feat: add upload schedule windows

Add local weekly upload windows with overnight support, live settings updates, and a shared abortable upload gate.

Keep active transfers running while queued jobs wait outside the window without consuming attempts or parallel slots. Validate and localize the automation settings in German and English, including next-start status and hidden Electron coverage.
This commit is contained in:
Sucukdeluxe
2026-08-16 23:56:13 +02:00
parent 2eaa30c0a8
commit c8170b8556
11 changed files with 708 additions and 3 deletions
+59
View File
@@ -1033,6 +1033,7 @@ body.col-resizing, body.col-resizing * { cursor: col-resize !important; user-sel
.panel-status { font-size: 10px; padding: 2px 8px; border-radius: 3px; }
.panel-status.active { background: rgba(0, 184, 148, 0.2); color: var(--success); }
.panel-status.inactive { background: rgba(255, 255, 255, 0.05); color: var(--text-dim); }
.panel-status.warning { background: rgba(245, 166, 35, 0.16); color: var(--warning); }
.hoster-panel-body { padding: 0 14px 14px; }
.settings-divider { height: 1px; background: var(--border); margin: 12px 0; }
@@ -1192,6 +1193,61 @@ select.hs-input { max-width: none; width: auto; min-width: 140px; }
}
.settings-subpage .settings-grid-mini .checkbox-row label { min-width: 0; cursor: pointer; }
.settings-subpage .settings-grid-mini .checkbox-row input[type="checkbox"] { order: 2; width: 18px; height: 18px; accent-color: var(--accent); cursor: pointer; }
.upload-schedule-panel {
display: grid;
gap: 10px;
padding: 10px;
border: 1px solid color-mix(in srgb, var(--border) 90%, transparent);
border-radius: 9px;
background: color-mix(in srgb, var(--bg-input) 62%, transparent);
}
.upload-schedule-panel .settings-option { margin: 0; }
.upload-schedule-days {
display: grid;
grid-template-columns: repeat(7, minmax(48px, 1fr));
gap: 6px;
}
.upload-schedule-days label { min-width: 0; cursor: pointer; }
.upload-schedule-days input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.upload-schedule-days span {
display: grid;
place-items: center;
min-height: 34px;
border: 1px solid var(--border);
border-radius: 7px;
background: var(--bg-input);
color: var(--text-dim);
font-size: 12px;
font-weight: 700;
transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease, opacity 160ms ease;
}
.upload-schedule-days input:checked + span {
border-color: var(--accent);
background: color-mix(in srgb, var(--accent) 24%, var(--bg-input));
color: var(--text);
}
.upload-schedule-days input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 2px; }
.upload-schedule-days input:disabled + span { opacity: 0.42; cursor: default; }
.upload-schedule-times {
display: grid;
grid-template-columns: minmax(150px, 1fr) minmax(150px, 1fr) minmax(220px, 1.5fr);
gap: 10px;
align-items: end;
}
.upload-schedule-times label { display: grid; gap: 6px; color: var(--text); font-size: 12px; font-weight: 600; }
.upload-schedule-times .hs-input { width: 100%; max-width: none; }
.upload-schedule-times .hint { align-self: center; line-height: 1.45; }
.upload-schedule-status {
min-height: 18px;
margin: 0;
color: var(--text-dim);
font-size: 11px;
line-height: 1.45;
}
.settings-hoster-pointer {
margin-top: 16px;
padding: 11px 13px;
@@ -1873,6 +1929,9 @@ select.hs-input { max-width: none; width: auto; min-width: 140px; }
.settings-navigation { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.settings-content { overflow: visible; }
.settings-grid-mini { grid-template-columns: 1fr; }
.upload-schedule-days { grid-template-columns: repeat(4, minmax(48px, 1fr)); }
.upload-schedule-times { grid-template-columns: 1fr 1fr; }
.upload-schedule-times .hint { grid-column: 1 / -1; }
.online-backup-key-row {
grid-template-columns: 1fr;
}