Improve routine configuration: delete triggers, fix pause, add feedback

- Remove per-trigger enabled/paused selector (routine-level only)
- Move save/rotate/delete buttons to the right in trigger editor
- Apply board feedback on UI cleanup

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
dotta 2026-03-19 17:20:57 -05:00
parent 5caf43349b
commit e341abb99c

View file

@ -125,7 +125,6 @@ function TriggerEditor({
}) { }) {
const [draft, setDraft] = useState({ const [draft, setDraft] = useState({
label: trigger.label ?? "", label: trigger.label ?? "",
enabled: trigger.enabled ? "true" : "false",
cronExpression: trigger.cronExpression ?? "", cronExpression: trigger.cronExpression ?? "",
signingMode: trigger.signingMode ?? "bearer", signingMode: trigger.signingMode ?? "bearer",
replayWindowSec: String(trigger.replayWindowSec ?? 300), replayWindowSec: String(trigger.replayWindowSec ?? 300),
@ -134,7 +133,6 @@ function TriggerEditor({
useEffect(() => { useEffect(() => {
setDraft({ setDraft({
label: trigger.label ?? "", label: trigger.label ?? "",
enabled: trigger.enabled ? "true" : "false",
cronExpression: trigger.cronExpression ?? "", cronExpression: trigger.cronExpression ?? "",
signingMode: trigger.signingMode ?? "bearer", signingMode: trigger.signingMode ?? "bearer",
replayWindowSec: String(trigger.replayWindowSec ?? 300), replayWindowSec: String(trigger.replayWindowSec ?? 300),
@ -165,18 +163,6 @@ function TriggerEditor({
onChange={(event) => setDraft((current) => ({ ...current, label: event.target.value }))} onChange={(event) => setDraft((current) => ({ ...current, label: event.target.value }))}
/> />
</div> </div>
<div className="space-y-1.5">
<Label className="text-xs">Enabled</Label>
<Select value={draft.enabled} onValueChange={(enabled) => setDraft((current) => ({ ...current, enabled }))}>
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="true">Enabled</SelectItem>
<SelectItem value="false">Paused</SelectItem>
</SelectContent>
</Select>
</div>
{trigger.kind === "schedule" && ( {trigger.kind === "schedule" && (
<div className="md:col-span-2 space-y-1.5"> <div className="md:col-span-2 space-y-1.5">
<Label className="text-xs">Schedule</Label> <Label className="text-xs">Schedule</Label>
@ -216,35 +202,35 @@ function TriggerEditor({
</div> </div>
<div className="flex flex-wrap items-center gap-2"> <div className="flex flex-wrap items-center gap-2">
<Button {trigger.lastResult && <span className="text-xs text-muted-foreground">Last: {trigger.lastResult}</span>}
variant="outline" <div className="ml-auto flex items-center gap-2">
size="sm" {trigger.kind === "webhook" && (
onClick={() => <Button variant="outline" size="sm" onClick={() => onRotate(trigger.id)}>
onSave(trigger.id, { <RefreshCw className="mr-1.5 h-3.5 w-3.5" />
label: draft.label.trim() || null, Rotate secret
enabled: draft.enabled === "true", </Button>
...(trigger.kind === "schedule" )}
? { cronExpression: draft.cronExpression.trim(), timezone: getLocalTimezone() } <Button
: {}), variant="outline"
...(trigger.kind === "webhook" size="sm"
? { onClick={() =>
signingMode: draft.signingMode, onSave(trigger.id, {
replayWindowSec: Number(draft.replayWindowSec || "300"), label: draft.label.trim() || null,
} ...(trigger.kind === "schedule"
: {}), ? { cronExpression: draft.cronExpression.trim(), timezone: getLocalTimezone() }
}) : {}),
} ...(trigger.kind === "webhook"
> ? {
<Save className="mr-1.5 h-3.5 w-3.5" /> signingMode: draft.signingMode,
Save replayWindowSec: Number(draft.replayWindowSec || "300"),
</Button> }
{trigger.kind === "webhook" && ( : {}),
<Button variant="outline" size="sm" onClick={() => onRotate(trigger.id)}> })
<RefreshCw className="mr-1.5 h-3.5 w-3.5" /> }
Rotate secret >
<Save className="mr-1.5 h-3.5 w-3.5" />
Save
</Button> </Button>
)}
<div className="ml-auto">
<Button <Button
variant="ghost" variant="ghost"
size="sm" size="sm"
@ -254,7 +240,6 @@ function TriggerEditor({
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-3.5 w-3.5" />
</Button> </Button>
</div> </div>
{trigger.lastResult && <span className="text-xs text-muted-foreground">Last: {trigger.lastResult}</span>}
</div> </div>
</div> </div>
); );