dashboard: fold schedule creation into the table view (closes #564)
The N3W SCH3DUL3 vertical form is gone. The schedules table now carries an always-visible inline create row at the bottom — fill the cells, click + to POST /api/schedules, the new schedule appears above on the next refresh. Per-column inputs match the display semantics: - `next` → `<input type="datetime-local">` (defaults to now+5min) - `every` → 4 mini d/h/m/s number inputs (blank/all-zero = one-shot) - `body` → `<textarea rows=1>` expanding to 4em on focus-within so multi-line prompts still fit (closes mara's "prompt may still be multi-line" requirement) - per-agent columns → checkbox (whole cell clickable via padded label) - actions → + submit + ⌫ reset (clears the carry without POSTing) `newScheduleCarry` module-scope object survives the paintAtomic re-render so mid-typed values stick across schedule-list refreshes (same pattern as `scheduleEditCarry` from #474). H2 collapses from "N3W SCH3DUL3" + "QU3U3D SCH3DUL3S" down to a single "SCH3DUL3S" since the section now does both. Empty-state branch on `renderSchedulesList` is gone — the table always renders because the create row is always there. `#schedule-new-section` div + `renderScheduleNewForm` / `readScheduleFormCarry` / `submitNewSchedule` and the `.schedule-new-form` CSS selector all removed. The edit-form path (#474 `renderScheduleEditForm` colspan'd row on `✎` toggle) is unchanged — "edit mode is inline in the table" already shipped there, this PR just adds the same mental model for create. Validations match the old form: empty targets / empty body / invalid datetime / non-integer interval each surface an `alert()`. The + button shows a spinner while the POST is in flight, then clears the carry + triggers `refreshSchedules()`.
This commit is contained in:
parent
c9e1c79035
commit
0deca50352
3 changed files with 341 additions and 157 deletions
|
|
@ -1693,7 +1693,6 @@ body.flow-shell .tabbar .tab.active.tab-link {
|
|||
Cards show: id + source + due-in + cancel-all in the header,
|
||||
the prompt body, then a targets table with per-row cancel. */
|
||||
|
||||
.schedule-new-form,
|
||||
.schedule-edit-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
@ -1924,6 +1923,109 @@ body.flow-shell .tabbar .tab.active.tab-link {
|
|||
padding: 0.1em 0.45em;
|
||||
}
|
||||
|
||||
/* #564 — inline create row at the bottom of the schedules table.
|
||||
Cells host inputs directly so the operator can fill + click + to
|
||||
queue a new schedule without leaving the table view. Slightly
|
||||
different background tone so it reads as "this isn't a schedule
|
||||
yet, it's the create form". */
|
||||
.schedules-table-create-row td {
|
||||
background: rgba(38, 32, 60, 0.25);
|
||||
border-top: 2px solid var(--border);
|
||||
vertical-align: top;
|
||||
padding: 0.4em 0.5em;
|
||||
}
|
||||
.schedules-table-create-cell {
|
||||
padding: 0.35em 0.4em;
|
||||
}
|
||||
.schedules-table-inline-input,
|
||||
.schedules-table-inline-textarea,
|
||||
.schedules-table-inline-num {
|
||||
background: var(--bg);
|
||||
border: 1px solid var(--border);
|
||||
color: var(--fg);
|
||||
font-family: ui-monospace, 'JetBrains Mono', monospace;
|
||||
font-size: 0.85em;
|
||||
padding: 0.2em 0.4em;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.schedules-table-inline-input:focus,
|
||||
.schedules-table-inline-textarea:focus,
|
||||
.schedules-table-inline-num:focus {
|
||||
border-color: var(--purple);
|
||||
outline: none;
|
||||
}
|
||||
.schedules-table-inline-textarea {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-height: 1.6em;
|
||||
resize: vertical;
|
||||
/* Single-line by default; bumps to 4em on focus so a multi-line
|
||||
prompt has room without the row taking permanent vertical space.
|
||||
:focus-within so resizing-up sticks while focus stays in the row. */
|
||||
}
|
||||
.schedules-table-create-body:focus-within .schedules-table-inline-textarea {
|
||||
min-height: 4em;
|
||||
}
|
||||
.schedules-table-inline-desc {
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin-top: 0.25em;
|
||||
}
|
||||
.schedules-table-inline-datetime {
|
||||
width: 100%;
|
||||
font-size: 0.78em;
|
||||
}
|
||||
.schedules-table-inline-interval {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.1em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.schedules-table-inline-num {
|
||||
width: 2.4em;
|
||||
text-align: right;
|
||||
font-variant-numeric: tabular-nums;
|
||||
/* hide native number spinners — they steal too much width at the
|
||||
2.4em column size and the d/h/m/s buttons aren't useful with no
|
||||
min/max range hint anyway. */
|
||||
-moz-appearance: textfield;
|
||||
appearance: textfield;
|
||||
}
|
||||
.schedules-table-inline-num::-webkit-outer-spin-button,
|
||||
.schedules-table-inline-num::-webkit-inner-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
.schedules-table-inline-unit {
|
||||
color: var(--muted);
|
||||
font-size: 0.7em;
|
||||
margin-right: 0.15em;
|
||||
}
|
||||
.schedules-table-inline-check {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
cursor: pointer;
|
||||
margin: 0;
|
||||
}
|
||||
.schedules-table-inline-check-lbl {
|
||||
display: inline-flex;
|
||||
cursor: pointer;
|
||||
padding: 0.4em 0.6em;
|
||||
/* Pad out the label so the entire cell is a click target. */
|
||||
}
|
||||
.schedules-table-create-submit {
|
||||
font-size: 1em;
|
||||
padding: 0.15em 0.55em;
|
||||
color: var(--green);
|
||||
border-color: var(--green);
|
||||
}
|
||||
.schedules-table-create-reset {
|
||||
font-size: 0.85em;
|
||||
padding: 0.15em 0.45em;
|
||||
color: var(--muted);
|
||||
border-color: var(--border);
|
||||
}
|
||||
|
||||
/* Selection bar (#443). Sticky-bottom strip that surfaces bulk
|
||||
actions when ≥1 agent is selected (click the icon). Visually
|
||||
echoes the flow composer's frosted-mauve treatment so the chrome
|
||||
|
|
|
|||
Loading…
Reference in a new issue