diff --git a/backend/src/routes/adminFeatureFlags.js b/backend/src/routes/adminFeatureFlags.js index 1b3badd0..65114458 100644 --- a/backend/src/routes/adminFeatureFlags.js +++ b/backend/src/routes/adminFeatureFlags.js @@ -88,6 +88,11 @@ const KNOWN_FLAGS = [ // per-event-type presets and global watermark defaults tab. Strictly opt-in; // gates all slideshow admin UI (per-event card, type preset, settings tab). 'slideshow', + // Workflow / automation engine — admin-configurable visual flows (triggers, + // conditions, branches, loops, approval gates). Strictly opt-in; master + // kill-switch for the Workflows admin area AND the engine's runtime side + // effects (no run is created/resumed while off). + 'workflows', ]; // Spec defaults for any flag missing from the DB (e.g. a row added by a @@ -117,6 +122,7 @@ const DEFAULT_FLAGS = { projects: false, whatsapp: false, slideshow: false, + workflows: false, }; async function readAllFlags() { diff --git a/frontend/src/contexts/FeatureFlagsContext.tsx b/frontend/src/contexts/FeatureFlagsContext.tsx index c97d4c1b..218d81d2 100644 --- a/frontend/src/contexts/FeatureFlagsContext.tsx +++ b/frontend/src/contexts/FeatureFlagsContext.tsx @@ -64,6 +64,9 @@ export const DEFAULT_FLAGS: FeatureFlags = { whatsapp: false, // Live Slideshow ("Diashow") — opt-in; gates all slideshow admin UI. slideshow: false, + // Workflow / automation engine — opt-in; gates the Workflows admin area + // and the engine runtime (triggers/actions/gates). + workflows: false, }; export const FEATURE_FLAGS_QUERY_KEY = ['feature-flags'] as const; diff --git a/frontend/src/features/settings/tabs/FeaturesTab.tsx b/frontend/src/features/settings/tabs/FeaturesTab.tsx index 5816bb3f..9434b923 100644 --- a/frontend/src/features/settings/tabs/FeaturesTab.tsx +++ b/frontend/src/features/settings/tabs/FeaturesTab.tsx @@ -23,6 +23,7 @@ import { Wallet, FolderKanban, MonitorPlay, + Workflow, } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { Button, Card } from '../../../components/common'; @@ -134,6 +135,24 @@ export const FeaturesTab: React.FC = () => { /> + {/* Automation — the visual workflow engine. Master kill-switch for the + Workflows admin area and the runtime; off by default. */} +
+ setFlag('workflows', next)} + /> +
+ {/* Clients (#354 follow-up). Visual grouping for the CRM-area sub-features. The "Clients" sidebar section itself is gated by a derived `clients` flag (computed from whether any diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json index 0f2b9671..9b680e94 100644 --- a/frontend/src/i18n/locales/de.json +++ b/frontend/src/i18n/locales/de.json @@ -1663,7 +1663,8 @@ "accounting": "Buchhaltung", "insights": "Auswertungen & Zugriff", "customers": "Kunden", - "clients": "CRM" + "clients": "CRM", + "automation": "Automatisierung" }, "status": { "stable": "stabil", @@ -1779,6 +1780,11 @@ "slideshow": { "title": "Live-Diashow", "description": "Ein separater Vollbild-„Diashow“-Link pro Event für Beamer bei Live-Events – übernimmt neue Uploads automatisch, mit Voreinstellungen je Event-Typ und globalen Wasserzeichen-Vorgaben unter Einstellungen → Diashow." + }, + "workflows": { + "title": "Workflows", + "description": "Visuelle Automatisierungen auf einer Canvas erstellen – Auslöser, Bedingungen, Verzweigungen, Schleifen und Freigabe-Gates für Admins. Deine Mahnstufen und Buchungsschritte werden zu bearbeitbaren Abläufen. Strikt optional.", + "sidebar": "Workflows" } }, "customerSurface": { diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json index 1eeee74f..cf3c178b 100644 --- a/frontend/src/i18n/locales/en.json +++ b/frontend/src/i18n/locales/en.json @@ -1219,7 +1219,8 @@ "accounting": "Accounting", "insights": "Insights & Access", "customers": "Customers", - "clients": "CRM" + "clients": "CRM", + "automation": "Automation" }, "status": { "stable": "stable", @@ -1335,6 +1336,11 @@ "slideshow": { "title": "Live Slideshow", "description": "A separate fullscreen \"Diashow\" link per event for projectors at live events — auto-picks-up new uploads, with per-event-type presets and global watermark defaults under Settings → Slideshow." + }, + "workflows": { + "title": "Workflows", + "description": "Build visual automations on a canvas — triggers, conditions, branches, loops and admin approval gates. Your reminder ladder and booking steps become editable flows. Strictly opt-in.", + "sidebar": "Workflows" } }, "customerSurface": { diff --git a/frontend/src/services/featureFlags.service.ts b/frontend/src/services/featureFlags.service.ts index 176c83d8..ee396eab 100644 --- a/frontend/src/services/featureFlags.service.ts +++ b/frontend/src/services/featureFlags.service.ts @@ -66,7 +66,11 @@ export type FeatureKey = | 'whatsapp' // Live Slideshow ("Diashow") — per-event fullscreen kiosk link + presets + // global watermark settings tab. Strictly opt-in; gates all slideshow UI. - | 'slideshow'; + | 'slideshow' + // Workflow / automation engine — admin-configurable visual flows (triggers, + // conditions, branches, loops, approval gates) built on a canvas. Strictly + // opt-in; gates the Workflows admin area and the engine runtime. + | 'workflows'; export type FeatureFlags = Record;