-
-
- {t('Alle Workflows über alle Features und Mandanten')}
-
+
+
+ } label={t('Workflows')} value={_totalCount} />
+ } label={t('Aktiv')} value={_activeCount} color="var(--success-color, #28a745)" />
+ } label={t('Laufend')} value={_runningCount} color="var(--primary-color, #007bff)" />
-
-
- {(['all', 'active', 'inactive'] as const).map((f) => (
-
- ))}
-
-
-
-
+
diff --git a/src/pages/workflowAutomation/types.ts b/src/pages/workflowAutomation/types.ts
index e25fca9..6007a3b 100644
--- a/src/pages/workflowAutomation/types.ts
+++ b/src/pages/workflowAutomation/types.ts
@@ -26,7 +26,7 @@ export interface WorkflowRunMetrics {
export interface WorkflowRun {
id: string;
workflowId: string;
- workflowLabel?: string;
+ workflowIdLabel?: string;
mandateId?: string;
mandateLabel?: string;
featureInstanceId?: string;
diff --git a/src/utils/settingsSchemaToFormAttributes.ts b/src/utils/settingsSchemaToFormAttributes.ts
new file mode 100644
index 0000000..6695ea3
--- /dev/null
+++ b/src/utils/settingsSchemaToFormAttributes.ts
@@ -0,0 +1,112 @@
+// Copyright (c) 2026 PowerOn AG
+// All rights reserved.
+/**
+ * settingsSchemaToFormAttributes
+ *
+ * Bridge between a Solution's `settingsSchema` (derived from trigger.form /
+ * exposed node params on the backend) and the `AttributeDefinition[]` array
+ * that FormGeneratorForm expects.
+ *
+ * This is NOT a second render system — it maps onto the existing
+ * `FRONTEND_TYPE_RENDERERS`-independent FormGenerator pipeline.
+ */
+
+import type { AttributeType } from './attributeTypeMapper';
+import type { AttributeDefinition, AttributeOption } from '../components/FormGenerator/FormGeneratorForm/FormGeneratorForm';
+
+// ---------------------------------------------------------------------------
+// Input types (mirror backend PortField / settingsSchema)
+// ---------------------------------------------------------------------------
+
+export interface SettingsSchemaField {
+ name: string;
+ type: string;
+ description?: string;
+ required?: boolean;
+ enumValues?: string[] | null;
+ default?: unknown;
+ frontendType?: string;
+ frontendOptions?: Record;
+ pickerLabel?: string;
+ pickerItemLabel?: string;
+}
+
+export interface SettingsSchema {
+ name?: string;
+ fields: SettingsSchemaField[];
+}
+
+// ---------------------------------------------------------------------------
+// Type mapping
+// ---------------------------------------------------------------------------
+
+const _PYTHON_TYPE_MAP: Record = {
+ str: 'text',
+ string: 'text',
+ int: 'integer',
+ float: 'float',
+ number: 'number',
+ bool: 'boolean',
+ boolean: 'boolean',
+ date: 'date',
+ datetime: 'timestamp',
+};
+
+const _FRONTEND_TYPE_MAP: Record = {
+ text: 'text',
+ textarea: 'textarea',
+ templateTextarea: 'textarea',
+ number: 'number',
+ checkbox: 'boolean',
+ date: 'date',
+ datetime: 'timestamp',
+ email: 'email',
+ select: 'select',
+ multiselect: 'multiselect',
+ json: 'json',
+ file: 'file',
+ hidden: 'text',
+ multilingual: 'multilingual',
+};
+
+function _resolveAttributeType(field: SettingsSchemaField): AttributeType {
+ if (field.frontendType && _FRONTEND_TYPE_MAP[field.frontendType]) {
+ return _FRONTEND_TYPE_MAP[field.frontendType];
+ }
+
+ if (field.enumValues?.length) {
+ return 'select';
+ }
+
+ const baseType = field.type.replace(/^List\[|]$/g, '').toLowerCase();
+ return _PYTHON_TYPE_MAP[baseType] ?? 'text';
+}
+
+function _resolveOptions(field: SettingsSchemaField): AttributeOption[] | undefined {
+ if (!field.enumValues?.length) return undefined;
+ return field.enumValues.map((v) => ({
+ value: v,
+ label: field.pickerItemLabel ? `${v}` : v,
+ }));
+}
+
+// ---------------------------------------------------------------------------
+// Public API
+// ---------------------------------------------------------------------------
+
+export function settingsSchemaToFormAttributes(
+ schema: SettingsSchema,
+): AttributeDefinition[] {
+ return schema.fields.map((field, index): AttributeDefinition => ({
+ name: field.name,
+ type: _resolveAttributeType(field),
+ label: field.pickerLabel ?? field.description ?? field.name,
+ description: field.description,
+ required: field.required ?? false,
+ default: field.default ?? undefined,
+ options: _resolveOptions(field),
+ visible: field.frontendType !== 'hidden',
+ order: index,
+ placeholder: field.frontendOptions?.placeholder as string | undefined,
+ }));
+}