From ae4470333e2b1b5c271b38092210c094822f4a19 Mon Sep 17 00:00:00 2001 From: Steffen Jost Date: Wed, 27 Sep 2023 09:31:50 +0000 Subject: [PATCH] fix(lms): sorting and filtering lms status works throughout now --- src/Database/Esqueleto/Utils.hs | 13 +++++++------ src/Handler/LMS.hs | 2 +- src/Handler/Qualification.hs | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Database/Esqueleto/Utils.hs b/src/Database/Esqueleto/Utils.hs index a3e4d8368..53a480fa8 100644 --- a/src/Database/Esqueleto/Utils.hs +++ b/src/Database/Esqueleto/Utils.hs @@ -314,13 +314,14 @@ mkExactFilterMaybeLast lenslike row criterias | otherwise = true -- | like `mkExactFilterMaybeLast` but for doubly wrapped Maybes -mkExactFilterMaybeLast' :: PersistField a - => (t -> E.SqlExpr (E.Value (Maybe (Maybe a)))) -- ^ getter from query to searched element - -> t -- ^ query row - -> Last (Maybe a) -- ^ needle +mkExactFilterMaybeLast' :: (PersistField a, PersistField b) + => (t -> E.SqlExpr (E.Value (Maybe b))) -- ^ getter from query ensure entity exists at all + -> (t -> E.SqlExpr (E.Value (Maybe (Maybe a)))) -- ^ getter from query to searched element + -> t -- ^ query row + -> Last (Maybe a) -- ^ needle -> E.SqlExpr (E.Value Bool) -mkExactFilterMaybeLast' lenslike row criterias - | Last (Just Nothing) <- criterias = lenslike row E.==. E.val (Just Nothing) +mkExactFilterMaybeLast' lensexists lenslike row criterias + | Last (Just Nothing) <- criterias = isJust (lensexists row) E.&&. E.isNothing (E.joinV $ lenslike row) | Last (Just crit) <- criterias = lenslike row E.==. E.val (Just crit) | otherwise = true diff --git a/src/Handler/LMS.hs b/src/Handler/LMS.hs index 4986ac5d1..c15a5ebaf 100644 --- a/src/Handler/LMS.hs +++ b/src/Handler/LMS.hs @@ -468,7 +468,7 @@ mkLmsTable isAdmin (Entity qid quali) acts cols psValidator = do -- , single ("status" , SortColumnNullsInv $ views (to queryLmsUser) (E.^. LmsUserStatusDay)) , single ("status" , SortColumnNeverNull $ \row -> E.coalesceDefault [ queryLmsUser row E.^. LmsUserStatusDay , queryLmsUser row E.^. LmsUserNotified - ](queryLmsUser row E.?. LmsUserStarted)) + ](queryLmsUser row E.^. LmsUserStarted)) , single ("started" , SortColumnNullsInv $ queryLmsUser >>> (E.^. LmsUserStarted)) , single ("datepin" , SortColumnNullsInv $ queryLmsUser >>> (E.^. LmsUserDatePin)) diff --git a/src/Handler/Qualification.hs b/src/Handler/Qualification.hs index a1d3763d1..b275c3e31 100644 --- a/src/Handler/Qualification.hs +++ b/src/Handler/Qualification.hs @@ -441,7 +441,7 @@ mkQualificationTable isAdmin (Entity qid quali) acts cols psValidator = do if | Just True <- getLast criterion -> quser `quserToNotify` now | otherwise -> E.true ) - , single ("status" , FilterColumn . E.mkExactFilterMaybeLast' $ views (to queryLmsUser) (E.?. LmsUserStatus)) + , single ("status" , FilterColumn . E.mkExactFilterMaybeLast' (views (to queryLmsUser) (E.?. LmsUserId)) $ views (to queryLmsUser) (E.?. LmsUserStatus)) ] dbtFilterUI mPrev = mconcat [ fltrUserNameEmailHdrUI MsgLmsUser mPrev