/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.
39 lines
1 KiB
TypeScript
39 lines
1 KiB
TypeScript
// <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>
|
|
);
|
|
}
|