From 955a951003fa93d07a97541eefe694ad16adbe1c Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Wed, 27 Mar 2019 16:16:29 +0100 Subject: [PATCH] Make massInput-Buttons behave nicer on Course-edit-page --- src/Handler/Course.hs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Handler/Course.hs b/src/Handler/Course.hs index 6ee54ac0f..22dce2e4d 100644 --- a/src/Handler/Course.hs +++ b/src/Handler/Course.hs @@ -372,8 +372,14 @@ getCourseNewR = do <*> iopt ciField "ssh" <*> iopt ciField "csh" + let courseEditHandler' = courseEditHandler $ \p -> Just . SomeRoute $ (CourseNewR, getParams) :#: p) + getParams = concat + [ [ ("tid", toPathPiece tid) | FormSuccess (Just tid, _, _) <- [params] ] + , [ ("ssh", toPathPiece ssh) | FormSuccess (_, Just ssh, _) <- [params] ] + , [ ("csh", toPathPiece csh) | FormSuccess (_, _, Just csh) <- [params] ] + ] - let noTemplateAction = courseEditHandler Nothing + let noTemplateAction = courseEditHandler' Nothing case params of -- DO NOT REMOVE: without this distinction, lecturers would never see an empty makeCourseForm any more! FormMissing -> noTemplateAction FormFailure msgs -> forM_ msgs (addMessage Error . toHtml) >> @@ -422,10 +428,10 @@ getCourseNewR = do unless cshOk $ addMessageI Warning $ MsgNoSuchCourseShorthand $ fromJust mbCsh when (tidOk && sshOk && cshOk) $ addMessageI Warning MsgNoSuchCourse return Nothing - courseEditHandler template + courseEditHandler' template postCourseNewR :: Handler Html -postCourseNewR = courseEditHandler Nothing -- Note: Nothing is safe here, since we will create a new course. +postCourseNewR = courseEditHandler (\p -> Just . SomeRoute $ CourseNewR :#: p) Nothing -- Note: Nothing is safe here, since we will create a new course. getCEditR, postCEditR :: TermId -> SchoolId -> CourseShorthand -> Handler Html getCEditR = pgCEditR @@ -439,7 +445,7 @@ pgCEditR tid ssh csh = do return $ (,) <$> mbCourse <*> mbLecs -- IMPORTANT: both GET and POST Handler must use the same template, -- since an Edit is identified via CourseID, which is not embedded in the received form data for security reasons. - courseEditHandler $ uncurry courseToForm <$> courseLecs + courseEditHandler (\p -> Just . SomeRoute $ CourseR tid ssh csh CEditR :#: p) $ uncurry courseToForm <$> courseLecs getCDeleteR, postCDeleteR :: TermId -> SchoolId -> CourseShorthand -> Handler Html @@ -455,10 +461,10 @@ postCDeleteR tid ssh csh = do -- | Course Creation and Editing -- | IMPORTANT: in case of Edit, Post/Get Request is provided with the same CourseForm template (cannot be Nothing), -- | since an edit is identified via cfCourseId which is not contained in the received form data for security reasons! -courseEditHandler :: Maybe CourseForm -> Handler Html -courseEditHandler mbCourseForm = do +courseEditHandler :: (forall p. PathPiece p => p -> Maybe (SomeRoute UniWorX)) -> Maybe CourseForm -> Handler Html +courseEditHandler miButtonAction mbCourseForm = do aid <- requireAuthId -- TODO: Verify that Editor is owner of the Course to be Edited!!! - ((result, formWidget), formEnctype) <- runFormPost $ makeCourseForm mbCourseForm + ((result, formWidget), formEnctype) <- runFormPost $ makeCourseForm miButtonAction mbCourseForm formResult result $ \case res@CourseForm { cfCourseId = Nothing @@ -573,8 +579,8 @@ courseToForm (Entity cid Course{..}) lecs = CourseForm , cfLecturers = [(lecturerUser, lecturerType) | Lecturer{..} <- lecs] } -makeCourseForm :: Maybe CourseForm -> Form CourseForm -makeCourseForm template = identifyForm FIDcourse $ \html -> do +makeCourseForm :: (forall p. PathPiece p => p -> Maybe (SomeRoute UniWorX)) -> Maybe CourseForm -> Form CourseForm +makeCourseForm miButtonAction template = identifyForm FIDcourse $ \html -> do -- TODO: Refactor to avoid the four repeated calls to liftHandlerT and three runDBs -- let editCid = cfCourseId =<< template -- possible start for refactoring @@ -632,9 +638,6 @@ makeCourseForm template = identifyForm FIDcourse $ \html -> do miAllowAdd :: ListPosition -> Natural -> ListLength -> Bool miAllowAdd _ _ _ = True - miButtonAction :: PathPiece p => p -> Maybe (SomeRoute UniWorX) - miButtonAction _ = Nothing - lecturerForm :: AForm Handler [(UserId,LecturerType)] lecturerForm = formToAForm . over (mapped._2) pure . over (mapped._1.mapped) Map.elems $ massInput