snapshot: preserve base shell standardization

This commit is contained in:
Md Bayazid Bostame
2026-03-24 17:50:03 +01:00
parent 5c6d300c4e
commit a4f5b9ee8f
14 changed files with 180 additions and 206 deletions

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Anmeldung" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Anmeldung" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
body { margin: 0; font-family: Arial, sans-serif; min-height: 100vh; background: linear-gradient(160deg, #eef6ff, #fff3f3); padding: 24px; } body { margin: 0; font-family: Arial, sans-serif; min-height: 100vh; background: linear-gradient(160deg, #eef6ff, #fff3f3); padding: 24px; }
.card { width: min(420px, calc(100% - 28px)); margin: 0 auto; background: #fff; border: 1px solid #d9e3f0; border-radius: 14px; padding: 20px; box-shadow: 0 12px 30px rgba(28, 45, 79, 0.12); } .card { width: min(420px, calc(100% - 28px)); margin: 0 auto; background: #fff; border: 1px solid #d9e3f0; border-radius: 14px; padding: 20px; box-shadow: 0 12px 30px rgba(28, 45, 79, 0.12); }
h1 { margin: 0 0 8px; font-size: 24px; } h1 { margin: 0 0 8px; font-size: 24px; }
@@ -18,11 +15,14 @@
.btn { width: 100%; } .btn { width: 100%; }
.errorlist { color: #b91c1c; margin: 6px 0; } .errorlist { color: #b91c1c; margin: 6px 0; }
</style> </style>
</head> {% endblock %}
<body>
{% include 'workflows/includes/app_header.html' with header_show_home=0 %} {% block shell_header %}
<div class="card"> {% include 'workflows/includes/app_header.html' %}
<h1>{% trans "Anmeldung" %}</h1> {% endblock %}
{% block shell_body %}
<div class="card"><h1>{% trans "Anmeldung" %}</h1>
<p>{% trans "Bitte melden Sie sich mit Ihrem Benutzerkonto an." %}</p> <p>{% trans "Bitte melden Sie sich mit Ihrem Benutzerkonto an." %}</p>
<form method="post" action="/accounts/login/"> <form method="post" action="/accounts/login/">
@@ -35,5 +35,6 @@
<button class="btn btn-primary" type="submit">{% trans "Anmelden" %}</button> <button class="btn btn-primary" type="submit">{% trans "Anmelden" %}</button>
</form> </form>
</div> </div>
</body> {% endblock %}
</html> {% endblock %}

View File

@@ -66,6 +66,7 @@
<li><code>/backend/config/</code>: Django settings, WSGI, URL config</li> <li><code>/backend/config/</code>: Django settings, WSGI, URL config</li>
<li><code>/backend/workflows/</code>: application logic, views, models, tasks, templates, static assets</li> <li><code>/backend/workflows/</code>: application logic, views, models, tasks, templates, static assets</li>
<li><code>/backend/workflows/templates/workflows/base_shell.html</code>: standard page shell for new staff-facing pages</li> <li><code>/backend/workflows/templates/workflows/base_shell.html</code>: standard page shell for new staff-facing pages</li>
<li>Rule: all interactive app pages should extend <code>base_shell.html</code>; do not rebuild topbar/frame logic in page-local templates.</li>
<li><code>/backend/media/templates/</code>: PDF HTML templates and letterhead source files</li> <li><code>/backend/media/templates/</code>: PDF HTML templates and letterhead source files</li>
<li><code>/backend/media/pdfs/</code>: generated PDF outputs on host volume</li> <li><code>/backend/media/pdfs/</code>: generated PDF outputs on host volume</li>
<li><code>/backend/locale/</code>: translation catalogs</li> <li><code>/backend/locale/</code>: translation catalogs</li>

View File

@@ -1,17 +1,14 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Form Builder" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_css %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="stylesheet" href="{% static 'workflows/css/form_builder.css' %}" />
<title>{% trans "Form Builder" %}</title> {% endblock %}
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" /> {% block shell_body %}
<link rel="stylesheet" href="{% static 'workflows/css/form_builder.css' %}" /> {% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %}
</head>
<body>
<div class="shell">
{% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %}
<header class="header"> <header class="header">
<h1>{% trans "Form Builder" %}</h1> <h1>{% trans "Form Builder" %}</h1>
@@ -166,8 +163,5 @@
</div> </div>
</form> </form>
</section> </section>
</div> {% endblock %}
<script src="{% static 'workflows/js/form_builder.js' %}"></script>
</body>
</html>

View File

@@ -1,14 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
{% get_current_language as CURRENT_LANGUAGE %}
<!doctype html> {% block title %}{% trans "TUBCO Onboarding & Offboarding Portal" %}{% endblock %}
<html lang="{{ CURRENT_LANGUAGE }}">
<head> {% block extra_head %}
<meta charset="utf-8" /> <style>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{% trans "TUBCO Onboarding & Offboarding Portal" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
:root { :root {
--brand-blue: #000078; --brand-blue: #000078;
--brand-red: #8c1d1d; --brand-red: #8c1d1d;
@@ -442,10 +438,10 @@
.quick-actions { justify-content: flex-start; } .quick-actions { justify-content: flex-start; }
} }
</style> </style>
</head> {% endblock %}
<body>
<div class="shell"> {% block shell_body %}
<div class="topbar"> <div class="topbar">
<div class="brand-wrap"> <div class="brand-wrap">
<a class="app-brand" href="/"><img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" /></a> <a class="app-brand" href="/"><img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" /></a>
</div> </div>
@@ -626,6 +622,5 @@
{% trans "Tipp: Die letzten Vorgänge sehen Sie jederzeit im Anfragen Dashboard." %} {% trans "Tipp: Die letzten Vorgänge sehen Sie jederzeit im Anfragen Dashboard." %}
</div> </div>
</main> </main>
</div> {% endblock %}
</body>
</html>

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Integrationen Setup" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Integrationen Setup" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #0f172a; padding: 20px; } body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #0f172a; padding: 20px; }
.shell { max-width: 980px; margin: 0 auto; background: #fff; border: 1px solid #d8e3f0; border-radius: 14px; padding: 16px; } .shell { max-width: 980px; margin: 0 auto; background: #fff; border: 1px solid #d8e3f0; border-radius: 14px; padding: 16px; }
.topbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; } .topbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; }
@@ -70,10 +67,10 @@
} }
@media (max-width: 760px) { .grid { grid-template-columns: 1fr; } } @media (max-width: 760px) { .grid { grid-template-columns: 1fr; } }
</style> </style>
</head> {% endblock %}
<body>
<div class="shell"> {% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %} {% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %}
<h1>{% trans "Integrationen Setup" %}</h1> <h1>{% trans "Integrationen Setup" %}</h1>
<p class="sub">{% trans "Verwalten Sie Nextcloud- und Mail-Konfiguration ohne Backend-Wechsel." %}</p> <p class="sub">{% trans "Verwalten Sie Nextcloud- und Mail-Konfiguration ohne Backend-Wechsel." %}</p>
@@ -365,6 +362,5 @@
</div> </div>
</form> </form>
{% endif %} {% endif %}
</div> {% endblock %}
</body>
</html>

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Einweisungs-Builder" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Einweisungs-Builder" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 20px; } body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 20px; }
.shell { max-width: 1180px; margin: 0 auto; background: #fff; border: 1px solid #d7e0ea; border-radius: 14px; padding: 18px; } .shell { max-width: 1180px; margin: 0 auto; background: #fff; border: 1px solid #d7e0ea; border-radius: 14px; padding: 18px; }
.topbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; } .topbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }
@@ -32,10 +29,10 @@
.actions { white-space: nowrap; } .actions { white-space: nowrap; }
.toolbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; } .toolbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
</style> </style>
</head> {% endblock %}
<body>
<div class="shell"> {% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_dashboard=1 header_show_home=1 header_inside_shell=1 %} {% include 'workflows/includes/app_header.html' with header_show_dashboard=1 header_show_home=1 header_inside_shell=1 %}
<div class="toolbar"> <div class="toolbar">
<div> <div>
@@ -143,6 +140,5 @@
<button class="btn btn-primary" type="submit">{% trans "Checkliste speichern" %}</button> <button class="btn btn-primary" type="submit">{% trans "Checkliste speichern" %}</button>
</div> </div>
</form> </form>
</div> {% endblock %}
</body>
</html>

View File

@@ -1,26 +1,26 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
{% get_current_language as CURRENT_LANGUAGE %}
<!doctype html> {% block title %}{% trans "Offboarding-Anfrage" %}{% endblock %}
<html lang="{{ CURRENT_LANGUAGE }}">
<head> {% block shell_class %}wrap{% endblock %}
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> {% block extra_css %}
<title>{% trans "Offboarding-Anfrage" %}</title> <link rel="stylesheet" href="{% static 'workflows/css/offboarding_form.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" /> {% endblock %}
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/offboarding_form.css' %}" /> {% block pre_shell %}
</head> <div id="saved-popup" class="popup-backdrop {% if saved %}show{% endif %}">
<body>
<div id="saved-popup" class="popup-backdrop {% if saved %}show{% endif %}">
<div class="popup"> <div class="popup">
<h3>{% trans "Anfrage gespeichert" %}</h3> <h3>{% trans "Anfrage gespeichert" %}</h3>
<p>{% blocktrans trimmed with request_id=saved_request_id %}Offboarding wurde erfolgreich gespeichert (ID: {{ request_id }}). Das PDF wird im Hintergrund erzeugt.{% endblocktrans %}</p> <p>{% blocktrans trimmed with request_id=saved_request_id %}Offboarding wurde erfolgreich gespeichert (ID: {{ request_id }}). Das PDF wird im Hintergrund erzeugt.{% endblocktrans %}</p>
<button class="btn btn-secondary" type="button" onclick="document.getElementById('saved-popup').classList.remove('show')">{% trans "Schließen" %}</button> <button class="btn btn-secondary" type="button" onclick="document.getElementById('saved-popup').classList.remove('show')">{% trans "Schließen" %}</button>
</div> </div>
</div> </div>
{% endblock %}
<div class="wrap"> {% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_lang=1 header_show_home=1 header_inside_shell=1 %} {% include 'workflows/includes/app_header.html' with header_show_lang=1 header_show_home=1 header_inside_shell=1 %}
<div class="wrap-body"> <div class="wrap-body">
<div class="card"> <div class="card">
@@ -66,9 +66,10 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %}
<script> {% block extra_scripts %}
(function () { <script>(function () {
function byName(name) { function byName(name) {
return document.querySelector('[name="' + name + '"]'); return document.querySelector('[name="' + name + '"]');
} }
@@ -120,5 +121,5 @@
suggestEmail(); suggestEmail();
}()); }());
</script> </script>
</body> {% endblock %}
</html>

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Offboarding gespeichert" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Offboarding gespeichert" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 24px; } body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 24px; }
.shell { background: #fff; border: 1px solid #d7e0ea; border-radius: 16px; padding: 20px; box-shadow: 0 16px 36px rgba(18,34,56,0.10); } .shell { background: #fff; border: 1px solid #d7e0ea; border-radius: 16px; padding: 20px; box-shadow: 0 16px 36px rgba(18,34,56,0.10); }
h1 { margin: 0 0 10px; color: #000078; } h1 { margin: 0 0 10px; color: #000078; }
@@ -15,11 +12,14 @@
code { background: #f4f6fa; padding: 2px 6px; border-radius: 6px; } code { background: #f4f6fa; padding: 2px 6px; border-radius: 6px; }
.actions { display:flex; gap:8px; flex-wrap:wrap; margin-top: 14px; } .actions { display:flex; gap:8px; flex-wrap:wrap; margin-top: 14px; }
</style> </style>
</head> {% endblock %}
<body>
{% include 'workflows/includes/app_header.html' with header_show_home=1 %} {% block shell_header %}
<div class="shell"> {% include 'workflows/includes/app_header.html' with header_show_home=1 %}
<h1>{% trans "Offboarding gespeichert" %}</h1> {% endblock %}
{% block shell_body %}
<h1>{% trans "Offboarding gespeichert" %}</h1>
<p>{% trans "Vorgangs-ID:" %} <code>{{ obj.id }}</code></p> <p>{% trans "Vorgangs-ID:" %} <code>{{ obj.id }}</code></p>
<p>{% trans "Name:" %} <code>{{ obj.full_name }}</code></p> <p>{% trans "Name:" %} <code>{{ obj.full_name }}</code></p>
<p>{% trans "E-Mail:" %} <code>{{ obj.work_email }}</code></p> <p>{% trans "E-Mail:" %} <code>{{ obj.work_email }}</code></p>
@@ -34,6 +34,5 @@
<a class="btn btn-secondary" href="/offboarding/new/">{% trans "Neue Offboarding-Anfrage erfassen" %}</a> <a class="btn btn-secondary" href="/offboarding/new/">{% trans "Neue Offboarding-Anfrage erfassen" %}</a>
<a class="btn btn-secondary" href="/requests/">{% trans "Zum Dashboard" %}</a> <a class="btn btn-secondary" href="/requests/">{% trans "Zum Dashboard" %}</a>
</div> </div>
</div> {% endblock %}
</body>
</html>

View File

@@ -1,26 +1,24 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
{% get_current_language as CURRENT_LANGUAGE %}
<!doctype html> {% block title %}{% trans "Onboarding-Anfrage" %}{% endblock %}
<html lang="{{ CURRENT_LANGUAGE }}">
<head> {% block extra_css %}
<meta charset="utf-8" /> <link rel="stylesheet" href="{% static 'workflows/css/onboarding_form.css' %}" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> {% endblock %}
<title>{% trans "Onboarding-Anfrage" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" /> {% block pre_shell %}
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" /> <div id="saved-popup" class="popup-backdrop {% if saved %}show{% endif %}">
<link rel="stylesheet" href="{% static 'workflows/css/onboarding_form.css' %}" />
</head>
<body>
<div id="saved-popup" class="popup-backdrop {% if saved %}show{% endif %}">
<div class="popup"> <div class="popup">
<h3>{% trans "Anfrage gespeichert" %}</h3> <h3>{% trans "Anfrage gespeichert" %}</h3>
<p>{% blocktrans trimmed with request_id=saved_request_id %}Onboarding wurde erfolgreich gespeichert (ID: {{ request_id }}). Das PDF wird im Hintergrund erzeugt.{% endblocktrans %}</p> <p>{% blocktrans trimmed with request_id=saved_request_id %}Onboarding wurde erfolgreich gespeichert (ID: {{ request_id }}). Das PDF wird im Hintergrund erzeugt.{% endblocktrans %}</p>
<button class="btn btn-secondary" type="button" onclick="document.getElementById('saved-popup').classList.remove('show')">{% trans "Schließen" %}</button> <button class="btn btn-secondary" type="button" onclick="document.getElementById('saved-popup').classList.remove('show')">{% trans "Schließen" %}</button>
</div> </div>
</div> </div>
{% endblock %}
<div class="shell"> {% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_lang=1 header_show_home=1 header_inside_shell=1 %} {% include 'workflows/includes/app_header.html' with header_show_lang=1 header_show_home=1 header_inside_shell=1 %}
<div class="shell-body"> <div class="shell-body">
<aside class="panel"> <aside class="panel">
@@ -162,9 +160,10 @@
</main> </main>
</div> </div>
</div> </div>
{% endblock %}
<script> {% block extra_scripts %}
(function () { <script>(function () {
const pages = Array.from(document.querySelectorAll('.page')); const pages = Array.from(document.querySelectorAll('.page'));
const navItems = Array.from(document.querySelectorAll('.step-item')); const navItems = Array.from(document.querySelectorAll('.step-item'));
const btnPrev = document.getElementById('btn-prev'); const btnPrev = document.getElementById('btn-prev');
@@ -418,5 +417,5 @@
updateStep(); updateStep();
})(); })();
</script> </script>
</body> {% endblock %}
</html>

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Einweisung durchführen" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Einweisung durchführen" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
:root { :root {
--brand-blue: #000078; --brand-blue: #000078;
--ink: #17253b; --ink: #17253b;
@@ -55,10 +52,10 @@
.actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 14px; } .actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 14px; }
@media (max-width: 900px) { .meta, .items { grid-template-columns: 1fr; } .meta-grid { grid-template-columns: 1fr; } .item:nth-last-child(-n+2) { border-bottom: 1px solid #eef3f8; } .item:last-child { border-bottom: 0; } } @media (max-width: 900px) { .meta, .items { grid-template-columns: 1fr; } .meta-grid { grid-template-columns: 1fr; } .item:nth-last-child(-n+2) { border-bottom: 1px solid #eef3f8; } .item:last-child { border-bottom: 0; } }
</style> </style>
</head> {% endblock %}
<body>
<div class="shell"> {% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_dashboard=1 header_show_home=1 header_inside_shell=1 %} {% include 'workflows/includes/app_header.html' with header_show_dashboard=1 header_show_home=1 header_inside_shell=1 %}
<div class="hero"> <div class="hero">
<h1>{% trans "Einweisung durchführen" %}</h1> <h1>{% trans "Einweisung durchführen" %}</h1>
@@ -149,5 +146,5 @@
</div> </div>
</div> </div>
</div> </div>
</body> {% endblock %}
</html>

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Onboarding gespeichert" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Onboarding gespeichert" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 24px; } body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #1b2b43; padding: 24px; }
.shell { background: #fff; border: 1px solid #d7e0ea; border-radius: 16px; padding: 20px; box-shadow: 0 16px 36px rgba(18,34,56,0.10); } .shell { background: #fff; border: 1px solid #d7e0ea; border-radius: 16px; padding: 20px; box-shadow: 0 16px 36px rgba(18,34,56,0.10); }
h1 { margin: 0 0 10px; color: #000078; } h1 { margin: 0 0 10px; color: #000078; }
@@ -15,11 +12,14 @@
code { background: #f4f6fa; padding: 2px 6px; border-radius: 6px; } code { background: #f4f6fa; padding: 2px 6px; border-radius: 6px; }
.actions { display:flex; gap:8px; flex-wrap:wrap; margin-top: 14px; } .actions { display:flex; gap:8px; flex-wrap:wrap; margin-top: 14px; }
</style> </style>
</head> {% endblock %}
<body>
{% include 'workflows/includes/app_header.html' with header_show_home=1 %} {% block shell_header %}
<div class="shell"> {% include 'workflows/includes/app_header.html' with header_show_home=1 %}
<h1>{% trans "Anfrage erfolgreich gespeichert" %}</h1> {% endblock %}
{% block shell_body %}
<h1>{% trans "Anfrage erfolgreich gespeichert" %}</h1>
<p>{% trans "Vorgangs-ID:" %} <code>{{ obj.id }}</code></p> <p>{% trans "Vorgangs-ID:" %} <code>{{ obj.id }}</code></p>
<p>{% trans "Name:" %} <code>{{ obj.full_name }}</code></p> <p>{% trans "Name:" %} <code>{{ obj.full_name }}</code></p>
<p>{% trans "E-Mail:" %} <code>{{ obj.work_email }}</code></p> <p>{% trans "E-Mail:" %} <code>{{ obj.work_email }}</code></p>
@@ -33,6 +33,5 @@
<a class="btn btn-secondary" href="/onboarding/new/">{% trans "Neue Anfrage erfassen" %}</a> <a class="btn btn-secondary" href="/onboarding/new/">{% trans "Neue Anfrage erfassen" %}</a>
<a class="btn btn-secondary" href="/requests/">{% trans "Zum Dashboard" %}</a> <a class="btn btn-secondary" href="/requests/">{% trans "Zum Dashboard" %}</a>
</div> </div>
</div> {% endblock %}
</body>
</html>

View File

@@ -194,6 +194,7 @@
<li><strong>Einweisungs- und Übergabeprotokoll:</strong> staff-only <code>PDF erzeugen</code>, <code>Neu erzeugen</code>, and <code>PDF öffnen</code> actions directly on onboarding rows in the Requests Dashboard.</li> <li><strong>Einweisungs- und Übergabeprotokoll:</strong> staff-only <code>PDF erzeugen</code>, <code>Neu erzeugen</code>, and <code>PDF öffnen</code> actions directly on onboarding rows in the Requests Dashboard.</li>
<li><strong>Einweisung durchführen:</strong> staff-only live checklist page opened from onboarding rows, with draft/completed status, notes, progress tracking, and a separate live-status PDF export.</li> <li><strong>Einweisung durchführen:</strong> staff-only live checklist page opened from onboarding rows, with draft/completed status, notes, progress tracking, and a separate live-status PDF export.</li>
<li><strong>Project Wiki:</strong> this documentation page.</li> <li><strong>Project Wiki:</strong> this documentation page.</li>
<li><strong>UI Shell Standard:</strong> interactive app pages should extend <code>base_shell.html</code>; PDF templates under <code>backend/media/templates/</code> must stay separate.</li>
<li><strong>Release Checklist:</strong> dedicated staff-only release runbook for validation, rollout evidence, and rollback basics.</li> <li><strong>Release Checklist:</strong> dedicated staff-only release runbook for validation, rollout evidence, and rollback basics.</li>
</ul> </ul>

View File

@@ -1,14 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
{% get_current_language as CURRENT_LANGUAGE %}
<!doctype html> {% block title %}{% trans "Anfragen Dashboard" %}{% endblock %}
<html lang="{{ CURRENT_LANGUAGE }}">
<head> {% block extra_head %}
<meta charset="utf-8" /> <style>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{% trans "Anfragen Dashboard" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
:root { :root {
--brand-blue: #000078; --brand-blue: #000078;
--brand-blue-soft: #1f4fd6; --brand-blue-soft: #1f4fd6;
@@ -873,10 +869,10 @@
.table-wrap { padding-left: 12px; padding-right: 12px; } .table-wrap { padding-left: 12px; padding-right: 12px; }
} }
</style> </style>
</head> {% endblock %}
<body>
<div class="shell"> {% block shell_body %}
<div class="topbar"> <div class="topbar">
<div class="brand-wrap"> <div class="brand-wrap">
<a class="app-brand" href="/"><img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" /></a> <a class="app-brand" href="/"><img class="brand-logo" src="{% static 'workflows/img/tubco-logo.svg' %}" alt="TUB/CO Logo" /></a>
</div> </div>
@@ -1001,9 +997,10 @@
</div> </div>
</form> </form>
<div class="search-help">{% trans "Datensätze können direkt in der Tabelle gefiltert, geöffnet, geprüft oder gelöscht werden." %}</div> <div class="search-help">{% trans "Datensätze können direkt in der Tabelle gefiltert, geöffnet, geprüft oder gelöscht werden." %}</div>
</div> {% endblock %}
{% if request.user.is_staff %}
<div class="control-stack"> {% block extra_scripts %}
{% if request.user.is_staff %}<div class="control-stack">
<form method="post" action="/requests/" id="bulk-delete-form" onsubmit="return confirm('Ausgewählte Einträge wirklich löschen?');"> <form method="post" action="/requests/" id="bulk-delete-form" onsubmit="return confirm('Ausgewählte Einträge wirklich löschen?');">
{% csrf_token %} {% csrf_token %}
<div class="bulk-toolbar"> <div class="bulk-toolbar">
@@ -1144,5 +1141,5 @@
})(); })();
</script> </script>
{% endif %} {% endif %}
</body> {% endblock %}
</html>

View File

@@ -1,13 +1,10 @@
{% extends 'workflows/base_shell.html' %}
{% load static i18n %} {% load static i18n %}
<!doctype html>
<html lang="de"> {% block title %}{% trans "Welcome E-Mails" %}{% endblock %}
<head>
<meta charset="utf-8" /> {% block extra_head %}
<meta name="viewport" content="width=device-width, initial-scale=1" /> <style>
<title>{% trans "Welcome E-Mails" %}</title>
<link rel="stylesheet" href="{% static 'workflows/css/buttons.css' %}" />
<link rel="stylesheet" href="{% static 'workflows/css/app_chrome.css' %}" />
<style>
body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #0f172a; padding: 20px; } body { margin: 0; font-family: Arial, sans-serif; background: #f4f8ff; color: #0f172a; padding: 20px; }
.shell { max-width: 1100px; margin: 0 auto; background: #fff; border: 1px solid #d8e3f0; border-radius: 14px; padding: 16px; } .shell { max-width: 1100px; margin: 0 auto; background: #fff; border: 1px solid #d8e3f0; border-radius: 14px; padding: 16px; }
.topbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; } .topbar { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; }
@@ -41,10 +38,10 @@
.select-col { width: 42px; text-align: center; } .select-col { width: 42px; text-align: center; }
.bulk-note { color: #64748b; font-size: 12px; } .bulk-note { color: #64748b; font-size: 12px; }
</style> </style>
</head> {% endblock %}
<body>
<div class="shell"> {% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %} {% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %}
<h1>{% trans "Geplante Welcome E-Mails" %}</h1> <h1>{% trans "Geplante Welcome E-Mails" %}</h1>
<p class="sub">{% trans "Welcome-Mails konfigurieren und geplante Mails steuern (sofort senden, pausieren, fortsetzen, abbrechen)." %}</p> <p class="sub">{% trans "Welcome-Mails konfigurieren und geplante Mails steuern (sofort senden, pausieren, fortsetzen, abbrechen)." %}</p>
@@ -180,9 +177,10 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> {% endblock %}
<script>
(function () { {% block extra_scripts %}
<script>(function () {
const selectAll = document.getElementById('select-all-welcome'); const selectAll = document.getElementById('select-all-welcome');
const rowChecks = Array.from(document.querySelectorAll('.welcome-select')); const rowChecks = Array.from(document.querySelectorAll('.welcome-select'));
const selectedCount = document.getElementById('selected-count'); const selectedCount = document.getElementById('selected-count');
@@ -235,5 +233,5 @@
syncState(); syncState();
})(); })();
</script> </script>
</body> {% endblock %}
</html>