diff --git a/src/Handler/Course.hs b/src/Handler/Course.hs index 9ed7a197b..abb9e27e7 100644 --- a/src/Handler/Course.hs +++ b/src/Handler/Course.hs @@ -759,14 +759,17 @@ makeCourseUserTable cid colChoices psValidator = dbtProj = traverse $ \(user, E.Value registrationTime , E.Value userNoteId, (feature,degree,terms)) -> return (user, registrationTime, userNoteId, (entityVal <$> feature, entityVal <$> degree, entityVal <$> terms)) dbtColonnade = colChoices dbtSorting = Map.fromList - [ sortUserName queryUser - , sortUserDisplayName queryUser + [ sortUserNameLink queryUser + , sortUserDisplayName queryUser -- needed for initial sorting + , sortUserEmail queryUser , sortUserMatriclenr queryUser , ( "course-user-semesternr", SortColumn queryUserSemester) -- $ -- preview (_userTableFeatures . _1 . _Just . _studyFeaturesSemester)) -- TODO ] dbtFilter = Map.fromList - [ filterUserName queryUser + [ fltrUserNameLink queryUser + , fltrUserEmail queryUser + , fltrUserMatriclenr queryUser , ( "course-user-semesternr", FilterColumn $ mkExactFilter queryUserSemester) -- TODO ] diff --git a/src/Handler/Utils/Table/Columns.hs b/src/Handler/Utils/Table/Columns.hs index f864e15ef..7b384d0db 100644 --- a/src/Handler/Utils/Table/Columns.hs +++ b/src/Handler/Utils/Table/Columns.hs @@ -42,40 +42,64 @@ colUserName' :: (IsDBTable m c, HasUser a, RenderMessage UniWorX msg, Show msg) colUserName' msg = sortable (Just $ fromString $ show msg) (i18nCell msg) cellHasUser colUserName :: (IsDBTable m c, HasUser a) => Colonnade Sortable a (DBCell m c) -colUserName = sortable (Just "user-surname") (i18nCell MsgCourseMembers) cellHasUser +colUserName = sortable (Just "user-name") (i18nCell MsgCourseMembers) cellHasUser colUserNameLink :: (IsDBTable m c, HasEntity a User) => (CryptoUUIDUser -> Route UniWorX) -> Colonnade Sortable a (DBCell m c) -colUserNameLink userLink = sortable (Just "user-surname") (i18nCell MsgCourseMembers) (cellHasUserLink userLink) +colUserNameLink userLink = sortable (Just "user-name") (i18nCell MsgCourseMembers) (cellHasUserLink userLink) -- | Intended to work with @nameWidget@, showing highlighter Surname within Displayname -- TOOD: We want to sort first by UserSurname and then by UserDisplayName, not supportet by dbTable -- see also @defaultSortingName@ sortUserName :: IsString a => (t -> E.SqlExpr (Entity User)) -> (a, SortColumn t) -sortUserName = sortUserSurname +sortUserName queryUser = ("user-name", SortColumn $ toSortKey . queryUser) + where toSortKey user = (user E.^. UserSurname) E.++. (user E.^. UserDisplayName) + +-- | Alias for sortUserName for consistency, since column comes in two variants +sortUserNameLink :: IsString a => (t -> E.SqlExpr (Entity User)) -> (a, SortColumn t) +sortUserNameLink = sortUserName sortUserSurname :: IsString a => (t -> E.SqlExpr (Entity User)) -> (a, SortColumn t) -sortUserSurname queryUser = ( "user-surname", SortColumn $ compose queryUser (E.^. UserSurname)) +sortUserSurname queryUser = ("user-surname", SortColumn $ compose queryUser (E.^. UserSurname)) sortUserDisplayName :: IsString a => (t -> E.SqlExpr (Entity User)) -> (a, SortColumn t) -sortUserDisplayName queryUser = ( "user-display-name", SortColumn $ compose queryUser (E.^. UserDisplayName)) +sortUserDisplayName queryUser = ("user-display-name", SortColumn $ compose queryUser (E.^. UserDisplayName)) defaultSortingByName :: PSValidator m x -> PSValidator m x -defaultSortingByName = defaultSorting [SortAscBy "user-surname", SortAscBy "user-display-name"] +defaultSortingByName = + -- defaultSorting [SortAscBy "user-surname", SortAscBy "user-display-name"] -- old way, requiring two exta sorters + defaultSorting [SortAscBy "user-name"] -- new way, untested, working with single sorter -filterUserName :: (IsFilterColumn t (a2 -> Set Text -> E.SqlExpr (E.Value Bool)), IsString a1) - => (a2 -> E.SqlExpr (Entity User)) - -> (a1, FilterColumn t) -filterUserName queryUser = ( "user-surname", FilterColumn $ mkContainsFilter queryName ) +-- | Alias for sortUserName for consistency +fltrUserNameLink :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) => (a -> E.SqlExpr (Entity User)) -> (d, FilterColumn t) +fltrUserNameLink = fltrUserName + +fltrUserName :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) + => (a -> E.SqlExpr (Entity User)) + -> (d, FilterColumn t) +fltrUserName queryUser = ( "user-name", FilterColumn $ mkContainsFilter queryName ) + where + queryName = compose queryUser (E.^. UserDisplayName) + +fltrUserNameExact :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) + => (a -> E.SqlExpr (Entity User)) + -> (d, FilterColumn t) +fltrUserNameExact queryUser = ( "user-name", FilterColumn $ mkExactFilter queryName ) + where + queryName = compose queryUser (E.^. UserDisplayName) + +fltrUserSurname :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) + => (a -> E.SqlExpr (Entity User)) + -> (d, FilterColumn t) +fltrUserSurname queryUser = ( "user-surname", FilterColumn $ mkContainsFilter queryName ) where queryName = compose queryUser (E.^. UserSurname) -filterUserNameExact :: (IsFilterColumn t (a2 -> Set Text -> E.SqlExpr (E.Value Bool)), IsString a1) - => (a2 -> E.SqlExpr (Entity User)) - -> (a1, FilterColumn t) -filterUserNameExact queryUser = ( "user-surname", FilterColumn $ mkExactFilter queryName ) +fltrUserDisplayName :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) + => (a -> E.SqlExpr (Entity User)) + -> (d, FilterColumn t) +fltrUserDisplayName queryUser = ( "user-display-name", FilterColumn $ mkContainsFilter queryName ) where - queryName = compose queryUser (E.^. UserSurname) - + queryName = compose queryUser (E.^. UserDisplayName) @@ -84,13 +108,27 @@ filterUserNameExact queryUser = ( "user-surname", FilterColumn $ mkExactFilter q colUserMatriclenr :: (IsDBTable m c, HasUser a) => Colonnade Sortable a (DBCell m c) colUserMatriclenr = sortable (Just "user-matriclenumber") (i18nCell MsgMatrikelNr) cellHasMatrikelnummer -sortUserMatriclenr :: IsString a => (t -> E.SqlExpr (Entity User)) -> (a, SortColumn t) +sortUserMatriclenr :: IsString d => (t -> E.SqlExpr (Entity User)) -> (d, SortColumn t) sortUserMatriclenr queryUser = ( "user-matriclenumber", SortColumn $ compose queryUser (E.^. UserMatrikelnummer)) +fltrUserMatriclenr :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) + => (a -> E.SqlExpr (Entity User)) + -> (d, FilterColumn t) +fltrUserMatriclenr queryUser = ( "user-matriclenumber", FilterColumn $ mkContainsFilter $ compose queryUser (E.^. UserMatrikelnummer)) + ---------------- -- User E-Mail colUserEmail :: (IsDBTable m c, HasUser a) => Colonnade Sortable a (DBCell m c) -colUserEmail = sortable (Just "email") (i18nCell MsgEMail) cellHasEMail +colUserEmail = sortable (Just "user-email") (i18nCell MsgEMail) cellHasEMail + +sortUserEmail :: IsString d => (t -> E.SqlExpr (Entity User)) -> (d, SortColumn t) +sortUserEmail queryUser = ( "user-email", SortColumn $ compose queryUser (E.^. UserEmail)) + +fltrUserEmail :: (IsFilterColumn t (a -> Set Text -> E.SqlExpr (E.Value Bool)), IsString d) + => (a -> E.SqlExpr (Entity User)) + -> (d, FilterColumn t) +fltrUserEmail queryUser = ( "user-email", FilterColumn $ mkContainsFilter $ compose queryUser (E.^. UserEmail)) +