diff --git a/messages/uniworx/de.msg b/messages/uniworx/de.msg index df1278858..59e81077f 100644 --- a/messages/uniworx/de.msg +++ b/messages/uniworx/de.msg @@ -73,7 +73,7 @@ CourseMembersCountLimited num@Int64 max@Int64: #{display num}/#{display max} CourseName: Name CourseDescription: Beschreibung CourseDescriptionTip: Beliebiges HTML-Markup ist gestattet -CourseHomepage: Homepage +CourseHomepageExternal: Externe Homepage CourseShorthand: Kürzel CourseShorthandUnique: Muss innerhalb Institut und Semester eindeutig sein CourseSemester: Semester @@ -582,6 +582,7 @@ ErrorCryptoIdMismatch: Verschlüsselte Id der Abgabe passte nicht zu anderen Dat InvalidRoute: Konnte URL nicht interpretieren MenuHome: Aktuell +MenuInformation: Informationen MenuImpressum: Impressum MenuDataProt: Datenschutz MenuVersion: Versionsgeschichte diff --git a/src/Foundation.hs b/src/Foundation.hs index 7abccd7d0..c97c194d7 100644 --- a/src/Foundation.hs +++ b/src/Foundation.hs @@ -1162,6 +1162,14 @@ defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the , menuItemModal = False , menuItemAccessCallback' = return True } + , return MenuItem + { menuItemType = Footer + , menuItemLabel = MsgMenuInformation + , menuItemIcon = Just "info" + , menuItemRoute = SomeRoute InfoR + , menuItemModal = False + , menuItemAccessCallback' = return True + } , do mCurrentRoute <- getCurrentRoute diff --git a/src/Handler/Course.hs b/src/Handler/Course.hs index eb0936540..2dbc46887 100644 --- a/src/Handler/Course.hs +++ b/src/Handler/Course.hs @@ -44,7 +44,7 @@ colDescription = sortable Nothing mempty $ \DBRow{ dbrOutput=(Entity _ Course{..}, _, _, _) } -> case courseDescription of Nothing -> mempty - (Just descr) -> cell $ modal (commentWidget True) (Right $ toWidget descr) + (Just descr) -> cell $ modal (toWidget $ hasComment True) (Right $ toWidget descr) colCShort :: IsDBTable m a => Colonnade _ CourseTableData (DBCell m a) colCShort = sortable (Just "cshort") (i18nCell MsgCourseShort) @@ -564,9 +564,10 @@ makeCourseForm template = identForm FIDcourse $ \html -> do (result, widget) <- flip (renderAForm FormStandard) html $ CourseForm <$> pure (cfCourseId =<< template) <*> areq ciField (fslI MsgCourseName) (cfName <$> template) - <*> aopt htmlField (fslI MsgCourseDescription + <*> aopt htmlField (fslpI MsgCourseDescription "Bitte mindestens die Modulbeschreibung angeben" & setTooltip MsgCourseDescriptionTip) (cfDesc <$> template) - <*> aopt urlField (fslI MsgCourseHomepage) (cfLink <$> template) + <*> aopt urlField (fslpI MsgCourseHomepageExternal "Optionale externe URL") + (cfLink <$> template) <*> areq ciField (fslI MsgCourseShorthand -- & addAttr "disabled" "disabled" & setTooltip MsgCourseShorthandUnique) (cfShort <$> template) @@ -671,7 +672,7 @@ colUserComment tid ssh csh = sortable (Just "course-user-note") (i18nCell MsgCourseUserNote) $ \DBRow{ dbrOutput=(Entity uid _, _, mbNoteKey) } -> maybeEmpty mbNoteKey $ const $ - anchorCellM (courseLink <$> encrypt uid) (commentWidget True) + anchorCellM (courseLink <$> encrypt uid) (toWidget $ hasComment True) where courseLink = CourseR tid ssh csh . CUserR diff --git a/src/Handler/Home.hs b/src/Handler/Home.hs index 05708b6e3..6363b641a 100644 --- a/src/Handler/Home.hs +++ b/src/Handler/Home.hs @@ -137,7 +137,7 @@ homeUser uid = do case mbsid of Nothing -> mempty (Just sid) -> anchorCellM (CSubmissionR tid ssh csh shn <$> encrypt sid <*> pure SubShowR) - tickmark + (toWidget $ hasTickmark True) ] let validator = def & defaultSorting [SortDescBy "done", SortAscBy "deadline"] sheetTable <- runDB $ dbTableWidget' validator DBTable diff --git a/src/Handler/SystemMessage.hs b/src/Handler/SystemMessage.hs index 4727540e0..ad791a9e6 100644 --- a/src/Handler/SystemMessage.hs +++ b/src/Handler/SystemMessage.hs @@ -10,18 +10,19 @@ import qualified Data.Set as Set import qualified Data.List.NonEmpty as NonEmpty import Handler.Utils +import Handler.Utils.Table.Cells import Utils.Lens import qualified Database.Esqueleto as E - + htmlField' :: Field (HandlerT UniWorX IO) Html htmlField' = htmlField { fieldParse = \vs fis -> fieldParse htmlField (map Text.strip vs) fis } - + getMessageR, postMessageR :: CryptoUUIDSystemMessage -> Handler Html getMessageR = postMessageR @@ -88,7 +89,7 @@ postMessageR cID = do ] addMessageI Success MsgSystemMessageEditTranslationSuccess redirect $ MessageR cID - + let messageEditModal = modal [whamlet|_{MsgSystemMessageEdit}|] $ Right [whamlet| @@ -113,7 +114,7 @@ postMessageR cID = do maySubmit <- (== Authorized) <$> evalAccess (MessageR cID) True forms <- traverse (const mkForm) $ () <$ guard maySubmit - + defaultLayout $(widgetFile "system-message") where diff --git a/src/Handler/Term.hs b/src/Handler/Term.hs index b6ca6f622..590892339 100644 --- a/src/Handler/Term.hs +++ b/src/Handler/Term.hs @@ -2,6 +2,7 @@ module Handler.Term where import Import import Handler.Utils +import Handler.Utils.Table.Cells import qualified Data.Map as Map -- import qualified Data.Text as T @@ -75,7 +76,7 @@ getTermShowR = do , sortable (Just "lecture-end") "Ende Vorlesungen" $ \(Entity _ Term{..},_) -> cell $ formatTime SelFormatDate termLectureEnd >>= toWidget , sortable Nothing "Aktiv" $ \(Entity _ Term{..},_) -> - textCell (bool "" tickmark termActive :: Text) + tickmarkCell termActive , sortable Nothing "Kurse" $ \(_, E.Value numCourses) -> cell [whamlet|_{MsgNumCourses numCourses}|] , sortable (Just "start") "Semesteranfang" $ \(Entity _ Term{..},_) -> diff --git a/src/Handler/Utils.hs b/src/Handler/Utils.hs index e45890f58..67beeabd1 100644 --- a/src/Handler/Utils.hs +++ b/src/Handler/Utils.hs @@ -70,18 +70,3 @@ warnTermDays tid times = do forM_ outoflecture $ warnI MsgDayIsOutOfLecture forM_ outoftermdays $ warnI MsgDayIsOutOfTerm -visibleWidget :: Bool -> Widget --- ^ @visibleWidget False@ is an icon that denotes that something™ is not visible -visibleWidget True = mempty -visibleWidget False = [whamlet||] - -isVisibleWidget :: Bool -> Widget --- ^ @visibleWidget True@ is an icon that denotes that something™ is visible -isVisibleWidget True = [whamlet||] -isVisibleWidget False = mempty - - -commentWidget :: Bool -> Widget --- ^ @commentWidget True@ is an icon that denotes that something™ has a comment -commentWidget True = [whamlet||] -commentWidget False = mempty diff --git a/src/Handler/Utils/Table/Cells.hs b/src/Handler/Utils/Table/Cells.hs index 802ae21a2..3a9cf4ce9 100644 --- a/src/Handler/Utils/Table/Cells.hs +++ b/src/Handler/Utils/Table/Cells.hs @@ -12,7 +12,11 @@ import Handler.Utils type CourseLink = (TermId, SchoolId, CourseShorthand) -- TODO: Refactor with WithHoles ! --------------------- +---------------- +-- Some basic cells are defined in Handler.Utils.Table.Pagination +-- such as: i18nCell, cellTooltip, anchorCell for links, etc. + +---------------- -- Special cells tellCell :: (Monoid a, IsDBTable m a) => a -> DBCell m a -> DBCell m a @@ -27,6 +31,19 @@ indicatorCell = writerCell . tell $ Any True writerCell :: IsDBTable m w => WriterT w m () -> DBCell m w writerCell act = mempty & cellContents %~ (<* act) +--------------------- +-- Icon cells + +tickmarkCell :: (IsDBTable m a) => Bool -> DBCell m a +tickmarkCell = cell . toWidget . hasTickmark + +commentCell :: IsDBTable m a => Maybe (Route UniWorX) -> DBCell m a +commentCell Nothing = mempty +commentCell (Just link) = anchorCell link icon + where icon = toWidget $ hasComment True + + +----------------- -- Datatype cells timeCell :: IsDBTable m a => UTCTime -> DBCell m a timeCell t = cell $ formatTime SelFormatDateTime t >>= toWidget @@ -128,10 +145,3 @@ correctorStateCell sc = correctorLoadCell :: IsDBTable m a => SheetCorrector -> DBCell m a correctorLoadCell sc = i18nCell $ sheetCorrectorLoad sc - - -commentCell :: IsDBTable m a => Maybe (Route UniWorX) -> DBCell m a -commentCell Nothing = mempty -commentCell (Just link) = anchorCell link icon - where - icon = commentWidget True diff --git a/src/Handler/Utils/Table/Pagination.hs b/src/Handler/Utils/Table/Pagination.hs index b5b36fdcf..67e5a3f46 100644 --- a/src/Handler/Utils/Table/Pagination.hs +++ b/src/Handler/Utils/Table/Pagination.hs @@ -23,7 +23,7 @@ module Handler.Utils.Table.Pagination , widgetColonnade, formColonnade, dbColonnade , cell, textCell, stringCell, i18nCell , anchorCell, anchorCell', anchorCellM, anchorCellM' - , tickmarkCell, cellTooltip + , cellTooltip , listCell , formCell, DBFormResult, getDBFormResult , dbRow, dbSelect @@ -780,7 +780,8 @@ pagesizeField psLim = selectField $ do return . toOptionList . toNullable $ pagesizeOptions psLim ---- DBCell utility functions +--------------------------------------------------------------- +--- DBCell utility functions, more in Handler.Utils.Table.Cells cell :: IsDBTable m a => Widget -> DBCell m a cell wgt = dbCell # ([], return wgt) @@ -794,10 +795,6 @@ i18nCell msg = cell $ do mr <- getMessageRender toWidget $ mr msg -tickmarkCell :: (IsDBTable m a) => Bool -> DBCell m a -tickmarkCell True = textCell (tickmark :: Text) -tickmarkCell False = mempty - cellTooltip :: (RenderMessage UniWorX msg, IsDBTable m a) => msg -> DBCell m a -> DBCell m a cellTooltip msg = cellContents.mapped %~ (<> tipWdgt) where @@ -807,7 +804,6 @@ cellTooltip msg = cellContents.mapped %~ (<> tipWdgt)
_{msg} |] - anchorCell :: IsDBTable m a => Route UniWorX -> Widget -> DBCell m a anchorCell = anchorCellM . return diff --git a/src/Utils.hs b/src/Utils.hs index d5dee863e..a523c723b 100644 --- a/src/Utils.hs +++ b/src/Utils.hs @@ -123,17 +123,51 @@ instance HasRoute site (SomeRoute site) where urlRoute (SomeRoute url) = urlRoute url +-- | A @Widget@ for any site; no language interpolation, etc. +type WidgetSiteless = forall site. forall m. (MonadIO m, MonadThrow m, MonadBaseControl IO m) + => WidgetT site m () + + +----------- +-- Icons -- +----------- + +isVisible :: Bool -> Markup +-- ^ Display an icon that denotes that something™ is visible or invisible +isVisible True = [shamlet||] +isVisible False = [shamlet||] +-- +-- For documentation on how to avoid these unneccessary functions +-- we implement them here just once for the first icon: +-- +isVisibleWidget :: Bool -> WidgetSiteless +-- ^ Widget having an icon that denotes that something™ is visible or invisible +isVisibleWidget = toWidget . isVisible + +maybeIsVisibleWidget :: Maybe Bool -> WidgetSiteless +-- ^ Maybe a widget with an icon that denotes that something™ is visible or invisible +maybeIsVisibleWidget = toWidget . foldMap isVisible + +-- Other _frequently_ used icons: +hasComment :: Bool -> Markup +-- ^ Display an icon that denotes that something™ has a comment or not +hasComment True = [shamlet||] +hasComment False = [shamlet||] -- comment-alt-slash is not available for free + +hasTickmark :: Bool -> Markup +-- ^ Display an icon that denotes that something™ is okay +hasTickmark True = [shamlet||] +hasTickmark False = mempty + --------------------- -- Text and String -- --------------------- -tickmark :: IsString a => a -tickmark = fromString "✔" --- Avoid annoying warnings: -tickmarkS :: String -tickmarkS = tickmark -tickmarkT :: Text -tickmarkT = tickmark +-- DEPRECATED: use hasTickmark instead; +-- maybe reinstate if needed for @bewertung.txt@ files + +-- tickmark :: IsString a => a +-- tickmark = fromString "✔" text2Html :: Text -> Html text2Html = toHtml -- prevents ambiguous types diff --git a/templates/adminTest.hamlet b/templates/adminTest.hamlet index 8290759e6..240f2dbf8 100644 --- a/templates/adminTest.hamlet +++ b/templates/adminTest.hamlet @@ -37,4 +37,4 @@
  • ^{modal "Email-Test" (Right emailWidget')}
  • - ^{visibleWidget False} + Some icons: ^{isVisible False} ^{hasComment True} diff --git a/templates/data-protection-de.hamlet b/templates/data-protection-de.hamlet index 73fae7c7b..f65090713 100644 --- a/templates/data-protection-de.hamlet +++ b/templates/data-protection-de.hamlet @@ -1,7 +1,6 @@
    -$#

    Stand -$#

    Version 0.91 vom 22.5.2018 +

    Stand 19.02.2019

    Die LMU unterliegt als Körperschaft des öffentlichen Rechts dem bayerischen Datenschutzgesetz, in einigen Bereichen dem Bundesdatenschutzgesetz, diff --git a/templates/infoLecturer.hamlet b/templates/infoLecturer.hamlet index 12ff31f87..c66d27f1d 100644 --- a/templates/infoLecturer.hamlet +++ b/templates/infoLecturer.hamlet @@ -1,40 +1,79 @@ UniWorX erfahrene Veranstalter finden hier die wichtigsten Neuerungen. +

    +

    Bekannte Probleme in Bearbeitung + +
    + $# + $# MOVE ITEM TO SECTION "VERANSTALTUNGEN", once it is implemented: + $# +
    Kurs Assistenten +
    + Momentan ist leider nur ein Dozent/Veranstalter pro Kurs erlaubt. + +

    +

    Folgendes ist in Vorbereitung: + Kurs-Veranstalter dürfen beliebige Personen + ebenfalls zu Veranstaltern des Kurses machen. + + Innerhalb des Kurses haben alle Kurs-Veranstalter die + gleichen Befugnisse und können insbesondere auch die + Liste der Veranstalter dieses Kurses bearbeiten. + +

    +

    Unterschied zu UniWorX: + + In Uni2work gibt es die Rollen "Dozent" + und "Veranstalter": + Dozenten dürfen im Wesentlichen neue Kurse erstellen. + Veranstalter haben vollen Zugriff auf einen speziellen Kurs. + + Die Dozenten Berechtigung wird nach Instituten unterschieden. + +

    + In UniWorX gab es die Rolle "Assistent", + d.h. alle "Veranstalter" mussten auch "Dozent" sein; + eine Unterscheidung nach Instituten gab es nicht. + +

    Kurs Teilnehmer +
    + Anzeige und Benachrichtigung angemeldeter + Kurs-Teilnehmer ist leider noch nicht fertig implementiert. + Voraussichtlich vor Start des Sommersemesters 2019 verfügbar. + +

    Veranstaltungen
    Kurskürzel
    - Alle Veranstaltungen müssen ein Kürzel zur Identifikation besitzen, - z.B. EiP, ProMo, SysPrak, etc. -
    - Das Kürzel muss innerhalb Institut und Semester eindeutig sein. +

    + Alle Veranstaltungen müssen ein Kürzel zur Identifikation besitzen, + z.B. EiP, ProMo, SysPrak, etc. +

    + Das Kürzel muss innerhalb Institut und Semester eindeutig sein.

    Kurse klonen
    - Veranstalter können alle Kurse Ihres Instituts für das aktuelle Semesters klonen. -
    - Dabei werden vor allem Kurskürzel und die Kursbeschreibung übernommen; - nicht jedoch Übungsblätter, Klausuren oder Anmeldungen. -
    - Die Kursbeschreibung kann in Html verfasst werden und - sollte die Modulbeschreibung enthalten! +

    + Veranstalter können alle Kurse Ihres Instituts für das aktuelle Semesters klonen. -

    Passwort -
    Die Anmeldung zum Kurs kann durch ein Passwort geschützt werden. + Dabei werden vor allem Kurskürzel und die Kursbeschreibung übernommen; + nicht jedoch Übungsblätter, Klausuren oder Anmeldungen. + + Die Kursbeschreibung kann in Html verfasst werden und + sollte die Modulbeschreibung enthalten!
    Materialzugriff
    Der Zugriff auf Übungsblätter, Folien und andere Materialien kann von der Anmeldung zum Kurs abhängig gemacht werden. -
    Teilnehmer -
    - Anzeige und Benachrichtigung angemeldeter - Teilnehmer ist leider noch nicht fertig implementiert. - Voraussichtlich noch vor Start des Sommersemesters 2019 verfügbar. +
    Kurs Passwort +
    Die Anmeldung zum Kurs kann durch ein Passwort geschützt werden. +

    Übungsbetrieb @@ -53,7 +92,7 @@ hier die wichtigsten Neuerungen.
    Verteilung
    Korrektoren können pro Blatt auch als Abwesend oder Entschuldigt - markiert werden und bekommen dann keine Abgaben zugeteilt. + markiert werden und bekommen dann keine Abgaben automatisch zugeteilt. Abwesende Korrektoren bekommen in späteren Blättern mehr Abgaben zugeteilt, entsprechend ihres @@ -75,15 +114,19 @@ hier die wichtigsten Neuerungen.
    Sichtbarkeit
    Übungsblätter können bis zu einem Datum vor den Teilnehmern versteckt werden. +

    + Die Aufgabenstellung ist erst mit Eröffnung der Abgabe erhältlich, + so wie bisher in UniWorX auch.

    Zeitstempel
    - Alle Dateien eines Übungsblattes sind mit einem - für Teilnehmer sichtbaren Zeitstempel versehen. -
    - Eine visuelle Hervorhebung geänderter/neuer Dateien - und entsprechende Benachrichtigungen sind geplant, - aber noch nicht verfügbar. +

    + Alle Dateien eines Übungsblattes sind mit einem + für Teilnehmer sichtbaren Zeitstempel versehen. +

    + Eine visuelle Hervorhebung geänderter/neuer Dateien + und entsprechende Benachrichtigungen sind geplant, + aber noch nicht verfügbar.

    Übungsgruppen
    diff --git a/templates/widgets/rating/rating.hamlet b/templates/widgets/rating/rating.hamlet index 366769452..5c42595e2 100644 --- a/templates/widgets/rating/rating.hamlet +++ b/templates/widgets/rating/rating.hamlet @@ -18,4 +18,4 @@ $maybe points <- submissionRatingPoints _{MsgNotPassed} , _{SheetTypeHeader sheetType} $nothing - #{tickmarkS} + #{hasTickmark True}