feat(avs): add page-action and form handler for registering avs participants
This commit is contained in:
parent
c30a6003c5
commit
747d6198c4
@ -286,3 +286,9 @@ CourseExamRegistrationTime: Angemeldet seit
|
|||||||
CourseParticipantStateIsActiveFilter: Ansicht
|
CourseParticipantStateIsActiveFilter: Ansicht
|
||||||
CourseApply: Zum Kurs bewerben
|
CourseApply: Zum Kurs bewerben
|
||||||
CourseAdministrator: Kursadministrator:in
|
CourseAdministrator: Kursadministrator:in
|
||||||
|
|
||||||
|
CourseAvsRegisterTitle: Teilnehmer:innen anmelden
|
||||||
|
CourseAvsRegisterParticipants: Teilnehmer:innen
|
||||||
|
CourseAvsRegisterParticipantsTip: Mehrere Teilnehmer:innen mit Komma separieren
|
||||||
|
CourseAvsRegisterCreateTutorial: Teilnehmer:innen in Tagesgruppe eintragen
|
||||||
|
CourseAvsRegisterTutorialDay: Tag
|
||||||
|
|||||||
@ -285,3 +285,9 @@ CourseExamRegistrationTime: Registered since
|
|||||||
CourseParticipantStateIsActiveFilter: View
|
CourseParticipantStateIsActiveFilter: View
|
||||||
CourseApply: Apply for course
|
CourseApply: Apply for course
|
||||||
CourseAdministrator: Course administrator
|
CourseAdministrator: Course administrator
|
||||||
|
|
||||||
|
CourseAvsRegisterTitle: Register participants
|
||||||
|
CourseAvsRegisterParticipants: Participants
|
||||||
|
CourseAvsRegisterParticipantsTip: Separate multiple participants with comma
|
||||||
|
CourseAvsRegisterCreateTutorial: Add participants to day group
|
||||||
|
CourseAvsRegisterTutorialDay: Day
|
||||||
|
|||||||
@ -137,6 +137,7 @@ BreadcrumbCourseEventEdit: Kurstermin bearbeiten
|
|||||||
BreadcrumbExamList: Prüfungen
|
BreadcrumbExamList: Prüfungen
|
||||||
BreadcrumbExamNew: Neue Prüfung anlegen
|
BreadcrumbExamNew: Neue Prüfung anlegen
|
||||||
BreadcrumbCourseApplications: Bewerbungen
|
BreadcrumbCourseApplications: Bewerbungen
|
||||||
|
BreadcrumbCourseAvsRegister: AVS-Teilnehmer:innen anmelden
|
||||||
BreadcrumbExamEdit: Prüfung bearbeiten
|
BreadcrumbExamEdit: Prüfung bearbeiten
|
||||||
BreadcrumbExamUsers: Teilnehmer:innen
|
BreadcrumbExamUsers: Teilnehmer:innen
|
||||||
BreadcrumbExamGrades: Prüfungsleistungen
|
BreadcrumbExamGrades: Prüfungsleistungen
|
||||||
|
|||||||
@ -131,6 +131,7 @@ BreadcrumbCourseNewsNew: Add course news
|
|||||||
BreadcrumbCourseNewsEdit: Edit course news
|
BreadcrumbCourseNewsEdit: Edit course news
|
||||||
BreadcrumbCourseEventNew: New course occurrence
|
BreadcrumbCourseEventNew: New course occurrence
|
||||||
BreadcrumbCourseEventEdit: Edit course occurrence
|
BreadcrumbCourseEventEdit: Edit course occurrence
|
||||||
|
BreadcrumbCourseAvsRegister: Register AVS participants
|
||||||
BreadcrumbExamList: Exams
|
BreadcrumbExamList: Exams
|
||||||
BreadcrumbExamNew: Create new exam
|
BreadcrumbExamNew: Create new exam
|
||||||
BreadcrumbCourseApplications: Applications
|
BreadcrumbCourseApplications: Applications
|
||||||
|
|||||||
@ -147,5 +147,7 @@ MenuApc: Druckerei
|
|||||||
MenuPrintSend: Manueller Briefversand
|
MenuPrintSend: Manueller Briefversand
|
||||||
MenuPrintDownload: Brief herunterladen
|
MenuPrintDownload: Brief herunterladen
|
||||||
|
|
||||||
|
MenuCourseAvsRegister: AVS-Teilnehmer:innen anmelden
|
||||||
|
|
||||||
MenuApiDocs: API-Dokumentation (Englisch)
|
MenuApiDocs: API-Dokumentation (Englisch)
|
||||||
MenuSwagger !ident-ok: OpenAPI 2.0 (Swagger)
|
MenuSwagger !ident-ok: OpenAPI 2.0 (Swagger)
|
||||||
@ -148,5 +148,7 @@ MenuApc: Printing
|
|||||||
MenuPrintSend: Send Letter
|
MenuPrintSend: Send Letter
|
||||||
MenuPrintDownload: Download Letter
|
MenuPrintDownload: Download Letter
|
||||||
|
|
||||||
|
MenuCourseAvsRegister: Register AVS participants
|
||||||
|
|
||||||
MenuApiDocs: API documentation
|
MenuApiDocs: API documentation
|
||||||
MenuSwagger: OpenAPI 2.0 (Swagger)
|
MenuSwagger: OpenAPI 2.0 (Swagger)
|
||||||
|
|||||||
2
routes
2
routes
@ -176,6 +176,8 @@
|
|||||||
!/users/new CAddUserR GET POST !lecturerANDallocation-time
|
!/users/new CAddUserR GET POST !lecturerANDallocation-time
|
||||||
!/users/invite CInviteR GET POST
|
!/users/invite CInviteR GET POST
|
||||||
/users/#CryptoUUIDUser CUserR GET POST !lecturerANDparticipant !lecturerANDapplicant
|
/users/#CryptoUUIDUser CUserR GET POST !lecturerANDparticipant !lecturerANDapplicant
|
||||||
|
/avs CAvsR:
|
||||||
|
/register CAvsRegisterR GET POST !lecturer
|
||||||
/correctors CHiWisR GET
|
/correctors CHiWisR GET
|
||||||
/communication CCommR GET POST
|
/communication CCommR GET POST
|
||||||
/notes CNotesR GET POST !corrector -- THIS route is used to check for overall course corrector access!
|
/notes CNotesR GET POST !corrector -- THIS route is used to check for overall course corrector access!
|
||||||
|
|||||||
@ -250,6 +250,7 @@ breadcrumb (CourseR tid ssh csh CEditR) = i18nCrumb MsgMenuCourseEdit . Just
|
|||||||
breadcrumb (CourseR tid ssh csh CUsersR) = i18nCrumb MsgMenuCourseMembers . Just $ CourseR tid ssh csh CShowR
|
breadcrumb (CourseR tid ssh csh CUsersR) = i18nCrumb MsgMenuCourseMembers . Just $ CourseR tid ssh csh CShowR
|
||||||
breadcrumb (CourseR tid ssh csh CAddUserR) = i18nCrumb MsgMenuCourseAddMembers . Just $ CourseR tid ssh csh CUsersR
|
breadcrumb (CourseR tid ssh csh CAddUserR) = i18nCrumb MsgMenuCourseAddMembers . Just $ CourseR tid ssh csh CUsersR
|
||||||
breadcrumb (CourseR tid ssh csh CInviteR) = i18nCrumb MsgBreadcrumbCourseParticipantInvitation . Just $ CourseR tid ssh csh CShowR
|
breadcrumb (CourseR tid ssh csh CInviteR) = i18nCrumb MsgBreadcrumbCourseParticipantInvitation . Just $ CourseR tid ssh csh CShowR
|
||||||
|
breadcrumb (CourseR tid ssh csh (CAvsR CAvsRegisterR)) = i18nCrumb MsgBreadcrumbCourseAvsRegister . Just $ CourseR tid ssh csh CUsersR
|
||||||
breadcrumb (CourseR tid ssh csh CExamOfficeR) = i18nCrumb MsgMenuCourseExamOffice . Just $ CourseR tid ssh csh CShowR
|
breadcrumb (CourseR tid ssh csh CExamOfficeR) = i18nCrumb MsgMenuCourseExamOffice . Just $ CourseR tid ssh csh CShowR
|
||||||
breadcrumb (CourseR tid ssh csh (CUserR cID)) = useRunDB . maybeT (i18nCrumb MsgBreadcrumbUser . Just $ CourseR tid ssh csh CUsersR) $ do
|
breadcrumb (CourseR tid ssh csh (CUserR cID)) = useRunDB . maybeT (i18nCrumb MsgBreadcrumbUser . Just $ CourseR tid ssh csh CUsersR) $ do
|
||||||
guardM . lift . hasReadAccessTo . CourseR tid ssh csh $ CUserR cID
|
guardM . lift . hasReadAccessTo . CourseR tid ssh csh $ CUserR cID
|
||||||
@ -985,6 +986,17 @@ pageActions (CourseR tid ssh csh CShowR) = do
|
|||||||
|
|
||||||
return $
|
return $
|
||||||
[ NavPageActionPrimary
|
[ NavPageActionPrimary
|
||||||
|
{ navLink = NavLink
|
||||||
|
{ navLabel = MsgMenuCourseAvsRegister
|
||||||
|
, navRoute = CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navAccess' = NavAccessDB . hasWriteAccessTo . CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navType = NavTypeLink { navModal = True }
|
||||||
|
, navQuick' = mempty
|
||||||
|
, navForceActive = False
|
||||||
|
}
|
||||||
|
, navChildren = mempty
|
||||||
|
}
|
||||||
|
, NavPageActionPrimary
|
||||||
{ navLink = NavLink
|
{ navLink = NavLink
|
||||||
{ navLabel = MsgMenuMaterialList
|
{ navLabel = MsgMenuMaterialList
|
||||||
, navRoute = CourseR tid ssh csh MaterialListR
|
, navRoute = CourseR tid ssh csh MaterialListR
|
||||||
@ -1717,6 +1729,17 @@ pageActions (CourseR tid ssh csh SheetListR) = do
|
|||||||
]
|
]
|
||||||
pageActions (CourseR tid ssh csh CUsersR) = return
|
pageActions (CourseR tid ssh csh CUsersR) = return
|
||||||
[ NavPageActionPrimary
|
[ NavPageActionPrimary
|
||||||
|
{ navLink = NavLink
|
||||||
|
{ navLabel = MsgMenuCourseAvsRegister
|
||||||
|
, navRoute = CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navAccess' = NavAccessDB . hasWriteAccessTo . CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navType = NavTypeLink { navModal = True }
|
||||||
|
, navQuick' = mempty
|
||||||
|
, navForceActive = False
|
||||||
|
}
|
||||||
|
, navChildren = mempty
|
||||||
|
}
|
||||||
|
, NavPageActionPrimary
|
||||||
{ navLink = NavLink
|
{ navLink = NavLink
|
||||||
{ navLabel = MsgMenuCourseAddMembers
|
{ navLabel = MsgMenuCourseAddMembers
|
||||||
, navRoute = CourseR tid ssh csh CAddUserR
|
, navRoute = CourseR tid ssh csh CAddUserR
|
||||||
@ -1791,6 +1814,17 @@ pageActions (CMaterialR tid ssh csh mnm MShowR) = return
|
|||||||
]
|
]
|
||||||
pageActions (CourseR tid ssh csh CTutorialListR) = return
|
pageActions (CourseR tid ssh csh CTutorialListR) = return
|
||||||
[ NavPageActionPrimary
|
[ NavPageActionPrimary
|
||||||
|
{ navLink = NavLink
|
||||||
|
{ navLabel = MsgMenuCourseAvsRegister
|
||||||
|
, navRoute = CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navAccess' = NavAccessDB . hasWriteAccessTo . CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navType = NavTypeLink { navModal = True }
|
||||||
|
, navQuick' = mempty
|
||||||
|
, navForceActive = False
|
||||||
|
}
|
||||||
|
, navChildren = mempty
|
||||||
|
}
|
||||||
|
, NavPageActionPrimary
|
||||||
{ navLink = NavLink
|
{ navLink = NavLink
|
||||||
{ navLabel = MsgMenuTutorialNew
|
{ navLabel = MsgMenuTutorialNew
|
||||||
, navRoute = CourseR tid ssh csh CTutorialNewR
|
, navRoute = CourseR tid ssh csh CTutorialNewR
|
||||||
@ -1837,6 +1871,17 @@ pageActions (CTutorialR tid ssh csh tutn TUsersR) = return
|
|||||||
}
|
}
|
||||||
, navChildren = []
|
, navChildren = []
|
||||||
}
|
}
|
||||||
|
, NavPageActionPrimary
|
||||||
|
{ navLink = NavLink
|
||||||
|
{ navLabel = MsgMenuCourseAvsRegister
|
||||||
|
, navRoute = CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navAccess' = NavAccessDB . hasWriteAccessTo . CourseR tid ssh csh $ CAvsR CAvsRegisterR
|
||||||
|
, navType = NavTypeLink { navModal = True }
|
||||||
|
, navQuick' = mempty
|
||||||
|
, navForceActive = False
|
||||||
|
}
|
||||||
|
, navChildren = mempty
|
||||||
|
}
|
||||||
, NavPageActionSecondary
|
, NavPageActionSecondary
|
||||||
{ navLink = NavLink
|
{ navLink = NavLink
|
||||||
{ navLabel = MsgMenuTutorialDelete
|
{ navLabel = MsgMenuTutorialDelete
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import ServantApi.ExternalApis.Type
|
|||||||
mkYesodData "UniWorX" uniworxRoutes
|
mkYesodData "UniWorX" uniworxRoutes
|
||||||
|
|
||||||
deriving instance Generic CourseR
|
deriving instance Generic CourseR
|
||||||
|
deriving instance Generic CAvsR
|
||||||
deriving instance Generic SheetR
|
deriving instance Generic SheetR
|
||||||
deriving instance Generic SubmissionR
|
deriving instance Generic SubmissionR
|
||||||
deriving instance Generic MaterialR
|
deriving instance Generic MaterialR
|
||||||
@ -51,6 +52,7 @@ deriving instance Generic (Route UniWorX)
|
|||||||
|
|
||||||
|
|
||||||
instance Hashable CourseR
|
instance Hashable CourseR
|
||||||
|
instance Hashable CAvsR
|
||||||
instance Hashable SheetR
|
instance Hashable SheetR
|
||||||
instance Hashable SubmissionR
|
instance Hashable SubmissionR
|
||||||
instance Hashable MaterialR
|
instance Hashable MaterialR
|
||||||
@ -76,6 +78,7 @@ instance Ord (Route EmbeddedStatic) where
|
|||||||
compare = compare `on` renderRoute
|
compare = compare `on` renderRoute
|
||||||
|
|
||||||
deriving instance Ord CourseR
|
deriving instance Ord CourseR
|
||||||
|
deriving instance Ord CAvsR
|
||||||
deriving instance Ord SheetR
|
deriving instance Ord SheetR
|
||||||
deriving instance Ord SubmissionR
|
deriving instance Ord SubmissionR
|
||||||
deriving instance Ord MaterialR
|
deriving instance Ord MaterialR
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import Import
|
|||||||
import qualified Database.Esqueleto.Legacy as E
|
import qualified Database.Esqueleto.Legacy as E
|
||||||
import qualified Database.Persist as P
|
import qualified Database.Persist as P
|
||||||
|
|
||||||
|
import Handler.Course.Avs as Handler.Course
|
||||||
import Handler.Course.Communication as Handler.Course
|
import Handler.Course.Communication as Handler.Course
|
||||||
import Handler.Course.Delete as Handler.Course
|
import Handler.Course.Delete as Handler.Course
|
||||||
import Handler.Course.Edit as Handler.Course
|
import Handler.Course.Edit as Handler.Course
|
||||||
|
|||||||
53
src/Handler/Course/Avs.hs
Normal file
53
src/Handler/Course/Avs.hs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
-- SPDX-FileCopyrightText: 2022 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
module Handler.Course.Avs
|
||||||
|
( getCAvsRegisterR, postCAvsRegisterR
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Import
|
||||||
|
|
||||||
|
import Handler.Utils
|
||||||
|
|
||||||
|
import qualified Data.Set as Set
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
import qualified Data.Time.Zones as TZ
|
||||||
|
|
||||||
|
|
||||||
|
data CourseAvsRegisterForm = CourseAvsRegisterForm
|
||||||
|
{ cavsregParticipants :: Set Text -- TODO: NonEmpty
|
||||||
|
, cavsregTutorial :: Maybe Day
|
||||||
|
}
|
||||||
|
deriving (Eq, Ord, Show, Read, Generic, Typeable)
|
||||||
|
|
||||||
|
makeLenses_ ''CourseAvsRegisterForm
|
||||||
|
|
||||||
|
courseAvsRegisterForm :: Maybe CourseAvsRegisterForm -> AForm Handler CourseAvsRegisterForm
|
||||||
|
courseAvsRegisterForm template = wFormToAForm $ do
|
||||||
|
today <- localDay . TZ.utcToLocalTimeTZ appTZ <$> liftIO getCurrentTime
|
||||||
|
|
||||||
|
let
|
||||||
|
cfCommaSeparatedSet :: forall m. Functor m => Field m Text -> Field m (Set Text)
|
||||||
|
cfCommaSeparatedSet = guardField (not . Set.null) . convertField (Set.fromList . mapMaybe (assertM' (not . Text.null) . Text.strip) . Text.splitOn ",") (Text.intercalate ", " . Set.toList)
|
||||||
|
|
||||||
|
aFormToWForm $ CourseAvsRegisterForm
|
||||||
|
<$> areq (textField & cfCommaSeparatedSet) (fslI MsgCourseAvsRegisterParticipants & setTooltip MsgCourseAvsRegisterParticipantsTip) (cavsregParticipants <$> template)
|
||||||
|
<*> optionalActionA
|
||||||
|
( areq dayField (fslI MsgCourseAvsRegisterTutorialDay) (Just . fromMaybe today . join $ cavsregTutorial <$> template)
|
||||||
|
)
|
||||||
|
(fslI MsgCourseAvsRegisterCreateTutorial) (is _Just . cavsregTutorial <$> template)
|
||||||
|
|
||||||
|
|
||||||
|
getCAvsRegisterR, postCAvsRegisterR :: TermId -> SchoolId -> CourseShorthand -> Handler Html
|
||||||
|
getCAvsRegisterR = postCAvsRegisterR
|
||||||
|
postCAvsRegisterR _tid _ssh _csh = do
|
||||||
|
((_result, formView), formEnctype) <- runFormPost . renderAForm FormStandard $ courseAvsRegisterForm Nothing
|
||||||
|
|
||||||
|
-- TODO: process result
|
||||||
|
|
||||||
|
defaultLayout $ do
|
||||||
|
setTitleI MsgCourseAvsRegisterTitle
|
||||||
|
wrapForm formView def
|
||||||
|
{ formEncoding = formEnctype
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user