From 7d5c8cffc7f014cc9477ff1d856f7b23f97c0ae3 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 14 May 2026 16:34:25 +0200 Subject: [PATCH] Refactor deploy script to add 'no-backup' option for updates, allowing users to skip database backups during code updates. Update help text for clarity on available options and improve overall script usability. --- deploy.sh | 50 ++++++++++++++++----------- frontend/src/components/StatusBox.vue | 40 ++++++++++++--------- frontend/src/views/Timefix.vue | 2 ++ 3 files changed, 54 insertions(+), 38 deletions(-) diff --git a/deploy.sh b/deploy.sh index c4e523b..3b0d909 100755 --- a/deploy.sh +++ b/deploy.sh @@ -9,13 +9,14 @@ # ./deploy.sh [OPTION] # # Optionen: -# install - Erste Installation (inkl. System-Setup) -# update - Update einer bestehenden Installation -# rollback - Rollback zur vorherigen Version -# backup - Erstelle Backup der Datenbank -# status - Zeige Status der Services -# logs - Zeige Logs -# help - Zeige diese Hilfe +# install - Erste Installation (inkl. System-Setup) +# update - Update einer bestehenden Installation +# update no-backup - Update ohne Backup (nur Code-Update) +# rollback - Rollback zur vorherigen Version +# backup - Erstelle Backup der Datenbank +# status - Zeige Status der Services +# logs - Zeige Logs +# help - Zeige diese Hilfe # # ============================================================================= @@ -459,8 +460,13 @@ do_update() { print_info "Quell-Verzeichnis: $CURRENT_DIR" print_info "Ziel-Verzeichnis: $PROJECT_DIR" - # Backup erstellen - do_backup + # Backup erstellen (nur wenn nicht explizit übersprungen) + SKIP_BACKUP="${2:-false}" + if [ "$SKIP_BACKUP" != "no-backup" ]; then + do_backup + else + print_info "Backup übersprungen (--no-backup Flag gesetzt)" + fi # Kopiere aktualisierte Dateien print_header "Kopiere aktualisierte Dateien" @@ -767,19 +773,21 @@ $PROJECT_NAME v3 - Deployment Script Verwendung: $0 [OPTION] Optionen: - install Erste Installation (inkl. System-Setup) - update Update einer bestehenden Installation - rollback Rollback zur vorherigen Version - backup Erstelle Backup der Datenbank - status Zeige Status der Services - logs Zeige Logs - help Zeige diese Hilfe + install Erste Installation (inkl. System-Setup) + update Update einer bestehenden Installation + update no-backup Update ohne Backup (nur Code-Update, keine DB-Berührung) + rollback Rollback zur vorherigen Version + backup Erstelle Backup der Datenbank + status Zeige Status der Services + logs Zeige Logs + help Zeige diese Hilfe Beispiele: - $0 install # Erste Installation - $0 update # Update durchführen - $0 backup # Backup erstellen - $0 status # Status anzeigen + $0 install # Erste Installation + $0 update # Update durchführen (mit Backup) + $0 update no-backup # Nur Code-Update, kein Backup + $0 backup # Backup erstellen + $0 status # Status anzeigen EOF } @@ -790,7 +798,7 @@ case "${1:-help}" in do_install ;; update) - do_update + do_update "$@" ;; rollback) do_rollback diff --git a/frontend/src/components/StatusBox.vue b/frontend/src/components/StatusBox.vue index ded00f7..13421d8 100644 --- a/frontend/src/components/StatusBox.vue +++ b/frontend/src/components/StatusBox.vue @@ -92,6 +92,19 @@ const fetchStats = async () => { isReady.value = true } +/** Lädt Zustand, laufende Zeiten und Tages-Stats neu (z. B. nach Stempeln oder Zeitkorrektur). */ +const refreshStatusData = async () => { + await fetchCurrentState() + await fetchWorklogData() + await fetchStats() +} + +const onWorklogUpdated = (e) => { + // Nach Stempeln in dieser Komponente wurde bereits refreshStatusData ausgeführt + if (e.detail?.fromStatusBoxClock) return + void refreshStatusData() +} + const fetchCurrentState = async () => { try { const response = await fetch(`${API_URL}/time-entries/current-state`, { @@ -317,13 +330,10 @@ const handleAction = async (action) => { return } - // Aktualisiere Status und Worklog-Daten sofort - await fetchCurrentState() - await fetchWorklogData() - await fetchStats() - - // Event auslösen für andere Komponenten (z.B. WeekOverview) - window.dispatchEvent(new CustomEvent('worklog-updated')) + await refreshStatusData() + window.dispatchEvent( + new CustomEvent('worklog-updated', { detail: { fromStatusBoxClock: true } }) + ) } catch (error) { console.error('Fehler beim Stempeln:', error) @@ -366,22 +376,17 @@ const rightButton = computed(() => { // Event-Handler für Login const handleLoginCompleted = async () => { - await fetchCurrentState() - await fetchWorklogData() - await fetchStats() + await refreshStatusData() } onMounted(async () => { // Initiales Laden - await fetchCurrentState() - await fetchWorklogData() - await fetchStats() - + await refreshStatusData() + window.addEventListener('worklog-updated', onWorklogUpdated) + // Server-Daten alle 60 Sekunden neu laden dataFetchInterval = setInterval(async () => { - await fetchCurrentState() - await fetchWorklogData() - await fetchStats() + await refreshStatusData() }, 60000) // Anzeige 2x pro Sekunde aktualisieren (nur Berechnung, keine Server-Requests) @@ -398,6 +403,7 @@ onBeforeUnmount(() => { if (dataFetchInterval) clearInterval(dataFetchInterval) if (displayUpdateInterval) clearInterval(displayUpdateInterval) window.removeEventListener('login-completed', handleLoginCompleted) + window.removeEventListener('worklog-updated', onWorklogUpdated) }) const displayRows = computed(() => { diff --git a/frontend/src/views/Timefix.vue b/frontend/src/views/Timefix.vue index 527dc17..e294a9e 100644 --- a/frontend/src/views/Timefix.vue +++ b/frontend/src/views/Timefix.vue @@ -275,6 +275,7 @@ async function createTimefix() { loadTimefixes(), loadWorklogEntries() // Lade auch die Dropdown-Liste neu ]) + window.dispatchEvent(new CustomEvent('worklog-updated')) } catch (error) { console.error('Fehler beim Erstellen der Zeitkorrektur:', error) await alert(`Fehler: ${error.message}`, 'Fehler') @@ -304,6 +305,7 @@ async function deleteTimefix(id) { } await loadTimefixes() + window.dispatchEvent(new CustomEvent('worklog-updated')) } catch (error) { console.error('Fehler beim Löschen der Zeitkorrektur:', error) await alert(`Fehler: ${error.message}`, 'Fehler')