snapshot: preserve app state before onboarding pdf layout restore

This commit is contained in:
Md Bayazid Bostame
2026-03-27 23:52:37 +01:00
parent 631886a763
commit 5cb7ef78f8
13 changed files with 318 additions and 306 deletions

View File

@@ -11,38 +11,38 @@
{% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_home=1 header_inside_shell=1 %}
<div class="builder-workspace">
<aside class="builder-sidebar">
<div class="builder-sidebar-card">
<span class="builder-sidebar-eyebrow">{% trans "Arbeitsbereich" %}</span>
<div class="builder-workspace app-workspace">
<aside class="builder-sidebar app-sidebar">
<div class="builder-sidebar-card app-sidebar-card">
<span class="builder-sidebar-eyebrow app-sidebar-eyebrow">{% trans "Arbeitsbereich" %}</span>
<h2>{% trans "Formularsteuerung" %}</h2>
</div>
<nav class="builder-side-nav" aria-label="{% trans 'Builder Navigation' %}">
<a class="builder-side-link{% if active_module == 'structure' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=structure">
<span class="builder-side-link-title">{% trans "Struktur & Reihenfolge" %}</span>
<span class="builder-side-link-meta">{{ columns|length }} {% trans "Abschnitte" %}</span>
<nav class="builder-side-nav app-side-nav" aria-label="{% trans 'Builder Navigation' %}">
<a class="builder-side-link app-side-link{% if active_module == 'structure' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=structure">
<span class="builder-side-link-title app-side-link-title">{% trans "Struktur & Reihenfolge" %}</span>
<span class="builder-side-link-meta app-side-link-meta">{{ columns|length }} {% trans "Abschnitte" %}</span>
</a>
<a class="builder-side-link{% if active_module == 'section-rules' or active_module == 'field-rules' or active_module == 'conditional-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=field-rules">
<span class="builder-side-link-title">{% trans "Sichtbarkeit & Regeln" %}</span>
<span class="builder-side-link-meta">{{ builder_summary.hidden_field_count }} {% trans "ausgeblendet" %}</span>
<a class="builder-side-link app-side-link{% if active_module == 'section-rules' or active_module == 'field-rules' or active_module == 'conditional-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=field-rules">
<span class="builder-side-link-title app-side-link-title">{% trans "Sichtbarkeit & Regeln" %}</span>
<span class="builder-side-link-meta app-side-link-meta">{{ builder_summary.hidden_field_count }} {% trans "ausgeblendet" %}</span>
</a>
<a class="builder-side-link{% if active_module == 'options' or active_module == 'field-texts' or active_module == 'custom-sections' or active_module == 'custom-fields' or active_module == 'preview' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=options">
<span class="builder-side-link-title">{% trans "Optionen & Texte" %}</span>
<span class="builder-side-link-meta">{{ builder_summary.custom_field_count }} {% trans "eigene Felder" %}</span>
<a class="builder-side-link app-side-link{% if active_module == 'options' or active_module == 'field-texts' or active_module == 'custom-sections' or active_module == 'custom-fields' or active_module == 'preview' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=options">
<span class="builder-side-link-title app-side-link-title">{% trans "Optionen & Texte" %}</span>
<span class="builder-side-link-meta app-side-link-meta">{{ builder_summary.custom_field_count }} {% trans "eigene Felder" %}</span>
</a>
</nav>
<div class="builder-sidebar-card builder-sidebar-stats">
<div class="builder-side-stat">
<div class="builder-sidebar-card builder-sidebar-stats app-sidebar-card app-sidebar-stats">
<div class="builder-side-stat app-side-stat">
<strong>{{ builder_summary.configurable_field_count }}</strong>
<span>{% trans "konfigurierbare Felder" %}</span>
</div>
<div class="builder-side-stat">
<div class="builder-side-stat app-side-stat">
<strong>{{ builder_summary.custom_section_count }}</strong>
<span>{% trans "eigene Abschnitte" %}</span>
</div>
<div class="builder-side-stat">
<div class="builder-side-stat app-side-stat">
<strong>{{ builder_summary.custom_field_count }}</strong>
<span>{% trans "eigene Felder" %}</span>
</div>
@@ -152,11 +152,11 @@
</div>
</div>
<nav class="builder-module-nav" aria-label="{% trans 'Regelmodule' %}">
<a class="builder-module-link{% if active_module == 'section-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=section-rules">{% trans "Abschnitte" %}</a>
<a class="builder-module-link{% if active_module == 'field-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=field-rules">{% trans "Feldregeln" %}</a>
<nav class="builder-module-nav app-module-nav" aria-label="{% trans 'Regelmodule' %}">
<a class="builder-module-link app-module-link{% if active_module == 'section-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=section-rules">{% trans "Abschnitte" %}</a>
<a class="builder-module-link app-module-link{% if active_module == 'field-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=field-rules">{% trans "Feldregeln" %}</a>
{% if form_type == 'onboarding' %}
<a class="builder-module-link{% if active_module == 'conditional-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=conditional-rules">{% trans "Bedingte Logik" %}</a>
<a class="builder-module-link app-module-link{% if active_module == 'conditional-rules' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=conditional-rules">{% trans "Bedingte Logik" %}</a>
{% endif %}
</nav>
@@ -441,14 +441,14 @@
</div>
</div>
<nav class="builder-module-nav" aria-label="{% trans 'Inhaltsmodule' %}">
<a class="builder-module-link{% if active_module == 'options' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=options">{% trans "Optionen" %}</a>
<a class="builder-module-link{% if active_module == 'field-texts' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=field-texts">{% trans "Feldtexte" %}</a>
<nav class="builder-module-nav app-module-nav" aria-label="{% trans 'Inhaltsmodule' %}">
<a class="builder-module-link app-module-link{% if active_module == 'options' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=options">{% trans "Optionen" %}</a>
<a class="builder-module-link app-module-link{% if active_module == 'field-texts' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=field-texts">{% trans "Feldtexte" %}</a>
{% if form_type == 'onboarding' %}
<a class="builder-module-link{% if active_module == 'custom-sections' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=custom-sections">{% trans "Eigene Abschnitte" %}</a>
<a class="builder-module-link app-module-link{% if active_module == 'custom-sections' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=custom-sections">{% trans "Eigene Abschnitte" %}</a>
{% endif %}
<a class="builder-module-link{% if active_module == 'custom-fields' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=custom-fields">{% trans "Eigene Felder" %}</a>
<a class="builder-module-link{% if active_module == 'preview' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=preview">{% trans "Vorschau" %}</a>
<a class="builder-module-link app-module-link{% if active_module == 'custom-fields' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=custom-fields">{% trans "Eigene Felder" %}</a>
<a class="builder-module-link app-module-link{% if active_module == 'preview' %} is-active{% endif %}" href="/admin-tools/form-builder/?form_type={{ form_type }}&option_category={{ selected_option_category }}&module=preview">{% trans "Vorschau" %}</a>
</nav>
<div class="builder-stack-layout">

View File

@@ -37,57 +37,6 @@
<main class="main">
{% include 'workflows/includes/messages.html' %}
{% if ops_summary.show %}
<section class="ops-overview-card">
<div class="ops-overview-head">
<div>
<h2>{% trans "Operations Overview" %}</h2>
<p>{% trans "Letzte Laufzeit- und Backup-Signale auf einen Blick." %}</p>
</div>
</div>
<div class="ops-overview-grid">
{% if ops_summary.can_view_jobs %}
<article class="ops-stat-card">
<span class="ops-stat-label">{% trans "Fehlgeschlagene Jobs (24h)" %}</span>
<strong class="{% if ops_summary.failed_count_24h %}is-error{% endif %}">{{ ops_summary.failed_count_24h }}</strong>
</article>
<article class="ops-stat-card">
<span class="ops-stat-label">{% trans "Erfolgreiche Jobs (24h)" %}</span>
<strong>{{ ops_summary.success_count_24h }}</strong>
</article>
<article class="ops-stat-card">
<span class="ops-stat-label">{% trans "Offene Starts (24h)" %}</span>
<strong>{{ ops_summary.started_count_24h }}</strong>
</article>
{% endif %}
{% if ops_summary.can_manage_backups and ops_summary.backup_health %}
<article class="ops-stat-card">
<span class="ops-stat-label">{% trans "Backup-Status" %}</span>
<strong>{{ ops_summary.backup_health.label }}</strong>
<span class="mini">{{ ops_summary.backup_health.summary }}</span>
</article>
{% endif %}
</div>
{% if ops_summary.can_view_jobs and ops_summary.recent_failed_logs %}
<div class="ops-failure-list">
<div class="ops-failure-head">
<h3>{% trans "Letzte Fehler" %}</h3>
<a class="btn btn-secondary" href="/admin-tools/jobs/">{% trans "Job Monitor öffnen" %}</a>
</div>
<div class="ops-failure-items">
{% for log in ops_summary.recent_failed_logs %}
<article class="ops-failure-item">
<strong>{{ log.task_name }}</strong>
<span>{{ log.target_label|default:log.target_type }}</span>
<code>{{ log.error_message|truncatechars:120 }}</code>
</article>
{% endfor %}
</div>
</div>
{% endif %}
</section>
{% endif %}
{% for section in portal_app_sections %}
{% if not forloop.first %}
<div class="section-divider" aria-hidden="true"></div>

View File

@@ -23,7 +23,7 @@
</div>
</header>
<div class="switch">
<div class="switch app-module-nav">
<a class="tab {% if kind == 'nextcloud' %}active{% endif %}" href="/admin-tools/integrations/?kind=nextcloud">{% trans "Setup Nextcloud" %}</a>
<a class="tab {% if kind == 'mail' %}active{% endif %}" href="/admin-tools/integrations/?kind=mail">{% trans "Setup Mail" %}</a>
<a class="tab {% if kind == 'emails' %}active{% endif %}" href="/admin-tools/integrations/?kind=emails">{% trans "E-Mail Routing & Vorlagen" %}</a>

View File

@@ -37,6 +37,15 @@
<label>{% trans "Offene Starts (24h)" %}</label>
<div class="branding-inline-value">{{ job_summary.started_count_24h }}</div>
</div>
{% if job_summary.can_manage_backups and job_summary.backup_health %}
<div class="field">
<label>{% trans "Backup-Status" %}</label>
<div class="branding-inline-value">
<strong>{{ job_summary.backup_health.label }}</strong>
<div class="mini">{{ job_summary.backup_health.summary }}</div>
</div>
</div>
{% endif %}
</div>
{% if job_summary.recent_failed %}
<div class="table-wrap u-mt-12 app-table-shell">

View File

@@ -20,24 +20,26 @@
{% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_lang=1 header_show_home=1 header_inside_shell=1 %}
<div class="offboarding-shell-body">
<aside class="offboarding-panel">
<div class="app-workspace workflow-workspace">
<aside class="app-sidebar">
<div class="app-sidebar-card workflow-sidebar-card">
<h1>{% trans "Offboarding" %}</h1>
<p class="offboarding-sub">{% trans "Strukturierte Austrittsanfrage mit denselben klaren Oberflächenmustern wie im Onboarding." %}</p>
<ol class="offboarding-step-list">
<ol class="app-flow-list">
{% for section in offboarding_sections %}
<li class="offboarding-step-item">
<span class="offboarding-dot">{{ forloop.counter }}</span>
<li class="app-flow-item">
<span class="app-flow-dot">{{ forloop.counter }}</span>
<div>
<div class="offboarding-step-title">{{ section.title }}</div>
<div class="offboarding-step-sub">{{ section.subtitle }}</div>
<div class="app-flow-title">{{ section.title }}</div>
<div class="app-flow-sub">{{ section.subtitle }}</div>
</div>
</li>
{% endfor %}
</ol>
</div>
</aside>
<main class="offboarding-main">
<main class="workflow-form-main offboarding-main">
<section class="offboarding-search-card">
<div class="offboarding-section-head offboarding-search-head">
<div>

View File

@@ -20,24 +20,26 @@
{% block shell_body %}
{% include 'workflows/includes/app_header.html' with header_show_lang=1 header_show_home=1 header_inside_shell=1 %}
<div class="shell-body">
<aside class="panel">
<div class="app-workspace workflow-workspace">
<aside class="app-sidebar">
<div class="app-sidebar-card workflow-sidebar-card">
<h1>{% trans "Onboarding" %}</h1>
<p class="sub">{% trans "Mehrseitiges Formular mit konfigurierbaren Feldern aus dem Admin." %}</p>
<ol class="step-list">
<ol class="app-flow-list">
{% for section in onboarding_sections %}
<li class="step-item {% if forloop.first %}active{% endif %}" data-nav-step="{{ forloop.counter }}" role="button" tabindex="0" aria-label="{{ section.title }}">
<span class="dot">{{ forloop.counter }}</span>
<li class="app-flow-item {% if forloop.first %}is-active{% endif %}" data-nav-step="{{ forloop.counter }}" role="button" tabindex="0" aria-label="{{ section.title }}">
<span class="app-flow-dot">{{ forloop.counter }}</span>
<div>
<div class="step-title">{{ section.title }}</div>
<div class="step-sub">{{ section.subtitle }}</div>
<div class="app-flow-title">{{ section.title }}</div>
<div class="app-flow-sub">{{ section.subtitle }}</div>
</div>
</li>
{% endfor %}
</ol>
</div>
</aside>
<main class="main">
<main class="workflow-form-main">
{% if form.errors %}
<div class="error-banner">{% trans "Bitte prüfen Sie die markierten Felder. Ungültige Eingaben wurden erkannt." %}</div>
{% endif %}