From 48891503adeb718326568f19f894b760754f5703 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe <259325684+Sucukdeluxe@users.noreply.github.com> Date: Sun, 9 Aug 2026 15:52:23 +0200 Subject: [PATCH] release: Multi-Hoster-Upload v2.0.4 --- package-lock.json | 4 +- package.json | 2 +- renderer/account-status.js | 36 +++++++++++++++ renderer/account-submit.js | 4 +- renderer/app.js | 72 +++++++++++++++++++++++------- renderer/index.html | 1 + renderer/styles.css | 3 ++ tests/account-status.test.js | 30 +++++++++++++ tests/ui-smoke.js | 57 ++++++++++++++++++++--- tests/validate-credentials.test.js | 4 +- 10 files changed, 184 insertions(+), 29 deletions(-) create mode 100644 renderer/account-status.js create mode 100644 tests/account-status.test.js diff --git a/package-lock.json b/package-lock.json index aa620dc..1fbb787 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "multi-hoster-uploader", - "version": "2.0.3", + "version": "2.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "multi-hoster-uploader", - "version": "2.0.3", + "version": "2.0.4", "dependencies": { "chokidar": "^3.6.0", "undici": "^7.29.0", diff --git a/package.json b/package.json index 65b4095..bc06e88 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "multi-hoster-uploader", - "version": "2.0.3", + "version": "2.0.4", "description": "Upload files to doodstream, voe, vidmoly, byse simultaneously", "main": "main.js", "scripts": { diff --git a/renderer/account-status.js b/renderer/account-status.js new file mode 100644 index 0000000..c9d2add --- /dev/null +++ b/renderer/account-status.js @@ -0,0 +1,36 @@ +(function (scope) { + const STATUS_PRESENTATIONS = { + ok: { statusClass: 'ok', label: 'Bereit', requiresOtp: false }, + warn: { statusClass: 'warn', label: 'Warnung', requiresOtp: false }, + checking: { statusClass: 'checking', label: 'Prüfe...', requiresOtp: false }, + error: { statusClass: 'error', label: 'Fehler', requiresOtp: false }, + otp_required: { statusClass: 'warn', label: 'OTP erforderlich', requiresOtp: true }, + unchecked: { statusClass: 'unchecked', label: 'Nicht geprüft', requiresOtp: false }, + disabled: { statusClass: 'disabled', label: 'Deaktiviert', requiresOtp: false } + }; + + function getAccountStatusPresentation(status) { + const presentation = STATUS_PRESENTATIONS[status] || STATUS_PRESENTATIONS.unchecked; + return { ...presentation }; + } + + function getAccountGroupStatus(summary) { + const total = Math.max(0, Number(summary && summary.total) || 0); + const disabled = Math.min(total, Math.max(0, Number(summary && summary.disabled) || 0)); + const active = total - disabled; + const errors = Math.max(0, Number(summary && summary.error) || 0); + const ok = Math.max(0, Number(summary && summary.ok) || 0); + const warning = Math.max(0, Number(summary && summary.warn) || 0); + const checking = Math.max(0, Number(summary && summary.checking) || 0); + const unchecked = Math.max(0, Number(summary && summary.unchecked) || 0); + if (active === 0) return 'unchecked'; + if (errors >= active) return 'error'; + if (errors > 0 || warning > 0 || checking > 0 || unchecked > 0) return 'warn'; + if (ok >= active) return 'ok'; + return 'warn'; + } + + const accountStatus = { getAccountGroupStatus, getAccountStatusPresentation }; + if (typeof module !== 'undefined' && module.exports) module.exports = accountStatus; + if (scope) scope.AccountStatus = accountStatus; +})(typeof window !== 'undefined' ? window : globalThis); diff --git a/renderer/account-submit.js b/renderer/account-submit.js index 3415e3a..065202f 100644 --- a/renderer/account-submit.js +++ b/renderer/account-submit.js @@ -1,6 +1,6 @@ (function (scope) { - function getAccountSubmitLabel({ isEdit } = {}) { - return isEdit ? 'Prüfen und speichern' : 'Prüfen und anlegen'; + function getAccountSubmitLabel() { + return 'Prüfen und speichern'; } async function submitValidatedAccount({ validate, commit, afterCommit, isCurrent }) { diff --git a/renderer/app.js b/renderer/app.js index f986a60..6bf3b16 100644 --- a/renderer/app.js +++ b/renderer/app.js @@ -3920,13 +3920,12 @@ function getCredentialLabel(name, account) { return 'Keine Zugangsdaten'; } -const _STATUS_LABELS = { ok: 'Bereit', warn: 'Warnung', checking: 'Prüfe...', error: 'Fehler', unchecked: 'Nicht geprüft' }; - function _buildAccountCardHtml(name, account, idx) { const isDisabled = account.enabled === false; const st = accountStatuses[account.id] || { status: 'unchecked', message: '' }; - const statusLabel = isDisabled ? 'Deaktiviert' : (_STATUS_LABELS[st.status] || 'Nicht geprüft'); - const statusClass = isDisabled ? 'disabled' : st.status; + const statusPresentation = window.AccountStatus.getAccountStatusPresentation(isDisabled ? 'disabled' : st.status); + const statusLabel = statusPresentation.label; + const statusClass = statusPresentation.statusClass; const credLabel = getCredentialLabel(name, account); const userLabel = account.label && String(account.label).trim(); // Subtitle: "Label: XYZ • API: ABC… • " — the user-set label is the @@ -3940,6 +3939,12 @@ function _buildAccountCardHtml(name, account, idx) { const sessionPausedBadge = isSessionPaused ? `Pausiert (Session) ` : ''; + const otpAction = !isDisabled && statusPresentation.requiresOtp + ? `
+ + +
` + : ''; return `
@@ -3947,6 +3952,7 @@ function _buildAccountCardHtml(name, account, idx) {