From 2f73217759c0e2d93b69ca93acc096df69c824dc Mon Sep 17 00:00:00 2001 From: FlorianEisenmenger Date: Sun, 24 May 2026 02:06:39 +0200 Subject: [PATCH] beautify html --- httpdocs/README.md | 64 +++++-- httpdocs/templates/_nav.html.twig | 16 +- .../email/registration_confirm.html.twig | 13 +- .../email/registration_notify.html.twig | 14 +- .../email/registration_welcome.html.twig | 10 +- .../templates/email/team_invite.html.twig | 17 +- httpdocs/templates/invite/error.html.twig | 6 +- .../templates/invite/set_password.html.twig | 12 +- .../registration/confirm_error.html.twig | 8 +- .../registration/confirmed.html.twig | 12 +- .../templates/registration/register.html.twig | 32 ++-- httpdocs/templates/security/login.html.twig | 12 +- httpdocs/templates/service/index.html.twig | 156 ++++++++--------- httpdocs/translations/messages.de.yaml | 163 ++++++++++++++---- 14 files changed, 336 insertions(+), 199 deletions(-) diff --git a/httpdocs/README.md b/httpdocs/README.md index 695e7fd..cc001b2 100644 --- a/httpdocs/README.md +++ b/httpdocs/README.md @@ -1,33 +1,54 @@ -# INSTALLATION +# spawntree Timetracker +## Installation + +```bash cd httpdocs -ddev start => Läuft dann unter https://timetracking.ddev.site:8459 +ddev start +# Läuft dann unter https://timetracking.ddev.site:8459 + ddev exec composer install ddev exec npm install -sh 1-reset-and-seed.sh (Entweder mit oder ohne Testdaten) -# Dann SCSS / JS bauen und beobachten: +sh 1-reset-and-seed.sh +# Entweder mit oder ohne Testdaten + ddev exec npm run watch +``` + +--- + +## Live-Setup (einmalig) -# LIVE EINMALIG AUSFÜHREN: -GRANT ALL PRIVILEGES ON \`db_%\`.* TO 'deindbuser'@'%'; FLUSH PRIVILEGES; +```sql +GRANT ALL PRIVILEGES ON `db_%`.* TO 'deindbuser'@'%'; FLUSH PRIVILEGES; +``` -# Central Entity geändert → Migration erstellen + ausführen: +--- + +## Migrationen + +### Central Entity geändert + +```bash ddev exec php bin/console doctrine:migrations:diff --em=central --namespace=DoctrineMigrations ddev exec php bin/console doctrine:migrations:migrate --em=central --no-interaction +``` + +### Tenant Entity geändert + +Kein Migrations-Workflow — die Tenant-DB wird per SchemaTool neu angelegt: -# Tenant Entity geändert → kein Migrations-Workflow. +```bash sh reset-and-seed.sh -# Das legt die Tenant-DB per SchemaTool neu an. +``` -# Alle URLs anzeigen -ddev describe +--- -# Cache clear -ddev exec php bin/console cache:clear +## Webpack / Assets -# WEBPACK -# Einmalig bauen (Dev) +```bash +# Dev (einmalig) ddev exec npm run dev # Watch-Modus (bei Änderungen automatisch neu bauen) @@ -35,3 +56,16 @@ ddev exec npm run watch # Production Build ddev exec npm run build +``` + +--- + +## Hilfsbefehle + +```bash +# Alle URLs anzeigen +ddev describe + +# Cache leeren +ddev exec php bin/console cache:clear +``` \ No newline at end of file diff --git a/httpdocs/templates/_nav.html.twig b/httpdocs/templates/_nav.html.twig index a355e92..04358b1 100644 --- a/httpdocs/templates/_nav.html.twig +++ b/httpdocs/templates/_nav.html.twig @@ -5,37 +5,37 @@ diff --git a/httpdocs/templates/email/registration_confirm.html.twig b/httpdocs/templates/email/registration_confirm.html.twig index 781fd05..dea00c9 100644 --- a/httpdocs/templates/email/registration_confirm.html.twig +++ b/httpdocs/templates/email/registration_confirm.html.twig @@ -8,23 +8,22 @@

spawntree Timetracker


-

Hallo {{ token.firstName }},

+

{{ 'app.email.confirm.greeting'|trans({'%name%': token.firstName}) }}

- bitte bestätige deine Registrierung für {{ token.companyName }} - mit einem Klick auf den Button. + {{ 'app.email.confirm.body'|trans({'%company%': token.companyName}) }}

- E-Mail bestätigen + {{ 'app.email.confirm.btn'|trans }}

- Der Link ist 24 Stunden gültig (bis {{ token.expiresAt|date('d.m.Y H:i') }} Uhr).
- Falls du dich nicht registriert hast, kannst du diese E-Mail ignorieren. + {{ 'app.email.confirm.expiry'|trans({'%expires%': token.expiresAt|date('d.m.Y H:i')}) }}
+ {{ 'app.email.confirm.ignore'|trans }}

{{ verifyUrl }} @@ -32,4 +31,4 @@ - \ No newline at end of file + diff --git a/httpdocs/templates/email/registration_notify.html.twig b/httpdocs/templates/email/registration_notify.html.twig index bca96f3..ae631e0 100644 --- a/httpdocs/templates/email/registration_notify.html.twig +++ b/httpdocs/templates/email/registration_notify.html.twig @@ -3,13 +3,13 @@ -

Neue Registrierung im Timetracker

+

{{ 'app.email.notify.title'|trans }}

- - - - - + + + + +
Firma{{ account.name }}
Slug{{ account.slug }}
Name{{ user.fullName }}
E-Mail{{ user.email }}
Datum{{ account.createdAt|date('d.m.Y H:i') }}
{{ 'app.email.notify.col_company'|trans }}{{ account.name }}
{{ 'app.email.notify.col_slug'|trans }}{{ account.slug }}
{{ 'app.email.notify.col_name'|trans }}{{ user.fullName }}
{{ 'app.email.notify.col_email'|trans }}{{ user.email }}
{{ 'app.email.notify.col_date'|trans }}{{ account.createdAt|date('d.m.Y H:i') }}
- \ No newline at end of file + diff --git a/httpdocs/templates/email/registration_welcome.html.twig b/httpdocs/templates/email/registration_welcome.html.twig index a68b39a..987aaac 100644 --- a/httpdocs/templates/email/registration_welcome.html.twig +++ b/httpdocs/templates/email/registration_welcome.html.twig @@ -8,23 +8,23 @@

spawntree Timetracker


-

Hallo {{ user.firstName }},

+

{{ 'app.email.welcome.greeting'|trans({'%name%': user.firstName}) }}

- dein Konto für {{ account.name }} ist jetzt aktiv. Los geht's! + {{ 'app.email.welcome.body'|trans({'%company%': account.name}) }}

- Zum Timetracker → + {{ 'app.email.welcome.btn'|trans }}

- Deine URL: {{ loginUrl }} + {{ 'app.email.welcome.url_label'|trans }} {{ loginUrl }}

- \ No newline at end of file + diff --git a/httpdocs/templates/email/team_invite.html.twig b/httpdocs/templates/email/team_invite.html.twig index bff716f..d87f50b 100644 --- a/httpdocs/templates/email/team_invite.html.twig +++ b/httpdocs/templates/email/team_invite.html.twig @@ -6,27 +6,28 @@

- Du wurdest zu {{ invite.account.name }} eingeladen + {{ 'app.email.invite.title'|trans({'%company%': invite.account.name}) }}

- Hallo {{ invite.firstName }},
- du wurdest als {{ invite.role == 'admin' ? 'Administrator' : (invite.role == 'tracker' ? 'Zeiterfasser' : 'Standard-Nutzer') }} - zum Team von {{ invite.account.name }} hinzugefügt. + {{ 'app.email.invite.greeting'|trans({'%name%': invite.firstName}) }}
+ {{ 'app.email.invite.role_added_pre'|trans }} + {{ invite.role == 'admin' ? 'app.email.invite.role_admin'|trans : (invite.role == 'tracker' ? 'app.email.invite.role_tracker'|trans : 'app.email.invite.role_member'|trans) }} + {{ 'app.email.invite.role_added_post'|trans({'%company%': invite.account.name}) }}

- Klicke auf den Button, um dein Passwort festzulegen und loszulegen. Der Link ist 7 Tage gültig. + {{ 'app.email.invite.cta'|trans }}

- Passwort festlegen → + {{ 'app.email.invite.btn'|trans }}

- Wenn du diese Einladung nicht erwartet hast, kannst du diese E-Mail ignorieren. + {{ 'app.email.invite.ignore'|trans }}

- \ No newline at end of file + diff --git a/httpdocs/templates/invite/error.html.twig b/httpdocs/templates/invite/error.html.twig index d387d9f..ecc3ba3 100644 --- a/httpdocs/templates/invite/error.html.twig +++ b/httpdocs/templates/invite/error.html.twig @@ -4,13 +4,13 @@ - Fehler – Einladungslink + {{ 'app.invite_error.page_title'|trans }} {{ encore_entry_link_tags('app') }}
- +
- \ No newline at end of file + diff --git a/httpdocs/templates/invite/set_password.html.twig b/httpdocs/templates/invite/set_password.html.twig index baf256b..dbbc50d 100644 --- a/httpdocs/templates/invite/set_password.html.twig +++ b/httpdocs/templates/invite/set_password.html.twig @@ -4,7 +4,7 @@ - Passwort festlegen – {{ invite.account.name }} + {{ 'app.set_password.page_title'|trans({'%name%': invite.account.name}) }} {{ encore_entry_link_tags('app') }} @@ -12,7 +12,7 @@
- + {% if error %} @@ -22,7 +22,7 @@ - \ No newline at end of file + diff --git a/httpdocs/templates/registration/confirmed.html.twig b/httpdocs/templates/registration/confirmed.html.twig index e556113..c44b986 100644 --- a/httpdocs/templates/registration/confirmed.html.twig +++ b/httpdocs/templates/registration/confirmed.html.twig @@ -4,7 +4,7 @@ - Konto aktiviert – spawntree Timetracker + {{ 'app.confirmed.page_title'|trans }} {{ encore_entry_link_tags('app') }} @@ -14,17 +14,17 @@
-

Konto aktiviert!

+

{{ 'app.confirmed.title'|trans }}

- Willkommen, {{ account.name }}.
- Du wirst gleich weitergeleitet … + {{ 'app.confirmed.welcome'|trans({'%name%': account.name}) }}
+ {{ 'app.confirmed.redirect'|trans }}

- Jetzt anmelden → + {{ 'app.confirmed.btn_login'|trans }}
- \ No newline at end of file + diff --git a/httpdocs/templates/registration/register.html.twig b/httpdocs/templates/registration/register.html.twig index 218a7ab..d6204bd 100644 --- a/httpdocs/templates/registration/register.html.twig +++ b/httpdocs/templates/registration/register.html.twig @@ -4,7 +4,7 @@ - Registrieren – spawntree Timetracker + {{ 'app.register.page_title'|trans }} {{ encore_entry_link_tags('app') }} @@ -15,61 +15,61 @@
spawntree Timetracker
-

Konto erstellen

-

Kostenlos starten, keine Kreditkarte nötig.

+

{{ 'app.register.title'|trans }}

+

{{ 'app.register.subtitle'|trans }}

- Dein Unternehmen + {{ 'app.register.section_company'|trans }}
- +
- Deine voraussichtliche URL: + {{ 'app.register.url_preview_label'|trans }}
- Dein Konto + {{ 'app.register.section_account'|trans }}
- +
- +
- +
- +
- +
@@ -78,10 +78,10 @@
@@ -93,4 +93,4 @@ {{ encore_entry_script_tags('registration') }} - \ No newline at end of file + diff --git a/httpdocs/templates/security/login.html.twig b/httpdocs/templates/security/login.html.twig index 2a5b937..e44dbc2 100644 --- a/httpdocs/templates/security/login.html.twig +++ b/httpdocs/templates/security/login.html.twig @@ -4,7 +4,7 @@ - Anmelden – spawntree + {{ 'app.login.page_title'|trans }} {{ encore_entry_link_tags('app') }} @@ -23,7 +23,7 @@ - \ No newline at end of file + diff --git a/httpdocs/templates/service/index.html.twig b/httpdocs/templates/service/index.html.twig index 88e398c..c04405f 100644 --- a/httpdocs/templates/service/index.html.twig +++ b/httpdocs/templates/service/index.html.twig @@ -1,65 +1,65 @@ {# templates/service/index.html.twig #} {% extends 'base.html.twig' %} -{% block title %}Leistungen{% endblock %} +{% block title %}{{ 'app.service.page_title'|trans }}{% endblock %} {% block body %} - + -
+
-
-

Leistungen

- -
+
+

{{ 'app.service.page_title'|trans }}

+ +
-
-
+
+
- -
- -
+ +
+ +
- -
- -
+ +
+ +
- -
- -
+ +
+ +
-
- - -
+
+ + +
+
-
-
- - -
+
+ + +
-
+
- {% set currentGroup = null %} - {% for service in services %} + {% set currentGroup = null %} + {% for service in services %} - {% set group = service.billable ? 'Verrechenbar' : 'Nicht-verrechenbar' %} + {% set group = service.billable ? 'app.service.billable'|trans : 'app.service.not_billable'|trans %} {% if group != currentGroup %} - {% if currentGroup is not null %}
{% endif %} -
-
{{ group }}
- {% set currentGroup = group %} + {% if currentGroup is not null %}
{% endif %} +
+
{{ group }}
+ {% set currentGroup = group %} {% endif %}
{% if service.isArchived() %} - {% else %} - - {% endif %} @@ -91,47 +91,47 @@ window.CRUD = { apiBase: '/api/services' };
{% if not service.isArchived() %} - {% endif %} + {% else %} +
+

{{ 'app.service.empty'|trans }}

+
+ {% endfor %} + {% if currentGroup is not null %}
{% endif %}
-
+
{% endblock %} diff --git a/httpdocs/translations/messages.de.yaml b/httpdocs/translations/messages.de.yaml index d948f81..2f76b1a 100644 --- a/httpdocs/translations/messages.de.yaml +++ b/httpdocs/translations/messages.de.yaml @@ -2,42 +2,145 @@ app: date: - today: "Heute" - tomorrow: "Morgen" - yesterday: "Gestern" - week_label: "Kalenderwoche" + today: "Heute" + tomorrow: "Morgen" + yesterday: "Gestern" + week_label: "Kalenderwoche" nav: - prev_week: "Vorherige Woche" - next_week: "Nächste Woche" - month_view: "Monatsansicht öffnen/schließen" - prev_month: "Vorheriger Monat" - next_month: "Nächster Monat" - close_month: "Monatsansicht schließen" + prev_week: "Vorherige Woche" + next_week: "Nächste Woche" + month_view: "Monatsansicht öffnen/schließen" + prev_month: "Vorheriger Monat" + next_month: "Nächster Monat" + close_month: "Monatsansicht schließen" + time_tracking: "Zeit erfassen" + reports: "Reports" + clients: "Kunden" + projects: "Projekte" + services: "Leistungen" + team: "Team" + account: "Account" + logout: "Abmelden" entry: - label_duration: "Dauer" + label_duration: "Dauer" label_project_service: "Projekt / Leistung" - label_note: "Bemerkung" - placeholder_note: "Optionale Beschreibung …" + label_note: "Bemerkung" + placeholder_note: "Optionale Beschreibung …" placeholder_duration_hint: "Format: 1:30 oder 1.5" - btn_create: "Erstellen" - btn_save: "Sichern" - btn_cancel: "Abbrechen" - btn_edit: "Bearbeiten" - btn_delete: "Löschen" - no_entries: "Noch keine Zeiteinträge für diesen Tag" - select_placeholder: "..." - confirm_delete: "Eintrag wirklich löschen?" - error_no_project: "Bitte ein Projekt wählen." - error_save: "Fehler beim Speichern des Eintrags." - error_delete: "Fehler beim Löschen." - error_load: "Fehler beim Laden der Einträge." - duration_hint: "1:30 für 1 Std 30 Min · 8 12 für 8 bis 12 Uhr · 1,75 für 1 Std 45 Min · 0:00 zum Stoppen" - error_zero_duration: "Bitte eine Dauer größer als 0:00 eingeben." + btn_create: "Erstellen" + btn_save: "Sichern" + btn_cancel: "Abbrechen" + btn_edit: "Bearbeiten" + btn_delete: "Löschen" + no_entries: "Noch keine Zeiteinträge für diesen Tag" + select_placeholder: "..." + confirm_delete: "Eintrag wirklich löschen?" + error_no_project: "Bitte ein Projekt wählen." + error_save: "Fehler beim Speichern des Eintrags." + error_delete: "Fehler beim Löschen." + error_load: "Fehler beim Laden der Einträge." + duration_hint: "1:30 für 1 Std 30 Min · 8 12 für 8 bis 12 Uhr · 1,75 für 1 Std 45 Min · 0:00 zum Stoppen" + error_zero_duration: "Bitte eine Dauer größer als 0:00 eingeben." error_duration_too_long: "Eine Dauer von mehr als 24 Stunden ist nicht möglich." - warn_duration_long: "Die Dauer ist länger als 8 Stunden. Wirklich speichern?" + warn_duration_long: "Die Dauer ist länger als 8 Stunden. Wirklich speichern?" service: - billable: "Verrechenbar" - not_billable: "Nicht-verrechenbar" + billable: "Verrechenbar" + not_billable: "Nicht-verrechenbar" + page_title: "Leistungen" + btn_new: "Neue Leistung" + label_billable: "Verrechenbar" + billable_checkbox: "Ja, diese Leistung ist verrechenbar" + placeholder_name: "Leistungsname" + empty: "Noch keine Leistungen angelegt." + + crud: + label_name: "Name" + label_note: "Bemerkung" + tab_active: "Aktiv" + tab_archived: "Archiviert" + btn_restore: "Wiederherstellen" + + login: + page_title: "Anmelden – spawntree" + label_email: "E-Mail" + label_password: "Passwort" + remember_me: "Angemeldet bleiben" + btn_submit: "Anmelden" + + register: + page_title: "Registrieren – spawntree Timetracker" + title: "Konto erstellen" + subtitle: "Kostenlos starten, keine Kreditkarte nötig." + section_company: "Dein Unternehmen" + label_company_name: "Firmenname" + placeholder_company_name: "Muster GmbH" + url_preview_label: "Deine voraussichtliche URL:" + section_account: "Dein Konto" + label_first_name: "Vorname" + label_last_name: "Nachname" + label_email: "E-Mail" + label_password: "Passwort" + label_password_repeat: "Wiederholen" + btn_submit: "Konto erstellen" + already_registered: "Bereits registriert?" + link_login: "Zur Anmeldung" + + confirm_error: + page_title: "Fehler – spawntree Timetracker" + title: "Link ungültig" + btn_retry: "Erneut registrieren" + + confirmed: + page_title: "Konto aktiviert – spawntree Timetracker" + title: "Konto aktiviert!" + welcome: "Willkommen, %name%." + redirect: "Du wirst gleich weitergeleitet …" + btn_login: "Jetzt anmelden →" + + invite_error: + page_title: "Fehler – Einladungslink" + title: "Ungültiger Link" + + set_password: + page_title: "Passwort festlegen – %name%" + subtitle: "Hallo %name%, lege dein Passwort fest, um loszulegen." + label_password: "Passwort" + label_password_repeat: "Wiederholen" + btn_submit: "Passwort speichern & anmelden" + + email: + confirm: + greeting: "Hallo %name%," + body: "bitte bestätige deine Registrierung für %company% mit einem Klick auf den Button." + btn: "E-Mail bestätigen" + expiry: "Der Link ist 24 Stunden gültig (bis %expires% Uhr)." + ignore: "Falls du dich nicht registriert hast, kannst du diese E-Mail ignorieren." + + notify: + title: "Neue Registrierung im Timetracker" + col_company: "Firma" + col_slug: "Slug" + col_name: "Name" + col_email: "E-Mail" + col_date: "Datum" + + welcome: + greeting: "Hallo %name%," + body: "dein Konto für %company% ist jetzt aktiv. Los geht's!" + btn: "Zum Timetracker →" + url_label: "Deine URL:" + + invite: + title: "Du wurdest zu %company% eingeladen" + greeting: "Hallo %name%," + role_added_pre: "du wurdest als" + role_added_post: "zum Team von %company% hinzugefügt." + role_admin: "Administrator" + role_tracker: "Zeiterfasser" + role_member: "Standard-Nutzer" + cta: "Klicke auf den Button, um dein Passwort festzulegen und loszulegen. Der Link ist 7 Tage gültig." + btn: "Passwort festlegen →" + ignore: "Wenn du diese Einladung nicht erwartet hast, kannst du diese E-Mail ignorieren."