P2R-02 slice 3: Schedules tab — slim list, new/edit form, delete, Run-now
CI / Test (linux/amd64) (pull_request) Failing after 44s
CI / Lint (pull_request) Failing after 13s
CI / Build (windows/amd64) (pull_request) Successful in 19s
CI / Build (linux/amd64) (pull_request) Successful in 19s
CI / Build (linux/arm64) (pull_request) Successful in 25s
CI / Test (linux/amd64) (pull_request) Failing after 44s
CI / Lint (pull_request) Failing after 13s
CI / Build (windows/amd64) (pull_request) Successful in 19s
CI / Build (linux/amd64) (pull_request) Successful in 19s
CI / Build (linux/arm64) (pull_request) Successful in 25s
Schedules list: status (enabled/paused) + cron + source-group tags + actions (Run-now when enabled+online, Edit, Delete). Run-now reuses dispatchScheduledJob — same path real cron fires take, so each referenced source group runs as its own backup with its own tag. Falls back to a 409 if the agent is offline. Schedule new/edit form: cron input with five preset chips (quick-pick @hourly / nightly / 6h / weekly / monthly), source-group multi-pick rendered as styled checkbox cards (visual state tracks the underlying box via a tiny inline script), enabled toggle. No paths/excludes/retention/kind on the schedule itself — those live on source groups now. Server-side validation re-renders with the operator's input + ticked groups intact. Every successful mutation calls pushScheduleSetAsync. Adds .schd-row, .preset-chip, .picker styles.
This commit is contained in:
@@ -194,6 +194,64 @@
|
||||
padding: 14px 18px;
|
||||
}
|
||||
|
||||
/* ---------- schedule rows (Schedules tab) ---------- */
|
||||
.schd-row {
|
||||
display: grid; align-items: center;
|
||||
grid-template-columns: 90px 1fr 2fr auto;
|
||||
column-gap: 18px;
|
||||
padding: 12px 18px; font-size: 13px;
|
||||
}
|
||||
.schd-row.head {
|
||||
padding-top: 10px; padding-bottom: 10px;
|
||||
font-size: 11px; color: var(--ink-fade);
|
||||
text-transform: uppercase; letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
/* ---------- cron preset chips ---------- */
|
||||
.preset-chip {
|
||||
font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
|
||||
padding: 4px 9px; border-radius: 4px;
|
||||
border: 1px solid var(--line-soft); color: var(--ink-mid);
|
||||
background: var(--bg);
|
||||
cursor: pointer; user-select: none;
|
||||
transition: border-color 100ms ease, color 100ms ease;
|
||||
}
|
||||
.preset-chip:hover { border-color: var(--accent); color: var(--ink); }
|
||||
|
||||
/* ---------- source-group picker (Schedule new/edit) ---------- */
|
||||
.picker {
|
||||
display: flex; align-items: center; gap: 12px;
|
||||
padding: 10px 12px;
|
||||
background: var(--bg);
|
||||
border: 1px solid var(--line-soft);
|
||||
border-radius: 5px;
|
||||
font-size: 13px; cursor: pointer;
|
||||
transition: border-color 100ms ease, background 100ms ease;
|
||||
}
|
||||
.picker:hover { border-color: var(--ink-mute); }
|
||||
.picker .check {
|
||||
display: inline-block; width: 14px; height: 14px;
|
||||
border: 1px solid var(--line); border-radius: 3px;
|
||||
flex-shrink: 0; position: relative;
|
||||
}
|
||||
.picker.checked {
|
||||
border-color: color-mix(in oklch, var(--accent), transparent 50%);
|
||||
background: color-mix(in oklch, var(--accent), transparent 92%);
|
||||
}
|
||||
.picker.checked .check {
|
||||
background: var(--accent); border-color: var(--accent);
|
||||
}
|
||||
.picker.checked .check::after {
|
||||
content: ""; position: absolute;
|
||||
left: 4px; top: 1px; width: 4px; height: 8px;
|
||||
border: solid oklch(0.18 0.01 195);
|
||||
border-width: 0 1.5px 1.5px 0;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.picker input[type="checkbox"] {
|
||||
position: absolute; opacity: 0; pointer-events: none;
|
||||
}
|
||||
|
||||
/* ---------- retention 3×2 keep-* grid (source-group edit) ---------- */
|
||||
.keep-cell {
|
||||
background: var(--bg);
|
||||
|
||||
Reference in New Issue
Block a user