From 709f64e292e0f56c46c92883281b35e254101b70 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Tue, 27 Jan 2026 09:31:14 +0100 Subject: [PATCH] 2 new dateStyle status regarding QG benotung --- public/css/components/abgabetool/abgabe.css | 88 +++++++++++++++++++ public/css/theme/default.css | 34 +++++++ .../Cis/Abgabetool/AbgabeMitarbeiterDetail.js | 60 +++++++++---- .../Cis/Abgabetool/AbgabetoolAssistenz.js | 42 +++++---- .../Cis/Abgabetool/AbgabetoolStudent.js | 43 +++++---- .../Cis/Abgabetool/StatusLegende.js | 20 ++++- system/phrasesupdate.php | 40 +++++++++ 7 files changed, 273 insertions(+), 54 deletions(-) diff --git a/public/css/components/abgabetool/abgabe.css b/public/css/components/abgabetool/abgabe.css index 7c806ce2f..cd6c6cdb2 100644 --- a/public/css/components/abgabetool/abgabe.css +++ b/public/css/components/abgabetool/abgabe.css @@ -139,6 +139,94 @@ box-shadow: 0 2px 6px rgba(0,0,0,0.12); } + +/* Base Header */ +.bestanden-header { + background-color: var(--fhc-purple-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.bestanden-header:hover { + background-color: var(--fhc-purple-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .bestanden-header { + background-color: var(--fhc-purple-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .bestanden-header:hover { + background-color: var(--fhc-purple-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + +/* Base Header */ +.nichtbestanden-header { + background-color: var(--fhc-red-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.nichtbestanden-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .nichtbestanden-header { + background-color: var(--fhc-red-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .nichtbestanden-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + +/* Base Header */ +.erledigt-header { + background-color: var(--fhc-red-70); + font-weight: 600; + border-radius: 6px; + padding: 0px 0px 0px 34px; + transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +/* Hover State */ +.erledigt-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + +/* Active / Expanded State */ +.p-accordion-tab-active > .erledigt-header { + background-color: var(--fhc-red-50); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); +} + +/* Hover State Active*/ +.p-accordion-tab-active > .erledigt-header:hover { + background-color: var(--fhc-red-60); + box-shadow: 0 2px 6px rgba(0,0,0,0.12); +} + + /* Base Header */ .standard-header { background-color: var(--fhc-white-70); diff --git a/public/css/theme/default.css b/public/css/theme/default.css index 699a60f93..a4d197f07 100644 --- a/public/css/theme/default.css +++ b/public/css/theme/default.css @@ -101,7 +101,41 @@ --fhc-beige-10: rgba(245, 233, 215, 0.5); --fhc-beige-20: rgba(172, 153, 125, 0.5); + /* --- Purple --- */ + --fhc-purple-5: rgb(250, 245, 255); + --fhc-purple-10: rgb(240, 230, 255); + --fhc-purple-20: rgb(220, 200, 250); + --fhc-purple-30: rgb(190, 160, 245); + --fhc-purple-40: rgb(160, 120, 235); + --fhc-purple-50: rgb(130, 80, 220); + --fhc-purple-60: rgb(110, 60, 190); + --fhc-purple-70: rgb(90, 40, 160); + --fhc-purple-80: rgb(70, 25, 130); + --fhc-purple-90: rgb(50, 15, 100); + /* --- Teal --- */ + --fhc-teal-5: rgb(240, 252, 252); + --fhc-teal-10: rgb(220, 245, 245); + --fhc-teal-20: rgb(180, 235, 235); + --fhc-teal-30: rgb(130, 220, 220); + --fhc-teal-40: rgb(80, 200, 200); + --fhc-teal-50: rgb(30, 170, 170); + --fhc-teal-60: rgb(20, 140, 140); + --fhc-teal-70: rgb(15, 115, 115); + --fhc-teal-80: rgb(10, 90, 90); + --fhc-teal-90: rgb(5, 65, 65); + + /* --- Indigo --- */ + --fhc-indigo-5: rgb(245, 247, 255); + --fhc-indigo-10: rgb(230, 235, 255); + --fhc-indigo-20: rgb(200, 210, 250); + --fhc-indigo-30: rgb(160, 175, 245); + --fhc-indigo-40: rgb(120, 140, 235); + --fhc-indigo-50: rgb(80, 100, 220); + --fhc-indigo-60: rgb(60, 80, 190); + --fhc-indigo-70: rgb(45, 60, 160); + --fhc-indigo-80: rgb(30, 40, 130); + --fhc-indigo-90: rgb(20, 25, 100); } diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index 92f546e32..3fda6510c 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -308,25 +308,34 @@ export const AbgabeMitarbeiterDetail = { const abgabedatum = new Date(termin.abgabedatum) termin.diffindays = this.dateDiffInDays(termin.datum) - - if(termin.bezeichnung?.benotbar && !termin.note) return 'beurteilungerforderlich' - if (termin.abgabedatum === null && termin.upload_allowed) { - if(datum < today) { - return 'verpasst' // needs upload, missed it and has not submitted anything - } else if (datum > today && termin.diffindays <= 12) { - return 'abzugeben' // needs to upload soon - } else { - return 'standard' // upload in distant future + + const isLate = abgabedatum && abgabedatum > datum; + + // GRADE STATUS + if (termin.note) { + if (termin.note.positiv) return 'bestanden'; + return 'nichtbestanden'; + } + + // ACTION REQUIRED FOR GRADE + if (termin.bezeichnung?.benotbar && datum < today) { + return 'beurteilungerforderlich'; + } + + // SUBMISSION STATUS + if (termin.upload_allowed) { + if (abgabedatum) { + return isLate ? 'verspaetet' : 'abgegeben'; } + + // no submission yet + if (datum < today) return 'verpasst'; + if (termin.diffindays <= 12) return 'abzugeben'; + return 'standard'; } - else if(abgabedatum > datum) { - return 'verspaetet' // needs upload, missed it and has submitted smth late - } else if(!termin.upload_allowed) { - if(datum > today) return termin.diffindays <= 12 ? 'abzugeben' : 'standard' - else if (today > datum) return 'abgegeben' - } else { - return 'abgegeben' // nothing else to do for that termin - } + + // GENERIC STATUS + return datum < today ? 'verpasst' : 'standard'; }, openBeurteilungLink(link) { window.open(link, '_blank') @@ -582,6 +591,18 @@ export const AbgabeMitarbeiterDetail = { class: "custom-tooltip" } }, + getTooltipBestanden() { + return { + value: this.$p.t('abgabetool/c4tooltipBestanden'), + class: "custom-tooltip" + } + }, + getTooltipNichtBestanden() { + return { + value: this.$p.t('abgabetool/c4tooltipNichtBestanden'), + class: "custom-tooltip" + } + }, getProjektarbeitTitel() { if(this.projektarbeit?.titel) return this.projektarbeit.titel @@ -753,8 +774,11 @@ export const AbgabeMitarbeiterDetail = { - + + + +
diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js b/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js index 4c3714372..f1e33a0cf 100644 --- a/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js +++ b/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js @@ -728,25 +728,33 @@ export const AbgabetoolAssistenz = { termin.diffindays = this.dateDiffInDays(termin.datum) - // seperate status if termin is in the past, it needs a note but doesnt have one yet - if(termin.bezeichnung?.benotbar && !termin.note) return 'beurteilungerforderlich' - if (termin.abgabedatum === null && termin.upload_allowed) { - if(datum < today) { - return 'verpasst' // needs upload, missed it and has not submitted anything - } else if (datum > today && termin.diffindays <= 12) { - return 'abzugeben' // needs to upload soon - } else { - return 'standard' // upload in distant future + const isLate = abgabedatum && abgabedatum > datum; + + // GRADE STATUS + if (termin.note) { + if (termin.note.positiv) return 'bestanden'; + return 'nichtbestanden'; + } + + // ACTION REQUIRED FOR GRADE + if (termin.bezeichnung?.benotbar && datum < today) { + return 'beurteilungerforderlich'; + } + + // SUBMISSION STATUS + if (termin.upload_allowed) { + if (abgabedatum) { + return isLate ? 'verspaetet' : 'abgegeben'; } + + // no submission yet + if (datum < today) return 'verpasst'; + if (termin.diffindays <= 12) return 'abzugeben'; + return 'standard'; } - else if(abgabedatum > datum) { - return 'verspaetet' // needs upload, missed it and has submitted smth late - } else if(!termin.upload_allowed) { - if(datum > today) return termin.diffindays <= 12 ? 'abzugeben' : 'standard' - else if (today > datum) return 'abgegeben' - } else { - return 'abgegeben' // nothing else to do for that termin - } + + // GENERIC STATUS + return datum < today ? 'verpasst' : 'standard'; }, openTimeline(val) { const projekt = this.projektarbeiten.find(p => p.projektarbeit_id == val.projektarbeit_id) diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js b/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js index b9286abf9..a60eee5da 100644 --- a/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js +++ b/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js @@ -70,25 +70,34 @@ export const AbgabetoolStudent = { const abgabedatum = new Date(termin.abgabedatum) termin.diffindays = this.dateDiffInDays(termin.datum) - - if (termin.bezeichnung?.benotbar && !termin.note) return 'beurteilungerforderlich' - if (termin.abgabedatum === null && termin.upload_allowed) { - if(datum < today) { - return 'verpasst' // needs upload, missed it and has not submitted anything - } else if (datum > today && termin.diffindays <= 12) { - return 'abzugeben' // needs to upload soon - } else { - return 'standard' // upload in distant future + + const isLate = abgabedatum && abgabedatum > datum; + + // GRADE STATUS + if (termin.note) { + if (termin.note.positiv) return 'bestanden'; + return 'nichtbestanden'; + } + + // ACTION REQUIRED FOR GRADE + if (termin.bezeichnung?.benotbar && datum < today) { + return 'beurteilungerforderlich'; + } + + // SUBMISSION STATUS + if (termin.upload_allowed) { + if (abgabedatum) { + return isLate ? 'verspaetet' : 'abgegeben'; } + + // no submission yet + if (datum < today) return 'verpasst'; + if (termin.diffindays <= 12) return 'abzugeben'; + return 'standard'; } - else if(abgabedatum > datum) { - return 'verspaetet' // needs upload, missed it and has submitted smth late - } else if(!termin.upload_allowed) { - if(datum > today) return termin.diffindays <= 12 ? 'abzugeben' : 'standard' - else if (today > datum) return 'abgegeben' - } else { - return 'abgegeben' // nothing else to do for that termin - } + + // GENERIC STATUS + return datum < today ? 'verpasst' : 'standard'; }, checkQualityGatesStrict(termine) { let qgate1Passed = false diff --git a/public/js/components/Cis/Abgabetool/StatusLegende.js b/public/js/components/Cis/Abgabetool/StatusLegende.js index 25761e238..ccf46a69b 100644 --- a/public/js/components/Cis/Abgabetool/StatusLegende.js +++ b/public/js/components/Cis/Abgabetool/StatusLegende.js @@ -47,7 +47,6 @@ export const AbgabeterminStatusLegende = {
{{ $capitalize($p.t('abgabetool/c4tooltipAbgegeben')) }}
-
@@ -57,7 +56,24 @@ export const AbgabeterminStatusLegende = {
{{ $capitalize($p.t('abgabetool/c4tooltipBeurteilungerforderlich')) }}
- +
+ +
+
+ +
+
+
{{ $capitalize($p.t('abgabetool/c4tooltipBestanden')) }}
+
+
+ +
+
+ +
+
+
{{ $capitalize($p.t('abgabetool/c4tooltipNichtBestanden')) }}
+
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 1c1d8047f..94179b4df 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -44476,6 +44476,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'abgabetool', + 'phrase' => 'c4tooltipBestanden', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Bestanden", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'passed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'abgabetool', + 'phrase' => 'c4tooltipNichtBestanden', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Nicht Bestanden", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'not passed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'abgabetool',