Code clean; abandoned utf8 tickmark in favour of font-awesome checkmark
This commit is contained in:
parent
8d29354818
commit
0938d93039
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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{..},_) ->
|
||||
|
||||
@ -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|<i .fas .fa-eye-slash>|]
|
||||
|
||||
isVisibleWidget :: Bool -> Widget
|
||||
-- ^ @visibleWidget True@ is an icon that denotes that something™ is visible
|
||||
isVisibleWidget True = [whamlet|<i .fas .fa-eye>|]
|
||||
isVisibleWidget False = mempty
|
||||
|
||||
|
||||
commentWidget :: Bool -> Widget
|
||||
-- ^ @commentWidget True@ is an icon that denotes that something™ has a comment
|
||||
commentWidget True = [whamlet|<i .fas .fa-comment-alt>|]
|
||||
commentWidget False = mempty
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
<div .tooltip__content>_{msg}
|
||||
|]
|
||||
|
||||
|
||||
anchorCell :: IsDBTable m a => Route UniWorX -> Widget -> DBCell m a
|
||||
anchorCell = anchorCellM . return
|
||||
|
||||
|
||||
48
src/Utils.hs
48
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|<i .fas .fa-eye>|]
|
||||
isVisible False = [shamlet|<i .fas .fa-eye-slash>|]
|
||||
--
|
||||
-- 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|<i .fas .fa-comment-alt>|]
|
||||
hasComment False = [shamlet|<i .fas .fa-comment-slash>|] -- comment-alt-slash is not available for free
|
||||
|
||||
hasTickmark :: Bool -> Markup
|
||||
-- ^ Display an icon that denotes that something™ is okay
|
||||
hasTickmark True = [shamlet|<i .fas .fa-check>|]
|
||||
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
|
||||
|
||||
@ -37,4 +37,4 @@
|
||||
<li>
|
||||
^{modal "Email-Test" (Right emailWidget')}
|
||||
<li>
|
||||
^{visibleWidget False}
|
||||
Some icons: ^{isVisible False} ^{hasComment True}
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
<div .container>
|
||||
<section>
|
||||
$# <h2>Stand
|
||||
$# <h3>Version 0.91 vom 22.5.2018
|
||||
<h2>Stand 19.02.2019
|
||||
<p>
|
||||
Die LMU unterliegt als Körperschaft des öffentlichen Rechts dem
|
||||
bayerischen Datenschutzgesetz, in einigen Bereichen dem Bundesdatenschutzgesetz,
|
||||
|
||||
@ -1,40 +1,79 @@
|
||||
|
||||
UniWorX erfahrene Veranstalter finden
|
||||
hier die wichtigsten Neuerungen.
|
||||
<section>
|
||||
<h2>Bekannte Probleme in Bearbeitung
|
||||
|
||||
<dl .deflist>
|
||||
$#
|
||||
$# MOVE ITEM TO SECTION "VERANSTALTUNGEN", once it is implemented:
|
||||
$#
|
||||
<dt .deflist__dt> Kurs Assistenten
|
||||
<dd .deflist__dd>
|
||||
Momentan ist leider nur ein Dozent/Veranstalter pro Kurs erlaubt.
|
||||
|
||||
<p>
|
||||
<h4>Folgendes ist in Vorbereitung:
|
||||
Kurs-Veranstalter dürfen <em>beliebige</em> 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.
|
||||
|
||||
<p>
|
||||
<h4>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.
|
||||
|
||||
<p>
|
||||
In UniWorX gab es die Rolle "Assistent",
|
||||
d.h. alle "Veranstalter" mussten auch "Dozent" sein;
|
||||
eine Unterscheidung nach Instituten gab es nicht.
|
||||
|
||||
<dt .deflist__dt> Kurs Teilnehmer
|
||||
<dd .deflist__dd>
|
||||
Anzeige und Benachrichtigung angemeldeter
|
||||
Kurs-Teilnehmer ist leider noch nicht fertig implementiert.
|
||||
Voraussichtlich vor Start des Sommersemesters 2019 verfügbar.
|
||||
|
||||
|
||||
<section>
|
||||
<h2>Veranstaltungen
|
||||
|
||||
<dl .deflist>
|
||||
<dt .deflist__dt> Kurskürzel
|
||||
<dd .deflist__dd>
|
||||
Alle Veranstaltungen müssen ein Kürzel zur Identifikation besitzen,
|
||||
z.B. EiP, ProMo, SysPrak, etc.
|
||||
<br>
|
||||
Das Kürzel muss innerhalb Institut und Semester eindeutig sein.
|
||||
<p>
|
||||
Alle Veranstaltungen müssen ein Kürzel zur Identifikation besitzen,
|
||||
z.B. EiP, ProMo, SysPrak, etc.
|
||||
<p>
|
||||
Das Kürzel muss innerhalb Institut und Semester eindeutig sein.
|
||||
|
||||
<dt .deflist__dt> Kurse klonen
|
||||
<dd .deflist__dd>
|
||||
Veranstalter können <em>alle</em> Kurse Ihres Instituts für das aktuelle Semesters klonen.
|
||||
<br>
|
||||
Dabei werden vor allem Kurskürzel und die Kursbeschreibung übernommen;
|
||||
nicht jedoch Übungsblätter, Klausuren oder Anmeldungen.
|
||||
<br>
|
||||
Die Kursbeschreibung kann in Html verfasst werden und
|
||||
<em>sollte die Modulbeschreibung enthalten!
|
||||
<p>
|
||||
Veranstalter können <em>alle</em> Kurse Ihres Instituts für das aktuelle Semesters klonen.
|
||||
|
||||
<dt .deflist__dt> Passwort
|
||||
<dd .deflist__dd> 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.
|
||||
<pr>
|
||||
Die Kursbeschreibung kann in Html verfasst werden und
|
||||
<em>sollte die Modulbeschreibung enthalten!
|
||||
|
||||
<dt .deflist__dt> Materialzugriff
|
||||
<dd .deflist__dd>
|
||||
Der Zugriff auf Übungsblätter, Folien und andere Materialien
|
||||
kann von der Anmeldung zum Kurs abhängig gemacht werden.
|
||||
|
||||
<dt .deflist__dt> Teilnehmer
|
||||
<dd .deflist__dd>
|
||||
Anzeige und Benachrichtigung angemeldeter
|
||||
Teilnehmer ist leider noch nicht fertig implementiert.
|
||||
Voraussichtlich noch vor Start des Sommersemesters 2019 verfügbar.
|
||||
<dt .deflist__dt> Kurs Passwort
|
||||
<dd .deflist__dd> Die Anmeldung zum Kurs kann durch ein Passwort geschützt werden.
|
||||
|
||||
|
||||
<section>
|
||||
<h2>Übungsbetrieb
|
||||
@ -53,7 +92,7 @@ hier die wichtigsten Neuerungen.
|
||||
<dt .deflist__dt> Verteilung
|
||||
<dd .deflist__dd>
|
||||
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.
|
||||
<dt .deflist__dt> Sichtbarkeit
|
||||
<dd .deflist__dd>
|
||||
Übungsblätter können bis zu einem Datum vor den Teilnehmern versteckt werden.
|
||||
<p>
|
||||
Die Aufgabenstellung ist erst mit Eröffnung der Abgabe erhältlich,
|
||||
so wie bisher in UniWorX auch.
|
||||
|
||||
<dt .deflist__dt> Zeitstempel
|
||||
<dd .deflist__dd>
|
||||
Alle Dateien eines Übungsblattes sind mit einem
|
||||
für Teilnehmer sichtbaren Zeitstempel versehen.
|
||||
<br>
|
||||
Eine visuelle Hervorhebung geänderter/neuer Dateien
|
||||
und entsprechende Benachrichtigungen sind geplant,
|
||||
aber noch nicht verfügbar.
|
||||
<p>
|
||||
Alle Dateien eines Übungsblattes sind mit einem
|
||||
für Teilnehmer sichtbaren Zeitstempel versehen.
|
||||
<p>
|
||||
Eine visuelle Hervorhebung geänderter/neuer Dateien
|
||||
und entsprechende Benachrichtigungen sind geplant,
|
||||
aber noch nicht verfügbar.
|
||||
|
||||
<dt .deflist__dt> Übungsgruppen
|
||||
<dd .deflist__dd>
|
||||
|
||||
@ -18,4 +18,4 @@ $maybe points <- submissionRatingPoints
|
||||
_{MsgNotPassed}
|
||||
, _{SheetTypeHeader sheetType}
|
||||
$nothing
|
||||
#{tickmarkS}
|
||||
#{hasTickmark True}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user