From 69e1f2693dd4a83775a06b7bf5370c7fe473e7c4 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe <259325684+Sucukdeluxe@users.noreply.github.com> Date: Wed, 2 Sep 2026 10:59:29 +0200 Subject: [PATCH] fix: prevent queue status text selection --- PROJECT_MEMORY.md | 8 +++++--- renderer/styles.css | 4 ++-- tests/ui-smoke.js | 3 +++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/PROJECT_MEMORY.md b/PROJECT_MEMORY.md index 5045be0..5de10ea 100644 --- a/PROJECT_MEMORY.md +++ b/PROJECT_MEMORY.md @@ -7,7 +7,7 @@ Multi-Hoster-Upload ist eine Electron-Desktopanwendung für Windows, die große ## Aktueller Zustand - Aktive Arbeitslinie: `master` aus `Sucukdeluxe/Multi-Hoster-Upload`. -- Zuletzt veröffentlichter Funktionsstand: Version `2.1.42`, Release-Commit `f7aa1d4`. +- Zuletzt veröffentlichter Funktionsstand: Version `2.1.42`, Release-Commit `f7aa1d4`; danach wurde die Textauswahl in Upload-Status-Badges unveröffentlicht deaktiviert. - Einstiegspunkt des Electron-Hauptprozesses: `main.js`. - Oberfläche: `renderer/`; gekapselte Fachlogik: `lib/`; Online-Backup-Dienst: `services/backup-api/`. - Die Abhängigkeiten sind lokal mit Node.js 24 installiert. @@ -24,6 +24,7 @@ Multi-Hoster-Upload ist eine Electron-Desktopanwendung für Windows, die große - Vorhandene Online-Backups und alte Upload-Payloads ohne Ablaufangabe bleiben zur Abwärtskompatibilität unbegrenzt gültig. - Backup-Importe wenden Sprache und automatischen Account-Check sofort an. Alle Konfigurationsfelder werden übertragen; Warteschlange, Upload-Wiederherstellungsstatus, letzter Dateiauswahlordner, Automatik-Telemetrie und Pausenzustand bleiben bewusst geräte- beziehungsweise laufzeitgebunden. - Ein nicht vorhandener Ordnerüberwachungspfad bleibt nach dem Import sichtbar gespeichert, die Überwachung wird aber deaktiviert und der Nutzer erhält eine Warnung. Ein nicht vorhandener Log-Ordner wird ebenfalls gemeldet, ohne den konfigurierten Pfad still zu löschen. +- Upload-Status-Badges und ihre Textlabels sind nicht markierbar; kopierbare Fehlerdetails, Logs und Eingabefelder behalten ihre Textauswahl. - Version `2.1.42` ist als GitHub- und Forgejo-Release veröffentlicht; Backup-API `2.0.4` wurde davor mit gesichertem Altstand produktiv ausgerollt. - Der eingebaute Updater liest Releases und Binärdateien von Forgejo; GitHub liefert ergänzend die öffentlichen Release Notes. Ein Release ist deshalb erst vollständig, wenn die vier Assets auch im Forgejo-Release vorhanden sind. - Forgejo bewahrt Leerzeichen in Asset-Namen, GitHub normalisiert sie zu Punkten. Das Forgejo-`latest.yml` und der Release-Plan verwenden Namen wie `Multi-Hoster-Upload Setup 2.1.42.exe`; das GitHub-Manifest muss auf den dort tatsächlich veröffentlichten Punktnamen zeigen. @@ -56,16 +57,17 @@ npm audit --omit=dev ## Offene nächste Schritte - Keine offenen Schritte für Release `v2.1.42`; bei einer Störung sind der vorherige API-Symlink und Anwendungsversion `2.1.41` die geprüften Rollback-Ziele. +- Der Status-Badge-Fix ist noch unveröffentlicht und benötigt für ein neues Release eine erneute ausdrückliche Freigabe. - Bei Bedarf einen Arbeitsweg ohne `&` im absoluten Pfad verwenden oder die npm-Aufrufe weiterhin direkt ausführen. ## Zuletzt verifiziert -Stand: 01.09.2026 +Stand: 02.09.2026 - Lint: erfolgreich, 0 Warnungen und 0 Fehler. - Haupttests: 805 erfolgreich, 0 fehlgeschlagen. - Backup-API-Tests: 17 erfolgreich, 0 fehlgeschlagen. -- Der vollständige opt-in UI-Smoke bestätigte alle neu ergänzten Prüfungen für fortlaufende Account-Statusmeldungen, Ablauf-Auswahl, Schlüsselbereinigung, Metadatenanzeige sowie sofortige Sprach-/Auto-Check-Übernahme; die 16 bekannten themenfremden Abweichungen blieben unverändert. +- Der vollständige opt-in UI-Smoke bestätigte zusätzlich, dass Upload-Status-Badges und deren Labels nicht markierbar sind; die 16 bekannten themenfremden Abweichungen blieben unverändert. - Produktionsabhängigkeiten: `npm audit --omit=dev` meldet 0 Schwachstellen. - Release-Commit `f7aa1d4` und der annotierte Tag `v2.1.42` wurden auf GitHub und Forgejo mit identischen Commit-Hashes verifiziert. - GitHub- und Forgejo-Release `v2.1.42` enthalten jeweils Installer, Portable-Build, Blockmap und ein zum Anbieter passendes Update-Manifest; GitHub führt den englischen und Forgejo den inhaltlich gleichwertigen deutschen Changelog. diff --git a/renderer/styles.css b/renderer/styles.css index 2dc9d8d..32d02a4 100644 --- a/renderer/styles.css +++ b/renderer/styles.css @@ -36,11 +36,11 @@ body { flex-direction: column; } -:where(button, select, option, label, .app-header, .menu-bar, .view-sidebar, .settings-sidebar, .queue-table th, .recent-files-table th, .history-table th, .resize-handle, .context-menu, .modal-header, .modal-footer, .account-card-drag-handle, .account-hoster-group-header, .account-hoster-settings-header) { +:where(button, select, option, label, .app-header, .menu-bar, .view-sidebar, .settings-sidebar, .queue-table th, .recent-files-table th, .history-table th, .resize-handle, .context-menu, .modal-header, .modal-footer, .account-card-drag-handle, .account-hoster-group-header, .account-hoster-settings-header, .status-badge, .status-badge *) { user-select: none; } -:where(.status-badge, .health-badge, .account-status, .panel-status, .account-modal-status, .online-backup-status, .health-check-results, .account-hoster-group-meta.error, .recent-file-row.error, .history-row.error, .log-file-path-row .key-input, .log-paths-list, .log-paths-list *, #jobLogBody, .update-release-notes, .update-release-notes *, .history-link-text, .copy-toast) { +:where(.health-badge, .account-status, .panel-status, .account-modal-status, .online-backup-status, .health-check-results, .account-hoster-group-meta.error, .recent-file-row.error, .history-row.error, .log-file-path-row .key-input, .log-paths-list, .log-paths-list *, #jobLogBody, .update-release-notes, .update-release-notes *, .history-link-text, .copy-toast) { user-select: text; } diff --git a/tests/ui-smoke.js b/tests/ui-smoke.js index 961b99a..715bf5e 100644 --- a/tests/ui-smoke.js +++ b/tests/ui-smoke.js @@ -2130,6 +2130,9 @@ setTimeout(async () => { if (!explicitDynamicEnglishValid) console.log('Explicit dynamic English: ' + JSON.stringify(explicitDynamicEnglish)); check('English runtime statuses, status tooltips, toast, and shutdown copy are localized', explicitDynamicEnglishValid); + const queueStatusSelection = await wc.executeJavaScript('(() => { const badge = document.querySelector("#queueBody .status-badge"); const label = badge?.querySelector(".status-badge-label"); return [badge, label].map(element => element ? getComputedStyle(element).userSelect : "missing"); })()'); + check('Queue status badges and labels cannot be text-selected', queueStatusSelection.join('|') === 'none|none'); + const englishSettingsSearch = await wc.executeJavaScript(\`(() => { document.querySelector('.tab[data-view="settings"]').click(); const search = document.getElementById('settingsSearchInput');