dashboard: SCH3DUL3S is a read-only list with a removal banner
The tab lists the rows left in the hive's store so the operator can recreate them with `swarmctl schedule add`: no create row, edit form, fire/pause/cancel buttons or schedules_changed subscription. The next column shows the stored next fire time as an absolute UTC timestamp (the value for --at) instead of a countdown. A warning banner says the page is slated for removal and points at swarmctl. The approvals view drops the schedule_prompt card and the approval_added subscription.
This commit is contained in:
parent
c3a54bbdd0
commit
a4a3f81d5c
8 changed files with 68 additions and 1500 deletions
|
|
@ -878,131 +878,7 @@ footer .banner-thin {
|
|||
}
|
||||
|
||||
/* ─── scheduled prompts tab ────────────────────────────────────────
|
||||
Creation form at the top, list of queued schedule cards below. */
|
||||
|
||||
.schedule-edit-form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.6em;
|
||||
background: var(--bg-elev);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 4px;
|
||||
padding: 0.8em 1em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
.schedule-edit-form-wrapper {
|
||||
margin-top: 0.5em;
|
||||
padding-left: 0.5em;
|
||||
border-left: 2px solid var(--yellow);
|
||||
}
|
||||
.schedule-edit-targets-note {
|
||||
color: var(--muted);
|
||||
font-style: italic;
|
||||
font-size: 0.85em;
|
||||
margin: 0.2em 0 0 0;
|
||||
}
|
||||
.schedule-field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.2em;
|
||||
}
|
||||
.schedule-field-label {
|
||||
color: var(--muted);
|
||||
font-size: 0.85em;
|
||||
letter-spacing: 0.05em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.schedule-field input,
|
||||
.schedule-field textarea {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
background: var(--bg);
|
||||
color: var(--fg);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 3px;
|
||||
padding: 0.35em 0.5em;
|
||||
}
|
||||
.schedule-field textarea {
|
||||
resize: vertical;
|
||||
min-height: 4em;
|
||||
}
|
||||
.schedule-targets {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.4em;
|
||||
}
|
||||
.schedule-target-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.4em;
|
||||
padding: 0.2em 0.6em;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 999px;
|
||||
font-size: 0.85em;
|
||||
cursor: pointer;
|
||||
background: color-mix(in srgb, var(--bg-elev) 40%, transparent);
|
||||
}
|
||||
.schedule-target-chip:hover {
|
||||
border-color: var(--purple-dim);
|
||||
}
|
||||
.schedule-target-chip:has(input:checked) {
|
||||
border-color: var(--purple);
|
||||
color: var(--purple);
|
||||
background: color-mix(in srgb, var(--purple) 8%, transparent);
|
||||
}
|
||||
.schedule-target-chip input {
|
||||
margin: 0;
|
||||
}
|
||||
.schedule-actions {
|
||||
display: flex;
|
||||
gap: 0.5em;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.schedule-interval-presets {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.3em;
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
.btn-interval-preset {
|
||||
color: var(--cyan);
|
||||
border-color: var(--cyan);
|
||||
font-size: 0.75em;
|
||||
padding: 0.15em 0.55em;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
.btn-interval-oneshot {
|
||||
color: var(--muted);
|
||||
border-color: var(--muted);
|
||||
}
|
||||
.schedule-interval-parts {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 0.35em;
|
||||
margin-top: 0.4em;
|
||||
}
|
||||
.schedule-interval-num {
|
||||
width: 4em;
|
||||
text-align: right;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.schedule-interval-unit {
|
||||
color: var(--muted);
|
||||
font-size: 0.85em;
|
||||
margin-right: 0.2em;
|
||||
}
|
||||
.schedule-interval-preview {
|
||||
margin-top: 0.4em;
|
||||
color: var(--cyan);
|
||||
font-size: 0.9em;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.schedule-interval-preview-oneshot {
|
||||
color: var(--muted);
|
||||
font-style: italic;
|
||||
}
|
||||
Read-only table of the schedules left in the hive's store. */
|
||||
|
||||
.schedules-table-wrap {
|
||||
overflow-x: auto;
|
||||
|
|
@ -1031,12 +907,10 @@ footer .banner-thin {
|
|||
width: 3em;
|
||||
text-align: center;
|
||||
}
|
||||
/* next / every columns: sized to typical content (short durations).
|
||||
Previous 8em / 7em wasted horizontal space. */
|
||||
.schedules-table-next-col {
|
||||
width: 5.5em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
/* every column: sized to typical content (short durations). */
|
||||
.schedules-table-every-col {
|
||||
width: 5em;
|
||||
white-space: nowrap;
|
||||
|
|
@ -1044,9 +918,6 @@ footer .banner-thin {
|
|||
.schedules-table-body-th {
|
||||
min-width: 12em;
|
||||
}
|
||||
.schedules-table-actions-th {
|
||||
width: 7em;
|
||||
}
|
||||
/* Agent-name columns: 90° vertical text (writing-mode) so names are fully
|
||||
readable without truncation. Previously used a -45° CSS transform which
|
||||
clipped names mid-glyph. writing-mode + rotate(180deg) is in-flow and
|
||||
|
|
@ -1078,8 +949,7 @@ footer .banner-thin {
|
|||
padding: 0 2px;
|
||||
}
|
||||
/* Column for an agent no longer in the live roster — its past schedules
|
||||
linger but the agent is gone. Greyed + struck through so the operator
|
||||
can still see (and cancel) the stale entries rather than be surprised. */
|
||||
linger but the agent is gone. Greyed + struck through. */
|
||||
.schedules-table-agent-th--gone > div {
|
||||
color: var(--muted);
|
||||
text-decoration: line-through;
|
||||
|
|
@ -1095,12 +965,6 @@ footer .banner-thin {
|
|||
color: var(--yellow);
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.btn-pause-schedule {
|
||||
color: var(--teal);
|
||||
}
|
||||
.btn-resume-schedule {
|
||||
color: var(--green);
|
||||
}
|
||||
.schedules-table-body-cell {
|
||||
max-width: 30em;
|
||||
overflow: hidden;
|
||||
|
|
@ -1112,135 +976,13 @@ footer .banner-thin {
|
|||
.schedules-table-check {
|
||||
width: 28px;
|
||||
text-align: center;
|
||||
padding: 0.3em 0 !important;
|
||||
}
|
||||
.schedules-table-check-btn {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
color: var(--green);
|
||||
cursor: pointer;
|
||||
padding: 0.1em 0.3em;
|
||||
font-family: inherit;
|
||||
font-size: 1em;
|
||||
}
|
||||
.schedules-table-check-btn:hover:not(:disabled) {
|
||||
color: var(--red);
|
||||
}
|
||||
.schedules-table-check-btn:disabled {
|
||||
cursor: default;
|
||||
padding: 0.3em 0 !important;
|
||||
}
|
||||
.schedules-table-check-cancelled {
|
||||
color: var(--muted);
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.schedules-table-actions {
|
||||
text-align: right;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.schedules-table-actions .btn-inline-small {
|
||||
margin-left: 0.3em;
|
||||
}
|
||||
.schedules-table-edit-row > td {
|
||||
/* Off-palette dim-purple surface tint: not an exact theme var, left as a
|
||||
literal pending a dedicated named var so a theme swap can recolour it. */
|
||||
background: rgba(38, 32, 60, 0.35);
|
||||
padding: 0.5em 0.6em;
|
||||
}
|
||||
.schedules-table-create-row td {
|
||||
/* Off-palette dim-purple surface tint — see the edit-row note above. */
|
||||
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;
|
||||
}
|
||||
.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;
|
||||
-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;
|
||||
}
|
||||
.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);
|
||||
}
|
||||
.btn-inline-small {
|
||||
font-size: 0.7em;
|
||||
padding: 0.1em 0.45em;
|
||||
}
|
||||
|
||||
/* Selection bar — sticky-bottom strip for bulk actions. */
|
||||
.selection-bar {
|
||||
|
|
|
|||
Loading…
Reference in a new issue