@open-mercato/core 0.6.5-develop.5382.1.f542de69af → 0.6.6-develop.5412.1.e2a52b14f0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/crmFixtures.js +4 -0
- package/dist/helpers/integration/crmFixtures.js.map +2 -2
- package/dist/modules/attachments/api/route.js +2 -0
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/lib/access.js +18 -0
- package/dist/modules/attachments/lib/access.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +3 -2
- package/dist/modules/auth/services/rbacService.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.js +0 -3
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +43 -2
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/deals/summary/route.js +402 -0
- package/dist/modules/customers/api/deals/summary/route.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js +16 -5
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js +22 -5
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +12 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +221 -56
- package/dist/modules/customers/backend/customers/deals/page.js.map +3 -3
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +1 -1
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/cli.js +15 -9
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +282 -0
- package/dist/modules/customers/components/DealsKpiStrip.js.map +7 -0
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +0 -1
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +100 -17
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +1 -2
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
- package/dist/modules/customers/components/kpi/PipelineStageBar.js +63 -0
- package/dist/modules/customers/components/kpi/PipelineStageBar.js.map +7 -0
- package/dist/modules/customers/lib/dealsMetrics.js +82 -0
- package/dist/modules/customers/lib/dealsMetrics.js.map +7 -0
- package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js +2 -1
- package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js +59 -27
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/entities.js +7 -0
- package/dist/modules/entities/api/entities.js.map +2 -2
- package/dist/modules/entities/api/records.js +26 -15
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js +14 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js +14 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +12 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/components/useRecordsEntityGuard.js +30 -0
- package/dist/modules/entities/components/useRecordsEntityGuard.js.map +7 -0
- package/dist/modules/query_index/lib/engine.js +4 -2
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/staff/api/team-members.js +9 -2
- package/dist/modules/staff/api/team-members.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +24 -1
- package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js +11 -6
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
- package/dist/modules/staff/commands/team-members.js +1 -1
- package/dist/modules/staff/commands/team-members.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +1 -1
- package/dist/modules/staff/components/TeamMemberForm.js.map +2 -2
- package/dist/modules/staff/lib/scheduleSwitch.js +23 -0
- package/dist/modules/staff/lib/scheduleSwitch.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/create/page.js +1 -2
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +1 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialog.js +4 -13
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +4 -13
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +1 -4
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -5
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/package.json +8 -8
- package/src/helpers/integration/crmFixtures.ts +21 -1
- package/src/modules/attachments/AGENTS.md +79 -0
- package/src/modules/attachments/api/route.ts +2 -0
- package/src/modules/attachments/lib/access.ts +36 -0
- package/src/modules/auth/services/rbacService.ts +11 -2
- package/src/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.tsx +0 -3
- package/src/modules/customers/api/deals/route.ts +51 -2
- package/src/modules/customers/api/deals/summary/route.ts +496 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.ts +28 -6
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealData.ts +33 -6
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +17 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +254 -66
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +1 -2
- package/src/modules/customers/cli.ts +15 -15
- package/src/modules/customers/components/DealsKpiStrip.tsx +389 -0
- package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +0 -1
- package/src/modules/customers/components/detail/DealForm.tsx +121 -19
- package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +1 -2
- package/src/modules/customers/components/kpi/PipelineStageBar.tsx +77 -0
- package/src/modules/customers/i18n/de.json +43 -0
- package/src/modules/customers/i18n/en.json +43 -0
- package/src/modules/customers/i18n/es.json +43 -0
- package/src/modules/customers/i18n/pl.json +43 -0
- package/src/modules/customers/lib/dealsMetrics.ts +159 -0
- package/src/modules/directory/subscribers/invalidateOrgScopeCache.ts +3 -1
- package/src/modules/directory/utils/organizationScope.ts +85 -30
- package/src/modules/entities/api/entities.ts +11 -0
- package/src/modules/entities/api/records.ts +46 -25
- package/src/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.tsx +15 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/create/page.tsx +15 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +23 -0
- package/src/modules/entities/components/useRecordsEntityGuard.ts +41 -0
- package/src/modules/entities/i18n/de.json +1 -0
- package/src/modules/entities/i18n/en.json +1 -0
- package/src/modules/entities/i18n/es.json +1 -0
- package/src/modules/entities/i18n/pl.json +1 -0
- package/src/modules/query_index/lib/engine.ts +11 -5
- package/src/modules/staff/api/team-members.ts +9 -2
- package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +31 -1
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +18 -8
- package/src/modules/staff/commands/team-members.ts +5 -2
- package/src/modules/staff/components/TeamMemberForm.tsx +4 -1
- package/src/modules/staff/i18n/de.json +1 -0
- package/src/modules/staff/i18n/en.json +1 -0
- package/src/modules/staff/i18n/es.json +1 -0
- package/src/modules/staff/i18n/pl.json +1 -0
- package/src/modules/staff/lib/scheduleSwitch.ts +46 -0
- package/src/modules/workflows/backend/definitions/create/page.tsx +1 -2
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +1 -2
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -2
- package/src/modules/workflows/components/NodeEditDialog.tsx +1 -4
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +4 -7
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +1 -2
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/workflows/components/DefinitionTriggersEditor.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useState, useCallback } from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { SwitchField } from '@open-mercato/ui/primitives/switch-field'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { EventPatternInput } from '@open-mercato/ui/backend/inputs/EventPatternInput'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Plus, Trash2, Edit2, Zap, Info, X } from 'lucide-react'\nimport type { WorkflowDefinitionTrigger } from '../data/entities'\n\ninterface DefinitionTriggersEditorProps {\n value: WorkflowDefinitionTrigger[]\n onChange: (triggers: WorkflowDefinitionTrigger[]) => void\n className?: string\n}\n\nconst FILTER_OPERATORS = [\n { value: 'eq', label: 'Equals' },\n { value: 'neq', label: 'Not Equals' },\n { value: 'gt', label: 'Greater Than' },\n { value: 'gte', label: 'Greater Than or Equal' },\n { value: 'lt', label: 'Less Than' },\n { value: 'lte', label: 'Less Than or Equal' },\n { value: 'contains', label: 'Contains' },\n { value: 'startsWith', label: 'Starts With' },\n { value: 'endsWith', label: 'Ends With' },\n { value: 'in', label: 'In (array)' },\n { value: 'notIn', label: 'Not In (array)' },\n { value: 'exists', label: 'Exists' },\n { value: 'notExists', label: 'Not Exists' },\n { value: 'regex', label: 'Regex Match' },\n] as const\n\ntype TriggerFormValues = {\n triggerId: string\n name: string\n description: string\n eventPattern: string\n enabled: boolean\n priority: number\n filterConditions: Array<{ field: string; operator: string; value: string }>\n contextMappings: Array<{ targetKey: string; sourceExpression: string; defaultValue: string }>\n debounceMs: string\n maxConcurrentInstances: string\n}\n\nconst defaultFormValues: TriggerFormValues = {\n triggerId: '',\n name: '',\n description: '',\n eventPattern: '',\n enabled: true,\n priority: 0,\n filterConditions: [],\n contextMappings: [],\n debounceMs: '',\n maxConcurrentInstances: '',\n}\n\n/**\n * DefinitionTriggersEditor\n *\n * Manages event triggers embedded in workflow definitions.\n * Works with local state - no API calls, changes are saved with the definition.\n */\nexport function DefinitionTriggersEditor({\n value,\n onChange,\n className,\n}: DefinitionTriggersEditorProps) {\n const t = useT()\n const [showDialog, setShowDialog] = useState(false)\n const [editingTrigger, setEditingTrigger] = useState<WorkflowDefinitionTrigger | null>(null)\n const [formValues, setFormValues] = useState<TriggerFormValues>(defaultFormValues)\n const [deleteConfirmId, setDeleteConfirmId] = useState<string | null>(null)\n\n // Generate trigger ID from name\n const generateTriggerId = useCallback((name: string) => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/(?:^_+|_+$)/g, '')\n .substring(0, 50) || `trigger_${Date.now()}`\n }, [])\n\n // Parse condition value (try JSON, fallback to string)\n const parseConditionValue = (valueStr: string): unknown => {\n try {\n return JSON.parse(valueStr)\n } catch {\n return valueStr\n }\n }\n\n // Build trigger from form values\n const buildTriggerFromForm = useCallback((values: TriggerFormValues): WorkflowDefinitionTrigger => {\n const config: WorkflowDefinitionTrigger['config'] = {}\n\n if (values.filterConditions.length > 0) {\n config.filterConditions = values.filterConditions.map(fc => ({\n field: fc.field,\n operator: fc.operator as any,\n value: parseConditionValue(fc.value),\n }))\n }\n\n if (values.contextMappings.length > 0) {\n config.contextMapping = values.contextMappings.map(cm => ({\n targetKey: cm.targetKey,\n sourceExpression: cm.sourceExpression,\n defaultValue: cm.defaultValue ? parseConditionValue(cm.defaultValue) : undefined,\n }))\n }\n\n if (values.debounceMs) {\n config.debounceMs = parseInt(values.debounceMs, 10)\n }\n\n if (values.maxConcurrentInstances) {\n config.maxConcurrentInstances = parseInt(values.maxConcurrentInstances, 10)\n }\n\n return {\n triggerId: values.triggerId || generateTriggerId(values.name),\n name: values.name,\n description: values.description || null,\n eventPattern: values.eventPattern,\n enabled: values.enabled,\n priority: values.priority,\n config: Object.keys(config).length > 0 ? config : null,\n }\n }, [generateTriggerId])\n\n // Open dialog for creating new trigger\n const handleCreateNew = useCallback(() => {\n setEditingTrigger(null)\n setFormValues(defaultFormValues)\n setShowDialog(true)\n }, [])\n\n // Open dialog for editing trigger\n const handleEdit = useCallback((trigger: WorkflowDefinitionTrigger) => {\n setEditingTrigger(trigger)\n setFormValues({\n triggerId: trigger.triggerId,\n name: trigger.name,\n description: trigger.description || '',\n eventPattern: trigger.eventPattern,\n enabled: trigger.enabled,\n priority: trigger.priority,\n filterConditions: trigger.config?.filterConditions?.map(fc => ({\n field: fc.field,\n operator: fc.operator,\n value: typeof fc.value === 'string' ? fc.value : JSON.stringify(fc.value),\n })) || [],\n contextMappings: trigger.config?.contextMapping?.map(cm => ({\n targetKey: cm.targetKey,\n sourceExpression: cm.sourceExpression,\n defaultValue: cm.defaultValue !== undefined\n ? (typeof cm.defaultValue === 'string' ? cm.defaultValue : JSON.stringify(cm.defaultValue))\n : '',\n })) || [],\n debounceMs: trigger.config?.debounceMs?.toString() || '',\n maxConcurrentInstances: trigger.config?.maxConcurrentInstances?.toString() || '',\n })\n setShowDialog(true)\n }, [])\n\n // Close dialog\n const handleCloseDialog = useCallback(() => {\n setShowDialog(false)\n setEditingTrigger(null)\n setFormValues(defaultFormValues)\n }, [])\n\n // Submit form\n const handleSubmit = useCallback(() => {\n if (!formValues.name.trim()) {\n return\n }\n if (!formValues.eventPattern.trim()) {\n return\n }\n\n const newTrigger = buildTriggerFromForm(formValues)\n\n if (editingTrigger) {\n // Update existing trigger\n onChange(value.map(t => t.triggerId === editingTrigger.triggerId ? newTrigger : t))\n } else {\n // Check for duplicate triggerId\n const existingIds = new Set(value.map(t => t.triggerId))\n if (existingIds.has(newTrigger.triggerId)) {\n // Append timestamp to make unique\n newTrigger.triggerId = `${newTrigger.triggerId}_${Date.now()}`\n }\n // Add new trigger\n onChange([...value, newTrigger])\n }\n\n handleCloseDialog()\n }, [formValues, editingTrigger, buildTriggerFromForm, value, onChange, handleCloseDialog])\n\n // Delete trigger\n const handleDelete = useCallback((triggerId: string) => {\n onChange(value.filter(t => t.triggerId !== triggerId))\n setDeleteConfirmId(null)\n }, [value, onChange])\n\n // Add filter condition\n const addFilterCondition = useCallback(() => {\n setFormValues(prev => ({\n ...prev,\n filterConditions: [...prev.filterConditions, { field: '', operator: 'eq', value: '' }],\n }))\n }, [])\n\n // Remove filter condition\n const removeFilterCondition = useCallback((index: number) => {\n setFormValues(prev => ({\n ...prev,\n filterConditions: prev.filterConditions.filter((_, i) => i !== index),\n }))\n }, [])\n\n // Update filter condition\n const updateFilterCondition = useCallback((index: number, field: string, fieldValue: string) => {\n setFormValues(prev => ({\n ...prev,\n filterConditions: prev.filterConditions.map((fc, i) =>\n i === index ? { ...fc, [field]: fieldValue } : fc\n ),\n }))\n }, [])\n\n // Add context mapping\n const addContextMapping = useCallback(() => {\n setFormValues(prev => ({\n ...prev,\n contextMappings: [...prev.contextMappings, { targetKey: '', sourceExpression: '', defaultValue: '' }],\n }))\n }, [])\n\n // Remove context mapping\n const removeContextMapping = useCallback((index: number) => {\n setFormValues(prev => ({\n ...prev,\n contextMappings: prev.contextMappings.filter((_, i) => i !== index),\n }))\n }, [])\n\n // Update context mapping\n const updateContextMapping = useCallback((index: number, field: string, fieldValue: string) => {\n setFormValues(prev => ({\n ...prev,\n contextMappings: prev.contextMappings.map((cm, i) =>\n i === index ? { ...cm, [field]: fieldValue } : cm\n ),\n }))\n }, [])\n\n return (\n <div className={className}>\n <div className=\"rounded-lg border bg-card p-3 md:p-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <Zap className=\"w-5 h-5 text-amber-500\" />\n <h3 className=\"text-sm font-semibold uppercase text-muted-foreground\">\n {t('workflows.triggers.title', 'Event Triggers')}\n </h3>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={handleCreateNew} className=\"w-full sm:w-auto\">\n <Plus className=\"w-4 h-4 mr-1\" />\n {t('workflows.triggers.add', 'Add Trigger')}\n </Button>\n </div>\n\n <p className=\"text-xs text-muted-foreground mb-4\">\n {t('workflows.triggers.description', 'Configure events that automatically start this workflow. When a matching event occurs in the system, a new workflow instance will be created with the mapped context.')}\n </p>\n\n {value.length === 0 ? (\n <Alert variant=\"info\">\n <Info className=\"w-4 h-4\" />\n <AlertTitle>{t('workflows.triggers.empty.title', 'No triggers configured')}</AlertTitle>\n <AlertDescription>\n {t('workflows.triggers.empty.description', 'Click \"Add Trigger\" to create an event trigger that automatically starts this workflow.')}\n </AlertDescription>\n </Alert>\n ) : (\n <div className=\"space-y-2\">\n {value.map(trigger => (\n <div\n key={trigger.triggerId}\n className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between p-3 rounded-lg border bg-background hover:bg-accent/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <Badge variant={trigger.enabled ? 'default' : 'secondary'} className=\"shrink-0\">\n {trigger.enabled ? t('common.active', 'Active') : t('common.disabled', 'Disabled')}\n </Badge>\n <div className=\"min-w-0\">\n <div className=\"font-medium text-sm truncate\">{trigger.name}</div>\n <code className=\"text-xs text-muted-foreground truncate block\">{trigger.eventPattern}</code>\n </div>\n </div>\n <div className=\"flex items-center gap-2 self-end sm:self-auto\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => handleEdit(trigger)}>\n <Edit2 className=\"w-4 h-4\" />\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"text-destructive hover:text-destructive\"\n onClick={() => setDeleteConfirmId(trigger.triggerId)}\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Create/Edit Dialog */}\n <Dialog open={showDialog} onOpenChange={setShowDialog}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {editingTrigger\n ? t('workflows.triggers.dialog.edit.title', 'Edit Event Trigger')\n : t('workflows.triggers.dialog.create.title', 'Create Event Trigger')\n }\n </DialogTitle>\n <DialogDescription>\n {t('workflows.triggers.dialog.description', 'Configure when this workflow should be automatically started based on system events.')}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* Basic Info */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-name\">{t('workflows.triggers.fields.name', 'Name')} *</Label>\n <Input\n id=\"trigger-name\"\n value={formValues.name}\n onChange={e => setFormValues(prev => ({ ...prev, name: e.target.value }))}\n placeholder={t('workflows.triggers.placeholders.name', 'Order Created Trigger')}\n />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-priority\">{t('workflows.triggers.fields.priority', 'Priority')}</Label>\n <Input\n id=\"trigger-priority\"\n type=\"number\"\n value={formValues.priority}\n onChange={e => setFormValues(prev => ({ ...prev, priority: parseInt(e.target.value) || 0 }))}\n placeholder=\"0\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.priority', 'Higher priority triggers execute first')}\n </p>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-description\">{t('workflows.triggers.fields.description', 'Description')}</Label>\n <Textarea\n id=\"trigger-description\"\n value={formValues.description}\n onChange={e => setFormValues(prev => ({ ...prev, description: e.target.value }))}\n placeholder={t('workflows.triggers.placeholders.description', 'Describe when this trigger should fire...')}\n rows={2}\n />\n </div>\n\n {/* Event Pattern */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-pattern\">{t('workflows.triggers.fields.eventPattern', 'Event Pattern')} *</Label>\n <EventPatternInput\n value={formValues.eventPattern}\n onChange={eventPattern => setFormValues(prev => ({ ...prev, eventPattern }))}\n placeholder={t('workflows.triggers.placeholders.eventPattern')}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.eventPattern', 'Use * as wildcard: \"sales.orders.*\" matches any order event')}\n </p>\n </div>\n\n {/* Enabled Switch */}\n <SwitchField\n id=\"trigger-enabled\"\n label={t('workflows.triggers.fields.enabled', 'Enabled')}\n flip\n checked={formValues.enabled}\n onCheckedChange={checked => setFormValues(prev => ({ ...prev, enabled: checked }))}\n />\n\n {/* Filter Conditions */}\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <Label>{t('workflows.triggers.fields.filterConditions', 'Filter Conditions')}</Label>\n <Button size=\"sm\" variant=\"ghost\" onClick={addFilterCondition} className=\"w-full sm:w-auto\">\n <Plus className=\"w-4 h-4 mr-1\" />\n {t('workflows.triggers.addCondition', 'Add Condition')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.filterConditions', 'Only trigger when the event payload matches these conditions (all must match)')}\n </p>\n {formValues.filterConditions.map((fc, index) => (\n <div key={index} className=\"flex flex-wrap items-center gap-2\">\n <Input\n value={fc.field}\n onChange={e => updateFilterCondition(index, 'field', e.target.value)}\n placeholder=\"status\"\n className=\"w-full sm:w-1/3\"\n />\n <Select\n value={fc.operator}\n onValueChange={(value) => updateFilterCondition(index, 'operator', value)}\n >\n <SelectTrigger size=\"lg\" className=\"w-full sm:w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {FILTER_OPERATORS.map(op => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Input\n value={fc.value}\n onChange={e => updateFilterCondition(index, 'value', e.target.value)}\n placeholder=\"submitted\"\n className=\"flex-1 min-w-0\"\n />\n <Button size=\"icon\" variant=\"ghost\" className=\"shrink-0\" onClick={() => removeFilterCondition(index)}>\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n\n {/* Context Mapping */}\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <Label>{t('workflows.triggers.fields.contextMapping', 'Context Mapping')}</Label>\n <Button size=\"sm\" variant=\"ghost\" onClick={addContextMapping} className=\"w-full sm:w-auto\">\n <Plus className=\"w-4 h-4 mr-1\" />\n {t('workflows.triggers.addMapping', 'Add Mapping')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.contextMapping', \"Map values from the event payload to the workflow's initial context\")}\n </p>\n {formValues.contextMappings.map((cm, index) => (\n <div key={index} className=\"flex flex-wrap items-center gap-2\">\n <Input\n value={cm.targetKey}\n onChange={e => updateContextMapping(index, 'targetKey', e.target.value)}\n placeholder=\"orderId\"\n className=\"w-full sm:w-1/3\"\n />\n <span className=\"hidden sm:inline text-muted-foreground\">=</span>\n <Input\n value={cm.sourceExpression}\n onChange={e => updateContextMapping(index, 'sourceExpression', e.target.value)}\n placeholder=\"id\"\n className=\"flex-1 min-w-0\"\n />\n <Input\n value={cm.defaultValue}\n onChange={e => updateContextMapping(index, 'defaultValue', e.target.value)}\n placeholder=\"default\"\n className=\"w-full sm:w-24\"\n />\n <Button size=\"icon\" variant=\"ghost\" className=\"shrink-0\" onClick={() => removeContextMapping(index)}>\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n\n {/* Advanced Options */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-debounce\">{t('workflows.triggers.fields.debounceMs', 'Debounce (ms)')}</Label>\n <Input\n id=\"trigger-debounce\"\n type=\"number\"\n value={formValues.debounceMs}\n onChange={e => setFormValues(prev => ({ ...prev, debounceMs: e.target.value }))}\n placeholder=\"0\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.debounce', 'Delay to prevent rapid re-triggers')}\n </p>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-max-concurrent\">{t('workflows.triggers.fields.maxConcurrent', 'Max Concurrent Instances')}</Label>\n <Input\n id=\"trigger-max-concurrent\"\n type=\"number\"\n value={formValues.maxConcurrentInstances}\n onChange={e => setFormValues(prev => ({ ...prev, maxConcurrentInstances: e.target.value }))}\n placeholder={t('workflows.triggers.placeholders.unlimited', 'Unlimited')}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.maxConcurrent', 'Limit simultaneous workflow instances')}\n </p>\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleCloseDialog}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={!formValues.name.trim() || !formValues.eventPattern.trim()}\n >\n {editingTrigger\n ? t('common.update', 'Update')\n : t('common.create', 'Create')\n }\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={!!deleteConfirmId} onOpenChange={() => setDeleteConfirmId(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t('workflows.triggers.delete.title', 'Delete Event Trigger?')}</DialogTitle>\n <DialogDescription>\n {t('workflows.triggers.delete.description', 'This will remove the event trigger. The change will take effect when you save the workflow definition.')}\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setDeleteConfirmId(null)}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => deleteConfirmId && handleDelete(deleteConfirmId)}\n >\n {t('common.delete', 'Delete')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n"],
|
|
5
|
-
"mappings": ";AA8RU,SACE,KADF;AA3RV,SAAS,UAAU,mBAAmB;AACtC,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,OAAO,kBAAkB,kBAAkB;AACpD,SAAS,yBAAyB;AAClC,SAAS,YAAY;AACrB,SAAS,MAAM,QAAQ,OAAO,KAAK,MAAM,SAAS;AASlD,MAAM,mBAAmB;AAAA,EACvB,EAAE,OAAO,MAAM,OAAO,SAAS;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,aAAa;AAAA,EACpC,EAAE,OAAO,MAAM,OAAO,eAAe;AAAA,EACrC,EAAE,OAAO,OAAO,OAAO,wBAAwB;AAAA,EAC/C,EAAE,OAAO,MAAM,OAAO,YAAY;AAAA,EAClC,EAAE,OAAO,OAAO,OAAO,qBAAqB;AAAA,EAC5C,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,EACvC,EAAE,OAAO,cAAc,OAAO,cAAc;AAAA,EAC5C,EAAE,OAAO,YAAY,OAAO,YAAY;AAAA,EACxC,EAAE,OAAO,MAAM,OAAO,aAAa;AAAA,EACnC,EAAE,OAAO,SAAS,OAAO,iBAAiB;AAAA,EAC1C,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,aAAa,OAAO,aAAa;AAAA,EAC1C,EAAE,OAAO,SAAS,OAAO,cAAc;AACzC;AAeA,MAAM,oBAAuC;AAAA,EAC3C,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,SAAS;AAAA,EACT,UAAU;AAAA,EACV,kBAAkB,CAAC;AAAA,EACnB,iBAAiB,CAAC;AAAA,EAClB,YAAY;AAAA,EACZ,wBAAwB;AAC1B;AAQO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA2C,IAAI;AAC3F,QAAM,CAAC,YAAY,aAAa,IAAI,SAA4B,iBAAiB;AACjF,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAG1E,QAAM,oBAAoB,YAAY,CAAC,SAAiB;AACtD,WAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,gBAAgB,EAAE,EAC1B,UAAU,GAAG,EAAE,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,EAC9C,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAsB,CAAC,aAA8B;AACzD,QAAI;AACF,aAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,uBAAuB,YAAY,CAAC,WAAyD;AACjG,UAAM,SAA8C,CAAC;AAErD,QAAI,OAAO,iBAAiB,SAAS,GAAG;AACtC,aAAO,mBAAmB,OAAO,iBAAiB,IAAI,SAAO;AAAA,QAC3D,OAAO,GAAG;AAAA,QACV,UAAU,GAAG;AAAA,QACb,OAAO,oBAAoB,GAAG,KAAK;AAAA,MACrC,EAAE;AAAA,IACJ;AAEA,QAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,aAAO,iBAAiB,OAAO,gBAAgB,IAAI,SAAO;AAAA,QACxD,WAAW,GAAG;AAAA,QACd,kBAAkB,GAAG;AAAA,QACrB,cAAc,GAAG,eAAe,oBAAoB,GAAG,YAAY,IAAI;AAAA,MACzE,EAAE;AAAA,IACJ;AAEA,QAAI,OAAO,YAAY;AACrB,aAAO,aAAa,SAAS,OAAO,YAAY,EAAE;AAAA,IACpD;AAEA,QAAI,OAAO,wBAAwB;AACjC,aAAO,yBAAyB,SAAS,OAAO,wBAAwB,EAAE;AAAA,IAC5E;AAEA,WAAO;AAAA,MACL,WAAW,OAAO,aAAa,kBAAkB,OAAO,IAAI;AAAA,MAC5D,MAAM,OAAO;AAAA,MACb,aAAa,OAAO,eAAe;AAAA,MACnC,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAGtB,QAAM,kBAAkB,YAAY,MAAM;AACxC,sBAAkB,IAAI;AACtB,kBAAc,iBAAiB;AAC/B,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,CAAC;AAGL,QAAM,aAAa,YAAY,CAAC,YAAuC;AACrE,sBAAkB,OAAO;AACzB,kBAAc;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ,eAAe;AAAA,MACpC,cAAc,QAAQ;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,kBAAkB,QAAQ,QAAQ,kBAAkB,IAAI,SAAO;AAAA,QAC7D,OAAO,GAAG;AAAA,QACV,UAAU,GAAG;AAAA,QACb,OAAO,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ,KAAK,UAAU,GAAG,KAAK;AAAA,MAC1E,EAAE,KAAK,CAAC;AAAA,MACR,iBAAiB,QAAQ,QAAQ,gBAAgB,IAAI,SAAO;AAAA,QAC1D,WAAW,GAAG;AAAA,QACd,kBAAkB,GAAG;AAAA,QACrB,cAAc,GAAG,iBAAiB,SAC7B,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe,KAAK,UAAU,GAAG,YAAY,IACvF;AAAA,MACN,EAAE,KAAK,CAAC;AAAA,MACR,YAAY,QAAQ,QAAQ,YAAY,SAAS,KAAK;AAAA,MACtD,wBAAwB,QAAQ,QAAQ,wBAAwB,SAAS,KAAK;AAAA,IAChF,CAAC;AACD,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAoB,YAAY,MAAM;AAC1C,kBAAc,KAAK;AACnB,sBAAkB,IAAI;AACtB,kBAAc,iBAAiB;AAAA,EACjC,GAAG,CAAC,CAAC;AAGL,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,WAAW,KAAK,KAAK,GAAG;AAC3B;AAAA,IACF;AACA,QAAI,CAAC,WAAW,aAAa,KAAK,GAAG;AACnC;AAAA,IACF;AAEA,UAAM,aAAa,qBAAqB,UAAU;AAElD,QAAI,gBAAgB;AAElB,eAAS,MAAM,IAAI,CAAAA,OAAKA,GAAE,cAAc,eAAe,YAAY,aAAaA,EAAC,CAAC;AAAA,IACpF,OAAO;AAEL,YAAM,cAAc,IAAI,IAAI,MAAM,IAAI,CAAAA,OAAKA,GAAE,SAAS,CAAC;AACvD,UAAI,YAAY,IAAI,WAAW,SAAS,GAAG;AAEzC,mBAAW,YAAY,GAAG,WAAW,SAAS,IAAI,KAAK,IAAI,CAAC;AAAA,MAC9D;AAEA,eAAS,CAAC,GAAG,OAAO,UAAU,CAAC;AAAA,IACjC;AAEA,sBAAkB;AAAA,EACpB,GAAG,CAAC,YAAY,gBAAgB,sBAAsB,OAAO,UAAU,iBAAiB,CAAC;AAGzF,QAAM,eAAe,YAAY,CAAC,cAAsB;AACtD,aAAS,MAAM,OAAO,CAAAA,OAAKA,GAAE,cAAc,SAAS,CAAC;AACrD,uBAAmB,IAAI;AAAA,EACzB,GAAG,CAAC,OAAO,QAAQ,CAAC;AAGpB,QAAM,qBAAqB,YAAY,MAAM;AAC3C,kBAAc,WAAS;AAAA,MACrB,GAAG;AAAA,MACH,kBAAkB,CAAC,GAAG,KAAK,kBAAkB,EAAE,OAAO,IAAI,UAAU,MAAM,OAAO,GAAG,CAAC;AAAA,IACvF,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAwB,YAAY,CAAC,UAAkB;AAC3D,kBAAc,WAAS;AAAA,MACrB,GAAG;AAAA,MACH,kBAAkB,KAAK,iBAAiB,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAAA,IACtE,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAwB,YAAY,CAAC,OAAe,OAAe,eAAuB;AAC9F,kBAAc,WAAS;AAAA,MACrB,GAAG;AAAA,MACH,kBAAkB,KAAK,iBAAiB;AAAA,QAAI,CAAC,IAAI,MAC/C,MAAM,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,IAAI;AAAA,MACjD;AAAA,IACF,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,oBAAoB,YAAY,MAAM;AAC1C,kBAAc,WAAS;AAAA,MACrB,GAAG;AAAA,MACH,iBAAiB,CAAC,GAAG,KAAK,iBAAiB,EAAE,WAAW,IAAI,kBAAkB,IAAI,cAAc,GAAG,CAAC;AAAA,IACtG,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,uBAAuB,YAAY,CAAC,UAAkB;AAC1D,kBAAc,WAAS;AAAA,MACrB,GAAG;AAAA,MACH,iBAAiB,KAAK,gBAAgB,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AAAA,IACpE,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,uBAAuB,YAAY,CAAC,OAAe,OAAe,eAAuB;AAC7F,kBAAc,WAAS;AAAA,MACrB,GAAG;AAAA,MACH,iBAAiB,KAAK,gBAAgB;AAAA,QAAI,CAAC,IAAI,MAC7C,MAAM,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,IAAI;AAAA,MACjD;AAAA,IACF,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,SACE,qBAAC,SAAI,WACH;AAAA,yBAAC,SAAI,WAAU,wCACb;AAAA,2BAAC,SAAI,WAAU,2EACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,OAAI,WAAU,0BAAyB;AAAA,UACxC,oBAAC,QAAG,WAAU,yDACX,YAAE,4BAA4B,gBAAgB,GACjD;AAAA,WACF;AAAA,QACA,qBAAC,UAAO,MAAK,MAAK,SAAQ,WAAU,SAAS,iBAAiB,WAAU,oBACtE;AAAA,8BAAC,QAAK,WAAU,gBAAe;AAAA,UAC9B,EAAE,0BAA0B,aAAa;AAAA,WAC5C;AAAA,SACF;AAAA,MAEA,oBAAC,OAAE,WAAU,sCACV,YAAE,kCAAkC,uKAAuK,GAC9M;AAAA,MAEC,MAAM,WAAW,IAChB,qBAAC,SAAM,SAAQ,QACb;AAAA,4BAAC,QAAK,WAAU,WAAU;AAAA,QAC1B,oBAAC,cAAY,YAAE,kCAAkC,wBAAwB,GAAE;AAAA,QAC3E,oBAAC,oBACE,YAAE,wCAAwC,yFAAyF,GACtI;AAAA,SACF,IAEA,oBAAC,SAAI,WAAU,aACZ,gBAAM,IAAI,aACT;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,iCAAC,SAAI,WAAU,mCACb;AAAA,kCAAC,SAAM,SAAS,QAAQ,UAAU,YAAY,aAAa,WAAU,YAClE,kBAAQ,UAAU,EAAE,iBAAiB,QAAQ,IAAI,EAAE,mBAAmB,UAAU,GACnF;AAAA,cACA,qBAAC,SAAI,WAAU,WACb;AAAA,oCAAC,SAAI,WAAU,gCAAgC,kBAAQ,MAAK;AAAA,gBAC5D,oBAAC,UAAK,WAAU,gDAAgD,kBAAQ,cAAa;AAAA,iBACvF;AAAA,eACF;AAAA,YACA,qBAAC,SAAI,WAAU,iDACb;AAAA,kCAAC,UAAO,MAAK,MAAK,SAAQ,SAAQ,SAAS,MAAM,WAAW,OAAO,GACjE,8BAAC,SAAM,WAAU,WAAU,GAC7B;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,WAAU;AAAA,kBACV,SAAS,MAAM,mBAAmB,QAAQ,SAAS;AAAA,kBAEnD,8BAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA;AAAA;AAAA,QAxBK,QAAQ;AAAA,MAyBf,CACD,GACH;AAAA,OAEJ;AAAA,IAGA,oBAAC,UAAO,MAAM,YAAY,cAAc,eACtC,+BAAC,iBAAc,WAAU,0CACvB;AAAA,2BAAC,gBACC;AAAA,4BAAC,eACE,2BACG,EAAE,wCAAwC,oBAAoB,IAC9D,EAAE,0CAA0C,sBAAsB,GAExE;AAAA,QACA,oBAAC,qBACE,YAAE,yCAAyC,sFAAsF,GACpI;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,kBAEb;AAAA,6BAAC,SAAI,WAAU,yCACb;AAAA,+BAAC,SAAI,WAAU,aACb;AAAA,iCAAC,SAAM,SAAQ,gBAAgB;AAAA,gBAAE,kCAAkC,MAAM;AAAA,cAAE;AAAA,eAAE;AAAA,YAC7E;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,OAAO,WAAW;AAAA,gBAClB,UAAU,OAAK,cAAc,WAAS,EAAE,GAAG,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE;AAAA,gBACxE,aAAa,EAAE,wCAAwC,uBAAuB;AAAA;AAAA,YAChF;AAAA,aACF;AAAA,UACA,qBAAC,SAAI,WAAU,aACb;AAAA,gCAAC,SAAM,SAAQ,oBAAoB,YAAE,sCAAsC,UAAU,GAAE;AAAA,YACvF;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,OAAO,WAAW;AAAA,gBAClB,UAAU,OAAK,cAAc,WAAS,EAAE,GAAG,MAAM,UAAU,SAAS,EAAE,OAAO,KAAK,KAAK,EAAE,EAAE;AAAA,gBAC3F,aAAY;AAAA;AAAA,YACd;AAAA,YACA,oBAAC,OAAE,WAAU,iCACV,YAAE,qCAAqC,wCAAwC,GAClF;AAAA,aACF;AAAA,WACF;AAAA,QAEA,qBAAC,SAAI,WAAU,aACb;AAAA,8BAAC,SAAM,SAAQ,uBAAuB,YAAE,yCAAyC,aAAa,GAAE;AAAA,UAChG;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAO,WAAW;AAAA,cAClB,UAAU,OAAK,cAAc,WAAS,EAAE,GAAG,MAAM,aAAa,EAAE,OAAO,MAAM,EAAE;AAAA,cAC/E,aAAa,EAAE,+CAA+C,2CAA2C;AAAA,cACzG,MAAM;AAAA;AAAA,UACR;AAAA,WACF;AAAA,QAGA,qBAAC,SAAI,WAAU,aACb;AAAA,+BAAC,SAAM,SAAQ,mBAAmB;AAAA,cAAE,0CAA0C,eAAe;AAAA,YAAE;AAAA,aAAE;AAAA,UACjG;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,WAAW;AAAA,cAClB,UAAU,kBAAgB,cAAc,WAAS,EAAE,GAAG,MAAM,aAAa,EAAE;AAAA,cAC3E,aAAa,EAAE,8CAA8C;AAAA;AAAA,UAC/D;AAAA,UACA,oBAAC,OAAE,WAAU,iCACV,YAAE,yCAAyC,6DAA6D,GAC3G;AAAA,WACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAO,EAAE,qCAAqC,SAAS;AAAA,YACvD,MAAI;AAAA,YACJ,SAAS,WAAW;AAAA,YACpB,iBAAiB,aAAW,cAAc,WAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,EAAE;AAAA;AAAA,QACnF;AAAA,QAGA,qBAAC,SAAI,WAAU,aACb;AAAA,+BAAC,SAAI,WAAU,sEACb;AAAA,gCAAC,SAAO,YAAE,8CAA8C,mBAAmB,GAAE;AAAA,YAC7E,qBAAC,UAAO,MAAK,MAAK,SAAQ,SAAQ,SAAS,oBAAoB,WAAU,oBACvE;AAAA,kCAAC,QAAK,WAAU,gBAAe;AAAA,cAC9B,EAAE,mCAAmC,eAAe;AAAA,eACvD;AAAA,aACF;AAAA,UACA,oBAAC,OAAE,WAAU,iCACV,YAAE,6CAA6C,+EAA+E,GACjI;AAAA,UACC,WAAW,iBAAiB,IAAI,CAAC,IAAI,UACpC,qBAAC,SAAgB,WAAU,qCACzB;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,GAAG;AAAA,gBACV,UAAU,OAAK,sBAAsB,OAAO,SAAS,EAAE,OAAO,KAAK;AAAA,gBACnE,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,GAAG;AAAA,gBACV,eAAe,CAACC,WAAU,sBAAsB,OAAO,YAAYA,MAAK;AAAA,gBAExE;AAAA,sCAAC,iBAAc,MAAK,MAAK,WAAU,uBACjC,8BAAC,eAAY,GACf;AAAA,kBACA,oBAAC,iBACE,2BAAiB,IAAI,QACpB,oBAAC,cAA0B,OAAO,GAAG,OAClC,aAAG,SADW,GAAG,KAEpB,CACD,GACH;AAAA;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,GAAG;AAAA,gBACV,UAAU,OAAK,sBAAsB,OAAO,SAAS,EAAE,OAAO,KAAK;AAAA,gBACnE,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YACA,oBAAC,UAAO,MAAK,QAAO,SAAQ,SAAQ,WAAU,YAAW,SAAS,MAAM,sBAAsB,KAAK,GACjG,8BAAC,KAAE,WAAU,WAAU,GACzB;AAAA,eA9BQ,KA+BV,CACD;AAAA,WACH;AAAA,QAGA,qBAAC,SAAI,WAAU,aACb;AAAA,+BAAC,SAAI,WAAU,sEACb;AAAA,gCAAC,SAAO,YAAE,4CAA4C,iBAAiB,GAAE;AAAA,YACzE,qBAAC,UAAO,MAAK,MAAK,SAAQ,SAAQ,SAAS,mBAAmB,WAAU,oBACtE;AAAA,kCAAC,QAAK,WAAU,gBAAe;AAAA,cAC9B,EAAE,iCAAiC,aAAa;AAAA,eACnD;AAAA,aACF;AAAA,UACA,oBAAC,OAAE,WAAU,iCACV,YAAE,2CAA2C,qEAAqE,GACrH;AAAA,UACC,WAAW,gBAAgB,IAAI,CAAC,IAAI,UACnC,qBAAC,SAAgB,WAAU,qCACzB;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,GAAG;AAAA,gBACV,UAAU,OAAK,qBAAqB,OAAO,aAAa,EAAE,OAAO,KAAK;AAAA,gBACtE,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YACA,oBAAC,UAAK,WAAU,0CAAyC,eAAC;AAAA,YAC1D;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,GAAG;AAAA,gBACV,UAAU,OAAK,qBAAqB,OAAO,oBAAoB,EAAE,OAAO,KAAK;AAAA,gBAC7E,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,GAAG;AAAA,gBACV,UAAU,OAAK,qBAAqB,OAAO,gBAAgB,EAAE,OAAO,KAAK;AAAA,gBACzE,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YACA,oBAAC,UAAO,MAAK,QAAO,SAAQ,SAAQ,WAAU,YAAW,SAAS,MAAM,qBAAqB,KAAK,GAChG,8BAAC,KAAE,WAAU,WAAU,GACzB;AAAA,eAtBQ,KAuBV,CACD;AAAA,WACH;AAAA,QAGA,qBAAC,SAAI,WAAU,yCACb;AAAA,+BAAC,SAAI,WAAU,aACb;AAAA,gCAAC,SAAM,SAAQ,oBAAoB,YAAE,wCAAwC,eAAe,GAAE;AAAA,YAC9F;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,OAAO,WAAW;AAAA,gBAClB,UAAU,OAAK,cAAc,WAAS,EAAE,GAAG,MAAM,YAAY,EAAE,OAAO,MAAM,EAAE;AAAA,gBAC9E,aAAY;AAAA;AAAA,YACd;AAAA,YACA,oBAAC,OAAE,WAAU,iCACV,YAAE,qCAAqC,oCAAoC,GAC9E;AAAA,aACF;AAAA,UACA,qBAAC,SAAI,WAAU,aACb;AAAA,gCAAC,SAAM,SAAQ,0BAA0B,YAAE,2CAA2C,0BAA0B,GAAE;AAAA,YAClH;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,OAAO,WAAW;AAAA,gBAClB,UAAU,OAAK,cAAc,WAAS,EAAE,GAAG,MAAM,wBAAwB,EAAE,OAAO,MAAM,EAAE;AAAA,gBAC1F,aAAa,EAAE,6CAA6C,WAAW;AAAA;AAAA,YACzE;AAAA,YACA,oBAAC,OAAE,WAAU,iCACV,YAAE,0CAA0C,uCAAuC,GACtF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,MAEA,qBAAC,gBACC;AAAA,4BAAC,UAAO,SAAQ,WAAU,SAAS,mBAChC,YAAE,iBAAiB,QAAQ,GAC9B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,CAAC,WAAW,KAAK,KAAK,KAAK,CAAC,WAAW,aAAa,KAAK;AAAA,YAElE,2BACG,EAAE,iBAAiB,QAAQ,IAC3B,EAAE,iBAAiB,QAAQ;AAAA;AAAA,QAEjC;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAGA,oBAAC,UAAO,MAAM,CAAC,CAAC,iBAAiB,cAAc,MAAM,mBAAmB,IAAI,GAC1E,+BAAC,iBACC;AAAA,2BAAC,gBACC;AAAA,4BAAC,eAAa,YAAE,mCAAmC,uBAAuB,GAAE;AAAA,QAC5E,oBAAC,qBACE,YAAE,yCAAyC,wGAAwG,GACtJ;AAAA,SACF;AAAA,MACA,qBAAC,gBACC;AAAA,4BAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,mBAAmB,IAAI,GAC7D,YAAE,iBAAiB,QAAQ,GAC9B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS,MAAM,mBAAmB,aAAa,eAAe;AAAA,YAE7D,YAAE,iBAAiB,QAAQ;AAAA;AAAA,QAC9B;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useState, useCallback } from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { SwitchField } from '@open-mercato/ui/primitives/switch-field'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { EventPatternInput } from '@open-mercato/ui/backend/inputs/EventPatternInput'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Plus, Trash2, Edit2, Zap, X } from 'lucide-react'\nimport type { WorkflowDefinitionTrigger } from '../data/entities'\n\ninterface DefinitionTriggersEditorProps {\n value: WorkflowDefinitionTrigger[]\n onChange: (triggers: WorkflowDefinitionTrigger[]) => void\n className?: string\n}\n\nconst FILTER_OPERATORS = [\n { value: 'eq', label: 'Equals' },\n { value: 'neq', label: 'Not Equals' },\n { value: 'gt', label: 'Greater Than' },\n { value: 'gte', label: 'Greater Than or Equal' },\n { value: 'lt', label: 'Less Than' },\n { value: 'lte', label: 'Less Than or Equal' },\n { value: 'contains', label: 'Contains' },\n { value: 'startsWith', label: 'Starts With' },\n { value: 'endsWith', label: 'Ends With' },\n { value: 'in', label: 'In (array)' },\n { value: 'notIn', label: 'Not In (array)' },\n { value: 'exists', label: 'Exists' },\n { value: 'notExists', label: 'Not Exists' },\n { value: 'regex', label: 'Regex Match' },\n] as const\n\ntype TriggerFormValues = {\n triggerId: string\n name: string\n description: string\n eventPattern: string\n enabled: boolean\n priority: number\n filterConditions: Array<{ field: string; operator: string; value: string }>\n contextMappings: Array<{ targetKey: string; sourceExpression: string; defaultValue: string }>\n debounceMs: string\n maxConcurrentInstances: string\n}\n\nconst defaultFormValues: TriggerFormValues = {\n triggerId: '',\n name: '',\n description: '',\n eventPattern: '',\n enabled: true,\n priority: 0,\n filterConditions: [],\n contextMappings: [],\n debounceMs: '',\n maxConcurrentInstances: '',\n}\n\n/**\n * DefinitionTriggersEditor\n *\n * Manages event triggers embedded in workflow definitions.\n * Works with local state - no API calls, changes are saved with the definition.\n */\nexport function DefinitionTriggersEditor({\n value,\n onChange,\n className,\n}: DefinitionTriggersEditorProps) {\n const t = useT()\n const [showDialog, setShowDialog] = useState(false)\n const [editingTrigger, setEditingTrigger] = useState<WorkflowDefinitionTrigger | null>(null)\n const [formValues, setFormValues] = useState<TriggerFormValues>(defaultFormValues)\n const [deleteConfirmId, setDeleteConfirmId] = useState<string | null>(null)\n\n // Generate trigger ID from name\n const generateTriggerId = useCallback((name: string) => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/(?:^_+|_+$)/g, '')\n .substring(0, 50) || `trigger_${Date.now()}`\n }, [])\n\n // Parse condition value (try JSON, fallback to string)\n const parseConditionValue = (valueStr: string): unknown => {\n try {\n return JSON.parse(valueStr)\n } catch {\n return valueStr\n }\n }\n\n // Build trigger from form values\n const buildTriggerFromForm = useCallback((values: TriggerFormValues): WorkflowDefinitionTrigger => {\n const config: WorkflowDefinitionTrigger['config'] = {}\n\n if (values.filterConditions.length > 0) {\n config.filterConditions = values.filterConditions.map(fc => ({\n field: fc.field,\n operator: fc.operator as any,\n value: parseConditionValue(fc.value),\n }))\n }\n\n if (values.contextMappings.length > 0) {\n config.contextMapping = values.contextMappings.map(cm => ({\n targetKey: cm.targetKey,\n sourceExpression: cm.sourceExpression,\n defaultValue: cm.defaultValue ? parseConditionValue(cm.defaultValue) : undefined,\n }))\n }\n\n if (values.debounceMs) {\n config.debounceMs = parseInt(values.debounceMs, 10)\n }\n\n if (values.maxConcurrentInstances) {\n config.maxConcurrentInstances = parseInt(values.maxConcurrentInstances, 10)\n }\n\n return {\n triggerId: values.triggerId || generateTriggerId(values.name),\n name: values.name,\n description: values.description || null,\n eventPattern: values.eventPattern,\n enabled: values.enabled,\n priority: values.priority,\n config: Object.keys(config).length > 0 ? config : null,\n }\n }, [generateTriggerId])\n\n // Open dialog for creating new trigger\n const handleCreateNew = useCallback(() => {\n setEditingTrigger(null)\n setFormValues(defaultFormValues)\n setShowDialog(true)\n }, [])\n\n // Open dialog for editing trigger\n const handleEdit = useCallback((trigger: WorkflowDefinitionTrigger) => {\n setEditingTrigger(trigger)\n setFormValues({\n triggerId: trigger.triggerId,\n name: trigger.name,\n description: trigger.description || '',\n eventPattern: trigger.eventPattern,\n enabled: trigger.enabled,\n priority: trigger.priority,\n filterConditions: trigger.config?.filterConditions?.map(fc => ({\n field: fc.field,\n operator: fc.operator,\n value: typeof fc.value === 'string' ? fc.value : JSON.stringify(fc.value),\n })) || [],\n contextMappings: trigger.config?.contextMapping?.map(cm => ({\n targetKey: cm.targetKey,\n sourceExpression: cm.sourceExpression,\n defaultValue: cm.defaultValue !== undefined\n ? (typeof cm.defaultValue === 'string' ? cm.defaultValue : JSON.stringify(cm.defaultValue))\n : '',\n })) || [],\n debounceMs: trigger.config?.debounceMs?.toString() || '',\n maxConcurrentInstances: trigger.config?.maxConcurrentInstances?.toString() || '',\n })\n setShowDialog(true)\n }, [])\n\n // Close dialog\n const handleCloseDialog = useCallback(() => {\n setShowDialog(false)\n setEditingTrigger(null)\n setFormValues(defaultFormValues)\n }, [])\n\n // Submit form\n const handleSubmit = useCallback(() => {\n if (!formValues.name.trim()) {\n return\n }\n if (!formValues.eventPattern.trim()) {\n return\n }\n\n const newTrigger = buildTriggerFromForm(formValues)\n\n if (editingTrigger) {\n // Update existing trigger\n onChange(value.map(t => t.triggerId === editingTrigger.triggerId ? newTrigger : t))\n } else {\n // Check for duplicate triggerId\n const existingIds = new Set(value.map(t => t.triggerId))\n if (existingIds.has(newTrigger.triggerId)) {\n // Append timestamp to make unique\n newTrigger.triggerId = `${newTrigger.triggerId}_${Date.now()}`\n }\n // Add new trigger\n onChange([...value, newTrigger])\n }\n\n handleCloseDialog()\n }, [formValues, editingTrigger, buildTriggerFromForm, value, onChange, handleCloseDialog])\n\n // Delete trigger\n const handleDelete = useCallback((triggerId: string) => {\n onChange(value.filter(t => t.triggerId !== triggerId))\n setDeleteConfirmId(null)\n }, [value, onChange])\n\n // Add filter condition\n const addFilterCondition = useCallback(() => {\n setFormValues(prev => ({\n ...prev,\n filterConditions: [...prev.filterConditions, { field: '', operator: 'eq', value: '' }],\n }))\n }, [])\n\n // Remove filter condition\n const removeFilterCondition = useCallback((index: number) => {\n setFormValues(prev => ({\n ...prev,\n filterConditions: prev.filterConditions.filter((_, i) => i !== index),\n }))\n }, [])\n\n // Update filter condition\n const updateFilterCondition = useCallback((index: number, field: string, fieldValue: string) => {\n setFormValues(prev => ({\n ...prev,\n filterConditions: prev.filterConditions.map((fc, i) =>\n i === index ? { ...fc, [field]: fieldValue } : fc\n ),\n }))\n }, [])\n\n // Add context mapping\n const addContextMapping = useCallback(() => {\n setFormValues(prev => ({\n ...prev,\n contextMappings: [...prev.contextMappings, { targetKey: '', sourceExpression: '', defaultValue: '' }],\n }))\n }, [])\n\n // Remove context mapping\n const removeContextMapping = useCallback((index: number) => {\n setFormValues(prev => ({\n ...prev,\n contextMappings: prev.contextMappings.filter((_, i) => i !== index),\n }))\n }, [])\n\n // Update context mapping\n const updateContextMapping = useCallback((index: number, field: string, fieldValue: string) => {\n setFormValues(prev => ({\n ...prev,\n contextMappings: prev.contextMappings.map((cm, i) =>\n i === index ? { ...cm, [field]: fieldValue } : cm\n ),\n }))\n }, [])\n\n return (\n <div className={className}>\n <div className=\"rounded-lg border bg-card p-3 md:p-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <Zap className=\"w-5 h-5 text-amber-500\" />\n <h3 className=\"text-sm font-semibold uppercase text-muted-foreground\">\n {t('workflows.triggers.title', 'Event Triggers')}\n </h3>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={handleCreateNew} className=\"w-full sm:w-auto\">\n <Plus className=\"w-4 h-4 mr-1\" />\n {t('workflows.triggers.add', 'Add Trigger')}\n </Button>\n </div>\n\n <p className=\"text-xs text-muted-foreground mb-4\">\n {t('workflows.triggers.description', 'Configure events that automatically start this workflow. When a matching event occurs in the system, a new workflow instance will be created with the mapped context.')}\n </p>\n\n {value.length === 0 ? (\n <Alert variant=\"info\">\n <AlertTitle>{t('workflows.triggers.empty.title', 'No triggers configured')}</AlertTitle>\n <AlertDescription>\n {t('workflows.triggers.empty.description', 'Click \"Add Trigger\" to create an event trigger that automatically starts this workflow.')}\n </AlertDescription>\n </Alert>\n ) : (\n <div className=\"space-y-2\">\n {value.map(trigger => (\n <div\n key={trigger.triggerId}\n className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between p-3 rounded-lg border bg-background hover:bg-accent/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <Badge variant={trigger.enabled ? 'default' : 'secondary'} className=\"shrink-0\">\n {trigger.enabled ? t('common.active', 'Active') : t('common.disabled', 'Disabled')}\n </Badge>\n <div className=\"min-w-0\">\n <div className=\"font-medium text-sm truncate\">{trigger.name}</div>\n <code className=\"text-xs text-muted-foreground truncate block\">{trigger.eventPattern}</code>\n </div>\n </div>\n <div className=\"flex items-center gap-2 self-end sm:self-auto\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => handleEdit(trigger)}>\n <Edit2 className=\"w-4 h-4\" />\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"text-destructive hover:text-destructive\"\n onClick={() => setDeleteConfirmId(trigger.triggerId)}\n >\n <Trash2 className=\"w-4 h-4\" />\n </Button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Create/Edit Dialog */}\n <Dialog open={showDialog} onOpenChange={setShowDialog}>\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>\n {editingTrigger\n ? t('workflows.triggers.dialog.edit.title', 'Edit Event Trigger')\n : t('workflows.triggers.dialog.create.title', 'Create Event Trigger')\n }\n </DialogTitle>\n <DialogDescription>\n {t('workflows.triggers.dialog.description', 'Configure when this workflow should be automatically started based on system events.')}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 py-4\">\n {/* Basic Info */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-name\">{t('workflows.triggers.fields.name', 'Name')} *</Label>\n <Input\n id=\"trigger-name\"\n value={formValues.name}\n onChange={e => setFormValues(prev => ({ ...prev, name: e.target.value }))}\n placeholder={t('workflows.triggers.placeholders.name', 'Order Created Trigger')}\n />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-priority\">{t('workflows.triggers.fields.priority', 'Priority')}</Label>\n <Input\n id=\"trigger-priority\"\n type=\"number\"\n value={formValues.priority}\n onChange={e => setFormValues(prev => ({ ...prev, priority: parseInt(e.target.value) || 0 }))}\n placeholder=\"0\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.priority', 'Higher priority triggers execute first')}\n </p>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-description\">{t('workflows.triggers.fields.description', 'Description')}</Label>\n <Textarea\n id=\"trigger-description\"\n value={formValues.description}\n onChange={e => setFormValues(prev => ({ ...prev, description: e.target.value }))}\n placeholder={t('workflows.triggers.placeholders.description', 'Describe when this trigger should fire...')}\n rows={2}\n />\n </div>\n\n {/* Event Pattern */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-pattern\">{t('workflows.triggers.fields.eventPattern', 'Event Pattern')} *</Label>\n <EventPatternInput\n value={formValues.eventPattern}\n onChange={eventPattern => setFormValues(prev => ({ ...prev, eventPattern }))}\n placeholder={t('workflows.triggers.placeholders.eventPattern')}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.eventPattern', 'Use * as wildcard: \"sales.orders.*\" matches any order event')}\n </p>\n </div>\n\n {/* Enabled Switch */}\n <SwitchField\n id=\"trigger-enabled\"\n label={t('workflows.triggers.fields.enabled', 'Enabled')}\n flip\n checked={formValues.enabled}\n onCheckedChange={checked => setFormValues(prev => ({ ...prev, enabled: checked }))}\n />\n\n {/* Filter Conditions */}\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <Label>{t('workflows.triggers.fields.filterConditions', 'Filter Conditions')}</Label>\n <Button size=\"sm\" variant=\"ghost\" onClick={addFilterCondition} className=\"w-full sm:w-auto\">\n <Plus className=\"w-4 h-4 mr-1\" />\n {t('workflows.triggers.addCondition', 'Add Condition')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.filterConditions', 'Only trigger when the event payload matches these conditions (all must match)')}\n </p>\n {formValues.filterConditions.map((fc, index) => (\n <div key={index} className=\"flex flex-wrap items-center gap-2\">\n <Input\n value={fc.field}\n onChange={e => updateFilterCondition(index, 'field', e.target.value)}\n placeholder=\"status\"\n className=\"w-full sm:w-1/3\"\n />\n <Select\n value={fc.operator}\n onValueChange={(value) => updateFilterCondition(index, 'operator', value)}\n >\n <SelectTrigger size=\"lg\" className=\"w-full sm:w-[140px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {FILTER_OPERATORS.map(op => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Input\n value={fc.value}\n onChange={e => updateFilterCondition(index, 'value', e.target.value)}\n placeholder=\"submitted\"\n className=\"flex-1 min-w-0\"\n />\n <Button size=\"icon\" variant=\"ghost\" className=\"shrink-0\" onClick={() => removeFilterCondition(index)}>\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n\n {/* Context Mapping */}\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <Label>{t('workflows.triggers.fields.contextMapping', 'Context Mapping')}</Label>\n <Button size=\"sm\" variant=\"ghost\" onClick={addContextMapping} className=\"w-full sm:w-auto\">\n <Plus className=\"w-4 h-4 mr-1\" />\n {t('workflows.triggers.addMapping', 'Add Mapping')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.contextMapping', \"Map values from the event payload to the workflow's initial context\")}\n </p>\n {formValues.contextMappings.map((cm, index) => (\n <div key={index} className=\"flex flex-wrap items-center gap-2\">\n <Input\n value={cm.targetKey}\n onChange={e => updateContextMapping(index, 'targetKey', e.target.value)}\n placeholder=\"orderId\"\n className=\"w-full sm:w-1/3\"\n />\n <span className=\"hidden sm:inline text-muted-foreground\">=</span>\n <Input\n value={cm.sourceExpression}\n onChange={e => updateContextMapping(index, 'sourceExpression', e.target.value)}\n placeholder=\"id\"\n className=\"flex-1 min-w-0\"\n />\n <Input\n value={cm.defaultValue}\n onChange={e => updateContextMapping(index, 'defaultValue', e.target.value)}\n placeholder=\"default\"\n className=\"w-full sm:w-24\"\n />\n <Button size=\"icon\" variant=\"ghost\" className=\"shrink-0\" onClick={() => removeContextMapping(index)}>\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n ))}\n </div>\n\n {/* Advanced Options */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-debounce\">{t('workflows.triggers.fields.debounceMs', 'Debounce (ms)')}</Label>\n <Input\n id=\"trigger-debounce\"\n type=\"number\"\n value={formValues.debounceMs}\n onChange={e => setFormValues(prev => ({ ...prev, debounceMs: e.target.value }))}\n placeholder=\"0\"\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.debounce', 'Delay to prevent rapid re-triggers')}\n </p>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"trigger-max-concurrent\">{t('workflows.triggers.fields.maxConcurrent', 'Max Concurrent Instances')}</Label>\n <Input\n id=\"trigger-max-concurrent\"\n type=\"number\"\n value={formValues.maxConcurrentInstances}\n onChange={e => setFormValues(prev => ({ ...prev, maxConcurrentInstances: e.target.value }))}\n placeholder={t('workflows.triggers.placeholders.unlimited', 'Unlimited')}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.triggers.hints.maxConcurrent', 'Limit simultaneous workflow instances')}\n </p>\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={handleCloseDialog}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={!formValues.name.trim() || !formValues.eventPattern.trim()}\n >\n {editingTrigger\n ? t('common.update', 'Update')\n : t('common.create', 'Create')\n }\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation Dialog */}\n <Dialog open={!!deleteConfirmId} onOpenChange={() => setDeleteConfirmId(null)}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{t('workflows.triggers.delete.title', 'Delete Event Trigger?')}</DialogTitle>\n <DialogDescription>\n {t('workflows.triggers.delete.description', 'This will remove the event trigger. The change will take effect when you save the workflow definition.')}\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setDeleteConfirmId(null)}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => deleteConfirmId && handleDelete(deleteConfirmId)}\n >\n {t('common.delete', 'Delete')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["t", "value"]
|
|
7
7
|
}
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
SelectValue
|
|
14
14
|
} from "@open-mercato/ui/primitives/select";
|
|
15
15
|
import { Alert, AlertDescription } from "@open-mercato/ui/primitives/alert";
|
|
16
|
-
import { ChevronDown,
|
|
16
|
+
import { ChevronDown, Plus, Trash2 } from "lucide-react";
|
|
17
17
|
import { sanitizeId } from "../lib/graph-utils.js";
|
|
18
18
|
import { WorkflowSelector } from "./WorkflowSelector.js";
|
|
19
19
|
import { JsonBuilder } from "@open-mercato/ui/backend/JsonBuilder";
|
|
@@ -392,14 +392,8 @@ function NodeEditDialog({ node, isOpen, onClose, onSave, onDelete }) {
|
|
|
392
392
|
] })
|
|
393
393
|
] })
|
|
394
394
|
] }),
|
|
395
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: !isEditable ? /* @__PURE__ */
|
|
396
|
-
/* @__PURE__ */ jsx(
|
|
397
|
-
/* @__PURE__ */ jsx(AlertDescription, { children: t("workflows.nodeEditor.endStepsNotEditable") })
|
|
398
|
-
] }) : isStartNode ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
399
|
-
/* @__PURE__ */ jsxs(Alert, { variant: "info", children: [
|
|
400
|
-
/* @__PURE__ */ jsx(Info, { className: "size-4" }),
|
|
401
|
-
/* @__PURE__ */ jsx(AlertDescription, { children: t("workflows.nodeEditor.startStepsInfo") })
|
|
402
|
-
] }),
|
|
395
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: !isEditable ? /* @__PURE__ */ jsx(Alert, { variant: "info", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("workflows.nodeEditor.endStepsNotEditable") }) }) : isStartNode ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
396
|
+
/* @__PURE__ */ jsx(Alert, { variant: "info", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("workflows.nodeEditor.startStepsInfo") }) }),
|
|
403
397
|
/* @__PURE__ */ jsx(
|
|
404
398
|
StartPreConditionsEditor,
|
|
405
399
|
{
|
|
@@ -512,10 +506,7 @@ function NodeEditDialog({ node, isOpen, onClose, onSave, onDelete }) {
|
|
|
512
506
|
}
|
|
513
507
|
)
|
|
514
508
|
] }),
|
|
515
|
-
isJsonSchemaFormat && /* @__PURE__ */
|
|
516
|
-
/* @__PURE__ */ jsx(Info, { className: "size-4" }),
|
|
517
|
-
/* @__PURE__ */ jsx(AlertDescription, { children: t("workflows.nodeEditor.jsonSchemaFormat") })
|
|
518
|
-
] }),
|
|
509
|
+
isJsonSchemaFormat && /* @__PURE__ */ jsx(Alert, { variant: "info", className: "mb-3", children: /* @__PURE__ */ jsx(AlertDescription, { children: t("workflows.nodeEditor.jsonSchemaFormat") }) }),
|
|
519
510
|
formFields.length === 0 && /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-sm text-gray-500 bg-gray-50 rounded-lg border border-gray-200", children: t("workflows.nodeEditor.noFormFields") }),
|
|
520
511
|
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: formFields.map((field, index) => {
|
|
521
512
|
const isExpanded = expandedFields.has(index);
|