Watch
0
0
Fork
You've already forked hyperhive
0

swarm-ui: a schedules page, one card per scheduled prompt

/schedules lists the controller's scheduled prompts as cards: name as the
title, the agents it fires for, the message, its cadence and next fire.
Edit turns a card into its own form; pause, resume and remove act in place,
and + schedule opens an empty form. The form sends only what changed, so a
rename never moves the fire times, and warns when the start or the repeat
does. Filters reuse the shared card filter bar.

Adds a TextAreaField to the ui kit, and an upcoming mode on RelativeTime so
a next-fire time reads "in 5m". Needs the controller's /api/schedules
routes.
This commit is contained in:
iris 2026-10-04 17:03:33 +02:00 • committed by mara
commit 63ee6d12be
14 changed files with 931 additions and 3 deletions

View file

@ -0,0 +1,39 @@
// <TextAreaField> — `TextField`'s multi-line sibling, for free text that
// runs past one line (a scheduled prompt's body is the motivating caller).
// Same label chrome and `.ui-form-control` look as the rest of the kit;
// the box only grows vertically, since a horizontal drag would break out
// of whatever column the page gave the field.
import { FormField } from "../form-field/FormField.js";
import "./TextAreaField.css";
export function TextAreaField({
id,
label,
value,
onInput,
rows = 4,
required,
placeholder,
}: {
id: string;
label: string;
value: string;
onInput: (value: string) => void;
rows?: number;
required?: boolean;
placeholder?: string;
}) {
return (
<FormField label={label} htmlFor={id}>
<textarea
id={id}
class="ui-form-control ui-text-area"
value={value}
rows={rows}
required={required}
placeholder={placeholder}
onInput={(e) => onInput((e.target as HTMLTextAreaElement).value)}
/>
</FormField>
);
}