diff --git a/ChangeLog.md b/ChangeLog.md index 3e3d9dfe8..59d7755a2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,5 @@ * Version 30.01.2019 - + Designänderungen * Version 16.01.2019 @@ -7,7 +7,7 @@ Links für Bequemlichkeiten hinzugefügt (z.B. aktuelles Übungsblatt) Liste zugewiesener Abgaben lassen sich nun filtern - + Bugfix: Wenn zwischen Anzeige und Empfang eines Tabellen-Formulars Zeilen verschwinden wird nun eine sinnvolle Fehlermeldung angezeigt * Version 30.11.2018 @@ -65,11 +65,6 @@ Bugfixes, wählbares Format für Datum - * Version 04.07.2018 - - Hinweis eingefügt, dass alle Daten des Systems spätestens im Dezember 2018 - gelöscht werden. - * Version 03.07.2018 Willkommen bei Uni2work aka "You-need-to-work!" diff --git a/assets/favicon-0.png b/assets/favicon-0.png new file mode 100644 index 000000000..68830769b Binary files /dev/null and b/assets/favicon-0.png differ diff --git a/assets/favicon-5.png b/assets/favicon-5.png new file mode 100644 index 000000000..5fb1fc327 Binary files /dev/null and b/assets/favicon-5.png differ diff --git a/assets/logo-o2.svg b/assets/logo-o2.svg new file mode 100644 index 000000000..80620673b --- /dev/null +++ b/assets/logo-o2.svg @@ -0,0 +1,4 @@ + diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 000000000..4ef03212e Binary files /dev/null and b/assets/logo.png differ diff --git a/config/settings.yml b/config/settings.yml index 7c561ddfb..3211d42db 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -27,6 +27,7 @@ notification-rate-limit: 3600 notification-collate-delay: 300 notification-expiration: 259201 session-timeout: 7200 +maximum-content-length: 52428800 log-settings: detailed: "_env:DETAILED_LOGGING:false" diff --git a/messages/uniworx/de.msg b/messages/uniworx/de.msg index 4002461e1..68b033660 100644 --- a/messages/uniworx/de.msg +++ b/messages/uniworx/de.msg @@ -47,7 +47,7 @@ LectureStart: Beginn Vorlesungen Course: Kurs CourseShort: Kürzel CourseCapacity: Kapazität -CourseCapacityTip: Falls angegeben wird die Anzahl an Kursanmeldungen, die zugelassen werden, beschränkt +CourseCapacityTip: Anzahl erlaubter Kursanmeldungen, leer lassen für unbeschränkte Kurskapazität CourseNoCapacity: In diesem Kurs sind keine Plätze mehr frei. CourseNotEmpty: In diesem Kurs sind momentan Teilnehmer angemeldet. CourseRegisterOk: Sie wurden angemeldet @@ -75,14 +75,15 @@ CourseDescription: Beschreibung CourseDescriptionTip: Beliebiges HTML-Markup ist gestattet CourseHomepage: Homepage CourseShorthand: Kürzel -CourseShorthandUnique: Muss innerhalb des Semesters eindeutig sein +CourseShorthandUnique: Muss innerhalb Institut und Semester eindeutig sein CourseSemester: Semester CourseSchool: Institut CourseSchoolShort: Fach CourseSecretTip: Anmeldung zum Kurs erfordert Eingabe des Passworts, sofern gesetzt +CourseSecretFormat: beliebige Zeichenkette CourseRegisterFromTip: Ohne Datum ist KEINE eigenständige Anmeldung von Studierenden möglich -CourseRegisterToTip: Anmeldung darf auch ohne Begrenzung möglich sein -CourseDeregisterUntilTip: Abmeldung darf auch ohne Begrenzung möglich sein +CourseRegisterToTip: Anmeldung darf auch unbegrenzt offen bleiben +CourseDeregisterUntilTip: Abmeldung darf auch unbegrenzt erlaubt bleiben CourseFilterSearch: Volltext-Suche CourseFilterRegistered: Registriert CourseDeleteQuestion: Wollen Sie den unten aufgeführten Kurs wirklich löschen? @@ -231,6 +232,7 @@ HomeHeading: Aktuelle Termine LoginHeading: Authentifizierung LoginTitle: Authentifizierung ProfileHeading: Benutzereinstellungen +ProfileFor: Benutzereinstellungen für ProfileDataHeading: Gespeicherte Benutzerdaten ImpressumHeading: Impressum SystemMessageHeading: Uni2work Statusmeldung @@ -333,11 +335,15 @@ MultiSinkException name@Text error@Text: In Abgabe #{name} ist ein Fehler aufget NoTableContent: Kein Tabelleninhalt NoUpcomingSheetDeadlines: Keine anstehenden Übungsblätter +AdminUserHeading: Benutzeradministration +AccessRightsFor: Berechtigungen für AdminFor: Administrator LecturerFor: Dozent LecturersFor: Dozenten UserListTitle: Komprehensive Benutzerliste +AccessRightsSaved: Berechtigungsänderungen wurden gespeichert. +Date: Datum DateTimeFormat: Datums- und Uhrzeitformat DateFormat: Datumsformat TimeFormat: Uhrzeitformat @@ -489,6 +495,7 @@ CorrGrade: Korrekturen eintragen UserAccountDeleted name@Text: Konto für #{name} wurde gelöscht! +HelpTitle : Hilfe HelpAnswer: Antworten an HelpUser: Meinen Benutzeraccount HelpAnonymous: Keine Antwort (Anonym) @@ -498,6 +505,9 @@ HelpProblemPage: Problematische Seite HelpIntroduction: Wenn Ihnen die Benutzung dieser Webseite Schwierigkeiten bereitet oder Sie einen verbesserbaren Umstand entdecken bitten wir Sie uns das zu melden, auch wenn Sie Ihr Problem bereits selbst lösen konnten. Wir passen die Seite ständig an und versuchen sie auch für zukünftige Benutzer so einsichtig wie möglich zu halten. HelpSent: Ihre Supportanfrage wurde weitergeleitet. +InfoLecturerTitle: Hinweise für Veranstalter + + SystemMessageFrom: Sichtbar ab SystemMessageTo: Sichtbar bis SystemMessageAuthenticatedOnly: Nur angemeldet @@ -560,7 +570,8 @@ ErrorCryptoIdMismatch: Verschlüsselte Id der Abgabe passte nicht zu anderen Dat InvalidRoute: Konnte URL nicht interpretieren MenuHome: Aktuell -MenuVersion: Impressum +MenuImpressum: Impressum +MenuVersion: Versionsgeschichte MenuHelp: Hilfe MenuProfile: Anpassen MenuLogin: Login @@ -598,6 +609,7 @@ MenuCorrectionsCreate: Abgaben registrieren MenuCorrectionsGrade: Abgaben bewerten MenuAuthPreds: Authorisierungseinstellungen +AuthPredsInfo: Um eigene Veranstaltungen aus Sicht der Teilnehmer anzusehen, können Veranstalter und Korrektoren hier die Prüfung ihrer erweiterten Berechtigungen temporär deaktivieren. Abgewählte Prädikate werden nicht geprüft um Zugriffe zu gewähren, welche andernfalls nicht erlaubt wären. Diese Einstellungen gelten nur temporär bis Ihre Sitzung abgelaufen ist (d.h. bis ihr Browser-Cookie abgelaufen ist). AuthPredsActive: Aktive Authorisierungsprädikate AuthPredsActiveChanged: Authorisierungseinstellungen für aktuelle Sitzung gespeichert AuthTagFree: Seite ist universell zugänglich diff --git a/package.yaml b/package.yaml index 46af6eab8..0aadd7a3f 100644 --- a/package.yaml +++ b/package.yaml @@ -114,6 +114,7 @@ dependencies: - memcached-binary - directory-tree - lifted-base + - hsass other-extensions: - GeneralizedNewtypeDeriving diff --git a/routes b/routes index 1c1535769..aca3c5735 100644 --- a/routes +++ b/routes @@ -11,7 +11,7 @@ -- -- Access Tags: -- !free -- free for all --- !lecturer -- lecturer for this course (or the school, if route is not connected to a course) +-- !lecturer -- lecturer for this course (or for any school, if route is not connected to a course) -- !corrector -- corrector for this sheet (or the submission, if route is connected to a submission, or the course, if route is not connected to a sheet, or any course, if route is not connected to a course) -- !registered -- participant for this course (no effect outside of courses) -- !participant -- connected with a given course (not necessarily registered), i.e. has a submission, is a corrector, etc. (no effect outside of courses) @@ -35,24 +35,28 @@ / HomeR GET !free /users UsersR GET -- no tags, i.e. admins only -/users/#CryptoUUIDUser AdminUserR GET !development +/users/#CryptoUUIDUser AdminUserR GET POST !development /users/#CryptoUUIDUser/hijack AdminHijackUserR POST !adminANDno-escalation /admin/test AdminTestR GET POST /admin/errMsg AdminErrMsgR GET POST -/info VersionR GET !free +/impressum ImpressumR GET !free +/version VersionR GET !free +/info InfoR GET !free + /help HelpR GET POST !free +/help/lecturer InfoLecturerR GET !lecturer -/profile ProfileR GET POST !free -/profile/data ProfileDataR GET POST !free -/authpreds AuthPredsR GET POST !free +/user ProfileR GET POST !free +/user/profile ProfileDataR GET POST !free +/user/authpreds AuthPredsR GET POST !free /term TermShowR GET !free /term/current TermCurrentR GET !free /term/edit TermEditR GET POST /term/#TermId/edit TermEditExistR GET !/term/#TermId TermCourseListR GET !free -!/term/#TermId/#SchoolId TermSchoolCourseListR GET !free +!/term/#TermId/#SchoolId TermSchoolCourseListR GET !free /school SchoolListR GET !development /school/#SchoolId SchoolShowR GET !development diff --git a/src/Foundation.hs b/src/Foundation.hs index 4938141d6..05f50b22c 100644 --- a/src/Foundation.hs +++ b/src/Foundation.hs @@ -430,6 +430,7 @@ tagAccessPredicate AuthLecturer = APDB $ \route _ -> case route of return (E.countRows :: E.SqlExpr (E.Value Int64)) guardMExceptT (c>0) (unauthorizedI MsgUnauthorizedLecturer) return Authorized + -- lecturer for any school will do _ -> exceptT return return $ do authId <- maybeExceptT AuthenticationRequired $ lift maybeAuthId void . maybeMExceptT (unauthorizedI MsgUnauthorizedSchoolLecturer) $ selectFirst [UserLecturerUser ==. authId] [] @@ -752,7 +753,7 @@ instance Yesod UniWorX where (getCachedDate, _) <- clientSessionDateCacher appSessionTimeout return . Just $ clientSessionBackend appSessionKey getCachedDate - maximumContentLength _ _ = Just $ 50 * 2^20 + maximumContentLength UniWorX{appSettings=AppSettings{appMaximumContentLength}} _ = appMaximumContentLength -- Yesod Middleware allows you to run code before and after each handler function. -- The defaultYesodMiddleware adds the response header "Vary: Accept, Accept-Language" and performs authorization checks. @@ -835,7 +836,7 @@ instance Yesod UniWorX where NotAuthenticated -> [whamlet|
_{MsgErrorResponseNotAuthenticated}|] PermissionDenied err' -> [whamlet|
#{err'}|] BadMethod method -> [whamlet|
_{MsgErrorResponseBadMethod (decodeUtf8 method)}|] - fmap toTypedContent . siteLayout (Just . toHtml . mr $ ErrorResponseTitle err) $ do + fmap toTypedContent . siteLayout (toWgt . mr $ ErrorResponseTitle err) $ do toWidget [cassius| .errMsg @@ -844,7 +845,7 @@ instance Yesod UniWorX where |] errPage - defaultLayout = siteLayout Nothing + defaultLayout = siteLayout' Nothing -- The page to be redirected to when authentication is required. authRoute _ = Just $ AuthR LoginR @@ -887,9 +888,21 @@ instance Yesod UniWorX where makeLogger = readTVarIO . snd . appLogger -siteLayout :: Maybe Html -- ^ Optionally override `pageHeading` +siteLayoutMsg :: (RenderMessage site msg, site ~ UniWorX) => msg -> Widget -> Handler Html +siteLayoutMsg msg widget = do + mr <- getMessageRender + siteLayout (toWgt $ mr msg) widget + +siteLayoutMsg' :: (RenderMessage site msg, site ~ UniWorX) => msg -> Widget -> Handler Html +siteLayoutMsg' = siteLayout . i18nHeading + +siteLayout :: Widget -- ^ `pageHeading` -> Widget -> Handler Html -siteLayout headingOverride widget = do +siteLayout = siteLayout' . Just + +siteLayout' :: Maybe Widget -- ^ Optionally override `pageHeading` + -> Widget -> Handler Html +siteLayout' headingOverride widget = do master <- getYesod let AppSettings { appUserDefaults = UserDefaultConf{..}, .. } = appSettings master @@ -961,8 +974,10 @@ siteLayout headingOverride widget = do asidenav = $(widgetFile "widgets/asidenav") footer :: Widget footer = $(widgetFile "widgets/footer") + alerts :: Widget + alerts = $(widgetFile "widgets/alerts/alerts") contentHeadline :: Maybe Widget - contentHeadline = (toWidget <$> headingOverride) <|> (pageHeading =<< mcurrentRoute) + contentHeadline = headingOverride <|> (pageHeading =<< mcurrentRoute) breadcrumbsWgt :: Widget breadcrumbsWgt = $(widgetFile "widgets/breadcrumbs") pageaction :: Widget @@ -974,23 +989,24 @@ siteLayout headingOverride widget = do hasPrimaryPageActions = any (is _PageActionPrime) $ toListOf (traverse . _1 . _menuItemType) menuTypes pc <- widgetToPageContent $ do - addScript $ StaticR js_zepto_js - addScript $ StaticR js_fetchPolyfill_js - addScript $ StaticR js_urlPolyfill_js - addScript $ StaticR js_featureChecker_js - addScript $ StaticR js_flatpickr_js - addScript $ StaticR js_tabber_js - addStylesheet $ StaticR css_flatpickr_css - addStylesheet $ StaticR css_tabber_css + addScript $ StaticR js_vendor_zepto_js + addScript $ StaticR js_vendor_flatpickr_js + addScript $ StaticR js_polyfills_fetchPolyfill_js + addScript $ StaticR js_polyfills_urlPolyfill_js + addScript $ StaticR js_utils_featureChecker_js + addScript $ StaticR js_utils_tabber_js + addScript $ StaticR js_utils_alerts_js + addStylesheet $ StaticR css_vendor_flatpickr_css + addStylesheet $ StaticR css_vendor_fontawesome_css addStylesheet $ StaticR css_fonts_css - addStylesheet $ StaticR css_fontawesome_css + addStylesheet $ StaticR css_utils_tabber_css + addStylesheet $ StaticR css_utils_alerts_scss $(widgetFile "default-layout") $(widgetFile "standalone/modal") $(widgetFile "standalone/showHide") $(widgetFile "standalone/inputs") $(widgetFile "standalone/tooltip") $(widgetFile "standalone/tabber") - $(widgetFile "standalone/alerts") $(widgetFile "standalone/datepicker") withUrlRenderer $(hamletFile "templates/default-layout-wrapper.hamlet") @@ -1022,25 +1038,28 @@ applySystemMessages = liftHandlerT . runDB . runConduit $ selectSource [] [] .| -- Define breadcrumbs. instance YesodBreadcrumbs UniWorX where - breadcrumb (AuthR _) = return ("Login" , Just HomeR) - breadcrumb HomeR = return ("Uni2work", Nothing) - breadcrumb UsersR = return ("Benutzer", Just HomeR) - breadcrumb AdminTestR = return ("Test" , Just HomeR) - breadcrumb (AdminUserR _) = return ("Users" , Just UsersR) - breadcrumb VersionR = return ("Impressum" , Just HomeR) + breadcrumb (AuthR _) = return ("Login" , Just HomeR) + breadcrumb HomeR = return ("Uni2work" , Nothing) + breadcrumb UsersR = return ("Benutzer" , Just HomeR) + breadcrumb AdminTestR = return ("Test" , Just HomeR) + breadcrumb (AdminUserR _) = return ("Users" , Just UsersR) + breadcrumb VersionR = return ("Impressum" , Just HomeR) + breadcrumb HelpR = return ("Hilfe" , Just HomeR) + breadcrumb InfoLecturerR = return ("Veranstalter" , Just HelpR) - breadcrumb ProfileR = return ("Profile" , Just HomeR) - breadcrumb ProfileDataR = return ("Data" , Just ProfileR) + breadcrumb ProfileR = return ("User" , Just HomeR) + breadcrumb ProfileDataR = return ("Profile" , Just ProfileR) + breadcrumb AuthPredsR = return ("Authentifizierung", Just ProfileR) breadcrumb TermShowR = return ("Semester" , Just HomeR) breadcrumb TermCurrentR = return ("Aktuell" , Just TermShowR) breadcrumb TermEditR = return ("Neu" , Just TermCurrentR) breadcrumb (TermEditExistR tid) = return ("Editieren" , Just $ TermCourseListR tid) - breadcrumb (TermCourseListR (unTermKey -> tid)) = getMessageRender <&> \mr -> (mr $ ShortTermIdentifier tid, Nothing) + breadcrumb (TermCourseListR (unTermKey -> tid)) = getMessageRender <&> \mr -> (mr $ ShortTermIdentifier tid, Just CourseListR) breadcrumb (TermSchoolCourseListR tid ssh) = return (CI.original $ unSchoolKey ssh, Just $ TermCourseListR tid) - breadcrumb CourseListR = return ("Kurse" , Just HomeR) + breadcrumb CourseListR = return ("Kurse" , Nothing) breadcrumb CourseNewR = return ("Neu" , Just CourseListR) breadcrumb (CourseR tid ssh csh CShowR) = return (CI.original csh, Just $ TermSchoolCourseListR tid ssh) -- (CourseR tid ssh csh CRegisterR) -- is POST only @@ -1090,18 +1109,18 @@ submissionList tid csh shn uid = E.select . E.from $ \(course `E.InnerJoin` shee defaultLinks :: (MonadHandler m, HandlerSite m ~ UniWorX) => m [MenuItem] defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the header. [ return MenuItem - { menuItemType = NavbarAside + { menuItemType = NavbarAside , menuItemLabel = MsgMenuHome - , menuItemIcon = Just "home" + , menuItemIcon = Just "home" , menuItemRoute = SomeRoute HomeR , menuItemModal = False , menuItemAccessCallback' = return True } , return MenuItem - { menuItemType = Footer - , menuItemLabel = MsgMenuVersion + { menuItemType = Footer + , menuItemLabel = MsgMenuImpressum , menuItemIcon = Just "book" - , menuItemRoute = SomeRoute VersionR + , menuItemRoute = SomeRoute ImpressumR , menuItemModal = False , menuItemAccessCallback' = return True } @@ -1109,7 +1128,7 @@ defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the mCurrentRoute <- getCurrentRoute return MenuItem - { menuItemType = NavbarRight + { menuItemType = NavbarRight , menuItemLabel = MsgMenuHelp , menuItemIcon = Just "question" , menuItemRoute = SomeRoute (HelpR, catMaybes [(toPathPiece GetReferer, ) . toPathPiece <$> mCurrentRoute]) @@ -1117,57 +1136,57 @@ defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the , menuItemAccessCallback' = return True } , return MenuItem - { menuItemType = NavbarRight + { menuItemType = NavbarRight , menuItemLabel = MsgMenuProfile - , menuItemIcon = Just "cogs" + , menuItemIcon = Just "cogs" , menuItemRoute = SomeRoute ProfileR , menuItemModal = False , menuItemAccessCallback' = isJust <$> maybeAuthPair } , return MenuItem - { menuItemType = NavbarSecondary + { menuItemType = NavbarSecondary , menuItemLabel = MsgMenuLogin - , menuItemIcon = Just "sign-in-alt" + , menuItemIcon = Just "sign-in-alt" , menuItemRoute = SomeRoute $ AuthR LoginR , menuItemModal = True , menuItemAccessCallback' = isNothing <$> maybeAuthPair } , return MenuItem - { menuItemType = NavbarSecondary + { menuItemType = NavbarSecondary , menuItemLabel = MsgMenuLogout - , menuItemIcon = Just "sign-out-alt" + , menuItemIcon = Just "sign-out-alt" , menuItemRoute = SomeRoute $ AuthR LogoutR , menuItemModal = False , menuItemAccessCallback' = isJust <$> maybeAuthPair } , return MenuItem - { menuItemType = NavbarAside + { menuItemType = NavbarAside , menuItemLabel = MsgMenuCourseList - , menuItemIcon = Just "calendar-alt" + , menuItemIcon = Just "graduation-cap" , menuItemRoute = SomeRoute CourseListR , menuItemModal = False , menuItemAccessCallback' = return True } , return MenuItem - { menuItemType = NavbarAside + { menuItemType = NavbarAside , menuItemLabel = MsgMenuTermShow - , menuItemIcon = Just "graduation-cap" + , menuItemIcon = Just "calendar-alt" -- SJ wrote: calendar icon, since Term will be repleaced with TimeTable in the future; arguably Term is more calendar-like than courses anyway!!! , menuItemRoute = SomeRoute TermShowR , menuItemModal = False , menuItemAccessCallback' = return True } , return MenuItem - { menuItemType = NavbarAside + { menuItemType = NavbarAside , menuItemLabel = MsgMenuCorrections - , menuItemIcon = Just "check" + , menuItemIcon = Just "check" , menuItemRoute = SomeRoute CorrectionsR , menuItemModal = False , menuItemAccessCallback' = return True } , return MenuItem - { menuItemType = NavbarAside + { menuItemType = NavbarAside , menuItemLabel = MsgMenuUsers - , menuItemIcon = Just "users" + , menuItemIcon = Just "users" , menuItemRoute = SomeRoute UsersR , menuItemModal = False , menuItemAccessCallback' = return True -- Creates a LOOP: (Authorized ==) <$> isAuthorized UsersR False @@ -1184,14 +1203,15 @@ pageActions :: Route UniWorX -> [MenuItem] -} pageActions (HomeR) = [ --- NavbarAside $ MenuItem --- { menuItemLabel = "Benutzer" --- , menuItemIcon = Just "users" --- , menuItemRoute = UsersR --- , menuItemAccessCallback' = return True --- } --- , MenuItem + { menuItemType = PageActionPrime + , menuItemLabel = MsgInfoLecturerTitle + , menuItemIcon = Nothing + , menuItemRoute = SomeRoute InfoLecturerR + , menuItemModal = False + , menuItemAccessCallback' = return True + } + , MenuItem { menuItemType = PageActionPrime , menuItemLabel = MsgMenuAdminTest , menuItemIcon = Just "screwdriver" @@ -1216,6 +1236,26 @@ pageActions (HomeR) = , menuItemAccessCallback' = return True } ] +pageActions (VersionR) = [ + MenuItem + { menuItemType = PageActionPrime + , menuItemLabel = MsgInfoLecturerTitle + , menuItemIcon = Nothing + , menuItemRoute = SomeRoute InfoLecturerR + , menuItemModal = False + , menuItemAccessCallback' = return True + } + ] +pageActions (HelpR) = [ + MenuItem + { menuItemType = PageActionPrime + , menuItemLabel = MsgInfoLecturerTitle + , menuItemIcon = Nothing + , menuItemRoute = SomeRoute InfoLecturerR + , menuItemModal = False + , menuItemAccessCallback' = return True + } + ] pageActions (ProfileR) = [ MenuItem { menuItemType = PageActionPrime @@ -1225,14 +1265,14 @@ pageActions (ProfileR) = , menuItemModal = False , menuItemAccessCallback' = return True } - -- , MenuItem - -- { menuItemType = PageActionSecondary - -- , menuItemLabel = MsgMenuAuthPreds - -- , menuItemIcon = Nothing - -- , menuItemRoute = SomeRoute AuthPredsR - -- , menuItemModal = True - -- , menuItemAccessCallback' = return True - -- } + , MenuItem + { menuItemType = PageActionSecondary + , menuItemLabel = MsgMenuAuthPreds + , menuItemIcon = Nothing + , menuItemRoute = SomeRoute AuthPredsR + , menuItemModal = True + , menuItemAccessCallback' = return True + } ] pageActions TermShowR = [ MenuItem @@ -1598,6 +1638,7 @@ pageActions _ = [] i18nHeading :: (MonadWidget m, RenderMessage site msg, HandlerSite m ~ site) => msg -> m () i18nHeading msg = liftWidgetT $ toWidget =<< getMessageRender <*> pure msg +-- | only used in defaultLayout; better use siteLayout instead! pageHeading :: Route UniWorX -> Maybe Widget pageHeading (AuthR _) = Just $ i18nHeading MsgLoginHeading @@ -1608,7 +1649,7 @@ pageHeading UsersR pageHeading (AdminTestR) = Just $ [whamlet|Internal Code Demonstration Page|] pageHeading (AdminUserR _) - = Just $ [whamlet|User Display for Admin|] + = Just $ i18nHeading MsgAdminUserHeading pageHeading (AdminErrMsgR) = Just $ i18nHeading MsgErrMsgHeading pageHeading (VersionR) diff --git a/src/Handler/Admin.hs b/src/Handler/Admin.hs index 17bc943b9..a159489fe 100644 --- a/src/Handler/Admin.hs +++ b/src/Handler/Admin.hs @@ -66,7 +66,7 @@ postAdminTestR = do _other -> addMessage Warning "KEIN Knopf erkannt" ((emailResult, emailWidget), emailEnctype) <- runFormPost . identifyForm "email" $ renderAForm FormStandard emailTestForm - case emailResult of + case emailResult of (FormSuccess (email, ls)) -> do jId <- runDB $ do jId <- queueJob $ JobSendTestEmail email ls @@ -80,22 +80,12 @@ postAdminTestR = do