diff --git a/src/Handler/Sheet.hs b/src/Handler/Sheet.hs index f8b4b8f51..2884043f8 100644 --- a/src/Handler/Sheet.hs +++ b/src/Handler/Sheet.hs @@ -146,13 +146,12 @@ getSheetListR tid ssh csh = do lastSheetEdit sheet = E.sub_select . E.from $ \sheetEdit -> do E.where_ $ sheetEdit E.^. SheetEditSheet E.==. sheet E.^. SheetId return . E.max_ $ sheetEdit E.^. SheetEditTime - sheetData :: E.SqlExpr (Entity Sheet) `E.LeftOuterJoin` (E.SqlExpr (Maybe (Entity Submission)) `E.InnerJoin` (E.SqlExpr (Maybe (Entity SubmissionUser)))) -> E.SqlQuery (E.SqlExpr (Entity Sheet), E.SqlExpr (E.Value (Maybe UTCTime)),E.SqlExpr (Maybe (Entity Submission))) + sheetData :: E.SqlExpr (Entity Sheet) `E.LeftOuterJoin` (E.SqlExpr (Maybe (Entity Submission)) `E.InnerJoin` (E.SqlExpr (Maybe (Entity SubmissionUser)))) -> E.SqlQuery () sheetData (sheet `E.LeftOuterJoin` (submission `E.InnerJoin` submissionUser)) = do E.on $ submission E.?. SubmissionId E.==. submissionUser E.?. SubmissionUserSubmission E.on $ (E.just $ sheet E.^. SheetId) E.==. submission E.?. SubmissionSheet E.&&. submissionUser E.?. SubmissionUserUser E.==. E.val muid E.where_ $ sheet E.^. SheetCourse E.==. E.val cid - return (sheet, lastSheetEdit sheet, submission) sheetCol = widgetColonnade . mconcat $ [ dbRow , sortable (Just "name") (i18nCell MsgSheet) @@ -197,48 +196,50 @@ getSheetListR tid ssh csh = do ] psValidator = def & defaultSorting [("submission-since", SortAsc)] - table <- runDB $ dbTableWidget' psValidator DBTable - { dbtSQLQuery = sheetData - , dbtColonnade = sheetCol - , dbtProj = \dbr@DBRow{ dbrOutput=(Entity _ Sheet{..}, _, _) } - -> dbr <$ guardM (lift $ (== Authorized) <$> evalAccessDB (CSheetR tid ssh csh sheetName SShowR) False) - , dbtSorting = Map.fromList - [ ( "name" - , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> sheet E.^. SheetName - ) - , ( "last-edit" - , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> lastSheetEdit sheet - ) - , ( "submission-since" - , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> sheet E.^. SheetActiveFrom - ) - , ( "submission-until" - , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> sheet E.^. SheetActiveTo - ) - , ( "rating" - , SortColumn $ \(_sheet `E.LeftOuterJoin` (submission `E.InnerJoin` _submissionUser)) -> submission E.?. SubmissionRatingPoints - ) --- GitLab Issue $143: HOW TO SORT? --- , ( "percent" --- , SortColumn $ \(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` _submissionUser)) -> --- case sheetType of -- no Haskell inside Esqueleto, right? --- (submission E.?. SubmissionRatingPoints) E./. (sheet E.^. SheetType) --- ) - ] - , dbtFilter = mempty - , dbtFilterUI = mempty - , dbtStyle = def - , dbtIdent = "sheets" :: Text - } - -- Collect summary over all Sheets, not just the ones shown due to pagination: - statistics <- gradeSummaryWidget MsgSheetGradingSummaryTitle <$> do - rows <- runDB $ E.select $ E.from $ \(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` submissionUser)) -> do - E.on $ submission E.?. SubmissionId E.==. submissionUser E.?. SubmissionUserSubmission - E.on $ (E.just $ sheet E.^. SheetId) E.==. submission E.?. SubmissionSheet - E.&&. submissionUser E.?. SubmissionUserUser E.==. E.val muid - E.where_ $ sheet E.^. SheetCourse E.==. E.val cid - return (sheet E.^. SheetType, submission E.?. SubmissionRatingPoints) - return $ foldMap (\(E.Value sheetType, E.Value mbPts) -> sheetTypeSum sheetType (join mbPts)) rows + (table,statistics) <- runDB $ liftA2 (,) + (dbTableWidget' psValidator DBTable + { dbtColonnade = sheetCol + , dbtSQLQuery = \dt@(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` _submissionUser)) + -> sheetData dt *> return (sheet, lastSheetEdit sheet, submission) + , dbtProj = \dbr@DBRow{ dbrOutput=(Entity _ Sheet{..}, _, _) } + -> dbr <$ guardM (lift $ (== Authorized) <$> evalAccessDB (CSheetR tid ssh csh sheetName SShowR) False) + , dbtSorting = Map.fromList + [ ( "name" + , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> sheet E.^. SheetName + ) + , ( "last-edit" + , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> lastSheetEdit sheet + ) + , ( "submission-since" + , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> sheet E.^. SheetActiveFrom + ) + , ( "submission-until" + , SortColumn $ \(sheet `E.LeftOuterJoin` _) -> sheet E.^. SheetActiveTo + ) + , ( "rating" + , SortColumn $ \(_sheet `E.LeftOuterJoin` (submission `E.InnerJoin` _submissionUser)) -> submission E.?. SubmissionRatingPoints + ) + -- GitLab Issue $143: HOW TO SORT? + -- , ( "percent" + -- , SortColumn $ \(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` _submissionUser)) -> + -- case sheetType of -- no Haskell inside Esqueleto, right? + -- (submission E.?. SubmissionRatingPoints) E./. (sheet E.^. SheetType) + -- ) + ] + , dbtFilter = mempty + , dbtFilterUI = mempty + , dbtStyle = def + , dbtIdent = "sheets" :: Text + } + ) ( + -- Collect summary over all Sheets, not just the ones shown due to pagination: + gradeSummaryWidget MsgSheetGradingSummaryTitle . + foldMap (\(E.Value sheetType, E.Value mbPts) -> sheetTypeSum sheetType (join mbPts)) + <$> ( + E.select $ E.from $ \dt@(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` _submissionUser)) -> + sheetData dt *> return (sheet E.^. SheetType, submission E.?. SubmissionRatingPoints) + ) + ) defaultLayout $ do $(widgetFile "sheetList")