diff --git a/backend/locale/en/LC_MESSAGES/django.po b/backend/locale/en/LC_MESSAGES/django.po index 0cea342..46fae62 100644 --- a/backend/locale/en/LC_MESSAGES/django.po +++ b/backend/locale/en/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: tubco-portal\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-25 23:02+0000\n" +"POT-Creation-Date: 2026-03-25 23:12+0000\n" "PO-Revision-Date: 2026-03-24 00:00+0000\n" "Language: en\n" "MIME-Version: 1.0\n" @@ -29,7 +29,7 @@ msgid "Abgeschlossen" msgstr "Completed" #: workflows/models.py:58 workflows/models.py:312 -#: workflows/templates/workflows/requests_dashboard.html:190 +#: workflows/templates/workflows/requests_dashboard.html:226 #: workflows/templates/workflows/welcome_emails.html:112 workflows/views.py:183 msgid "Fehlgeschlagen" msgstr "Failed" @@ -56,6 +56,7 @@ msgstr "" #: workflows/models.py:138 #: workflows/templates/workflows/onboarding_intro_session.html:32 +#: workflows/templates/workflows/requests_dashboard.html:149 msgid "Abteilung" msgstr "Department" @@ -109,12 +110,14 @@ msgstr "Finish" #: workflows/templates/workflows/home.html:66 #: workflows/templates/workflows/onboarding_form.html:25 #: workflows/templates/workflows/requests_dashboard.html:68 +#: workflows/templates/workflows/requests_dashboard.html:135 msgid "Onboarding" msgstr "Onboarding" #: workflows/models.py:178 workflows/models.py:259 #: workflows/templates/workflows/home.html:82 #: workflows/templates/workflows/requests_dashboard.html:78 +#: workflows/templates/workflows/requests_dashboard.html:136 msgid "Offboarding" msgstr "Offboarding" @@ -367,12 +370,15 @@ msgstr "" #: workflows/templates/workflows/audit_log.html:23 #: workflows/templates/workflows/audit_log.html:54 -#: workflows/templates/workflows/requests_dashboard.html:161 +#: workflows/templates/workflows/requests_dashboard.html:197 #: workflows/templates/workflows/welcome_emails.html:91 msgid "Aktion" msgstr "Action" #: workflows/templates/workflows/audit_log.html:25 +#: workflows/templates/workflows/requests_dashboard.html:134 +#: workflows/templates/workflows/requests_dashboard.html:142 +#: workflows/templates/workflows/requests_dashboard.html:151 msgid "Alle" msgstr "" @@ -400,7 +406,7 @@ msgid "Filtern" msgstr "" #: workflows/templates/workflows/audit_log.html:45 -#: workflows/templates/workflows/requests_dashboard.html:133 +#: workflows/templates/workflows/requests_dashboard.html:169 msgid "Zurücksetzen" msgstr "Reset" @@ -410,7 +416,8 @@ msgstr "" #: workflows/templates/workflows/audit_log.html:55 #: workflows/templates/workflows/request_timeline.html:62 -#: workflows/templates/workflows/requests_dashboard.html:156 +#: workflows/templates/workflows/requests_dashboard.html:132 +#: workflows/templates/workflows/requests_dashboard.html:192 msgid "Typ" msgstr "Type" @@ -509,17 +516,17 @@ msgid "Label (EN)" msgstr "Label (EN)" #: workflows/templates/workflows/form_builder.html:95 -#: workflows/templates/workflows/integrations_setup.html:258 +#: workflows/templates/workflows/integrations_setup.html:266 #: workflows/templates/workflows/intro_builder.html:69 msgid "Aktiv" msgstr "Active" #: workflows/templates/workflows/form_builder.html:96 #: workflows/templates/workflows/form_builder.html:111 -#: workflows/templates/workflows/integrations_setup.html:260 +#: workflows/templates/workflows/integrations_setup.html:268 #: workflows/templates/workflows/intro_builder.html:70 #: workflows/templates/workflows/intro_builder.html:106 -#: workflows/templates/workflows/requests_dashboard.html:247 +#: workflows/templates/workflows/requests_dashboard.html:283 #: workflows/templates/workflows/welcome_emails.html:74 msgid "Löschen" msgstr "Delete" @@ -705,7 +712,7 @@ msgstr "" #: workflows/templates/workflows/home.html:4 #: workflows/templates/workflows/home.html:35 -#: workflows/templates/workflows/requests_dashboard.html:263 +#: workflows/templates/workflows/requests_dashboard.html:299 msgid "TUBCO Onboarding & Offboarding Portal" msgstr "TUBCO Onboarding & Offboarding Portal" @@ -759,12 +766,12 @@ msgid "E-Mail:" msgstr "Email:" #: workflows/templates/workflows/home.html:43 -#: workflows/templates/workflows/integrations_setup.html:121 +#: workflows/templates/workflows/integrations_setup.html:125 msgid "Testmodus" msgstr "Test mode" #: workflows/templates/workflows/home.html:43 -#: workflows/templates/workflows/integrations_setup.html:121 +#: workflows/templates/workflows/integrations_setup.html:125 msgid "Produktion" msgstr "Production" @@ -845,6 +852,7 @@ msgstr "Search" #: workflows/templates/workflows/home.html:102 #: workflows/templates/workflows/onboarding_intro_session.html:41 #: workflows/templates/workflows/request_timeline.html:70 +#: workflows/templates/workflows/requests_dashboard.html:140 #: workflows/templates/workflows/welcome_emails.html:89 msgid "Status" msgstr "Status" @@ -976,8 +984,8 @@ msgid "Nextcloud-Test starten" msgstr "Nextcloud test" #: workflows/templates/workflows/integrations_setup.html:62 -#: workflows/templates/workflows/integrations_setup.html:120 -#: workflows/templates/workflows/requests_dashboard.html:230 +#: workflows/templates/workflows/integrations_setup.html:124 +#: workflows/templates/workflows/requests_dashboard.html:266 msgid "Status:" msgstr "Status:" @@ -994,174 +1002,174 @@ msgid "" msgstr "" #: workflows/templates/workflows/integrations_setup.html:72 -#: workflows/templates/workflows/integrations_setup.html:130 +#: workflows/templates/workflows/integrations_setup.html:134 msgid "Leeres Passwortfeld lässt das bestehende Passwort unverändert." msgstr "Leaving the password field empty keeps the current password unchanged." -#: workflows/templates/workflows/integrations_setup.html:106 +#: workflows/templates/workflows/integrations_setup.html:110 #, fuzzy #| msgid "Absenderadresse (optional)" msgid "Absenderadresse" msgstr "Sender address (optional)" -#: workflows/templates/workflows/integrations_setup.html:111 +#: workflows/templates/workflows/integrations_setup.html:115 msgid "SMTP SSL" msgstr "SMTP SSL" -#: workflows/templates/workflows/integrations_setup.html:112 +#: workflows/templates/workflows/integrations_setup.html:116 msgid "SMTP TLS" msgstr "SMTP TLS" -#: workflows/templates/workflows/integrations_setup.html:115 +#: workflows/templates/workflows/integrations_setup.html:119 msgid "Mail speichern" msgstr "Save mail settings" -#: workflows/templates/workflows/integrations_setup.html:116 +#: workflows/templates/workflows/integrations_setup.html:120 #, fuzzy #| msgid "SMTP-Test" msgid "SMTP-Test starten" msgstr "SMTP test" -#: workflows/templates/workflows/integrations_setup.html:123 +#: workflows/templates/workflows/integrations_setup.html:127 #, fuzzy #| msgid "E-Mail Modus" msgid "E-Mail Modus schalten" msgstr "Email mode" -#: workflows/templates/workflows/integrations_setup.html:129 +#: workflows/templates/workflows/integrations_setup.html:133 msgid "" "Im Testmodus werden Systemmails umgeleitet. In Produktion werden sie an die " "echten Empfänger gesendet." msgstr "" -#: workflows/templates/workflows/integrations_setup.html:139 +#: workflows/templates/workflows/integrations_setup.html:147 msgid "It onboarding email" msgstr "IT onboarding email" -#: workflows/templates/workflows/integrations_setup.html:143 +#: workflows/templates/workflows/integrations_setup.html:151 msgid "General info email" msgstr "General info email" -#: workflows/templates/workflows/integrations_setup.html:147 +#: workflows/templates/workflows/integrations_setup.html:155 msgid "Business card email" msgstr "Business card email" -#: workflows/templates/workflows/integrations_setup.html:151 +#: workflows/templates/workflows/integrations_setup.html:159 msgid "Hr works email" msgstr "HR Works email" -#: workflows/templates/workflows/integrations_setup.html:155 +#: workflows/templates/workflows/integrations_setup.html:163 msgid "Key notification email" msgstr "Key notification email" -#: workflows/templates/workflows/integrations_setup.html:159 +#: workflows/templates/workflows/integrations_setup.html:167 msgid "Diese Empfänger werden für condition-based E-Mail Routing genutzt." msgstr "These recipients are used for condition-based email routing." -#: workflows/templates/workflows/integrations_setup.html:186 +#: workflows/templates/workflows/integrations_setup.html:194 msgid "E-Mail Routing & Vorlagen speichern" msgstr "Save email routing & templates" -#: workflows/templates/workflows/integrations_setup.html:192 +#: workflows/templates/workflows/integrations_setup.html:200 msgid "Bedingungsregeln für zusätzliche E-Mails" msgstr "Conditional rules for additional emails" -#: workflows/templates/workflows/integrations_setup.html:193 +#: workflows/templates/workflows/integrations_setup.html:201 msgid "Zusätzliche Regeln laufen nach dem Standard-Routing." msgstr "Additional rules run after the standard routing flow." -#: workflows/templates/workflows/integrations_setup.html:200 -#: workflows/templates/workflows/integrations_setup.html:271 +#: workflows/templates/workflows/integrations_setup.html:208 +#: workflows/templates/workflows/integrations_setup.html:279 msgid "Regelname" msgstr "Rule name" -#: workflows/templates/workflows/integrations_setup.html:204 -#: workflows/templates/workflows/integrations_setup.html:275 +#: workflows/templates/workflows/integrations_setup.html:212 +#: workflows/templates/workflows/integrations_setup.html:283 msgid "Event" msgstr "Event" -#: workflows/templates/workflows/integrations_setup.html:212 -#: workflows/templates/workflows/integrations_setup.html:283 +#: workflows/templates/workflows/integrations_setup.html:220 +#: workflows/templates/workflows/integrations_setup.html:291 msgid "Feldname" msgstr "Field name" -#: workflows/templates/workflows/integrations_setup.html:216 -#: workflows/templates/workflows/integrations_setup.html:287 +#: workflows/templates/workflows/integrations_setup.html:224 +#: workflows/templates/workflows/integrations_setup.html:295 #: workflows/templates/workflows/intro_builder.html:67 msgid "Operator" msgstr "Operator" -#: workflows/templates/workflows/integrations_setup.html:224 -#: workflows/templates/workflows/integrations_setup.html:295 +#: workflows/templates/workflows/integrations_setup.html:232 +#: workflows/templates/workflows/integrations_setup.html:303 msgid "Vergleichswert" msgstr "Comparison value" -#: workflows/templates/workflows/integrations_setup.html:228 -#: workflows/templates/workflows/integrations_setup.html:299 +#: workflows/templates/workflows/integrations_setup.html:236 +#: workflows/templates/workflows/integrations_setup.html:307 #: workflows/templates/workflows/welcome_emails.html:87 msgid "Empfänger" msgstr "Recipients" -#: workflows/templates/workflows/integrations_setup.html:232 -#: workflows/templates/workflows/integrations_setup.html:303 +#: workflows/templates/workflows/integrations_setup.html:240 +#: workflows/templates/workflows/integrations_setup.html:311 msgid "Template Key (optional)" msgstr "Template key (optional)" -#: workflows/templates/workflows/integrations_setup.html:234 -#: workflows/templates/workflows/integrations_setup.html:305 +#: workflows/templates/workflows/integrations_setup.html:242 +#: workflows/templates/workflows/integrations_setup.html:313 msgid "-- Custom Betreff/Body verwenden --" msgstr "-- Use custom subject/body --" -#: workflows/templates/workflows/integrations_setup.html:241 -#: workflows/templates/workflows/integrations_setup.html:312 +#: workflows/templates/workflows/integrations_setup.html:249 +#: workflows/templates/workflows/integrations_setup.html:320 msgid "Custom Subject (optional)" msgstr "Custom subject (optional)" -#: workflows/templates/workflows/integrations_setup.html:245 -#: workflows/templates/workflows/integrations_setup.html:316 +#: workflows/templates/workflows/integrations_setup.html:253 +#: workflows/templates/workflows/integrations_setup.html:324 msgid "Custom Body (optional)" msgstr "Custom body (optional)" -#: workflows/templates/workflows/integrations_setup.html:249 -#: workflows/templates/workflows/integrations_setup.html:320 +#: workflows/templates/workflows/integrations_setup.html:257 +#: workflows/templates/workflows/integrations_setup.html:328 msgid "Custom Subject (EN, optional)" msgstr "Custom subject (EN, optional)" -#: workflows/templates/workflows/integrations_setup.html:253 -#: workflows/templates/workflows/integrations_setup.html:324 +#: workflows/templates/workflows/integrations_setup.html:261 +#: workflows/templates/workflows/integrations_setup.html:332 msgid "Custom Body (EN, optional)" msgstr "Custom body (EN, optional)" -#: workflows/templates/workflows/integrations_setup.html:259 -#: workflows/templates/workflows/integrations_setup.html:329 +#: workflows/templates/workflows/integrations_setup.html:267 +#: workflows/templates/workflows/integrations_setup.html:337 msgid "PDF anhängen" msgstr "Attach PDF" -#: workflows/templates/workflows/integrations_setup.html:264 +#: workflows/templates/workflows/integrations_setup.html:272 msgid "Noch keine zusätzlichen Regeln vorhanden." msgstr "No additional rules configured yet." -#: workflows/templates/workflows/integrations_setup.html:268 +#: workflows/templates/workflows/integrations_setup.html:276 msgid "Neue Regel hinzufügen" msgstr "Add new rule" -#: workflows/templates/workflows/integrations_setup.html:334 +#: workflows/templates/workflows/integrations_setup.html:342 msgid "Regeln speichern" msgstr "Save rules" -#: workflows/templates/workflows/integrations_setup.html:344 +#: workflows/templates/workflows/integrations_setup.html:352 #, fuzzy #| msgid "Hardware-Übergabetermin" msgid "Vorlauf Hardware-Übergabe (Tage)" msgstr "Hardware handover date" -#: workflows/templates/workflows/integrations_setup.html:356 +#: workflows/templates/workflows/integrations_setup.html:364 #, fuzzy #| msgid "Regeln speichern" msgid "Workflow-Regeln speichern" msgstr "Save rules" -#: workflows/templates/workflows/integrations_setup.html:358 +#: workflows/templates/workflows/integrations_setup.html:366 msgid "" "Steuert den Mindestvorlauf für das gewünschte Übergabedatum der Geräte im " "Onboarding-Formular." @@ -1272,7 +1280,7 @@ msgid "z. B. max.mustermann@tub.co" msgstr "e.g. john.doe@tub.co" #: workflows/templates/workflows/offboarding_form.html:33 -#: workflows/templates/workflows/requests_dashboard.html:131 +#: workflows/templates/workflows/requests_dashboard.html:167 msgid "Suchen" msgstr "Search" @@ -1315,7 +1323,7 @@ msgstr "" #: workflows/templates/workflows/offboarding_success.html:23 #: workflows/templates/workflows/onboarding_success.html:22 #: workflows/templates/workflows/request_timeline.html:104 -#: workflows/templates/workflows/requests_dashboard.html:185 +#: workflows/templates/workflows/requests_dashboard.html:221 msgid "PDF öffnen" msgstr "Open PDF" @@ -1484,7 +1492,7 @@ msgid "Alles zurücksetzen" msgstr "Reset all" #: workflows/templates/workflows/onboarding_intro_session.html:90 -#: workflows/templates/workflows/requests_dashboard.html:203 +#: workflows/templates/workflows/requests_dashboard.html:239 msgid "Live-Protokoll" msgstr "Live protocol" @@ -1499,7 +1507,7 @@ msgid "Live-Protokoll erzeugen" msgstr "Generate live protocol" #: workflows/templates/workflows/onboarding_intro_session.html:98 -#: workflows/templates/workflows/requests_dashboard.html:207 +#: workflows/templates/workflows/requests_dashboard.html:243 msgid "Live-Protokoll öffnen" msgstr "Open live protocol" @@ -1686,7 +1694,7 @@ msgid "Request Timeline" msgstr "" #: workflows/templates/workflows/request_timeline.html:74 -#: workflows/templates/workflows/requests_dashboard.html:158 +#: workflows/templates/workflows/requests_dashboard.html:194 msgid "E-Mail" msgstr "Email" @@ -1779,65 +1787,73 @@ msgstr "%(count)s entries visible" msgid "Nach Name oder E-Mail suchen" msgstr "Search by name or email" -#: workflows/templates/workflows/requests_dashboard.html:143 +#: workflows/templates/workflows/requests_dashboard.html:158 +msgid "Von" +msgstr "" + +#: workflows/templates/workflows/requests_dashboard.html:162 +msgid "Bis" +msgstr "" + +#: workflows/templates/workflows/requests_dashboard.html:179 #: workflows/templates/workflows/welcome_emails.html:78 msgid "ausgewählt" msgstr "selected" -#: workflows/templates/workflows/requests_dashboard.html:144 +#: workflows/templates/workflows/requests_dashboard.html:180 msgid "Auswahl löschen" msgstr "Delete selection" -#: workflows/templates/workflows/requests_dashboard.html:157 +#: workflows/templates/workflows/requests_dashboard.html:193 msgid "Person" msgstr "Person" -#: workflows/templates/workflows/requests_dashboard.html:159 +#: workflows/templates/workflows/requests_dashboard.html:195 msgid "Dokument" msgstr "Document" -#: workflows/templates/workflows/requests_dashboard.html:160 -#: workflows/templates/workflows/requests_dashboard.html:200 +#: workflows/templates/workflows/requests_dashboard.html:196 +#: workflows/templates/workflows/requests_dashboard.html:236 msgid "Einweisung" msgstr "Introduction" -#: workflows/templates/workflows/requests_dashboard.html:187 +#: workflows/templates/workflows/requests_dashboard.html:223 msgid "Noch nicht verfügbar" msgstr "Not available yet" -#: workflows/templates/workflows/requests_dashboard.html:205 +#: workflows/templates/workflows/requests_dashboard.html:241 msgid "Einweisung öffnen" msgstr "Open introduction" -#: workflows/templates/workflows/requests_dashboard.html:212 +#: workflows/templates/workflows/requests_dashboard.html:248 msgid "Standard-Einweisungs-PDF" msgstr "Standard introduction PDF" -#: workflows/templates/workflows/requests_dashboard.html:217 +#: workflows/templates/workflows/requests_dashboard.html:253 msgid "Neu erzeugen" msgstr "Regenerate" -#: workflows/templates/workflows/requests_dashboard.html:219 +#: workflows/templates/workflows/requests_dashboard.html:255 msgid "Standard-PDF öffnen" msgstr "Open standard PDF" -#: workflows/templates/workflows/requests_dashboard.html:223 +#: workflows/templates/workflows/requests_dashboard.html:259 msgid "PDF erzeugen" msgstr "Generate PDF" -#: workflows/templates/workflows/requests_dashboard.html:234 +#: workflows/templates/workflows/requests_dashboard.html:270 msgid "Nicht relevant" msgstr "Not relevant" -#: workflows/templates/workflows/requests_dashboard.html:238 +#: workflows/templates/workflows/requests_dashboard.html:274 msgid "Timeline" msgstr "" -#: workflows/templates/workflows/requests_dashboard.html:242 +#: workflows/templates/workflows/requests_dashboard.html:278 msgid "Erneut versuchen" msgstr "" -#: workflows/templates/workflows/requests_dashboard.html:254 +#: workflows/templates/workflows/requests_dashboard.html:290 msgid "Noch keine Vorgänge vorhanden." msgstr "No requests available yet." @@ -2179,23 +2195,23 @@ msgstr "%(count)s selection(s) could not be processed." msgid "Keine passenden Einträge gefunden." msgstr "No matching entries found." -#: workflows/views.py:726 +#: workflows/views.py:776 msgid "Einweisungs- und Übergabeprotokoll wurde erzeugt." msgstr "Introduction and handover protocol was generated." -#: workflows/views.py:744 +#: workflows/views.py:794 msgid "Einweisungsprotokoll aus Live-Status wurde erzeugt." msgstr "Introduction protocol from live status was generated." -#: workflows/views.py:774 +#: workflows/views.py:824 msgid "Einweisung wurde zurückgesetzt." msgstr "Introduction was reset." -#: workflows/views.py:788 +#: workflows/views.py:838 msgid "Einweisung wurde als abgeschlossen gespeichert." msgstr "Introduction was saved as completed." -#: workflows/views.py:801 +#: workflows/views.py:851 msgid "Einweisung wurde als Entwurf gespeichert." msgstr "Introduction was saved as draft." diff --git a/backend/workflows/static/workflows/css/requests_dashboard.css b/backend/workflows/static/workflows/css/requests_dashboard.css index 61d8e11..76adda7 100644 --- a/backend/workflows/static/workflows/css/requests_dashboard.css +++ b/backend/workflows/static/workflows/css/requests_dashboard.css @@ -425,18 +425,37 @@ .search-form { display: grid; - gap: 12px; + gap: 10px; + } + + .filter-grid { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 8px; + } + + .filter-field { + display: grid; + gap: 4px; + } + + .filter-field label { + font-size: 11px; + font-weight: 800; + color: #294465; } .search-box { position: relative; } - .search-box input { + .search-box input, + .filter-field select, + .filter-field input[type="date"] { width: 100%; border: 1px solid var(--line-strong); - border-radius: 16px; - padding: 14px 16px; + border-radius: 14px; + padding: 11px 13px; font: inherit; font-weight: 600; color: var(--ink); @@ -444,7 +463,9 @@ box-shadow: inset 0 1px 0 rgba(255,255,255,0.98); } - .search-box input:focus { + .search-box input:focus, + .filter-field select:focus, + .filter-field input[type="date"]:focus { outline: none; border-color: rgba(0, 0, 120, 0.3); box-shadow: 0 0 0 4px rgba(0, 0, 120, 0.08); @@ -488,7 +509,7 @@ } .table-controls { - padding: 14px 18px 14px; + padding: 12px 18px 12px; border-bottom: 1px solid var(--line); background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(244,248,255,0.96)); } @@ -496,16 +517,16 @@ .table-controls-grid { display: grid; grid-template-columns: minmax(0, 1fr) auto; - gap: 14px; + gap: 10px; align-items: stretch; } .control-stack { display: grid; - gap: 12px; - padding: 14px; + gap: 10px; + padding: 12px; border: 1px solid rgba(217, 227, 238, 0.95); - border-radius: 18px; + border-radius: 16px; background: linear-gradient(180deg, rgba(255,255,255,0.98), rgba(249,251,255,0.95)); box-shadow: inset 0 1px 0 rgba(255,255,255,0.9); } @@ -848,6 +869,10 @@ .table-controls-grid { grid-template-columns: 1fr; } + + .filter-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } } @media (max-width: 760px) { @@ -860,4 +885,5 @@ .topbar { flex-direction: column; } .quick-actions { justify-content: flex-start; } .table-wrap { padding-left: 12px; padding-right: 12px; } + .filter-grid { grid-template-columns: 1fr; } } diff --git a/backend/workflows/static/workflows/js/requests_dashboard.js b/backend/workflows/static/workflows/js/requests_dashboard.js index 4c13e85..9d37646 100644 --- a/backend/workflows/static/workflows/js/requests_dashboard.js +++ b/backend/workflows/static/workflows/js/requests_dashboard.js @@ -1,4 +1,34 @@ (function () { + const filterForm = document.querySelector('.search-form'); + if (filterForm) { + const searchInput = filterForm.querySelector('input[name="q"]'); + const immediateFields = Array.from( + filterForm.querySelectorAll('select[name], input[type="date"][name]') + ); + let debounceTimer = null; + + const submitFilters = function () { + if (debounceTimer) { + window.clearTimeout(debounceTimer); + debounceTimer = null; + } + filterForm.requestSubmit(); + }; + + if (searchInput) { + searchInput.addEventListener('input', function () { + if (debounceTimer) { + window.clearTimeout(debounceTimer); + } + debounceTimer = window.setTimeout(submitFilters, 280); + }); + } + + immediateFields.forEach(function (field) { + field.addEventListener('change', submitFilters); + }); + } + const selectAll = document.getElementById('select-all'); const rowChecks = Array.from(document.querySelectorAll('.row-select')); const selectedCount = document.getElementById('selected-count'); diff --git a/backend/workflows/templates/workflows/requests_dashboard.html b/backend/workflows/templates/workflows/requests_dashboard.html index ed0841f..cd2e62e 100644 --- a/backend/workflows/templates/workflows/requests_dashboard.html +++ b/backend/workflows/templates/workflows/requests_dashboard.html @@ -112,7 +112,7 @@ {% endif %}
-
+

{% trans "Vorgänge" %}

@@ -123,14 +123,50 @@
-
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
- {% if search_query %} -{% trans "Zurücksetzen" %} + {% if has_filters %} +{% trans "Zurücksetzen" %} {% endif %}
diff --git a/backend/workflows/views.py b/backend/workflows/views.py index d8a524e..0437311 100644 --- a/backend/workflows/views.py +++ b/backend/workflows/views.py @@ -557,11 +557,37 @@ def requests_dashboard(request): return redirect('requests_dashboard') search_query = request.GET.get('q', '').strip() + type_filter = (request.GET.get('type') or '').strip().lower() + status_filter = (request.GET.get('status') or '').strip().lower() + department_filter = (request.GET.get('department') or '').strip() + date_from = (request.GET.get('date_from') or '').strip() + date_to = (request.GET.get('date_to') or '').strip() + onboarding_qs = OnboardingRequest.objects.order_by('-created_at') offboarding_qs = OffboardingRequest.objects.order_by('-created_at') + all_onboarding = OnboardingRequest.objects.all() + all_offboarding = OffboardingRequest.objects.all() + if search_query: onboarding_qs = onboarding_qs.filter(Q(full_name__icontains=search_query) | Q(work_email__icontains=search_query)) offboarding_qs = offboarding_qs.filter(Q(full_name__icontains=search_query) | Q(work_email__icontains=search_query)) + if status_filter in {'submitted', 'processing', 'completed', 'failed'}: + onboarding_qs = onboarding_qs.filter(processing_status=status_filter) + offboarding_qs = offboarding_qs.filter(processing_status=status_filter) + if department_filter: + onboarding_qs = onboarding_qs.filter(department=department_filter) + offboarding_qs = offboarding_qs.filter(department=department_filter) + if date_from: + onboarding_qs = onboarding_qs.filter(created_at__date__gte=date_from) + offboarding_qs = offboarding_qs.filter(created_at__date__gte=date_from) + if date_to: + onboarding_qs = onboarding_qs.filter(created_at__date__lte=date_to) + offboarding_qs = offboarding_qs.filter(created_at__date__lte=date_to) + + if type_filter == 'onboarding': + offboarding_qs = offboarding_qs.none() + elif type_filter == 'offboarding': + onboarding_qs = onboarding_qs.none() onboarding_items = onboarding_qs[:50] offboarding_items = offboarding_qs[:50] @@ -649,12 +675,36 @@ def requests_dashboard(request): onboarding_total = onboarding_qs.count() offboarding_total = offboarding_qs.count() + departments = sorted( + { + value.strip() + for value in list(all_onboarding.exclude(department='').values_list('department', flat=True)) + + list(all_offboarding.exclude(department='').values_list('department', flat=True)) + if value and value.strip() + }, + key=str.lower, + ) + status_choices = [ + {'value': 'submitted', 'label': _request_status_label('submitted', language_code)}, + {'value': 'processing', 'label': _request_status_label('processing', language_code)}, + {'value': 'completed', 'label': _request_status_label('completed', language_code)}, + {'value': 'failed', 'label': _request_status_label('failed', language_code)}, + ] + has_filters = any([search_query, type_filter, status_filter, department_filter, date_from, date_to]) return render( request, 'workflows/requests_dashboard.html', { 'rows': rows[:60], 'search_query': search_query, + 'selected_type': type_filter, + 'selected_status': status_filter, + 'selected_department': department_filter, + 'date_from': date_from, + 'date_to': date_to, + 'departments': departments, + 'status_choices': status_choices, + 'has_filters': has_filters, 'onboarding_total': onboarding_total, 'offboarding_total': offboarding_total, 'combined_total': onboarding_total + offboarding_total,