feat(workflows): warn when disabling a built-in (reverts to legacy, not off)

Confirm dialog on the list page when toggling a built-in OFF, clarifying it
reverts to the previous built-in/legacy behaviour rather than turning the
automation off (review concern #4). The enable-refusal for unimplemented flows
surfaces via the existing toggle error toast (backend 409). EN + DE strings.
This commit is contained in:
Luca
2026-06-23 23:36:17 +02:00
parent d927464778
commit c5f131cec3
3 changed files with 20 additions and 1 deletions
+3
View File
@@ -212,6 +212,9 @@
"enabled": "Aktiv", "enabled": "Aktiv",
"disabled": "Inaktiv", "disabled": "Inaktiv",
"confirmDelete": "Diesen Workflow löschen?", "confirmDelete": "Diesen Workflow löschen?",
"toggle": {
"confirmDisableBuiltin": "Das Deaktivieren dieses eingebauten Ablaufs stellt das vorherige Standardverhalten wieder her die Automatisierung wird dadurch nicht abgeschaltet. Fortfahren?"
},
"test": { "test": {
"title": "Testlauf", "title": "Testlauf",
"hint": "Probelauf: durchläuft den ganzen Ablauf sofort (Wartezeiten übersprungen, Gates automatisch bestätigt), Nebeneffekte werden nur simuliert keine echten E-Mails. Optional eine Entitäts-ID (z. B. eine Rechnung) angeben, damit Bedingungen sie lesen können.", "hint": "Probelauf: durchläuft den ganzen Ablauf sofort (Wartezeiten übersprungen, Gates automatisch bestätigt), Nebeneffekte werden nur simuliert keine echten E-Mails. Optional eine Entitäts-ID (z. B. eine Rechnung) angeben, damit Bedingungen sie lesen können.",
+3
View File
@@ -212,6 +212,9 @@
"enabled": "Enabled", "enabled": "Enabled",
"disabled": "Disabled", "disabled": "Disabled",
"confirmDelete": "Delete this workflow?", "confirmDelete": "Delete this workflow?",
"toggle": {
"confirmDisableBuiltin": "Disabling this built-in reverts to the previous built-in behaviour — it does not turn the automation off. Continue?"
},
"test": { "test": {
"title": "Test run", "title": "Test run",
"hint": "Dry run: walks the whole flow now (waits skipped, gates auto-confirmed) with side effects mocked — no real emails. Optionally give an entity id (e.g. an invoice) so conditions can read it.", "hint": "Dry run: walks the whole flow now (waits skipped, gates auto-confirmed) with side effects mocked — no real emails. Optionally give an entity id (e.g. an invoice) so conditions can read it.",
@@ -73,6 +73,19 @@ export const WorkflowsListPage: React.FC = () => {
const isEnabled = (w: WorkflowSummary) => w.enabled === true || w.enabled === 1; const isEnabled = (w: WorkflowSummary) => w.enabled === true || w.enabled === 1;
const isBuiltin = (w: WorkflowSummary) => w.is_builtin === true || w.is_builtin === 1; const isBuiltin = (w: WorkflowSummary) => w.is_builtin === true || w.is_builtin === 1;
// Disabling a built-in reverts to the legacy hardcoded behaviour (it does NOT
// stop the automation) — warn so the admin isn't surprised. Enabling is guarded
// server-side (a flow using unimplemented actions is refused with a clear error).
const toggle = (w: WorkflowSummary) => {
const next = !isEnabled(w);
if (!next && isBuiltin(w)) {
const msg = t('workflows.toggle.confirmDisableBuiltin',
'Disabling this built-in reverts to the previous built-in behaviour — it does not turn the automation off. Continue?') as string;
if (!window.confirm(msg)) return;
}
toggleMutation.mutate({ id: w.id, enabled: next });
};
return ( return (
<div className="space-y-6"> <div className="space-y-6">
<div className="flex items-center justify-between gap-3 flex-wrap"> <div className="flex items-center justify-between gap-3 flex-wrap">
@@ -117,7 +130,7 @@ export const WorkflowsListPage: React.FC = () => {
</div> </div>
<button <button
type="button" type="button"
onClick={() => toggleMutation.mutate({ id: w.id, enabled: !isEnabled(w) })} onClick={() => toggle(w)}
className={`text-xs px-2 py-1 rounded-full border ${isEnabled(w) className={`text-xs px-2 py-1 rounded-full border ${isEnabled(w)
? 'bg-green-50 dark:bg-green-900/30 text-green-700 dark:text-green-300 border-green-300 dark:border-green-700' ? 'bg-green-50 dark:bg-green-900/30 text-green-700 dark:text-green-300 border-green-300 dark:border-green-700'
: 'bg-neutral-50 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-300 dark:border-neutral-600'}`} : 'bg-neutral-50 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 border-neutral-300 dark:border-neutral-600'}`}