chore(qualification): finish qualification edit handler
This commit is contained in:
parent
b26dd285df
commit
cf8fc90db7
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
# SPDX-FileCopyrightText: 2022-25 Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -7,20 +7,24 @@ QualificationName: Qualifikation
|
|||||||
QualificationDescription: Beschreibung
|
QualificationDescription: Beschreibung
|
||||||
QualificationValidIndicator: Gültigkeit
|
QualificationValidIndicator: Gültigkeit
|
||||||
QualificationValidDuration: Gültigkeitsdauer
|
QualificationValidDuration: Gültigkeitsdauer
|
||||||
QualificationAuditDuration: Aufbewahrung Audit Log
|
QualificationAuditDuration: Aufbewahrungszeitraum E‑Learning Log
|
||||||
QualificationAuditDurationTooltip n@Int: Optionaler Zeitraum zur Löschung von E‑Learning Daten. Hinweis: Der E‑Learning Server kann seine anonymisierten Daten schon früher löschen, aber spätestens #{n} Tage nach Abschluss.
|
QualificationAuditDurationTooltip n@Int: Optionaler Zeitraum zur Löschung von E‑Learning Daten. Hinweis: Der E‑Learning Server kann seine anonymisierten Daten schon früher löschen, aber spätestens #{n} Tage nach Abschluss.
|
||||||
QualificationAuditDurationReuseError: Diese Qualifikation nutzt das E‑Learning einer anderen Qualifikation, für die derzeit keinen Löschzeitraum konfiguriert wurde.
|
QualificationAuditDurationReuseNoTime: Diese Qualifikation nutzt das E‑Learning einer anderen Qualifikation, für die derzeit keinen Löschzeitraum konfiguriert wurde.
|
||||||
|
QualificationAuditDurationReuseError: Fehler: Aufbewahrungszeitraum E‑Learning Log kann nicht individuell konfiguriert werden, wenn das E‑Learning einer anderen Qualifikation mitbenutzt wird.
|
||||||
QualificationRefreshWithin: Erneurerungszeitraum
|
QualificationRefreshWithin: Erneurerungszeitraum
|
||||||
QualificationRefreshWithinTooltip: Optionaler Zeitraum vor Ablauf für eine Benachrichtigung per Email. Bei aktiviertem automatischem E‑Learning wird dieses gestartet und die Benachrichtigung erfolgt per Brief oder Email.
|
QualificationRefreshWithinTooltip: Optionaler Zeitraum vor Ablauf für eine Benachrichtigung per Email. Bei aktiviertem automatischem E‑Learning wird dieses gestartet und die Benachrichtigung erfolgt per Brief oder Email.
|
||||||
QualificationRefreshReminder: Zweite Erinnerung
|
QualificationRefreshReminder: Zweite Erinnerung
|
||||||
QualificationRefreshReminderTooltip: Optionaler Zeitraum vor Ablauf zur Versendung einer zweiten Erinnerung per Brief oder Email mit identischen E‑Learning Zugangsdaten, sofern die Qualifikation noch gültig und das E‑Learning noch offen ist.
|
QualificationRefreshReminderTooltip: Optionaler Zeitraum vor Ablauf zur Versendung einer zweiten Erinnerung per Brief oder Email mit identischen E‑Learning Zugangsdaten, sofern die Qualifikation noch gültig und das E‑Learning noch offen ist.
|
||||||
QualificationElearningStart: Wird das E‑Learning automatisch gestartet?
|
QualificationElearningStart: Wird das E‑Learning automatisch gestartet?
|
||||||
QualificationElearningRenew: Verlängert ein erfolgreiches E‑Learning die Qualifikation automatisch um die reguläre Gültigkeitsdauer?
|
QualificationElearningRenew: Verlängert ein erfolgreiches E‑Learning die Qualifikation automatisch um die reguläre Gültigkeitsdauer?
|
||||||
QualificationElearningLimit: Ist die Anzahl der E‑Learning Versuche limitiert?
|
QualificationElearningLimit: Limit Anzahl E‑Learning Versuche
|
||||||
|
QualificationElearningLimitExplain: Ist die Anzahl der E‑Learning Versuche limitiert?
|
||||||
QualificationElearningLimitMax n@Int: Maximal #{n} Versuche
|
QualificationElearningLimitMax n@Int: Maximal #{n} Versuche
|
||||||
QualificationElearningNoLimit: Nicht limitiert
|
QualificationElearningNoLimit: Nicht limitiert
|
||||||
QualificationExpiryNotification: Ungültigkeitsbenachrichtigung?
|
QualificationExpiryNotification: Ungültigkeitsbenachrichtigung?
|
||||||
QualificationExpiryNotificationTooltip: Nutzer werden benachrichtigt, wenn die Qualifikation ungültig wird, sofern der jeweilige Nutzer in seinen Benutzereinstellungen diese Art Benachrichtigung aktiviert hat.
|
QualificationExpiryNotificationTooltip: Nutzer werden benachrichtigt, wenn die Qualifikation ungültig wird, sofern der jeweilige Nutzer in seinen Benutzereinstellungen diese Art Benachrichtigung nicht deaktiviert hat.
|
||||||
|
QualificationAvsLicence: AVS Qualifikation
|
||||||
|
QualificationSapId: SAP Qualifikations Id
|
||||||
TableQualificationCountActive: Aktive
|
TableQualificationCountActive: Aktive
|
||||||
TableQualificationCountActiveTooltip: Anzahl Personen mit momentan gültiger Qualifikation
|
TableQualificationCountActiveTooltip: Anzahl Personen mit momentan gültiger Qualifikation
|
||||||
TableQualificationCountTotal: Gesamt
|
TableQualificationCountTotal: Gesamt
|
||||||
@ -98,8 +102,8 @@ LmsReportInsert: Neues LMS Ereignis
|
|||||||
LmsReportUpdate: LMS Ereignis Aktualisierung
|
LmsReportUpdate: LMS Ereignis Aktualisierung
|
||||||
LmsReportCsvExceptionDuplicatedKey: CSV-Import LmsReport fand uneindeutigen Schlüssel
|
LmsReportCsvExceptionDuplicatedKey: CSV-Import LmsReport fand uneindeutigen Schlüssel
|
||||||
LmsDirectUpload: Direkter Upload für automatisierte Systeme
|
LmsDirectUpload: Direkter Upload für automatisierte Systeme
|
||||||
LmsErrorNoRefreshElearning: Fehler: E‑Learning wird nicht automatisch gestartet, da die Zeitspanne für den Erneurerungszeitraum nicht festgelegt wurde!
|
LmsErrorNoRefreshElearning: Fehler: E‑Learning wird nicht automatisch gestartet, da die Zeitspanne für den Erneuerungszeitraum nicht festgelegt wurde!
|
||||||
LmsErrorNoRenewElearning: Fehler: Erfoglreiches E‑Learning verlängert die Qualifikation nicht automatisch, da die Gültigkeitsdauer nicht festgelegt wurde!
|
LmsErrorNoRenewElearning: Fehler: Erfolgreiches E‑Learning verlängert die Qualifikation nicht automatisch, da die Gültigkeitsdauer nicht festgelegt wurde!
|
||||||
MailSubjectQualificationRenewal qname@Text: Qualifikation #{qname} muss demnächst erneuert werden
|
MailSubjectQualificationRenewal qname@Text: Qualifikation #{qname} muss demnächst erneuert werden
|
||||||
MailSubjectQualificationExpiry qname@Text: Qualifikation #{qname} läuft demnächst ab
|
MailSubjectQualificationExpiry qname@Text: Qualifikation #{qname} läuft demnächst ab
|
||||||
MailSubjectQualificationExpired qname@Text: Qualifikation #{qname} ist ab sofort ungültig
|
MailSubjectQualificationExpired qname@Text: Qualifikation #{qname} ist ab sofort ungültig
|
||||||
@ -147,3 +151,10 @@ LmsActionFailed n@Int: Aktion nicht durchgeführt für #{n} #{pluralDE n "Person
|
|||||||
LmsStarted: E‑Learning eröffnet
|
LmsStarted: E‑Learning eröffnet
|
||||||
BtnLmsEnqueue: Nutzer mit ablaufenden Qualifikationen zum E‑Learning anmelden und benachrichtigen
|
BtnLmsEnqueue: Nutzer mit ablaufenden Qualifikationen zum E‑Learning anmelden und benachrichtigen
|
||||||
BtnLmsDequeue: Nutzer mit beendetem E‑Learning aufräumen und ggf. benachrichtigen
|
BtnLmsDequeue: Nutzer mit beendetem E‑Learning aufräumen und ggf. benachrichtigen
|
||||||
|
|
||||||
|
QualificationEditNote: Hinweis: Die Änderungen treten sofort in Kraft. Bitte vergewissern Sie sich vorher, dass alles korrekt eingestellt wurde!
|
||||||
|
QualificationCreated qsh@Text: Qualifikation #{qsh} wurde angelegt.
|
||||||
|
QualificationEdit qsh@Text: Qualifikation #{qsh} wurde geändert.
|
||||||
|
QualFormErrorDuplShort qsh@Text: Es gibt bereits eine Qualifikation mit Kürzel #{qsh}!
|
||||||
|
QualFormErrorDuplName qname@Text: Es gibt bereits eine Qualifikation mit Namen #{qname}!
|
||||||
|
QualFormErrorSshMismatch: Qualifikationänderungsformular enthält unglültige Institutsangabe. Bitte versuchen Sie erneut, nachdem Sie Seite neu geladen haben.
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
# SPDX-FileCopyrightText: 2022-25 Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -9,18 +9,22 @@ QualificationValidIndicator: Validity
|
|||||||
QualificationValidDuration: Validity period
|
QualificationValidDuration: Validity period
|
||||||
QualificationAuditDuration: Audit log retention period
|
QualificationAuditDuration: Audit log retention period
|
||||||
QualificationAuditDurationTooltip n@Int: Optional period for deletion of e‑learning data. Note that the e‑learning server may delete its anonymised data earlier, at most #{n} days after closing.
|
QualificationAuditDurationTooltip n@Int: Optional period for deletion of e‑learning data. Note that the e‑learning server may delete its anonymised data earlier, at most #{n} days after closing.
|
||||||
QualificationAuditDurationReuseError: This qualification reuses the e‑learning from another qualification, which has no audit duration configured.
|
QualificationAuditDurationReuseNoTime: This qualification reuses the e‑learning from another qualification, which has no audit duration configured.
|
||||||
|
QualificationAuditDurationReuseError: Error: Audit log retention period may not be configure when reusing the e‑learning from another qualification.
|
||||||
QualificationRefreshWithin: Refresh within
|
QualificationRefreshWithin: Refresh within
|
||||||
QualificationRefreshWithinTooltip: Optional period before expiry to send a notification by email. If e‑learning is set to start automatically, it will be started and e‑learning credentials are send with this notification by post or email.
|
QualificationRefreshWithinTooltip: Optional period before expiry to send a notification by email. If e‑learning is set to start automatically, it will be started and e‑learning credentials are send with this notification by post or email.
|
||||||
QualificationRefreshReminder: Second reminder
|
QualificationRefreshReminder: Second reminder
|
||||||
QualificationRefreshReminderTooltip: Optional period before expiry to send a second notification by post or email once more, including the existing credentials, provided that the e‑learning is still undecided and the qualification has not yet expired.
|
QualificationRefreshReminderTooltip: Optional period before expiry to send a second notification by post or email once more, including the existing credentials, provided that the e‑learning is still undecided and the qualification has not yet expired.
|
||||||
QualificationElearningStart: Is e‑learning automatically started?
|
QualificationElearningStart: Is e‑learning automatically started?
|
||||||
QualificationElearningRenew: Does successful e‑learning automatically extend a qualification by the default validity period?
|
QualificationElearningRenew: Does successful e‑learning automatically extend a qualification by the default validity period?
|
||||||
QualificationElearningLimit: Is the number of e‑learning attempts limited?
|
QualificationElearningLimit: Limit of e‑learning attempts
|
||||||
|
QualificationElearningLimitExplain: Is the number of e‑learning attempts limited?
|
||||||
QualificationElearningLimitMax n: #{n} attempts maximum
|
QualificationElearningLimitMax n: #{n} attempts maximum
|
||||||
QualificationElearningNoLimit: No limit
|
QualificationElearningNoLimit: No limit
|
||||||
QualificationExpiryNotification: Invalidity notification?
|
QualificationExpiryNotification: Notification upon invalidation?
|
||||||
QualificationExpiryNotificationTooltip: Qualification holder are notfied upon invalidity, provided they have activated such notification in their user settings.
|
QualificationExpiryNotificationTooltip: Qualification holder are notfied upon invalidation, provided they have not deactivated such notification in their user settings.
|
||||||
|
QualificationAvsLicence: AVS Qualification
|
||||||
|
QualificationSapId: SAP Qualification Id
|
||||||
TableQualificationCountActive: Active
|
TableQualificationCountActive: Active
|
||||||
TableQualificationCountActiveTooltip: Number of currently valid qualification holders
|
TableQualificationCountActiveTooltip: Number of currently valid qualification holders
|
||||||
TableQualificationCountTotal: Total
|
TableQualificationCountTotal: Total
|
||||||
@ -147,3 +151,10 @@ LmsActionFailed n: No action for #{n} #{pluralENs n "person"}, since there was n
|
|||||||
LmsStarted: E‑learning open since
|
LmsStarted: E‑learning open since
|
||||||
BtnLmsEnqueue: Enqueue users with expiring qualifications for e‑learning and notify them
|
BtnLmsEnqueue: Enqueue users with expiring qualifications for e‑learning and notify them
|
||||||
BtnLmsDequeue: Dequeue users with finished e‑learning and notify failed users
|
BtnLmsDequeue: Dequeue users with finished e‑learning and notify failed users
|
||||||
|
|
||||||
|
QualificationEditNote: Changes are effective immediately. Please double check that all settings are correct before submitting the changes!
|
||||||
|
QualificationCreated qsh@Text: Qualification #{qsh} created.
|
||||||
|
QualificationEdit qsh@Text: Qualification #{qsh} edited.
|
||||||
|
QualFormErrorDuplShort qsh@Text: There already exists a qualification with shorthand #{qsh}!
|
||||||
|
QualFormErrorDuplName qname@Text: There already exists a qualification with name #{qname}!
|
||||||
|
QualFormErrorSshMismatch: Qualification edit form data mismatch on institute detected. Please try again after reloading the page.
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2023 Steffen Jost <jost@tcs.ifi.lmu.de>,Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>
|
# SPDX-FileCopyrightText: 2023-25 Steffen Jost <jost@tcs.ifi.lmu.de>,Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -104,6 +104,7 @@ UtilNoneSet: Keine angegeben
|
|||||||
UtilEmptyChoice: Auswahl war leer
|
UtilEmptyChoice: Auswahl war leer
|
||||||
UtilEmptyNoChangeTip: Eine leere Eingabe belässt den vorherigen Wert unverändert.
|
UtilEmptyNoChangeTip: Eine leere Eingabe belässt den vorherigen Wert unverändert.
|
||||||
MultiNoSelection: Keine Auswahl
|
MultiNoSelection: Keine Auswahl
|
||||||
|
MustBePositive: muss positiv sein
|
||||||
|
|
||||||
#invitation.hs
|
#invitation.hs
|
||||||
InvitationAction: Aktion
|
InvitationAction: Aktion
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2023 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
# SPDX-FileCopyrightText: 2023-25 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -104,6 +104,7 @@ UtilNoneSet: None set
|
|||||||
UtilEmptyChoice: Empty selection
|
UtilEmptyChoice: Empty selection
|
||||||
UtilEmptyNoChangeTip: Existing values remain unchanged if this field is left empty.
|
UtilEmptyNoChangeTip: Existing values remain unchanged if this field is left empty.
|
||||||
MultiNoSelection: No selection
|
MultiNoSelection: No selection
|
||||||
|
MustBePositive: must be positive
|
||||||
|
|
||||||
#invitation.hs
|
#invitation.hs
|
||||||
InvitationAction: Action
|
InvitationAction: Action
|
||||||
|
|||||||
@ -4,21 +4,21 @@
|
|||||||
|
|
||||||
Qualification
|
Qualification
|
||||||
-- INVARIANT: 2*refreshWithin < validDuration
|
-- INVARIANT: 2*refreshWithin < validDuration
|
||||||
school SchoolId --TODO: Ansprechpartner der Schule in Briefe erwähnen
|
school SchoolId -- 1
|
||||||
shorthand (CI Text)
|
shorthand (CI Text) -- 2
|
||||||
name (CI Text)
|
name (CI Text) -- 3
|
||||||
description StoredMarkup Maybe -- user-defined large Html, ought to contain full description
|
description StoredMarkup Maybe -- 4 user-defined large Html, ought to contain full description
|
||||||
validDuration Int Maybe -- > 0, qualification is valid indefinitely or for a specified number of months, use with addMonthsDay
|
validDuration Int Maybe -- 5 if > 0, qualification is valid indefinitely or for a specified number of months, use with addMonthsDay
|
||||||
auditDuration Int Maybe -- > 0, number of months to keep audit log and LmsUserIdents; or indefinitely (dangerous, since LmsIdents may run out)
|
auditDuration Int Maybe -- 6 if > 0, number of months to keep audit log and LmsUserIdents; or indefinitely (dangerous, since LmsIdents may run out)
|
||||||
refreshWithin CalendarDiffDays Maybe -- notify users about renewal within this number of month/days before expiry; to be used with addGregorianDurationClip
|
refreshWithin CalendarDiffDays Maybe -- 7 notify users about renewal within this number of month/days before expiry; to be used with addGregorianDurationClip
|
||||||
refreshReminder CalendarDiffDays Maybe -- send a second notification about renewal within this number of month/days before expiry
|
refreshReminder CalendarDiffDays Maybe -- 8 send a second notification about renewal within this number of month/days before expiry
|
||||||
elearningStart Bool -- automatically schedule e-refresher
|
elearningStart Bool -- 9 automatically schedule e-refresher
|
||||||
elearningRenews Bool default=true -- successful e-learing automatically increases validity automatically by validDuration
|
elearningRenews Bool default=true -- 10 successful e-learing automatically increases validity automatically by validDuration
|
||||||
elearningLimit Int Maybe -- limit of e-learning attempts, currently only for informative purposes, as it is enforced by LMS only
|
elearningLimit Int Maybe -- 11 limit of e-learning attempts, currently only for informative purposes, as it is enforced by LMS only
|
||||||
lmsReuses QualificationId Maybe -- if set, lms is also included within the given qualification's lms, but only for direct routes. AuditDuration is used from this Qualification instead.
|
lmsReuses QualificationId Maybe -- 12 if set, lms is also included within the given qualification's lms, but only for direct routes. AuditDuration is used from this Qualification instead.
|
||||||
expiryNotification Bool default=true -- should expiryNotification be generated for this qualification?
|
expiryNotification Bool default=true -- 13 should expiryNotification be generated for this qualification?
|
||||||
avsLicence AvsLicence Maybe -- if set, valid QualificationUsers are synchronized to AVS as a driving licence
|
avsLicence AvsLicence Maybe -- 14 if set, valid QualificationUsers are synchronized to AVS as a driving licence
|
||||||
sapId Text Maybe -- if set, valid QualificationUsers with userCompanyPersonalNumber are transmitted via SAP interface under this id
|
sapId Text Maybe -- 15 if set, valid QualificationUsers with userCompanyPersonalNumber are transmitted via SAP interface under this id
|
||||||
SchoolQualificationShort school shorthand -- must be unique per school and shorthand
|
SchoolQualificationShort school shorthand -- must be unique per school and shorthand
|
||||||
SchoolQualificationName school name -- must be unique per school and name
|
SchoolQualificationName school name -- must be unique per school and name
|
||||||
-- across all schools, only one qualification may be a driving licence -- NO LONGER TRUE
|
-- across all schools, only one qualification may be a driving licence -- NO LONGER TRUE
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
-- SPDX-FileCopyrightText: 2022-24 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
-- SPDX-FileCopyrightText: 2022-25 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||||
--
|
--
|
||||||
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ mkLmsAllTable isAdmin lmsDeletionDays = do
|
|||||||
foldMap (textCell . formatCalendarDiffDays . fromMonths) . view (resultAllQualification . _qualificationAuditDuration)
|
foldMap (textCell . formatCalendarDiffDays . fromMonths) . view (resultAllQualification . _qualificationAuditDuration)
|
||||||
, sortable (Just "qel-renew") (i18nCell MsgTableLmsElearningRenews & cellTooltip MsgQualificationElearningRenew)
|
, sortable (Just "qel-renew") (i18nCell MsgTableLmsElearningRenews & cellTooltip MsgQualificationElearningRenew)
|
||||||
$ tickmarkCell . view (resultAllQualification . _qualificationElearningRenews)
|
$ tickmarkCell . view (resultAllQualification . _qualificationElearningRenews)
|
||||||
, sortable (Just "qel-limit") (i18nCell MsgTableLmsElearningLimit & cellTooltip MsgQualificationElearningLimit)
|
, sortable (Just "qel-limit") (i18nCell MsgTableLmsElearningLimit & cellTooltip MsgQualificationElearningLimitExplain)
|
||||||
$ cellMaybe numCell . view (resultAllQualification . _qualificationElearningLimit)
|
$ cellMaybe numCell . view (resultAllQualification . _qualificationElearningLimit)
|
||||||
, sortable (Just "qel-reuse") (i18nCell MsgTableQualificationLmsReuses & cellTooltip MsgTableQualificationLmsReusesTooltip)
|
, sortable (Just "qel-reuse") (i18nCell MsgTableQualificationLmsReuses & cellTooltip MsgTableQualificationLmsReusesTooltip)
|
||||||
$ \(view (resultAllQualification . _qualificationLmsReuses) -> reuseQid) -> maybeCell reuseQid qualificationIdShortCell
|
$ \(view (resultAllQualification . _qualificationLmsReuses) -> reuseQid) -> maybeCell reuseQid qualificationIdShortCell
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
-- SPDX-FileCopyrightText: 2022-24 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
-- SPDX-FileCopyrightText: 2022-25 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
--
|
--
|
||||||
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ import Handler.Utils
|
|||||||
import qualified Data.CaseInsensitive as CI
|
import qualified Data.CaseInsensitive as CI
|
||||||
|
|
||||||
import Jobs.Queue
|
import Jobs.Queue
|
||||||
import qualified Control.Monad.State.Class as State
|
-- import qualified Control.Monad.State.Class as State -- for debug only
|
||||||
|
|
||||||
data LRQF = LRQF
|
data LRQF = LRQF
|
||||||
{ lrqfLetter :: Text
|
{ lrqfLetter :: Text
|
||||||
@ -68,8 +68,8 @@ makeRenewalForm tmpl = identifyForm FIDLmsLetter . validateForm validateLetterRe
|
|||||||
|
|
||||||
validateLetterRenewQualification :: FormValidator LRQF Handler ()
|
validateLetterRenewQualification :: FormValidator LRQF Handler ()
|
||||||
validateLetterRenewQualification = do
|
validateLetterRenewQualification = do
|
||||||
LRQF{..} <- State.get
|
-- LRQF{..} <- State.get
|
||||||
liftHandler $ addMessage Warning $ text2Html $ "Validate called:" <> tshow lrqfUser -- DEBUG
|
-- liftHandler $ addMessage Warning $ text2Html $ "Validate called:" <> tshow lrqfUser -- DEBUG
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
lrqf2letter :: LRQF -> DB (Entity User, SomeLetter)
|
lrqf2letter :: LRQF -> DB (Entity User, SomeLetter)
|
||||||
|
|||||||
@ -146,11 +146,6 @@ mkQualificationAllTable isAdmin = do
|
|||||||
dbTable resultDBTableValidator resultDBTable
|
dbTable resultDBTableValidator resultDBTable
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- getQualificationEditR, postQualificationEditR :: SchoolId -> QualificationShorthand -> Handler Html
|
|
||||||
-- getQualificationEditR = postQualificationEditR
|
|
||||||
-- postQualificationEditR = error "TODO"
|
|
||||||
|
|
||||||
data QualificationTableCsv = QualificationTableCsv -- Q..T..C.. -> qtc..
|
data QualificationTableCsv = QualificationTableCsv -- Q..T..C.. -> qtc..
|
||||||
{ qtcDisplayName :: UserDisplayName
|
{ qtcDisplayName :: UserDisplayName
|
||||||
, qtcEmail :: UserEmail
|
, qtcEmail :: UserEmail
|
||||||
|
|||||||
@ -13,6 +13,9 @@ module Handler.Qualification.Edit
|
|||||||
|
|
||||||
import Import
|
import Import
|
||||||
|
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
import qualified Control.Monad.State.Class as State
|
||||||
|
|
||||||
import Handler.Utils
|
import Handler.Utils
|
||||||
-- import Database.Esqueleto.Experimental ((:&)(..))
|
-- import Database.Esqueleto.Experimental ((:&)(..))
|
||||||
-- import qualified Database.Esqueleto.Experimental as E -- needs TypeApplications Lang-Pragma
|
-- import qualified Database.Esqueleto.Experimental as E -- needs TypeApplications Lang-Pragma
|
||||||
@ -29,24 +32,82 @@ postQualificationEditR ssh qsh = do
|
|||||||
handleQualificationEdit ssh $ Just qent
|
handleQualificationEdit ssh $ Just qent
|
||||||
|
|
||||||
|
|
||||||
mkQualificationForm :: Maybe Qualification -> SchoolId -> Qualification
|
mkQualificationForm :: SchoolId -> Maybe Qualification -> Form Qualification
|
||||||
mkQualificationForm templ ssh = renderAForm FormStandard $ Qualification -- to reorder form fiels, use permuteFun on Qualification
|
mkQualificationForm ssh templ = identifyForm FIDQualificationEdit . validateForm (validateQualificationEdit ssh) $ \html ->
|
||||||
<$> areq hiddenField "" (Just ssh)
|
flip (renderAForm FormStandard) html $ reorderedQualification
|
||||||
<*> areq ciField (fslI MsgQualificationShort) (qualificationShorthand <$> templ)
|
<$> areq hiddenField "" (Just ssh) -- 1 -> 1
|
||||||
<*> areq ciField (fslI MsgQualificationName) (qualificationName <$> templ)
|
<*> areq ciField (fslI MsgQualificationShort) (qualificationShorthand <$> templ) -- 2 -> 2
|
||||||
<*> aopt htmlField (fslI MsgQualificationDescription) (qualificationDescription <$> templ)
|
<*> areq ciField (fslI MsgQualificationName) (qualificationName <$> templ) -- 3 -> 3
|
||||||
<*> aopt (posIntFieldI MsgQualificationValidDuration) (fslI MsgQualificationValidDuration) (qualificationValidDuration <$> templ)
|
<*> aopt htmlField (fslI MsgQualificationDescription) (qualificationDescription <$> templ) -- 4 -> 4
|
||||||
<*> aopt (posIntFieldI MsgQualificationAuditDuration) (fslI MsgQualificationAuditDuration) (qualificationAuditDuration <$> templ)
|
<*> aopt_natFieldI MsgQualificationValidDuration (qualificationValidDuration <$> templ) -- 5 -> 5
|
||||||
<*> aopt calendarDiffDaysField (fslI MsgQualificationRefreshWithin) (qualificationRefreshWithin <$> templ)
|
<*> aopt calendarDiffDaysField (fslI MsgQualificationRefreshWithin &
|
||||||
<*> aopt calendarDiffDaysField (fslI MsgQualificationRefreshReminder) (qualificationRefreshReminder <$> templ)
|
setTooltip MsgQualificationRefreshWithinTooltip) (qualificationRefreshWithin <$> templ) -- 6 -> 7
|
||||||
<*> areq checkBoxField (fslI MsgQualificationElearningStart) (qualificationElearningStart <$> templ)
|
|
||||||
<*> areq checkBoxField (fslI MsgTableQualificationElearningRenews) (qualificationElearningRenews <$> templ)
|
<*> areq checkBoxField (fslI MsgQualificationElearningStart) (qualificationElearningStart <$> templ) -- 7 -> 9
|
||||||
<*> aopt (posIntFieldI MsgQualificationElearningLimit)(fslI MsgQualificationElearningLimit) (qualificationElearningLimit <$> templ)
|
<*> aopt calendarDiffDaysField (fslI MsgQualificationRefreshReminder &
|
||||||
<*> aopt (error "TODO") (fslI MsgTableQualificationLmsReuses) (qualificationLmsReuses <$> templ)
|
setTooltip MsgQualificationRefreshReminderTooltip) (qualificationRefreshReminder <$> templ) -- 8 -> 8
|
||||||
<*> areq checkBoxField (fslI MsgQualificationExpiryNotification) (qualificationExpiryNotification <$> templ)
|
<*> areq checkBoxField (fslI MsgQualificationExpiryNotification) (qualificationExpiryNotification <$> templ) -- 9 -> 13
|
||||||
<*> aopt (error "TODO") (fslI MsgQualificationAvsLicence) (qualificationAvsLicence <$> templ)
|
<*> aopt_natFieldI MsgQualificationAuditDuration (qualificationAuditDuration <$> templ) -- 10 -> 6
|
||||||
<*> aopt textField (fslI MsgQualficiationSapId) (qualificationSapId <$> templ)
|
<*> areq checkBoxField (fslI MsgQualificationElearningRenew) (qualificationElearningRenews <$> templ) -- 11 -> 10
|
||||||
-- TODO: add tooltips
|
<*> aopt_natFieldI MsgQualificationElearningLimit (qualificationElearningLimit <$> templ) -- 12 -> 11
|
||||||
|
<*> aopt qualificationField (fslI MsgTableQualificationLmsReuses &
|
||||||
|
setTooltip MsgTableQualificationLmsReusesTooltip) (qualificationLmsReuses <$> templ) -- 13 -> 12
|
||||||
|
<*> aopt avsLicenceField (fslI MsgQualificationAvsLicence &
|
||||||
|
setTooltip MsgTableQualificationIsAvsLicenceTooltip) (qualificationAvsLicence <$> templ) -- 14 -> 14
|
||||||
|
<*> aopt textField (fslI MsgQualificationSapId &
|
||||||
|
setTooltip MsgTableQualificationSapExportTooltip) (qualificationSapId <$> templ) -- 15 -> 15
|
||||||
|
where
|
||||||
|
avsLicenceField :: Field Handler AvsLicence
|
||||||
|
avsLicenceField = selectFieldList [ (Text.singleton $ licence2char lic, lic) | lic <- universeF, lic /= AvsNoLicence ]
|
||||||
|
|
||||||
|
aopt_natFieldI msg = aopt (natFieldI $ UniWorXMessages [SomeMessage msg, text2message " ", SomeMessage MsgMustBePositive]) (fslI msg)
|
||||||
|
-- [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15]
|
||||||
|
reorderedQualification = $(permuteFun [ 1, 2, 3, 4, 5,10, 6, 8, 7,11,12,13, 9,14,15]) Qualification -- read reverse: at the 6th position, the 10th element should be placed
|
||||||
|
validateQualificationEdit :: SchoolId -> FormValidator Qualification Handler ()
|
||||||
|
validateQualificationEdit ssh = do
|
||||||
|
canonise
|
||||||
|
Qualification{..} <- State.get
|
||||||
|
guardValidation MsgQualFormErrorSshMismatch $ qualificationSchool == ssh
|
||||||
|
guardValidation MsgLmsErrorNoRefreshElearning $ not qualificationElearningStart || isJust qualificationRefreshWithin
|
||||||
|
guardValidation MsgLmsErrorNoRenewElearning $ not qualificationElearningStart || isJust qualificationValidDuration
|
||||||
|
guardValidation MsgQualificationAuditDurationReuseError $ isNothing qualificationAuditDuration || isNothing qualificationLmsReuses
|
||||||
|
where
|
||||||
|
canonise = do -- i.e. map Just 0 to Nothing
|
||||||
|
Qualification{..} <- State.get
|
||||||
|
-- canonisation, i.e. map Just 0 to Nothing
|
||||||
|
when (qualificationRefreshWithin == Just mempty) $ State.modify $ set _qualificationRefreshWithin Nothing
|
||||||
|
when (qualificationRefreshReminder == Just mempty) $ State.modify $ set _qualificationRefreshReminder Nothing
|
||||||
|
when (qualificationValidDuration == Just 0) $ State.modify $ set _qualificationValidDuration Nothing
|
||||||
|
when (qualificationAuditDuration == Just 0) $ State.modify $ set _qualificationAuditDuration Nothing
|
||||||
|
when (qualificationElearningLimit == Just 0) $ State.modify $ set _qualificationElearningLimit Nothing
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
handleQualificationEdit :: SchoolId -> Maybe (Entity Qualification) -> Handler Html
|
handleQualificationEdit :: SchoolId -> Maybe (Entity Qualification) -> Handler Html
|
||||||
handleQualificationEdit _ _ = error "todo"
|
handleQualificationEdit ssh templ = do
|
||||||
|
((qRes, qWgt), qEnc) <- runFormPost $ mkQualificationForm ssh $ entityVal <$> templ
|
||||||
|
let qForm = wrapForm qWgt def
|
||||||
|
{ formEncoding = qEnc
|
||||||
|
}
|
||||||
|
formResult qRes $ \resQuali -> do
|
||||||
|
uniqViolation <- runDB $ case templ of
|
||||||
|
Just Entity{entityKey=qid} -> replaceUnique qid resQuali -- edit old qualification
|
||||||
|
_ -> maybeM (checkUnique resQuali) (const $ return Nothing) (insertUnique resQuali) -- insert new qualification
|
||||||
|
case uniqViolation of
|
||||||
|
Just (SchoolQualificationShort _ nconflict) -> addMessageI Error $ MsgQualFormErrorDuplShort $ ciOriginal nconflict
|
||||||
|
Just (SchoolQualificationName _ nconflict) -> addMessageI Error $ MsgQualFormErrorDuplName $ ciOriginal nconflict
|
||||||
|
Nothing -> do
|
||||||
|
let qshort = qualificationShorthand resQuali
|
||||||
|
qmsg = if isNothing templ then MsgQualificationCreated else MsgQualificationEdit
|
||||||
|
addMessageI Success $ qmsg $ ciOriginal qshort
|
||||||
|
redirect $ QualificationR ssh qshort
|
||||||
|
let heading = bool MsgMenuQualificationNew MsgMenuQualificationEdit $ isJust templ
|
||||||
|
siteLayoutMsg heading $ do
|
||||||
|
setTitleI heading
|
||||||
|
[whamlet|
|
||||||
|
<p>
|
||||||
|
^{qForm}
|
||||||
|
$maybe _ <- templ
|
||||||
|
<p>
|
||||||
|
_{MsgQualificationEditNote}
|
||||||
|
|]
|
||||||
@ -1,4 +1,4 @@
|
|||||||
-- SPDX-FileCopyrightText: 2022-24 Felix Hamann <felix.hamann@campus.lmu.de>,Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
-- SPDX-FileCopyrightText: 2022-25 Felix Hamann <felix.hamann@campus.lmu.de>,Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Winnie Ros <winnie.ros@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
--
|
--
|
||||||
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -1425,6 +1425,7 @@ utcTimeField = checkMMap (return . localTimeToUTC') utcToLocalTime localTimeFiel
|
|||||||
LTUNone{} -> Left MsgIllDefinedUTCTime
|
LTUNone{} -> Left MsgIllDefinedUTCTime
|
||||||
LTUAmbiguous{} -> Left MsgAmbiguousUTCTime
|
LTUAmbiguous{} -> Left MsgAmbiguousUTCTime
|
||||||
|
|
||||||
|
-- | Field for entering calendarDiffDays, result (0, 0) is accepted here
|
||||||
calendarDiffDaysField :: (MonadHandler m, HandlerSite m ~ UniWorX) => Field m CalendarDiffDays
|
calendarDiffDaysField :: (MonadHandler m, HandlerSite m ~ UniWorX) => Field m CalendarDiffDays
|
||||||
calendarDiffDaysField = Field
|
calendarDiffDaysField = Field
|
||||||
{ fieldParse = parseDD
|
{ fieldParse = parseDD
|
||||||
@ -1434,7 +1435,7 @@ calendarDiffDaysField = Field
|
|||||||
[whamlet|
|
[whamlet|
|
||||||
$newline never
|
$newline never
|
||||||
<input id="#{theId}-months" name="#{name}" *{attrs} type="number" step=1 :isReq:required value="#{vmon}">
|
<input id="#{theId}-months" name="#{name}" *{attrs} type="number" step=1 :isReq:required value="#{vmon}">
|
||||||
_{MsgSomeMonths}
|
_{MsgSomeMonths} #
|
||||||
<input id="#{theId}-days" name="#{name}" *{attrs} type="number" step=1 :isReq:required value="#{vday}">
|
<input id="#{theId}-days" name="#{name}" *{attrs} type="number" step=1 :isReq:required value="#{vday}">
|
||||||
_{MsgSomeDays}
|
_{MsgSomeDays}
|
||||||
|]
|
|]
|
||||||
@ -1447,12 +1448,11 @@ calendarDiffDaysField = Field
|
|||||||
parseDD [tmon, tday] _
|
parseDD [tmon, tday] _
|
||||||
| Just nmon <- readMay tmon
|
| Just nmon <- readMay tmon
|
||||||
, Just nday <- readMay tday
|
, Just nday <- readMay tday
|
||||||
-- , 0 =< nmon + nday
|
= return $ Right $ Just $ CalendarDiffDays { cdMonths=nmon, cdDays=nday}
|
||||||
= return $ Right $ if 0 == nmon + nday -- TODO: this should not be distinguished here
|
parseDD ["",""] _ = return $ Right Nothing
|
||||||
then Nothing
|
parseDD [""] _ = return $ Right Nothing
|
||||||
else Just $ CalendarDiffDays { cdMonths=nmon, cdDays=nday}
|
parseDD [] _ = return $ Right Nothing
|
||||||
parseDD [] _ = return $ Right Nothing
|
parseDD pl _ = return $ Left $ SomeMessage $ "Parsing CalendarDiffDays failed: " <> tshow pl -- TODO: better error message
|
||||||
parseDD _ _ = return $ Left "Parsing calendarDiffDaysField failed" -- TODO: better error messages
|
|
||||||
|
|
||||||
|
|
||||||
langField :: Bool -- ^ Only allow values from `appLanguages`
|
langField :: Bool -- ^ Only allow values from `appLanguages`
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
-- SPDX-FileCopyrightText: 2023 Felix Hamann <felix.hamann@campus.lmu.de>,Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
-- SPDX-FileCopyrightText: 2023-25 Felix Hamann <felix.hamann@campus.lmu.de>,Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
--
|
--
|
||||||
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -330,6 +330,7 @@ data FormIdentifier
|
|||||||
| FIDFirmAction
|
| FIDFirmAction
|
||||||
| FIDTutorialExamOccurrences
|
| FIDTutorialExamOccurrences
|
||||||
| FIDUnreachableUsersAction
|
| FIDUnreachableUsersAction
|
||||||
|
| FIDQualificationEdit
|
||||||
deriving (Eq, Ord, Read, Show)
|
deriving (Eq, Ord, Read, Show)
|
||||||
|
|
||||||
instance PathPiece FormIdentifier where
|
instance PathPiece FormIdentifier where
|
||||||
|
|||||||
@ -149,11 +149,10 @@ with
|
|||||||
-- Functions --
|
-- Functions --
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
permuteFun :: [Int] -> ExpQ -- generic permutation of function arguments, i.e. $(permuteFun [2,1]) == flip
|
permuteFun :: [Int] -> ExpQ -- generic permutation of function arguments, i.e. $(permuteFun [2,1]) == flip -- list determins position where the argument comes from
|
||||||
permuteFun perm = lamE pat rhs
|
permuteFun perm = lamE pat rhs
|
||||||
where pat = map varP $ fn:xs
|
where pat = map varP $ fn:xs
|
||||||
rhs = foldl appE (varE fn) $ map varE ps
|
rhs = foldl appE (varE fn) $ map varE ps
|
||||||
-- rhs = appE (varE fn) (varE $ xs!!1)
|
|
||||||
ln = length perm
|
ln = length perm
|
||||||
xs = [ mkName $ "x" ++ show j | j <- [1..ln] ]
|
xs = [ mkName $ "x" ++ show j | j <- [1..ln] ]
|
||||||
ps = [ xs !! (j-1) | j <- perm ]
|
ps = [ xs !! (j-1) | j <- perm ]
|
||||||
@ -163,7 +162,6 @@ altFun :: [Int] -> ExpQ -- generic permutation/repetition of function arguments,
|
|||||||
altFun perm = lamE pat rhs
|
altFun perm = lamE pat rhs
|
||||||
where pat = map varP $ fn:xs
|
where pat = map varP $ fn:xs
|
||||||
rhs = foldl appE (varE fn) $ map varE ps
|
rhs = foldl appE (varE fn) $ map varE ps
|
||||||
-- rhs = appE (varE fn) (varE $ xs!!1)
|
|
||||||
mx = maximum $ impureNonNull perm
|
mx = maximum $ impureNonNull perm
|
||||||
xs = [ mkName $ "x" ++ show j | j <- [1..mx] ]
|
xs = [ mkName $ "x" ++ show j | j <- [1..mx] ]
|
||||||
ps = [ xs !! (j-1) | j <- perm ]
|
ps = [ xs !! (j-1) | j <- perm ]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
$newline never
|
$newline never
|
||||||
|
|
||||||
$# SPDX-FileCopyrightText: 2022-23 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
$# SPDX-FileCopyrightText: 2022-25 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
$#
|
$#
|
||||||
$# SPDX-License-Identifier: AGPL-3.0-or-later
|
$# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later
|
|||||||
$if (qualificationElearningRenews quali) && isNothing (qualificationValidDuration quali)
|
$if (qualificationElearningRenews quali) && isNothing (qualificationValidDuration quali)
|
||||||
<p>
|
<p>
|
||||||
#{icon IconNotificationError}
|
#{icon IconNotificationError}
|
||||||
_{MsgLmsErrorNoRefreshElearning}
|
_{MsgLmsErrorNoRenewElearning}
|
||||||
|
|
||||||
<dt .deflist__dt>_{MsgQualificationElearningLimit}
|
<dt .deflist__dt>_{MsgQualificationElearningLimit}
|
||||||
<dd .deflist__dd>
|
<dd .deflist__dd>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
$newline never
|
$newline never
|
||||||
|
|
||||||
$# SPDX-FileCopyrightText: 2022 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
$# SPDX-FileCopyrightText: 2022-25 Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>
|
||||||
$#
|
$#
|
||||||
$# SPDX-License-Identifier: AGPL-3.0-or-later
|
$# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later
|
|||||||
$maybe daudit <- qualificationAuditDuration lqre
|
$maybe daudit <- qualificationAuditDuration lqre
|
||||||
_{MsgMonths (fromIntegral daudit)}
|
_{MsgMonths (fromIntegral daudit)}
|
||||||
$nothing
|
$nothing
|
||||||
_{MsgQualificationAuditDurationReuseError}
|
_{MsgQualificationAuditDurationReuseNoTime}
|
||||||
$nothing
|
$nothing
|
||||||
_{MsgMonths (fromIntegral daudit)}
|
_{MsgMonths (fromIntegral daudit)}
|
||||||
$nothing
|
$nothing
|
||||||
@ -67,7 +67,7 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later
|
|||||||
$if (qualificationElearningRenews quali) && isNothing (qualificationValidDuration quali)
|
$if (qualificationElearningRenews quali) && isNothing (qualificationValidDuration quali)
|
||||||
<p>
|
<p>
|
||||||
#{icon IconNotificationError}
|
#{icon IconNotificationError}
|
||||||
_{MsgLmsErrorNoRefreshElearning}
|
_{MsgLmsErrorNoRenewElearning}
|
||||||
|
|
||||||
<dt .deflist__dt>_{MsgQualificationElearningLimit}
|
<dt .deflist__dt>_{MsgQualificationElearningLimit}
|
||||||
<dd .deflist__dd>
|
<dd .deflist__dd>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user