@open-mercato/core 0.5.1-develop.2949.009dcdd2d5 → 0.5.1-develop.2954.610bab2d08
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/dist/helpers/integration/salesUi.js +25 -23
- package/dist/helpers/integration/salesUi.js.map +2 -2
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js +24 -24
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +15 -7
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +4 -6
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +63 -23
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +26 -26
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/business_rules/components/ActionRow.js +36 -25
- package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
- package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionRow.js +19 -10
- package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
- package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
- package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
- package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +4 -6
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/components/AddressEditor.js +24 -7
- package/dist/modules/customers/components/AddressEditor.js.map +2 -2
- package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
- package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -14
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js +16 -12
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
- package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js +18 -13
- package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
- package/dist/modules/entities/components/EncryptionManager.js +23 -19
- package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
- package/dist/modules/feature_toggles/components/formConfig.js +17 -9
- package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
- package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
- package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
- package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
- package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
- package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
- package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +14 -9
- package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
- package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js +14 -6
- package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
- package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
- package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
- package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
- package/package.json +3 -3
- package/src/helpers/integration/salesUi.ts +40 -30
- package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
- package/src/modules/attachments/fields/attachment.tsx +4 -6
- package/src/modules/auth/api/users/route.ts +75 -25
- package/src/modules/auth/backend/users/create/page.tsx +16 -20
- package/src/modules/business_rules/components/ActionRow.tsx +51 -32
- package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
- package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
- package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
- package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
- package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
- package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
- package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
- package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
- package/src/modules/customers/components/AddressEditor.tsx +30 -16
- package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
- package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
- package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
- package/src/modules/customers/components/detail/DealForm.tsx +33 -20
- package/src/modules/customers/components/formConfig.tsx +25 -17
- package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
- package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
- package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
- package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
- package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
- package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
- package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
- package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
- package/src/modules/entities/components/EncryptionManager.tsx +49 -33
- package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
- package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
- package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
- package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
- package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
- package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
- package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
- package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
- package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
- package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
- package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
- package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
- package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
- package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
- package/src/modules/workflows/components/StepsEditor.tsx +20 -10
- package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
- package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/workflows/components/NodeEditDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport {Node} from '@xyflow/react'\nimport {useEffect, useState} from 'react'\nimport {Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle} from '@open-mercato/ui/primitives/dialog'\nimport {Button} from '@open-mercato/ui/primitives/button'\nimport {Badge} from '@open-mercato/ui/primitives/badge'\nimport {Alert, AlertDescription} from '@open-mercato/ui/primitives/alert'\nimport {ChevronDown, Info, Plus, Trash2} from 'lucide-react'\nimport {sanitizeId} from '../lib/graph-utils'\nimport {WorkflowDefinition, WorkflowSelector} from './WorkflowSelector'\nimport {JsonBuilder} from '@open-mercato/ui/backend/JsonBuilder'\nimport {StartPreConditionsEditor, type StartPreCondition} from './fields/StartPreConditionsEditor'\nimport {useT} from '@open-mercato/shared/lib/i18n/context'\nimport {useConfirmDialog} from '@open-mercato/ui/backend/confirm-dialog'\n\nexport interface NodeEditDialogProps {\n node: Node | null\n isOpen: boolean\n onClose: () => void\n onSave: (nodeId: string, updates: Partial<Node['data']>) => void\n onDelete?: (nodeId: string) => void\n}\n\n/**\n * NodeEditDialog - Modal dialog for editing step properties\n *\n * Allows editing:\n * - Label (name)\n * - Description\n * - User task configuration (assignedTo, assignedToRoles, formKey)\n * - Automated task configuration (activityType, activityId)\n */\ninterface FormField {\n name: string\n type: string\n label: string\n required: boolean\n placeholder?: string\n options?: string[] // For select/radio fields\n defaultValue?: string\n}\n\nexport function NodeEditDialog({ node, isOpen, onClose, onSave, onDelete }: NodeEditDialogProps) {\n const t = useT()\n const { confirm: confirmDialog, ConfirmDialogElement } = useConfirmDialog()\n const [stepName, setStepName] = useState('')\n const [description, setDescription] = useState('')\n const [assignedTo, setAssignedTo] = useState('')\n const [assignedToRoles, setAssignedToRoles] = useState('')\n const [formKey, setFormKey] = useState('')\n const [activityType, setActivityType] = useState('')\n const [activityId, setActivityId] = useState('')\n const [timeout, setTimeout] = useState('')\n const [showAdvanced, setShowAdvanced] = useState(false)\n const [advancedConfig, setAdvancedConfig] = useState<Record<string, any>>({})\n const [formFields, setFormFields] = useState<FormField[]>([])\n const [expandedFields, setExpandedFields] = useState<Set<number>>(new Set())\n const [isJsonSchemaFormat, setIsJsonSchemaFormat] = useState(false)\n // Advanced userTaskConfig fields (Issue 4.3)\n const [assignmentRule, setAssignmentRule] = useState('')\n const [slaDuration, setSlaDuration] = useState('')\n const [escalationRules, setEscalationRules] = useState<any[]>([])\n\n // Sub-workflow configuration fields (Phase 8)\n const [subWorkflowId, setSubWorkflowId] = useState('')\n const [subWorkflowVersion, setSubWorkflowVersion] = useState('')\n const [inputMappings, setInputMappings] = useState<Array<{ key: string; value: string }>>([])\n const [outputMappings, setOutputMappings] = useState<Array<{ key: string; value: string }>>([])\n const [showWorkflowSelector, setShowWorkflowSelector] = useState(false)\n\n // Wait for signal configuration fields\n const [signalName, setSignalName] = useState('')\n const [signalTimeout, setSignalTimeout] = useState('')\n\n // Step activities state (for AUTOMATED steps)\n const [stepActivities, setStepActivities] = useState<any[]>([])\n const [expandedStepActivities, setExpandedStepActivities] = useState<Set<number>>(new Set())\n\n // Pre-conditions state (for START steps)\n const [preConditions, setPreConditions] = useState<StartPreCondition[]>([])\n\n // Convert JSON Schema to our custom format\n const convertJsonSchemaToFields = (schema: any): FormField[] => {\n if (!schema || !schema.properties) return []\n\n const fields: FormField[] = []\n const properties = schema.properties\n const required = schema.required || []\n\n for (const [name, prop] of Object.entries(properties)) {\n const propDef = prop as any\n const field: FormField = {\n name,\n type: mapJsonSchemaTypeToFieldType(propDef),\n label: propDef.title || name,\n required: required.includes(name),\n placeholder: propDef.description || undefined,\n }\n\n // Handle enum for select fields\n if (propDef.enum) {\n field.options = propDef.enum\n }\n\n // Handle default value\n if (propDef.default !== undefined) {\n field.defaultValue = String(propDef.default)\n }\n\n fields.push(field)\n }\n\n return fields\n }\n\n // Map JSON Schema types to our field types\n const mapJsonSchemaTypeToFieldType = (propDef: any): string => {\n if (propDef.enum) return 'select'\n\n switch (propDef.type) {\n case 'string':\n if (propDef.format === 'email') return 'email'\n if (propDef.format === 'uri') return 'url'\n if (propDef.format === 'date') return 'date'\n if (propDef.format === 'time') return 'time'\n if (propDef.format === 'date-time') return 'datetime-local'\n if (propDef.maxLength && propDef.maxLength > 200) return 'textarea'\n return 'text'\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'checkbox'\n default:\n return 'text'\n }\n }\n\n // Load node data when dialog opens\n useEffect(() => {\n if (node && isOpen) {\n const nodeData = node.data as any\n setStepName(nodeData?.stepName || nodeData?.label || '')\n setDescription(nodeData?.description || '')\n setAssignedTo(nodeData?.assignedTo || '')\n setAssignedToRoles(nodeData?.assignedToRoles?.join(', ') || '')\n setFormKey(nodeData?.formKey || '')\n setActivityType(nodeData?.activityType || '')\n setActivityId(nodeData?.activityId || '')\n setTimeout(nodeData?.timeout || '')\n\n // Load advanced userTaskConfig fields (Issue 4.3)\n if (node.type === 'userTask' && nodeData?.userTaskConfig) {\n setAssignmentRule(nodeData.userTaskConfig.assignmentRule || nodeData.assignmentRule || '')\n setSlaDuration(nodeData.userTaskConfig.slaDuration || nodeData.slaDuration || '')\n setEscalationRules(nodeData.userTaskConfig.escalationRules || nodeData.escalationRules || [])\n } else {\n setAssignmentRule('')\n setSlaDuration('')\n setEscalationRules([])\n }\n\n // Load sub-workflow configuration (Phase 8)\n if (node.type === 'subWorkflow' && nodeData?.config) {\n setSubWorkflowId(nodeData.config.subWorkflowId || '')\n setSubWorkflowVersion(nodeData.config.version?.toString() || '')\n\n // Convert inputMapping object to array for editing\n if (nodeData.config.inputMapping) {\n const mappings = Object.entries(nodeData.config.inputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n setInputMappings(mappings)\n } else {\n setInputMappings([])\n }\n\n // Convert outputMapping object to array for editing\n if (nodeData.config.outputMapping) {\n const mappings = Object.entries(nodeData.config.outputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n setOutputMappings(mappings)\n } else {\n setOutputMappings([])\n }\n } else {\n setSubWorkflowId('')\n setSubWorkflowVersion('')\n setInputMappings([])\n setOutputMappings([])\n }\n\n // Load signal configuration\n if (node.type === 'waitForSignal' && nodeData?.signalConfig) {\n setSignalName(nodeData.signalConfig.signalName || '')\n setSignalTimeout(nodeData.signalConfig.timeout || 'PT5M')\n } else {\n setSignalName('')\n setSignalTimeout('')\n }\n\n // Load step activities (for AUTOMATED steps)\n if (node.type === 'automated' && nodeData?.activities) {\n setStepActivities(nodeData.activities)\n } else if (node.type === 'automated') {\n setStepActivities([])\n }\n\n // Load pre-conditions (for START steps)\n if (node.type === 'start' && nodeData?.preConditions) {\n setPreConditions(nodeData.preConditions)\n } else if (node.type === 'start') {\n setPreConditions([])\n }\n\n // Load form fields from userTaskConfig.formSchema\n if (nodeData?.userTaskConfig?.formSchema) {\n const schema = nodeData.userTaskConfig.formSchema\n\n // Check if it's our custom format (with fields array) or JSON Schema format\n if (schema.fields && Array.isArray(schema.fields)) {\n // Custom format\n setFormFields(schema.fields)\n setIsJsonSchemaFormat(false)\n } else if (schema.properties) {\n // JSON Schema format - convert to our format\n setFormFields(convertJsonSchemaToFields(schema))\n setIsJsonSchemaFormat(true)\n } else {\n setFormFields([])\n setIsJsonSchemaFormat(false)\n }\n } else {\n setFormFields([])\n setIsJsonSchemaFormat(false)\n }\n\n // Load advanced config (userTaskConfig for USER_TASK, other custom fields)\n const advancedFields: any = {}\n if (nodeData?.userTaskConfig) {\n advancedFields.userTaskConfig = nodeData.userTaskConfig\n }\n if (nodeData?.retryPolicy) {\n advancedFields.retryPolicy = nodeData.retryPolicy\n }\n setAdvancedConfig(advancedFields)\n setExpandedFields(new Set())\n }\n }, [node, isOpen])\n\n const addFormField = () => {\n const newField: FormField = {\n name: `field_${Date.now()}`,\n type: 'text',\n label: t('workflows.form.newField'),\n required: false,\n placeholder: '',\n }\n setFormFields([...formFields, newField])\n // Auto-expand the new field\n const newExpanded = new Set(expandedFields)\n newExpanded.add(formFields.length)\n setExpandedFields(newExpanded)\n }\n\n const removeFormField = async (index: number) => {\n const confirmed = await confirmDialog({\n title: t('workflows.confirm.removeField'),\n variant: 'destructive',\n })\n if (confirmed) {\n setFormFields(formFields.filter((_, i) => i !== index))\n const newExpanded = new Set(expandedFields)\n newExpanded.delete(index)\n setExpandedFields(newExpanded)\n }\n }\n\n const updateFormField = (index: number, field: keyof FormField, value: any) => {\n const updated = [...formFields]\n updated[index] = { ...updated[index], [field]: value }\n setFormFields(updated)\n }\n\n const toggleFieldExpanded = (index: number) => {\n const newExpanded = new Set(expandedFields)\n if (newExpanded.has(index)) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedFields(newExpanded)\n }\n\n const handleWorkflowSelect = (workflowId: string, workflow: WorkflowDefinition) => {\n setSubWorkflowId(workflowId)\n setSubWorkflowVersion(workflow.version.toString())\n setShowWorkflowSelector(false)\n }\n\n const handleSave = () => {\n if (!node) return\n\n // Validate and sanitize step ID\n const sanitizedId = sanitizeId(node.id)\n if (sanitizedId !== node.id) {\n alert(t('workflows.nodeEditor.stepIdSanitized', { from: node.id, to: sanitizedId }))\n }\n\n const updates: Partial<Node['data']> = {\n stepName,\n label: stepName, // Keep label for backward compatibility\n description: description || undefined,\n timeout: timeout || undefined,\n }\n\n // User task specific fields\n if (node.type === 'userTask') {\n updates.assignedTo = assignedTo || undefined\n updates.assignedToRoles = assignedToRoles\n ? assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean)\n : []\n updates.formKey = formKey || undefined\n\n // Build userTaskConfig with all fields (Issue 4.3 - preserve advanced fields)\n updates.userTaskConfig = {\n ...(formFields.length > 0 && {\n formSchema: {\n fields: formFields,\n },\n }),\n ...(assignedTo && { assignedTo }),\n ...(assignedToRoles && { assignedToRoles: assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean) }),\n // Preserve advanced fields loaded from node data\n ...(assignmentRule && { assignmentRule }),\n ...(slaDuration && { slaDuration }),\n ...(escalationRules && escalationRules.length > 0 && { escalationRules }),\n }\n }\n\n // Automated task specific fields\n if (node.type === 'automated') {\n updates.activityType = activityType || undefined\n updates.activityId = activityId || undefined\n }\n\n // Sub-workflow specific fields (Phase 8)\n if (node.type === 'subWorkflow') {\n const config: any = {}\n\n if (subWorkflowId) {\n config.subWorkflowId = subWorkflowId\n }\n\n if (subWorkflowVersion) {\n const versionNum = parseInt(subWorkflowVersion, 10)\n if (!isNaN(versionNum)) {\n config.version = versionNum\n }\n }\n\n // Convert inputMappings array to object\n if (inputMappings.length > 0) {\n config.inputMapping = inputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n // Convert outputMappings array to object\n if (outputMappings.length > 0) {\n config.outputMapping = outputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n if (Object.keys(config).length > 0) {\n updates.config = config\n }\n }\n\n // Wait for signal specific fields\n if (node.type === 'waitForSignal') {\n const config: any = {}\n\n if (signalName) {\n config.signalName = signalName\n }\n\n if (signalTimeout) {\n config.timeout = signalTimeout\n }\n\n if (Object.keys(config).length > 0) {\n updates.signalConfig = config\n }\n }\n\n // Step activities (for AUTOMATED steps)\n if (node.type === 'automated' && stepActivities.length > 0) {\n updates.activities = stepActivities\n }\n\n // Pre-conditions (for START steps)\n if (node.type === 'start') {\n // Filter out empty rule IDs\n updates.preConditions = preConditions.filter(pc => pc.ruleId && pc.ruleId.trim())\n }\n\n // Merge advanced config\n if (advancedConfig && Object.keys(advancedConfig).length > 0) {\n Object.assign(updates, advancedConfig)\n }\n\n onSave(sanitizedId, updates)\n onClose()\n }\n\n const handleDelete = () => {\n if (!node || !onDelete) return\n onDelete(node.id)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleSave()\n }\n if (e.key === 'Escape') {\n onClose()\n }\n }\n\n if (!isOpen || !node) return null\n\n const nodeTypeLabel = {\n start: t('workflows.nodeTypes.start'),\n end: t('workflows.nodeTypes.end'),\n userTask: t('workflows.nodeTypes.userTask'),\n automated: t('workflows.nodeTypes.automated'),\n decision: t('workflows.nodeTypes.decision'),\n }[node.type || 'automated']\n\n // START nodes are partially editable (pre-conditions only), END nodes are not editable\n const isEditable = node.type !== 'end'\n const isStartNode = node.type === 'start'\n\n const badgeVariant =\n node.type === 'start' ? 'default' :\n node.type === 'end' ? 'secondary' :\n node.type === 'userTask' ? 'outline' : 'muted'\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent className=\"sm:max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <div className=\"flex items-center gap-2 mb-2\">\n <DialogTitle>{t('workflows.nodeEditor.title')}</DialogTitle>\n <Badge variant={badgeVariant}>\n {nodeTypeLabel}\n </Badge>\n </div>\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"font-medium\">{t('workflows.fields.id')}:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted text-muted-foreground font-mono\">{node.id}</code>\n </div>\n {(node.data as any)?.stepName && (\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"font-medium\">{t('workflows.fields.name')}:</span>\n <span>{(node.data as any).stepName}</span>\n </div>\n )}\n </div>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n {!isEditable ? (\n <Alert variant=\"info\">\n <Info className=\"size-4\" />\n <AlertDescription>\n {t('workflows.nodeEditor.endStepsNotEditable')}\n </AlertDescription>\n </Alert>\n ) : isStartNode ? (\n <div className=\"space-y-4\">\n {/* Info Alert for START nodes */}\n <Alert variant=\"info\">\n <Info className=\"size-4\" />\n <AlertDescription>\n {t('workflows.nodeEditor.startStepsInfo')}\n </AlertDescription>\n </Alert>\n\n {/* Pre-Conditions Editor for START nodes */}\n <StartPreConditionsEditor\n value={preConditions}\n setValue={setPreConditions}\n />\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* Step Name */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.stepName')} *\n </label>\n <input\n type=\"text\"\n value={stepName}\n onChange={(e) => setStepName(e.target.value)}\n placeholder={t('workflows.form.placeholders.stepName')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n autoFocus\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.stepName')}\n </p>\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.description')}\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('workflows.form.placeholders.description')}\n rows={3}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.description')}\n </p>\n </div>\n\n {/* Timeout */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.timeout')}\n </label>\n <input\n type=\"text\"\n value={timeout}\n onChange={(e) => setTimeout(e.target.value)}\n placeholder={t('workflows.form.placeholders.timeout')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.timeout')}\n </p>\n </div>\n\n {/* User Task Configuration */}\n {node.type === 'userTask' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n {t('workflows.nodeEditor.userTaskConfig')}\n </h3>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.assignedTo')}\n </label>\n <input\n type=\"text\"\n value={assignedTo}\n onChange={(e) => setAssignedTo(e.target.value)}\n placeholder={t('workflows.form.placeholders.userId')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.assignedTo')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.assignedToRoles')}\n </label>\n <input\n type=\"text\"\n value={assignedToRoles}\n onChange={(e) => setAssignedToRoles(e.target.value)}\n placeholder={t('workflows.form.placeholders.roles')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.assignedToRoles')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.formKey')}\n </label>\n <input\n type=\"text\"\n value={formKey}\n onChange={(e) => setFormKey(e.target.value)}\n placeholder={t('workflows.form.placeholders.formKey')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.formKey')}\n </p>\n </div>\n\n {/* Form Schema Builder */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.formFields', { count: formFields.length })}\n </h3>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.formFields')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={addFormField}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addField')}\n </Button>\n </div>\n\n {/* JSON Schema Format Notice */}\n {isJsonSchemaFormat && (\n <Alert variant=\"info\" className=\"mb-3\">\n <Info className=\"size-4\" />\n <AlertDescription>\n {t('workflows.nodeEditor.jsonSchemaFormat')}\n </AlertDescription>\n </Alert>\n )}\n\n {formFields.length === 0 && (\n <div className=\"p-4 text-center text-sm text-gray-500 bg-gray-50 rounded-lg border border-gray-200\">\n {t('workflows.nodeEditor.noFormFields')}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {formFields.map((field, index) => {\n const isExpanded = expandedFields.has(index)\n return (\n <div key={index} className=\"border border-gray-200 rounded-lg bg-gray-50\">\n <button\n type=\"button\"\n onClick={() => toggleFieldExpanded(index)}\n className=\"w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 transition-colors rounded-t-lg\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {field.label || field.name}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {field.type}\n </Badge>\n {field.required && (\n <Badge variant=\"destructive\" className=\"text-xs text-white\">\n {t('workflows.form.required')}\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-gray-600 mt-1\">\n Field name: <code className=\"bg-white px-1 rounded\">{field.name}</code>\n </p>\n </div>\n <ChevronDown\n className={`w-5 h-5 text-gray-400 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-gray-200 bg-white\">\n {/* Field Name */}\n <div className=\"pt-3\">\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.fieldName')} *</label>\n <input\n type=\"text\"\n value={field.name}\n onChange={(e) => updateFormField(index, 'name', e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-ring\"\n placeholder={t('workflows.form.placeholders.fieldName')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.fieldName')}</p>\n </div>\n\n {/* Field Label */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.fieldLabel')} *</label>\n <input\n type=\"text\"\n value={field.label}\n onChange={(e) => updateFormField(index, 'label', e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-ring\"\n placeholder={t('workflows.form.placeholders.fieldLabel')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.fieldLabel')}</p>\n </div>\n\n {/* Field Type */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.fieldType')} *</label>\n <select\n value={field.type}\n onChange={(e) => updateFormField(index, 'type', e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-ring\"\n >\n <option value=\"text\">{t('workflows.form.fieldTypes.text')}</option>\n <option value=\"number\">{t('workflows.form.fieldTypes.number')}</option>\n <option value=\"email\">{t('workflows.form.fieldTypes.email')}</option>\n <option value=\"tel\">{t('workflows.form.fieldTypes.tel')}</option>\n <option value=\"url\">{t('workflows.form.fieldTypes.url')}</option>\n <option value=\"textarea\">{t('workflows.form.fieldTypes.textarea')}</option>\n <option value=\"select\">{t('workflows.form.fieldTypes.select')}</option>\n <option value=\"radio\">{t('workflows.form.fieldTypes.radio')}</option>\n <option value=\"checkbox\">{t('workflows.form.fieldTypes.checkbox')}</option>\n <option value=\"date\">{t('workflows.form.fieldTypes.date')}</option>\n <option value=\"time\">{t('workflows.form.fieldTypes.time')}</option>\n <option value=\"datetime-local\">{t('workflows.form.fieldTypes.datetime-local')}</option>\n </select>\n </div>\n\n {/* Placeholder */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.placeholder')}</label>\n <input\n type=\"text\"\n value={field.placeholder || ''}\n onChange={(e) => updateFormField(index, 'placeholder', e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-ring\"\n placeholder={t('workflows.form.placeholders.placeholder')}\n />\n </div>\n\n {/* Default Value */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.defaultValue')}</label>\n <input\n type=\"text\"\n value={field.defaultValue || ''}\n onChange={(e) => updateFormField(index, 'defaultValue', e.target.value)}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-ring\"\n placeholder={t('workflows.form.placeholders.defaultValue')}\n />\n </div>\n\n {/* Options (for select/radio) */}\n {(field.type === 'select' || field.type === 'radio') && (\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.options')}</label>\n <input\n type=\"text\"\n value={field.options?.join(', ') || ''}\n onChange={(e) => updateFormField(index, 'options', e.target.value.split(',').map(o => o.trim()).filter(Boolean))}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-ring\"\n placeholder={t('workflows.form.placeholders.options')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.options')}</p>\n </div>\n )}\n\n {/* Required Checkbox */}\n <div>\n <label className=\"flex items-center gap-2 text-xs font-medium text-gray-700\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={(e) => updateFormField(index, 'required', e.target.checked)}\n className=\"rounded border-gray-300 text-blue-600 focus-visible:ring-ring\"\n />\n {t('workflows.form.requiredField')}\n </label>\n </div>\n\n {/* Delete Button */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => removeFormField(index)}\n >\n <Trash2 className=\"size-4 mr-1\" />\n {t('workflows.form.removeField')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n </>\n )}\n\n {/* Automated Step Activities */}\n {node.type === 'automated' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.stepActivities', { count: stepActivities.length })}\n </h3>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.activities')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => {\n setStepActivities([\n ...stepActivities,\n {\n activityId: `activity_${stepActivities.length + 1}`,\n activityName: `${t('workflows.activities.singular')} ${stepActivities.length + 1}`,\n activityType: 'CALL_API',\n config: {},\n async: false,\n },\n ])\n }}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addActivity')}\n </Button>\n </div>\n\n {stepActivities.length === 0 && (\n <div className=\"p-4 text-center text-sm text-gray-500 bg-gray-50 rounded-lg border border-gray-200\">\n {t('workflows.nodeEditor.noActivities')}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {stepActivities.map((activity, index) => {\n const isExpanded = expandedStepActivities.has(index)\n return (\n <div key={index} className=\"border border-gray-200 rounded-lg bg-gray-50\">\n {/* Activity Header (Collapsed) */}\n <button\n type=\"button\"\n onClick={() => {\n const newExpanded = new Set(expandedStepActivities)\n if (isExpanded) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedStepActivities(newExpanded)\n }}\n className=\"w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 transition-colors rounded-t-lg\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {activity.activityName || activity.activityId || `Activity ${index + 1}`}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {activity.activityType}\n </Badge>\n {activity.async && (\n <Badge variant=\"outline\" className=\"text-xs\">\n {t('workflows.form.async')}\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-gray-600 mt-1\">\n ID: <code className=\"bg-white px-1 rounded\">{activity.activityId}</code>\n </p>\n </div>\n <ChevronDown\n className={`w-5 h-5 text-gray-400 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n\n {/* Activity Body (Expanded) */}\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-gray-200 bg-white\">\n {/* Activity ID */}\n <div className=\"pt-3\">\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.activityId')} *\n </label>\n <input\n type=\"text\"\n value={activity.activityId}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].activityId = e.target.value\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder={t('workflows.form.placeholders.activityId')}\n />\n </div>\n\n {/* Activity Name */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.activityName')} *\n </label>\n <input\n type=\"text\"\n value={activity.activityName || ''}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].activityName = e.target.value\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder={t('workflows.form.placeholders.activityName')}\n />\n </div>\n\n {/* Activity Type */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.activityType')} *\n </label>\n <select\n value={activity.activityType}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].activityType = e.target.value\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <option value=\"SEND_EMAIL\">{t('workflows.activities.types.SEND_EMAIL')}</option>\n <option value=\"CALL_API\">{t('workflows.activities.types.CALL_API')}</option>\n <option value=\"UPDATE_ENTITY\">{t('workflows.activities.types.UPDATE_ENTITY')}</option>\n <option value=\"EMIT_EVENT\">{t('workflows.activities.types.EMIT_EVENT')}</option>\n <option value=\"CALL_WEBHOOK\">{t('workflows.activities.types.CALL_WEBHOOK')}</option>\n <option value=\"EXECUTE_FUNCTION\">{t('workflows.activities.types.EXECUTE_FUNCTION')}</option>\n </select>\n </div>\n\n {/* Timeout */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.timeout')}\n </label>\n <input\n type=\"text\"\n value={activity.timeoutMs || ''}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].timeoutMs = e.target.value ? parseInt(e.target.value) : undefined\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-xs focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder={t('workflows.form.placeholders.timeoutMs')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">{t('workflows.form.descriptions.timeoutMs')}</p>\n </div>\n\n {/* Retry Policy Grid */}\n <div className=\"border border-gray-200 rounded-lg p-3 bg-gray-50\">\n <label className=\"block text-xs font-semibold text-gray-700 mb-2\">\n {t('workflows.form.retryPolicy')}\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.maxAttempts')}</label>\n <input\n type=\"number\"\n value={activity.retryPolicy?.maxAttempts || 1}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.maxAttempts = parseInt(e.target.value) || 1\n setStepActivities(updated)\n }}\n min=\"1\"\n max=\"10\"\n className=\"w-full px-2 py-1 border border-gray-300 rounded text-xs\"\n />\n </div>\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.initialInterval')}</label>\n <input\n type=\"number\"\n value={activity.retryPolicy?.initialIntervalMs || 1000}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.initialIntervalMs = parseInt(e.target.value) || 1000\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1 border border-gray-300 rounded text-xs\"\n />\n </div>\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.backoffCoefficient')}</label>\n <input\n type=\"number\"\n step=\"0.1\"\n value={activity.retryPolicy?.backoffCoefficient || 2}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.backoffCoefficient = parseFloat(e.target.value) || 2\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1 border border-gray-300 rounded text-xs\"\n />\n </div>\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.maxInterval')}</label>\n <input\n type=\"number\"\n value={activity.retryPolicy?.maxIntervalMs || 60000}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.maxIntervalMs = parseInt(e.target.value) || 60000\n setStepActivities(updated)\n }}\n className=\"w-full px-2 py-1 border border-gray-300 rounded text-xs\"\n />\n </div>\n </div>\n </div>\n\n {/* Activity Flags */}\n <div className=\"flex gap-4\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={activity.async || false}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].async = e.target.checked\n setStepActivities(updated)\n }}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus-visible:ring-ring\"\n />\n <span className=\"text-xs text-gray-700\">{t('workflows.form.executeAsync')}</span>\n </label>\n </div>\n\n {/* Activity Config JSON */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.configuration')}\n </label>\n <JsonBuilder\n value={activity.config || {}}\n onChange={(config) => {\n const updated = [...stepActivities]\n updated[index].config = config\n setStepActivities(updated)\n }}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.activityConfig')}\n </p>\n </div>\n\n {/* Delete Button */}\n <div className=\"pt-3 border-t border-gray-100\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n setStepActivities(stepActivities.filter((_, i) => i !== index))\n const newExpanded = new Set(expandedStepActivities)\n newExpanded.delete(index)\n setExpandedStepActivities(newExpanded)\n }}\n >\n <Trash2 className=\"size-3 mr-1\" />\n {t('workflows.form.deleteActivity')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n </>\n )}\n\n {/* Sub-Workflow Configuration (Phase 8) */}\n {node.type === 'subWorkflow' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n {t('workflows.form.subWorkflowConfig')}\n </h3>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.workflowToInvoke')} *\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={subWorkflowId}\n onChange={(e) => setSubWorkflowId(e.target.value)}\n placeholder={t('workflows.form.placeholders.subWorkflowId')}\n className=\"flex-1 px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n readOnly\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowWorkflowSelector(true)}\n >\n {t('workflows.form.browse')}\n </Button>\n </div>\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.subWorkflowId')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.version')}\n </label>\n <input\n type=\"number\"\n value={subWorkflowVersion}\n onChange={(e) => setSubWorkflowVersion(e.target.value)}\n placeholder={t('workflows.form.placeholders.version')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.subWorkflowVersion')}\n </p>\n </div>\n\n {/* Input Mapping */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.inputMapping', { count: inputMappings.length })}\n </h4>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.inputMapping')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setInputMappings([...inputMappings, { key: '', value: '' }])}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addMapping')}\n </Button>\n </div>\n\n {inputMappings.length === 0 ? (\n <p className=\"text-sm text-gray-500 italic\">\n {t('workflows.nodeEditor.noInputMappings')}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {inputMappings.map((mapping, index) => (\n <div key={index} className=\"flex gap-2 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={mapping.key}\n onChange={(e) => {\n const newMappings = [...inputMappings]\n newMappings[index].key = e.target.value\n setInputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.childKey')}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-sm focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.childKey')}</p>\n </div>\n <span className=\"text-gray-400 mt-2\">\u2192</span>\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={mapping.value}\n onChange={(e) => {\n const newMappings = [...inputMappings]\n newMappings[index].value = e.target.value\n setInputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.parentPath')}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-sm focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.parentPath')}</p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setInputMappings(inputMappings.filter((_, i) => i !== index))\n }}\n className=\"mt-1\"\n >\n <Trash2 className=\"size-3\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Output Mapping */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.outputMapping', { count: outputMappings.length })}\n </h4>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.outputMapping')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setOutputMappings([...outputMappings, { key: '', value: '' }])}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addMapping')}\n </Button>\n </div>\n\n {outputMappings.length === 0 ? (\n <p className=\"text-sm text-gray-500 italic\">\n {t('workflows.nodeEditor.noOutputMappings')}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {outputMappings.map((mapping, index) => (\n <div key={index} className=\"flex gap-2 items-start\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={mapping.key}\n onChange={(e) => {\n const newMappings = [...outputMappings]\n newMappings[index].key = e.target.value\n setOutputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.parentKey')}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-sm focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.parentKey')}</p>\n </div>\n <span className=\"text-gray-400 mt-2\">\u2190</span>\n <div className=\"flex-1\">\n <input\n type=\"text\"\n value={mapping.value}\n onChange={(e) => {\n const newMappings = [...outputMappings]\n newMappings[index].value = e.target.value\n setOutputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.childPath')}\n className=\"w-full px-2 py-1.5 border border-gray-300 rounded text-sm focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.childPath')}</p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setOutputMappings(outputMappings.filter((_, i) => i !== index))\n }}\n className=\"mt-1\"\n >\n <Trash2 className=\"size-3\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* Wait for Signal Configuration */}\n {node.type === 'waitForSignal' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n {t('workflows.form.signalConfig')}\n </h3>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.signalName')} *\n </label>\n <input\n type=\"text\"\n value={signalName}\n onChange={(e) => setSignalName(e.target.value)}\n placeholder={t('workflows.form.placeholders.signalName')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.signalName')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.timeout')}\n </label>\n <input\n type=\"text\"\n value={signalTimeout}\n onChange={(e) => setSignalTimeout(e.target.value)}\n placeholder={t('workflows.form.placeholders.signalTimeout')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.signalTimeout')}\n </p>\n </div>\n </>\n )}\n\n {/* Advanced Configuration */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <button\n type=\"button\"\n onClick={() => setShowAdvanced(!showAdvanced)}\n className=\"flex items-center justify-between w-full text-left\"\n >\n <h3 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.advancedConfiguration')}\n </h3>\n <svg\n className={`w-5 h-5 transition-transform ${showAdvanced ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {showAdvanced && (\n <div className=\"mt-3\">\n <JsonBuilder\n value={advancedConfig}\n onChange={setAdvancedConfig}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.advancedConfig')}\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n <DialogFooter className=\"flex justify-between\">\n {onDelete && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleDelete}\n >\n <Trash2 className=\"size-4\" />\n {t('workflows.form.deleteStep')}\n </Button>\n )}\n <div className=\"flex gap-2 ml-auto\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n >\n {t('workflows.actions.cancel')}\n </Button>\n {isEditable && (\n <Button\n type=\"button\"\n onClick={handleSave}\n >\n {t('workflows.actions.saveChanges')}\n </Button>\n )}\n </div>\n </DialogFooter>\n </DialogContent>\n\n {/* Workflow Selector Dialog */}\n {node?.type === 'subWorkflow' && (\n <WorkflowSelector\n isOpen={showWorkflowSelector}\n onClose={() => setShowWorkflowSelector(false)}\n onSelect={handleWorkflowSelect}\n excludeWorkflowIds={[]}\n title={t('workflows.dialogs.selectSubWorkflow')}\n description={t('workflows.dialogs.selectSubWorkflowDescription')}\n onlyEnabled={true}\n />\n )}\n {ConfirmDialogElement}\n </Dialog>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport {Node} from '@xyflow/react'\nimport {useEffect, useState} from 'react'\nimport {Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle} from '@open-mercato/ui/primitives/dialog'\nimport {Button} from '@open-mercato/ui/primitives/button'\nimport {Input} from '@open-mercato/ui/primitives/input'\nimport {Badge} from '@open-mercato/ui/primitives/badge'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport {Alert, AlertDescription} from '@open-mercato/ui/primitives/alert'\nimport {ChevronDown, Info, Plus, Trash2} from 'lucide-react'\nimport {sanitizeId} from '../lib/graph-utils'\nimport {WorkflowDefinition, WorkflowSelector} from './WorkflowSelector'\nimport {JsonBuilder} from '@open-mercato/ui/backend/JsonBuilder'\nimport {StartPreConditionsEditor, type StartPreCondition} from './fields/StartPreConditionsEditor'\nimport {useT} from '@open-mercato/shared/lib/i18n/context'\nimport {useConfirmDialog} from '@open-mercato/ui/backend/confirm-dialog'\n\nexport interface NodeEditDialogProps {\n node: Node | null\n isOpen: boolean\n onClose: () => void\n onSave: (nodeId: string, updates: Partial<Node['data']>) => void\n onDelete?: (nodeId: string) => void\n}\n\n/**\n * NodeEditDialog - Modal dialog for editing step properties\n *\n * Allows editing:\n * - Label (name)\n * - Description\n * - User task configuration (assignedTo, assignedToRoles, formKey)\n * - Automated task configuration (activityType, activityId)\n */\ninterface FormField {\n name: string\n type: string\n label: string\n required: boolean\n placeholder?: string\n options?: string[] // For select/radio fields\n defaultValue?: string\n}\n\nexport function NodeEditDialog({ node, isOpen, onClose, onSave, onDelete }: NodeEditDialogProps) {\n const t = useT()\n const { confirm: confirmDialog, ConfirmDialogElement } = useConfirmDialog()\n const [stepName, setStepName] = useState('')\n const [description, setDescription] = useState('')\n const [assignedTo, setAssignedTo] = useState('')\n const [assignedToRoles, setAssignedToRoles] = useState('')\n const [formKey, setFormKey] = useState('')\n const [activityType, setActivityType] = useState('')\n const [activityId, setActivityId] = useState('')\n const [timeout, setTimeout] = useState('')\n const [showAdvanced, setShowAdvanced] = useState(false)\n const [advancedConfig, setAdvancedConfig] = useState<Record<string, any>>({})\n const [formFields, setFormFields] = useState<FormField[]>([])\n const [expandedFields, setExpandedFields] = useState<Set<number>>(new Set())\n const [isJsonSchemaFormat, setIsJsonSchemaFormat] = useState(false)\n // Advanced userTaskConfig fields (Issue 4.3)\n const [assignmentRule, setAssignmentRule] = useState('')\n const [slaDuration, setSlaDuration] = useState('')\n const [escalationRules, setEscalationRules] = useState<any[]>([])\n\n // Sub-workflow configuration fields (Phase 8)\n const [subWorkflowId, setSubWorkflowId] = useState('')\n const [subWorkflowVersion, setSubWorkflowVersion] = useState('')\n const [inputMappings, setInputMappings] = useState<Array<{ key: string; value: string }>>([])\n const [outputMappings, setOutputMappings] = useState<Array<{ key: string; value: string }>>([])\n const [showWorkflowSelector, setShowWorkflowSelector] = useState(false)\n\n // Wait for signal configuration fields\n const [signalName, setSignalName] = useState('')\n const [signalTimeout, setSignalTimeout] = useState('')\n\n // Step activities state (for AUTOMATED steps)\n const [stepActivities, setStepActivities] = useState<any[]>([])\n const [expandedStepActivities, setExpandedStepActivities] = useState<Set<number>>(new Set())\n\n // Pre-conditions state (for START steps)\n const [preConditions, setPreConditions] = useState<StartPreCondition[]>([])\n\n // Convert JSON Schema to our custom format\n const convertJsonSchemaToFields = (schema: any): FormField[] => {\n if (!schema || !schema.properties) return []\n\n const fields: FormField[] = []\n const properties = schema.properties\n const required = schema.required || []\n\n for (const [name, prop] of Object.entries(properties)) {\n const propDef = prop as any\n const field: FormField = {\n name,\n type: mapJsonSchemaTypeToFieldType(propDef),\n label: propDef.title || name,\n required: required.includes(name),\n placeholder: propDef.description || undefined,\n }\n\n // Handle enum for select fields\n if (propDef.enum) {\n field.options = propDef.enum\n }\n\n // Handle default value\n if (propDef.default !== undefined) {\n field.defaultValue = String(propDef.default)\n }\n\n fields.push(field)\n }\n\n return fields\n }\n\n // Map JSON Schema types to our field types\n const mapJsonSchemaTypeToFieldType = (propDef: any): string => {\n if (propDef.enum) return 'select'\n\n switch (propDef.type) {\n case 'string':\n if (propDef.format === 'email') return 'email'\n if (propDef.format === 'uri') return 'url'\n if (propDef.format === 'date') return 'date'\n if (propDef.format === 'time') return 'time'\n if (propDef.format === 'date-time') return 'datetime-local'\n if (propDef.maxLength && propDef.maxLength > 200) return 'textarea'\n return 'text'\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'checkbox'\n default:\n return 'text'\n }\n }\n\n // Load node data when dialog opens\n useEffect(() => {\n if (node && isOpen) {\n const nodeData = node.data as any\n setStepName(nodeData?.stepName || nodeData?.label || '')\n setDescription(nodeData?.description || '')\n setAssignedTo(nodeData?.assignedTo || '')\n setAssignedToRoles(nodeData?.assignedToRoles?.join(', ') || '')\n setFormKey(nodeData?.formKey || '')\n setActivityType(nodeData?.activityType || '')\n setActivityId(nodeData?.activityId || '')\n setTimeout(nodeData?.timeout || '')\n\n // Load advanced userTaskConfig fields (Issue 4.3)\n if (node.type === 'userTask' && nodeData?.userTaskConfig) {\n setAssignmentRule(nodeData.userTaskConfig.assignmentRule || nodeData.assignmentRule || '')\n setSlaDuration(nodeData.userTaskConfig.slaDuration || nodeData.slaDuration || '')\n setEscalationRules(nodeData.userTaskConfig.escalationRules || nodeData.escalationRules || [])\n } else {\n setAssignmentRule('')\n setSlaDuration('')\n setEscalationRules([])\n }\n\n // Load sub-workflow configuration (Phase 8)\n if (node.type === 'subWorkflow' && nodeData?.config) {\n setSubWorkflowId(nodeData.config.subWorkflowId || '')\n setSubWorkflowVersion(nodeData.config.version?.toString() || '')\n\n // Convert inputMapping object to array for editing\n if (nodeData.config.inputMapping) {\n const mappings = Object.entries(nodeData.config.inputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n setInputMappings(mappings)\n } else {\n setInputMappings([])\n }\n\n // Convert outputMapping object to array for editing\n if (nodeData.config.outputMapping) {\n const mappings = Object.entries(nodeData.config.outputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n setOutputMappings(mappings)\n } else {\n setOutputMappings([])\n }\n } else {\n setSubWorkflowId('')\n setSubWorkflowVersion('')\n setInputMappings([])\n setOutputMappings([])\n }\n\n // Load signal configuration\n if (node.type === 'waitForSignal' && nodeData?.signalConfig) {\n setSignalName(nodeData.signalConfig.signalName || '')\n setSignalTimeout(nodeData.signalConfig.timeout || 'PT5M')\n } else {\n setSignalName('')\n setSignalTimeout('')\n }\n\n // Load step activities (for AUTOMATED steps)\n if (node.type === 'automated' && nodeData?.activities) {\n setStepActivities(nodeData.activities)\n } else if (node.type === 'automated') {\n setStepActivities([])\n }\n\n // Load pre-conditions (for START steps)\n if (node.type === 'start' && nodeData?.preConditions) {\n setPreConditions(nodeData.preConditions)\n } else if (node.type === 'start') {\n setPreConditions([])\n }\n\n // Load form fields from userTaskConfig.formSchema\n if (nodeData?.userTaskConfig?.formSchema) {\n const schema = nodeData.userTaskConfig.formSchema\n\n // Check if it's our custom format (with fields array) or JSON Schema format\n if (schema.fields && Array.isArray(schema.fields)) {\n // Custom format\n setFormFields(schema.fields)\n setIsJsonSchemaFormat(false)\n } else if (schema.properties) {\n // JSON Schema format - convert to our format\n setFormFields(convertJsonSchemaToFields(schema))\n setIsJsonSchemaFormat(true)\n } else {\n setFormFields([])\n setIsJsonSchemaFormat(false)\n }\n } else {\n setFormFields([])\n setIsJsonSchemaFormat(false)\n }\n\n // Load advanced config (userTaskConfig for USER_TASK, other custom fields)\n const advancedFields: any = {}\n if (nodeData?.userTaskConfig) {\n advancedFields.userTaskConfig = nodeData.userTaskConfig\n }\n if (nodeData?.retryPolicy) {\n advancedFields.retryPolicy = nodeData.retryPolicy\n }\n setAdvancedConfig(advancedFields)\n setExpandedFields(new Set())\n }\n }, [node, isOpen])\n\n const addFormField = () => {\n const newField: FormField = {\n name: `field_${Date.now()}`,\n type: 'text',\n label: t('workflows.form.newField'),\n required: false,\n placeholder: '',\n }\n setFormFields([...formFields, newField])\n // Auto-expand the new field\n const newExpanded = new Set(expandedFields)\n newExpanded.add(formFields.length)\n setExpandedFields(newExpanded)\n }\n\n const removeFormField = async (index: number) => {\n const confirmed = await confirmDialog({\n title: t('workflows.confirm.removeField'),\n variant: 'destructive',\n })\n if (confirmed) {\n setFormFields(formFields.filter((_, i) => i !== index))\n const newExpanded = new Set(expandedFields)\n newExpanded.delete(index)\n setExpandedFields(newExpanded)\n }\n }\n\n const updateFormField = (index: number, field: keyof FormField, value: any) => {\n const updated = [...formFields]\n updated[index] = { ...updated[index], [field]: value }\n setFormFields(updated)\n }\n\n const toggleFieldExpanded = (index: number) => {\n const newExpanded = new Set(expandedFields)\n if (newExpanded.has(index)) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedFields(newExpanded)\n }\n\n const handleWorkflowSelect = (workflowId: string, workflow: WorkflowDefinition) => {\n setSubWorkflowId(workflowId)\n setSubWorkflowVersion(workflow.version.toString())\n setShowWorkflowSelector(false)\n }\n\n const handleSave = () => {\n if (!node) return\n\n // Validate and sanitize step ID\n const sanitizedId = sanitizeId(node.id)\n if (sanitizedId !== node.id) {\n alert(t('workflows.nodeEditor.stepIdSanitized', { from: node.id, to: sanitizedId }))\n }\n\n const updates: Partial<Node['data']> = {\n stepName,\n label: stepName, // Keep label for backward compatibility\n description: description || undefined,\n timeout: timeout || undefined,\n }\n\n // User task specific fields\n if (node.type === 'userTask') {\n updates.assignedTo = assignedTo || undefined\n updates.assignedToRoles = assignedToRoles\n ? assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean)\n : []\n updates.formKey = formKey || undefined\n\n // Build userTaskConfig with all fields (Issue 4.3 - preserve advanced fields)\n updates.userTaskConfig = {\n ...(formFields.length > 0 && {\n formSchema: {\n fields: formFields,\n },\n }),\n ...(assignedTo && { assignedTo }),\n ...(assignedToRoles && { assignedToRoles: assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean) }),\n // Preserve advanced fields loaded from node data\n ...(assignmentRule && { assignmentRule }),\n ...(slaDuration && { slaDuration }),\n ...(escalationRules && escalationRules.length > 0 && { escalationRules }),\n }\n }\n\n // Automated task specific fields\n if (node.type === 'automated') {\n updates.activityType = activityType || undefined\n updates.activityId = activityId || undefined\n }\n\n // Sub-workflow specific fields (Phase 8)\n if (node.type === 'subWorkflow') {\n const config: any = {}\n\n if (subWorkflowId) {\n config.subWorkflowId = subWorkflowId\n }\n\n if (subWorkflowVersion) {\n const versionNum = parseInt(subWorkflowVersion, 10)\n if (!isNaN(versionNum)) {\n config.version = versionNum\n }\n }\n\n // Convert inputMappings array to object\n if (inputMappings.length > 0) {\n config.inputMapping = inputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n // Convert outputMappings array to object\n if (outputMappings.length > 0) {\n config.outputMapping = outputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n if (Object.keys(config).length > 0) {\n updates.config = config\n }\n }\n\n // Wait for signal specific fields\n if (node.type === 'waitForSignal') {\n const config: any = {}\n\n if (signalName) {\n config.signalName = signalName\n }\n\n if (signalTimeout) {\n config.timeout = signalTimeout\n }\n\n if (Object.keys(config).length > 0) {\n updates.signalConfig = config\n }\n }\n\n // Step activities (for AUTOMATED steps)\n if (node.type === 'automated' && stepActivities.length > 0) {\n updates.activities = stepActivities\n }\n\n // Pre-conditions (for START steps)\n if (node.type === 'start') {\n // Filter out empty rule IDs\n updates.preConditions = preConditions.filter(pc => pc.ruleId && pc.ruleId.trim())\n }\n\n // Merge advanced config\n if (advancedConfig && Object.keys(advancedConfig).length > 0) {\n Object.assign(updates, advancedConfig)\n }\n\n onSave(sanitizedId, updates)\n onClose()\n }\n\n const handleDelete = () => {\n if (!node || !onDelete) return\n onDelete(node.id)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n handleSave()\n }\n if (e.key === 'Escape') {\n onClose()\n }\n }\n\n if (!isOpen || !node) return null\n\n const nodeTypeLabel = {\n start: t('workflows.nodeTypes.start'),\n end: t('workflows.nodeTypes.end'),\n userTask: t('workflows.nodeTypes.userTask'),\n automated: t('workflows.nodeTypes.automated'),\n decision: t('workflows.nodeTypes.decision'),\n }[node.type || 'automated']\n\n // START nodes are partially editable (pre-conditions only), END nodes are not editable\n const isEditable = node.type !== 'end'\n const isStartNode = node.type === 'start'\n\n const badgeVariant =\n node.type === 'start' ? 'default' :\n node.type === 'end' ? 'secondary' :\n node.type === 'userTask' ? 'outline' : 'muted'\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent className=\"sm:max-w-2xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <div className=\"flex items-center gap-2 mb-2\">\n <DialogTitle>{t('workflows.nodeEditor.title')}</DialogTitle>\n <Badge variant={badgeVariant}>\n {nodeTypeLabel}\n </Badge>\n </div>\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"font-medium\">{t('workflows.fields.id')}:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted text-muted-foreground font-mono\">{node.id}</code>\n </div>\n {(node.data as any)?.stepName && (\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"font-medium\">{t('workflows.fields.name')}:</span>\n <span>{(node.data as any).stepName}</span>\n </div>\n )}\n </div>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n {!isEditable ? (\n <Alert variant=\"info\">\n <Info className=\"size-4\" />\n <AlertDescription>\n {t('workflows.nodeEditor.endStepsNotEditable')}\n </AlertDescription>\n </Alert>\n ) : isStartNode ? (\n <div className=\"space-y-4\">\n {/* Info Alert for START nodes */}\n <Alert variant=\"info\">\n <Info className=\"size-4\" />\n <AlertDescription>\n {t('workflows.nodeEditor.startStepsInfo')}\n </AlertDescription>\n </Alert>\n\n {/* Pre-Conditions Editor for START nodes */}\n <StartPreConditionsEditor\n value={preConditions}\n setValue={setPreConditions}\n />\n </div>\n ) : (\n <div className=\"space-y-4\">\n {/* Step Name */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.stepName')} *\n </label>\n <Input\n type=\"text\"\n value={stepName}\n onChange={(e) => setStepName(e.target.value)}\n placeholder={t('workflows.form.placeholders.stepName')}\n autoFocus\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.stepName')}\n </p>\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.description')}\n </label>\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder={t('workflows.form.placeholders.description')}\n rows={3}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\"\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.description')}\n </p>\n </div>\n\n {/* Timeout */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.timeout')}\n </label>\n <Input\n type=\"text\"\n value={timeout}\n onChange={(e) => setTimeout(e.target.value)}\n placeholder={t('workflows.form.placeholders.timeout')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.timeout')}\n </p>\n </div>\n\n {/* User Task Configuration */}\n {node.type === 'userTask' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n {t('workflows.nodeEditor.userTaskConfig')}\n </h3>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.assignedTo')}\n </label>\n <Input\n type=\"text\"\n value={assignedTo}\n onChange={(e) => setAssignedTo(e.target.value)}\n placeholder={t('workflows.form.placeholders.userId')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.assignedTo')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.assignedToRoles')}\n </label>\n <Input\n type=\"text\"\n value={assignedToRoles}\n onChange={(e) => setAssignedToRoles(e.target.value)}\n placeholder={t('workflows.form.placeholders.roles')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.assignedToRoles')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.formKey')}\n </label>\n <Input\n type=\"text\"\n value={formKey}\n onChange={(e) => setFormKey(e.target.value)}\n placeholder={t('workflows.form.placeholders.formKey')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.formKey')}\n </p>\n </div>\n\n {/* Form Schema Builder */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.formFields', { count: formFields.length })}\n </h3>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.formFields')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={addFormField}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addField')}\n </Button>\n </div>\n\n {/* JSON Schema Format Notice */}\n {isJsonSchemaFormat && (\n <Alert variant=\"info\" className=\"mb-3\">\n <Info className=\"size-4\" />\n <AlertDescription>\n {t('workflows.nodeEditor.jsonSchemaFormat')}\n </AlertDescription>\n </Alert>\n )}\n\n {formFields.length === 0 && (\n <div className=\"p-4 text-center text-sm text-gray-500 bg-gray-50 rounded-lg border border-gray-200\">\n {t('workflows.nodeEditor.noFormFields')}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {formFields.map((field, index) => {\n const isExpanded = expandedFields.has(index)\n return (\n <div key={index} className=\"border border-gray-200 rounded-lg bg-gray-50\">\n <button\n type=\"button\"\n onClick={() => toggleFieldExpanded(index)}\n className=\"w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 transition-colors rounded-t-lg\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {field.label || field.name}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {field.type}\n </Badge>\n {field.required && (\n <Badge variant=\"destructive\" className=\"text-xs text-white\">\n {t('workflows.form.required')}\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-gray-600 mt-1\">\n Field name: <code className=\"bg-white px-1 rounded\">{field.name}</code>\n </p>\n </div>\n <ChevronDown\n className={`w-5 h-5 text-gray-400 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-gray-200 bg-white\">\n {/* Field Name */}\n <div className=\"pt-3\">\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.fieldName')} *</label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={field.name}\n onChange={(e) => updateFormField(index, 'name', e.target.value)}\n placeholder={t('workflows.form.placeholders.fieldName')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.fieldName')}</p>\n </div>\n\n {/* Field Label */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.fieldLabel')} *</label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={field.label}\n onChange={(e) => updateFormField(index, 'label', e.target.value)}\n placeholder={t('workflows.form.placeholders.fieldLabel')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.fieldLabel')}</p>\n </div>\n\n {/* Field Type */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.fieldType')} *</label>\n <Select\n value={field.type}\n onValueChange={(value) => updateFormField(index, 'type', value)}\n >\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"text\">{t('workflows.form.fieldTypes.text')}</SelectItem>\n <SelectItem value=\"number\">{t('workflows.form.fieldTypes.number')}</SelectItem>\n <SelectItem value=\"email\">{t('workflows.form.fieldTypes.email')}</SelectItem>\n <SelectItem value=\"tel\">{t('workflows.form.fieldTypes.tel')}</SelectItem>\n <SelectItem value=\"url\">{t('workflows.form.fieldTypes.url')}</SelectItem>\n <SelectItem value=\"textarea\">{t('workflows.form.fieldTypes.textarea')}</SelectItem>\n <SelectItem value=\"select\">{t('workflows.form.fieldTypes.select')}</SelectItem>\n <SelectItem value=\"radio\">{t('workflows.form.fieldTypes.radio')}</SelectItem>\n <SelectItem value=\"checkbox\">{t('workflows.form.fieldTypes.checkbox')}</SelectItem>\n <SelectItem value=\"date\">{t('workflows.form.fieldTypes.date')}</SelectItem>\n <SelectItem value=\"time\">{t('workflows.form.fieldTypes.time')}</SelectItem>\n <SelectItem value=\"datetime-local\">{t('workflows.form.fieldTypes.datetime-local')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Placeholder */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.placeholder')}</label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={field.placeholder || ''}\n onChange={(e) => updateFormField(index, 'placeholder', e.target.value)}\n placeholder={t('workflows.form.placeholders.placeholder')}\n />\n </div>\n\n {/* Default Value */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.defaultValue')}</label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={field.defaultValue || ''}\n onChange={(e) => updateFormField(index, 'defaultValue', e.target.value)}\n placeholder={t('workflows.form.placeholders.defaultValue')}\n />\n </div>\n\n {/* Options (for select/radio) */}\n {(field.type === 'select' || field.type === 'radio') && (\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">{t('workflows.form.options')}</label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={field.options?.join(', ') || ''}\n onChange={(e) => updateFormField(index, 'options', e.target.value.split(',').map(o => o.trim()).filter(Boolean))}\n placeholder={t('workflows.form.placeholders.options')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.options')}</p>\n </div>\n )}\n\n {/* Required Checkbox */}\n <div>\n <label className=\"flex items-center gap-2 text-xs font-medium text-gray-700\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={(e) => updateFormField(index, 'required', e.target.checked)}\n className=\"rounded border-gray-300 text-blue-600 focus-visible:ring-ring\"\n />\n {t('workflows.form.requiredField')}\n </label>\n </div>\n\n {/* Delete Button */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => removeFormField(index)}\n >\n <Trash2 className=\"size-4 mr-1\" />\n {t('workflows.form.removeField')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n </>\n )}\n\n {/* Automated Step Activities */}\n {node.type === 'automated' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.stepActivities', { count: stepActivities.length })}\n </h3>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.activities')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => {\n setStepActivities([\n ...stepActivities,\n {\n activityId: `activity_${stepActivities.length + 1}`,\n activityName: `${t('workflows.activities.singular')} ${stepActivities.length + 1}`,\n activityType: 'CALL_API',\n config: {},\n async: false,\n },\n ])\n }}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addActivity')}\n </Button>\n </div>\n\n {stepActivities.length === 0 && (\n <div className=\"p-4 text-center text-sm text-gray-500 bg-gray-50 rounded-lg border border-gray-200\">\n {t('workflows.nodeEditor.noActivities')}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {stepActivities.map((activity, index) => {\n const isExpanded = expandedStepActivities.has(index)\n return (\n <div key={index} className=\"border border-gray-200 rounded-lg bg-gray-50\">\n {/* Activity Header (Collapsed) */}\n <button\n type=\"button\"\n onClick={() => {\n const newExpanded = new Set(expandedStepActivities)\n if (isExpanded) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedStepActivities(newExpanded)\n }}\n className=\"w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 transition-colors rounded-t-lg\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {activity.activityName || activity.activityId || `Activity ${index + 1}`}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {activity.activityType}\n </Badge>\n {activity.async && (\n <Badge variant=\"outline\" className=\"text-xs\">\n {t('workflows.form.async')}\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-gray-600 mt-1\">\n ID: <code className=\"bg-white px-1 rounded\">{activity.activityId}</code>\n </p>\n </div>\n <ChevronDown\n className={`w-5 h-5 text-gray-400 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n\n {/* Activity Body (Expanded) */}\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-gray-200 bg-white\">\n {/* Activity ID */}\n <div className=\"pt-3\">\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.activityId')} *\n </label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={activity.activityId}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].activityId = e.target.value\n setStepActivities(updated)\n }}\n placeholder={t('workflows.form.placeholders.activityId')}\n />\n </div>\n\n {/* Activity Name */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.activityName')} *\n </label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={activity.activityName || ''}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].activityName = e.target.value\n setStepActivities(updated)\n }}\n placeholder={t('workflows.form.placeholders.activityName')}\n />\n </div>\n\n {/* Activity Type */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.activityType')} *\n </label>\n <Select\n value={activity.activityType}\n onValueChange={(value) => {\n const updated = [...stepActivities]\n updated[index].activityType = value\n setStepActivities(updated)\n }}\n >\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"SEND_EMAIL\">{t('workflows.activities.types.SEND_EMAIL')}</SelectItem>\n <SelectItem value=\"CALL_API\">{t('workflows.activities.types.CALL_API')}</SelectItem>\n <SelectItem value=\"UPDATE_ENTITY\">{t('workflows.activities.types.UPDATE_ENTITY')}</SelectItem>\n <SelectItem value=\"EMIT_EVENT\">{t('workflows.activities.types.EMIT_EVENT')}</SelectItem>\n <SelectItem value=\"CALL_WEBHOOK\">{t('workflows.activities.types.CALL_WEBHOOK')}</SelectItem>\n <SelectItem value=\"EXECUTE_FUNCTION\">{t('workflows.activities.types.EXECUTE_FUNCTION')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Timeout */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.timeout')}\n </label>\n <Input\n type=\"text\"\n size=\"sm\"\n value={activity.timeoutMs || ''}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].timeoutMs = e.target.value ? parseInt(e.target.value) : undefined\n setStepActivities(updated)\n }}\n placeholder={t('workflows.form.placeholders.timeoutMs')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">{t('workflows.form.descriptions.timeoutMs')}</p>\n </div>\n\n {/* Retry Policy Grid */}\n <div className=\"border border-gray-200 rounded-lg p-3 bg-gray-50\">\n <label className=\"block text-xs font-semibold text-gray-700 mb-2\">\n {t('workflows.form.retryPolicy')}\n </label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.maxAttempts')}</label>\n <Input\n type=\"number\"\n size=\"sm\"\n value={activity.retryPolicy?.maxAttempts || 1}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.maxAttempts = parseInt(e.target.value) || 1\n setStepActivities(updated)\n }}\n min=\"1\"\n max=\"10\"\n />\n </div>\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.initialInterval')}</label>\n <Input\n type=\"number\"\n size=\"sm\"\n value={activity.retryPolicy?.initialIntervalMs || 1000}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.initialIntervalMs = parseInt(e.target.value) || 1000\n setStepActivities(updated)\n }}\n />\n </div>\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.backoffCoefficient')}</label>\n <Input\n type=\"number\"\n size=\"sm\"\n step=\"0.1\"\n value={activity.retryPolicy?.backoffCoefficient || 2}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.backoffCoefficient = parseFloat(e.target.value) || 2\n setStepActivities(updated)\n }}\n />\n </div>\n <div>\n <label className=\"block text-xs text-gray-600 mb-1\">{t('workflows.form.maxInterval')}</label>\n <Input\n type=\"number\"\n size=\"sm\"\n value={activity.retryPolicy?.maxIntervalMs || 60000}\n onChange={(e) => {\n const updated = [...stepActivities]\n if (!updated[index].retryPolicy) updated[index].retryPolicy = {}\n updated[index].retryPolicy.maxIntervalMs = parseInt(e.target.value) || 60000\n setStepActivities(updated)\n }}\n />\n </div>\n </div>\n </div>\n\n {/* Activity Flags */}\n <div className=\"flex gap-4\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={activity.async || false}\n onChange={(e) => {\n const updated = [...stepActivities]\n updated[index].async = e.target.checked\n setStepActivities(updated)\n }}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus-visible:ring-ring\"\n />\n <span className=\"text-xs text-gray-700\">{t('workflows.form.executeAsync')}</span>\n </label>\n </div>\n\n {/* Activity Config JSON */}\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1\">\n {t('workflows.form.configuration')}\n </label>\n <JsonBuilder\n value={activity.config || {}}\n onChange={(config) => {\n const updated = [...stepActivities]\n updated[index].config = config\n setStepActivities(updated)\n }}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.activityConfig')}\n </p>\n </div>\n\n {/* Delete Button */}\n <div className=\"pt-3 border-t border-gray-100\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n setStepActivities(stepActivities.filter((_, i) => i !== index))\n const newExpanded = new Set(expandedStepActivities)\n newExpanded.delete(index)\n setExpandedStepActivities(newExpanded)\n }}\n >\n <Trash2 className=\"size-3 mr-1\" />\n {t('workflows.form.deleteActivity')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n </>\n )}\n\n {/* Sub-Workflow Configuration (Phase 8) */}\n {node.type === 'subWorkflow' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n {t('workflows.form.subWorkflowConfig')}\n </h3>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.workflowToInvoke')} *\n </label>\n <div className=\"flex gap-2\">\n <Input\n type=\"text\"\n value={subWorkflowId}\n onChange={(e) => setSubWorkflowId(e.target.value)}\n placeholder={t('workflows.form.placeholders.subWorkflowId')}\n className=\"flex-1\"\n readOnly\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowWorkflowSelector(true)}\n >\n {t('workflows.form.browse')}\n </Button>\n </div>\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.subWorkflowId')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.version')}\n </label>\n <Input\n type=\"number\"\n value={subWorkflowVersion}\n onChange={(e) => setSubWorkflowVersion(e.target.value)}\n placeholder={t('workflows.form.placeholders.version')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.subWorkflowVersion')}\n </p>\n </div>\n\n {/* Input Mapping */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.inputMapping', { count: inputMappings.length })}\n </h4>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.inputMapping')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setInputMappings([...inputMappings, { key: '', value: '' }])}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addMapping')}\n </Button>\n </div>\n\n {inputMappings.length === 0 ? (\n <p className=\"text-sm text-gray-500 italic\">\n {t('workflows.nodeEditor.noInputMappings')}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {inputMappings.map((mapping, index) => (\n <div key={index} className=\"flex gap-2 items-start\">\n <div className=\"flex-1\">\n <Input\n type=\"text\"\n value={mapping.key}\n onChange={(e) => {\n const newMappings = [...inputMappings]\n newMappings[index].key = e.target.value\n setInputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.childKey')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.childKey')}</p>\n </div>\n <span className=\"text-gray-400 mt-2\">\u2192</span>\n <div className=\"flex-1\">\n <Input\n type=\"text\"\n value={mapping.value}\n onChange={(e) => {\n const newMappings = [...inputMappings]\n newMappings[index].value = e.target.value\n setInputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.parentPath')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.parentPath')}</p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setInputMappings(inputMappings.filter((_, i) => i !== index))\n }}\n className=\"mt-1\"\n >\n <Trash2 className=\"size-3\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Output Mapping */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h4 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.outputMapping', { count: outputMappings.length })}\n </h4>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {t('workflows.form.descriptions.outputMapping')}\n </p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setOutputMappings([...outputMappings, { key: '', value: '' }])}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.form.addMapping')}\n </Button>\n </div>\n\n {outputMappings.length === 0 ? (\n <p className=\"text-sm text-gray-500 italic\">\n {t('workflows.nodeEditor.noOutputMappings')}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {outputMappings.map((mapping, index) => (\n <div key={index} className=\"flex gap-2 items-start\">\n <div className=\"flex-1\">\n <Input\n type=\"text\"\n value={mapping.key}\n onChange={(e) => {\n const newMappings = [...outputMappings]\n newMappings[index].key = e.target.value\n setOutputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.parentKey')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.parentKey')}</p>\n </div>\n <span className=\"text-gray-400 mt-2\">\u2190</span>\n <div className=\"flex-1\">\n <Input\n type=\"text\"\n value={mapping.value}\n onChange={(e) => {\n const newMappings = [...outputMappings]\n newMappings[index].value = e.target.value\n setOutputMappings(newMappings)\n }}\n placeholder={t('workflows.form.placeholders.childPath')}\n />\n <p className=\"text-xs text-gray-500 mt-0.5\">{t('workflows.form.descriptions.childPath')}</p>\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setOutputMappings(outputMappings.filter((_, i) => i !== index))\n }}\n className=\"mt-1\"\n >\n <Trash2 className=\"size-3\" />\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* Wait for Signal Configuration */}\n {node.type === 'waitForSignal' && (\n <>\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">\n {t('workflows.form.signalConfig')}\n </h3>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.signalName')} *\n </label>\n <Input\n type=\"text\"\n value={signalName}\n onChange={(e) => setSignalName(e.target.value)}\n placeholder={t('workflows.form.placeholders.signalName')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.signalName')}\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-1\">\n {t('workflows.form.timeout')}\n </label>\n <Input\n type=\"text\"\n value={signalTimeout}\n onChange={(e) => setSignalTimeout(e.target.value)}\n placeholder={t('workflows.form.placeholders.signalTimeout')}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.signalTimeout')}\n </p>\n </div>\n </>\n )}\n\n {/* Advanced Configuration */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <button\n type=\"button\"\n onClick={() => setShowAdvanced(!showAdvanced)}\n className=\"flex items-center justify-between w-full text-left\"\n >\n <h3 className=\"text-sm font-semibold text-gray-900\">\n {t('workflows.form.advancedConfiguration')}\n </h3>\n <svg\n className={`w-5 h-5 transition-transform ${showAdvanced ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {showAdvanced && (\n <div className=\"mt-3\">\n <JsonBuilder\n value={advancedConfig}\n onChange={setAdvancedConfig}\n />\n <p className=\"text-xs text-gray-500 mt-1\">\n {t('workflows.form.descriptions.advancedConfig')}\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n <DialogFooter className=\"flex justify-between\">\n {onDelete && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleDelete}\n >\n <Trash2 className=\"size-4\" />\n {t('workflows.form.deleteStep')}\n </Button>\n )}\n <div className=\"flex gap-2 ml-auto\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onClose}\n >\n {t('workflows.actions.cancel')}\n </Button>\n {isEditable && (\n <Button\n type=\"button\"\n onClick={handleSave}\n >\n {t('workflows.actions.saveChanges')}\n </Button>\n )}\n </div>\n </DialogFooter>\n </DialogContent>\n\n {/* Workflow Selector Dialog */}\n {node?.type === 'subWorkflow' && (\n <WorkflowSelector\n isOpen={showWorkflowSelector}\n onClose={() => setShowWorkflowSelector(false)}\n onSelect={handleWorkflowSelect}\n excludeWorkflowIds={[]}\n title={t('workflows.dialogs.selectSubWorkflow')}\n description={t('workflows.dialogs.selectSubWorkflowDescription')}\n onlyEnabled={true}\n />\n )}\n {ConfirmDialogElement}\n </Dialog>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AAkdU,SAkGM,UAjGJ,KADF;AA/cV,SAAQ,WAAW,gBAAe;AAClC,SAAQ,QAAQ,eAAe,cAAc,cAAc,mBAAkB;AAC7E,SAAQ,cAAa;AACrB,SAAQ,aAAY;AACpB,SAAQ,aAAY;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAQ,OAAO,wBAAuB;AACtC,SAAQ,aAAa,MAAM,MAAM,cAAa;AAC9C,SAAQ,kBAAiB;AACzB,SAA4B,wBAAuB;AACnD,SAAQ,mBAAkB;AAC1B,SAAQ,gCAAuD;AAC/D,SAAQ,YAAW;AACnB,SAAQ,wBAAuB;AA6BxB,SAAS,eAAe,EAAE,MAAM,QAAQ,SAAS,QAAQ,SAAS,GAAwB;AAC/F,QAAM,IAAI,KAAK;AACf,QAAM,EAAE,SAAS,eAAe,qBAAqB,IAAI,iBAAiB;AAC1E,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAC/C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,EAAE;AACzD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,EAAE;AACzC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE;AACnD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,EAAE;AACzC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA8B,CAAC,CAAC;AAC5E,QAAM,CAAC,YAAY,aAAa,IAAI,SAAsB,CAAC,CAAC;AAC5D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAS,KAAK;AAElE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,EAAE;AACvD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAgB,CAAC,CAAC;AAGhE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE;AACrD,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAS,EAAE;AAC/D,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAgD,CAAC,CAAC;AAC5F,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAgD,CAAC,CAAC;AAC9F,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,KAAK;AAGtE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE;AAGrD,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAgB,CAAC,CAAC;AAC9D,QAAM,CAAC,wBAAwB,yBAAyB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AAG3F,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA8B,CAAC,CAAC;AAG1E,QAAM,4BAA4B,CAAC,WAA6B;AAC9D,QAAI,CAAC,UAAU,CAAC,OAAO,WAAY,QAAO,CAAC;AAE3C,UAAM,SAAsB,CAAC;AAC7B,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,OAAO,YAAY,CAAC;AAErC,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,YAAM,UAAU;AAChB,YAAM,QAAmB;AAAA,QACvB;AAAA,QACA,MAAM,6BAA6B,OAAO;AAAA,QAC1C,OAAO,QAAQ,SAAS;AAAA,QACxB,UAAU,SAAS,SAAS,IAAI;AAAA,QAChC,aAAa,QAAQ,eAAe;AAAA,MACtC;AAGA,UAAI,QAAQ,MAAM;AAChB,cAAM,UAAU,QAAQ;AAAA,MAC1B;AAGA,UAAI,QAAQ,YAAY,QAAW;AACjC,cAAM,eAAe,OAAO,QAAQ,OAAO;AAAA,MAC7C;AAEA,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,+BAA+B,CAAC,YAAyB;AAC7D,QAAI,QAAQ,KAAM,QAAO;AAEzB,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,YAAI,QAAQ,WAAW,QAAS,QAAO;AACvC,YAAI,QAAQ,WAAW,MAAO,QAAO;AACrC,YAAI,QAAQ,WAAW,OAAQ,QAAO;AACtC,YAAI,QAAQ,WAAW,OAAQ,QAAO;AACtC,YAAI,QAAQ,WAAW,YAAa,QAAO;AAC3C,YAAI,QAAQ,aAAa,QAAQ,YAAY,IAAK,QAAO;AACzD,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,YAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,YAAM,WAAW,KAAK;AACtB,kBAAY,UAAU,YAAY,UAAU,SAAS,EAAE;AACvD,qBAAe,UAAU,eAAe,EAAE;AAC1C,oBAAc,UAAU,cAAc,EAAE;AACxC,yBAAmB,UAAU,iBAAiB,KAAK,IAAI,KAAK,EAAE;AAC9D,iBAAW,UAAU,WAAW,EAAE;AAClC,sBAAgB,UAAU,gBAAgB,EAAE;AAC5C,oBAAc,UAAU,cAAc,EAAE;AACxC,iBAAW,UAAU,WAAW,EAAE;AAGlC,UAAI,KAAK,SAAS,cAAc,UAAU,gBAAgB;AACxD,0BAAkB,SAAS,eAAe,kBAAkB,SAAS,kBAAkB,EAAE;AACzF,uBAAe,SAAS,eAAe,eAAe,SAAS,eAAe,EAAE;AAChF,2BAAmB,SAAS,eAAe,mBAAmB,SAAS,mBAAmB,CAAC,CAAC;AAAA,MAC9F,OAAO;AACL,0BAAkB,EAAE;AACpB,uBAAe,EAAE;AACjB,2BAAmB,CAAC,CAAC;AAAA,MACvB;AAGA,UAAI,KAAK,SAAS,iBAAiB,UAAU,QAAQ;AACnD,yBAAiB,SAAS,OAAO,iBAAiB,EAAE;AACpD,8BAAsB,SAAS,OAAO,SAAS,SAAS,KAAK,EAAE;AAG/D,YAAI,SAAS,OAAO,cAAc;AAChC,gBAAM,WAAW,OAAO,QAAQ,SAAS,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,YACnF;AAAA,YACA;AAAA,UACF,EAAE;AACF,2BAAiB,QAAQ;AAAA,QAC3B,OAAO;AACL,2BAAiB,CAAC,CAAC;AAAA,QACrB;AAGA,YAAI,SAAS,OAAO,eAAe;AACjC,gBAAM,WAAW,OAAO,QAAQ,SAAS,OAAO,aAAa,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,YACpF;AAAA,YACA;AAAA,UACF,EAAE;AACF,4BAAkB,QAAQ;AAAA,QAC5B,OAAO;AACL,4BAAkB,CAAC,CAAC;AAAA,QACtB;AAAA,MACF,OAAO;AACL,yBAAiB,EAAE;AACnB,8BAAsB,EAAE;AACxB,yBAAiB,CAAC,CAAC;AACnB,0BAAkB,CAAC,CAAC;AAAA,MACtB;AAGA,UAAI,KAAK,SAAS,mBAAmB,UAAU,cAAc;AAC3D,sBAAc,SAAS,aAAa,cAAc,EAAE;AACpD,yBAAiB,SAAS,aAAa,WAAW,MAAM;AAAA,MAC1D,OAAO;AACL,sBAAc,EAAE;AAChB,yBAAiB,EAAE;AAAA,MACrB;AAGA,UAAI,KAAK,SAAS,eAAe,UAAU,YAAY;AACrD,0BAAkB,SAAS,UAAU;AAAA,MACvC,WAAW,KAAK,SAAS,aAAa;AACpC,0BAAkB,CAAC,CAAC;AAAA,MACtB;AAGA,UAAI,KAAK,SAAS,WAAW,UAAU,eAAe;AACpD,yBAAiB,SAAS,aAAa;AAAA,MACzC,WAAW,KAAK,SAAS,SAAS;AAChC,yBAAiB,CAAC,CAAC;AAAA,MACrB;AAGA,UAAI,UAAU,gBAAgB,YAAY;AACxC,cAAM,SAAS,SAAS,eAAe;AAGvC,YAAI,OAAO,UAAU,MAAM,QAAQ,OAAO,MAAM,GAAG;AAEjD,wBAAc,OAAO,MAAM;AAC3B,gCAAsB,KAAK;AAAA,QAC7B,WAAW,OAAO,YAAY;AAE5B,wBAAc,0BAA0B,MAAM,CAAC;AAC/C,gCAAsB,IAAI;AAAA,QAC5B,OAAO;AACL,wBAAc,CAAC,CAAC;AAChB,gCAAsB,KAAK;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,sBAAc,CAAC,CAAC;AAChB,8BAAsB,KAAK;AAAA,MAC7B;AAGA,YAAM,iBAAsB,CAAC;AAC7B,UAAI,UAAU,gBAAgB;AAC5B,uBAAe,iBAAiB,SAAS;AAAA,MAC3C;AACA,UAAI,UAAU,aAAa;AACzB,uBAAe,cAAc,SAAS;AAAA,MACxC;AACA,wBAAkB,cAAc;AAChC,wBAAkB,oBAAI,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,QAAM,eAAe,MAAM;AACzB,UAAM,WAAsB;AAAA,MAC1B,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MACzB,MAAM;AAAA,MACN,OAAO,EAAE,yBAAyB;AAAA,MAClC,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AACA,kBAAc,CAAC,GAAG,YAAY,QAAQ,CAAC;AAEvC,UAAM,cAAc,IAAI,IAAI,cAAc;AAC1C,gBAAY,IAAI,WAAW,MAAM;AACjC,sBAAkB,WAAW;AAAA,EAC/B;AAEA,QAAM,kBAAkB,OAAO,UAAkB;AAC/C,UAAM,YAAY,MAAM,cAAc;AAAA,MACpC,OAAO,EAAE,+BAA+B;AAAA,MACxC,SAAS;AAAA,IACX,CAAC;AACD,QAAI,WAAW;AACb,oBAAc,WAAW,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AACtD,YAAM,cAAc,IAAI,IAAI,cAAc;AAC1C,kBAAY,OAAO,KAAK;AACxB,wBAAkB,WAAW;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,OAAe,OAAwB,UAAe;AAC7E,UAAM,UAAU,CAAC,GAAG,UAAU;AAC9B,YAAQ,KAAK,IAAI,EAAE,GAAG,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,MAAM;AACrD,kBAAc,OAAO;AAAA,EACvB;AAEA,QAAM,sBAAsB,CAAC,UAAkB;AAC7C,UAAM,cAAc,IAAI,IAAI,cAAc;AAC1C,QAAI,YAAY,IAAI,KAAK,GAAG;AAC1B,kBAAY,OAAO,KAAK;AAAA,IAC1B,OAAO;AACL,kBAAY,IAAI,KAAK;AAAA,IACvB;AACA,sBAAkB,WAAW;AAAA,EAC/B;AAEA,QAAM,uBAAuB,CAAC,YAAoB,aAAiC;AACjF,qBAAiB,UAAU;AAC3B,0BAAsB,SAAS,QAAQ,SAAS,CAAC;AACjD,4BAAwB,KAAK;AAAA,EAC/B;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,KAAM;AAGX,UAAM,cAAc,WAAW,KAAK,EAAE;AACtC,QAAI,gBAAgB,KAAK,IAAI;AAC3B,YAAM,EAAE,wCAAwC,EAAE,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC,CAAC;AAAA,IACrF;AAEA,UAAM,UAAiC;AAAA,MACrC;AAAA,MACA,OAAO;AAAA;AAAA,MACP,aAAa,eAAe;AAAA,MAC5B,SAAS,WAAW;AAAA,IACtB;AAGA,QAAI,KAAK,SAAS,YAAY;AAC5B,cAAQ,aAAa,cAAc;AACnC,cAAQ,kBAAkB,kBACtB,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAC9D,CAAC;AACL,cAAQ,UAAU,WAAW;AAG7B,cAAQ,iBAAiB;AAAA,QACvB,GAAI,WAAW,SAAS,KAAK;AAAA,UAC3B,YAAY;AAAA,YACV,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,GAAI,cAAc,EAAE,WAAW;AAAA,QAC/B,GAAI,mBAAmB,EAAE,iBAAiB,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE;AAAA;AAAA,QAE1G,GAAI,kBAAkB,EAAE,eAAe;AAAA,QACvC,GAAI,eAAe,EAAE,YAAY;AAAA,QACjC,GAAI,mBAAmB,gBAAgB,SAAS,KAAK,EAAE,gBAAgB;AAAA,MACzE;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,aAAa;AAC7B,cAAQ,eAAe,gBAAgB;AACvC,cAAQ,aAAa,cAAc;AAAA,IACrC;AAGA,QAAI,KAAK,SAAS,eAAe;AAC/B,YAAM,SAAc,CAAC;AAErB,UAAI,eAAe;AACjB,eAAO,gBAAgB;AAAA,MACzB;AAEA,UAAI,oBAAoB;AACtB,cAAM,aAAa,SAAS,oBAAoB,EAAE;AAClD,YAAI,CAAC,MAAM,UAAU,GAAG;AACtB,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF;AAGA,UAAI,cAAc,SAAS,GAAG;AAC5B,eAAO,eAAe,cACnB,OAAO,OAAK,EAAE,OAAO,EAAE,KAAK,EAC5B,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC;AAAA,MAC1D;AAGA,UAAI,eAAe,SAAS,GAAG;AAC7B,eAAO,gBAAgB,eACpB,OAAO,OAAK,EAAE,OAAO,EAAE,KAAK,EAC5B,OAAO,CAAC,KAAK,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC;AAAA,MAC1D;AAEA,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,gBAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,iBAAiB;AACjC,YAAM,SAAc,CAAC;AAErB,UAAI,YAAY;AACd,eAAO,aAAa;AAAA,MACtB;AAEA,UAAI,eAAe;AACjB,eAAO,UAAU;AAAA,MACnB;AAEA,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,gBAAQ,eAAe;AAAA,MACzB;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,eAAe,eAAe,SAAS,GAAG;AAC1D,cAAQ,aAAa;AAAA,IACvB;AAGA,QAAI,KAAK,SAAS,SAAS;AAEzB,cAAQ,gBAAgB,cAAc,OAAO,QAAM,GAAG,UAAU,GAAG,OAAO,KAAK,CAAC;AAAA,IAClF;AAGA,QAAI,kBAAkB,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC5D,aAAO,OAAO,SAAS,cAAc;AAAA,IACvC;AAEA,WAAO,aAAa,OAAO;AAC3B,YAAQ;AAAA,EACV;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,CAAC,QAAQ,CAAC,SAAU;AACxB,aAAS,KAAK,EAAE;AAAA,EAClB;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,EAAE,QAAQ,YAAY,EAAE,WAAW,EAAE,UAAU;AACjD,iBAAW;AAAA,IACb;AACA,QAAI,EAAE,QAAQ,UAAU;AACtB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,CAAC,KAAM,QAAO;AAE7B,QAAM,gBAAgB;AAAA,IACpB,OAAO,EAAE,2BAA2B;AAAA,IACpC,KAAK,EAAE,yBAAyB;AAAA,IAChC,UAAU,EAAE,8BAA8B;AAAA,IAC1C,WAAW,EAAE,+BAA+B;AAAA,IAC5C,UAAU,EAAE,8BAA8B;AAAA,EAC5C,EAAE,KAAK,QAAQ,WAAW;AAG1B,QAAM,aAAa,KAAK,SAAS;AACjC,QAAM,cAAc,KAAK,SAAS;AAElC,QAAM,eACJ,KAAK,SAAS,UAAU,YACxB,KAAK,SAAS,QAAQ,cACtB,KAAK,SAAS,aAAa,YAAY;AAEzC,SACE,qBAAC,UAAO,MAAM,QAAQ,cAAc,SAClC;AAAA,yBAAC,iBAAc,WAAU,6CACvB;AAAA,2BAAC,gBACC;AAAA,6BAAC,SAAI,WAAU,gCACb;AAAA,8BAAC,eAAa,YAAE,4BAA4B,GAAE;AAAA,UAC9C,oBAAC,SAAM,SAAS,cACb,yBACH;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,2CACb;AAAA,+BAAC,SAAI,WAAU,mCACb;AAAA,iCAAC,UAAK,WAAU,eAAe;AAAA,gBAAE,qBAAqB;AAAA,cAAE;AAAA,eAAC;AAAA,YACzD,oBAAC,UAAK,WAAU,kEAAkE,eAAK,IAAG;AAAA,aAC5F;AAAA,UACE,KAAK,MAAc,YACnB,qBAAC,SAAI,WAAU,mCACb;AAAA,iCAAC,UAAK,WAAU,eAAe;AAAA,gBAAE,uBAAuB;AAAA,cAAE;AAAA,eAAC;AAAA,YAC3D,oBAAC,UAAO,eAAK,KAAa,UAAS;AAAA,aACrC;AAAA,WAEJ;AAAA,SACF;AAAA,MAEA,oBAAC,SAAI,WAAU,aACZ,WAAC,aACA,qBAAC,SAAM,SAAQ,QACb;AAAA,4BAAC,QAAK,WAAU,UAAS;AAAA,QACzB,oBAAC,oBACE,YAAE,0CAA0C,GAC/C;AAAA,SACF,IACE,cACF,qBAAC,SAAI,WAAU,aAEb;AAAA,6BAAC,SAAM,SAAQ,QACb;AAAA,8BAAC,QAAK,WAAU,UAAS;AAAA,UACzB,oBAAC,oBACE,YAAE,qCAAqC,GAC1C;AAAA,WACF;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA;AAAA,QACZ;AAAA,SACF,IAEA,qBAAC,SAAI,WAAU,aAEb;AAAA,6BAAC,SACC;AAAA,+BAAC,WAAM,WAAU,gDACd;AAAA,cAAE,yBAAyB;AAAA,YAAE;AAAA,aAChC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,cAC3C,aAAa,EAAE,sCAAsC;AAAA,cACrD,WAAS;AAAA;AAAA,UACX;AAAA,UACA,oBAAC,OAAE,WAAU,8BACV,YAAE,sCAAsC,GAC3C;AAAA,WACF;AAAA,QAGA,qBAAC,SACC;AAAA,8BAAC,WAAM,WAAU,gDACd,YAAE,4BAA4B,GACjC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,cAC9C,aAAa,EAAE,yCAAyC;AAAA,cACxD,MAAM;AAAA,cACN,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,oBAAC,OAAE,WAAU,8BACV,YAAE,yCAAyC,GAC9C;AAAA,WACF;AAAA,QAGA,qBAAC,SACC;AAAA,8BAAC,WAAM,WAAU,gDACd,YAAE,wBAAwB,GAC7B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,cAC1C,aAAa,EAAE,qCAAqC;AAAA;AAAA,UACtD;AAAA,UACA,oBAAC,OAAE,WAAU,8BACV,YAAE,qCAAqC,GAC1C;AAAA,WACF;AAAA,QAGC,KAAK,SAAS,cACb,iCACE;AAAA,8BAAC,SAAI,WAAU,sCACb,8BAAC,QAAG,WAAU,4CACX,YAAE,qCAAqC,GAC1C,GACF;AAAA,UAEA,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,gDACd,YAAE,2BAA2B,GAChC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,gBAC7C,aAAa,EAAE,oCAAoC;AAAA;AAAA,YACrD;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,wCAAwC,GAC7C;AAAA,aACF;AAAA,UAEA,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,gDACd,YAAE,gCAAgC,GACrC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,gBAClD,aAAa,EAAE,mCAAmC;AAAA;AAAA,YACpD;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,6CAA6C,GAClD;AAAA,aACF;AAAA,UAEA,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,gDACd,YAAE,wBAAwB,GAC7B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,gBAC1C,aAAa,EAAE,qCAAqC;AAAA;AAAA,YACtD;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,qCAAqC,GAC1C;AAAA,aACF;AAAA,UAGA,qBAAC,SAAI,WAAU,sCACb;AAAA,iCAAC,SAAI,WAAU,0CACb;AAAA,mCAAC,SACC;AAAA,oCAAC,QAAG,WAAU,uCACX,YAAE,6BAA6B,EAAE,OAAO,WAAW,OAAO,CAAC,GAC9D;AAAA,gBACA,oBAAC,OAAE,WAAU,gCACV,YAAE,wCAAwC,GAC7C;AAAA,iBACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS;AAAA,kBAET;AAAA,wCAAC,QAAK,WAAU,eAAc;AAAA,oBAC7B,EAAE,yBAAyB;AAAA;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA,YAGC,sBACC,qBAAC,SAAM,SAAQ,QAAO,WAAU,QAC9B;AAAA,kCAAC,QAAK,WAAU,UAAS;AAAA,cACzB,oBAAC,oBACE,YAAE,uCAAuC,GAC5C;AAAA,eACF;AAAA,YAGD,WAAW,WAAW,KACrB,oBAAC,SAAI,WAAU,sFACZ,YAAE,mCAAmC,GACxC;AAAA,YAGF,oBAAC,SAAI,WAAU,aACZ,qBAAW,IAAI,CAAC,OAAO,UAAU;AAChC,oBAAM,aAAa,eAAe,IAAI,KAAK;AAC3C,qBACE,qBAAC,SAAgB,WAAU,gDACzB;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,oBAAoB,KAAK;AAAA,oBACxC,WAAU;AAAA,oBAEV;AAAA,2CAAC,SAAI,WAAU,UACb;AAAA,6CAAC,SAAI,WAAU,2BACb;AAAA,8CAAC,UAAK,WAAU,uCACb,gBAAM,SAAS,MAAM,MACxB;AAAA,0BACA,oBAAC,SAAM,SAAQ,aAAY,WAAU,WAClC,gBAAM,MACT;AAAA,0BACC,MAAM,YACL,oBAAC,SAAM,SAAQ,eAAc,WAAU,sBACpC,YAAE,yBAAyB,GAC9B;AAAA,2BAEJ;AAAA,wBACA,qBAAC,OAAE,WAAU,8BAA6B;AAAA;AAAA,0BAC5B,oBAAC,UAAK,WAAU,yBAAyB,gBAAM,MAAK;AAAA,2BAClE;AAAA,yBACF;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW,8CAA8C,aAAa,eAAe,EAAE;AAAA;AAAA,sBACzF;AAAA;AAAA;AAAA,gBACF;AAAA,gBAEC,cACC,qBAAC,SAAI,WAAU,yDAEb;AAAA,uCAAC,SAAI,WAAU,QACb;AAAA,yCAAC,WAAM,WAAU,gDAAgD;AAAA,wBAAE,0BAA0B;AAAA,sBAAE;AAAA,uBAAE;AAAA,oBACjG;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,OAAO,MAAM;AAAA,wBACb,UAAU,CAAC,MAAM,gBAAgB,OAAO,QAAQ,EAAE,OAAO,KAAK;AAAA,wBAC9D,aAAa,EAAE,uCAAuC;AAAA;AAAA,oBACxD;AAAA,oBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,uCAAuC,GAAE;AAAA,qBAC1F;AAAA,kBAGA,qBAAC,SACC;AAAA,yCAAC,WAAM,WAAU,gDAAgD;AAAA,wBAAE,2BAA2B;AAAA,sBAAE;AAAA,uBAAE;AAAA,oBAClG;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,OAAO,MAAM;AAAA,wBACb,UAAU,CAAC,MAAM,gBAAgB,OAAO,SAAS,EAAE,OAAO,KAAK;AAAA,wBAC/D,aAAa,EAAE,wCAAwC;AAAA;AAAA,oBACzD;AAAA,oBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,wCAAwC,GAAE;AAAA,qBAC3F;AAAA,kBAGA,qBAAC,SACC;AAAA,yCAAC,WAAM,WAAU,gDAAgD;AAAA,wBAAE,0BAA0B;AAAA,sBAAE;AAAA,uBAAE;AAAA,oBACjG;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO,MAAM;AAAA,wBACb,eAAe,CAAC,UAAU,gBAAgB,OAAO,QAAQ,KAAK;AAAA,wBAE9D;AAAA,8CAAC,iBAAc,MAAK,MAClB,8BAAC,eAAY,GACf;AAAA,0BACA,qBAAC,iBACC;AAAA,gDAAC,cAAW,OAAM,QAAQ,YAAE,gCAAgC,GAAE;AAAA,4BAC9D,oBAAC,cAAW,OAAM,UAAU,YAAE,kCAAkC,GAAE;AAAA,4BAClE,oBAAC,cAAW,OAAM,SAAS,YAAE,iCAAiC,GAAE;AAAA,4BAChE,oBAAC,cAAW,OAAM,OAAO,YAAE,+BAA+B,GAAE;AAAA,4BAC5D,oBAAC,cAAW,OAAM,OAAO,YAAE,+BAA+B,GAAE;AAAA,4BAC5D,oBAAC,cAAW,OAAM,YAAY,YAAE,oCAAoC,GAAE;AAAA,4BACtE,oBAAC,cAAW,OAAM,UAAU,YAAE,kCAAkC,GAAE;AAAA,4BAClE,oBAAC,cAAW,OAAM,SAAS,YAAE,iCAAiC,GAAE;AAAA,4BAChE,oBAAC,cAAW,OAAM,YAAY,YAAE,oCAAoC,GAAE;AAAA,4BACtE,oBAAC,cAAW,OAAM,QAAQ,YAAE,gCAAgC,GAAE;AAAA,4BAC9D,oBAAC,cAAW,OAAM,QAAQ,YAAE,gCAAgC,GAAE;AAAA,4BAC9D,oBAAC,cAAW,OAAM,kBAAkB,YAAE,0CAA0C,GAAE;AAAA,6BACpF;AAAA;AAAA;AAAA,oBACF;AAAA,qBACF;AAAA,kBAGA,qBAAC,SACC;AAAA,wCAAC,WAAM,WAAU,gDAAgD,YAAE,4BAA4B,GAAE;AAAA,oBACjG;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,OAAO,MAAM,eAAe;AAAA,wBAC5B,UAAU,CAAC,MAAM,gBAAgB,OAAO,eAAe,EAAE,OAAO,KAAK;AAAA,wBACrE,aAAa,EAAE,yCAAyC;AAAA;AAAA,oBAC1D;AAAA,qBACF;AAAA,kBAGA,qBAAC,SACC;AAAA,wCAAC,WAAM,WAAU,gDAAgD,YAAE,6BAA6B,GAAE;AAAA,oBAClG;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,OAAO,MAAM,gBAAgB;AAAA,wBAC7B,UAAU,CAAC,MAAM,gBAAgB,OAAO,gBAAgB,EAAE,OAAO,KAAK;AAAA,wBACtE,aAAa,EAAE,0CAA0C;AAAA;AAAA,oBAC3D;AAAA,qBACF;AAAA,mBAGE,MAAM,SAAS,YAAY,MAAM,SAAS,YAC1C,qBAAC,SACC;AAAA,wCAAC,WAAM,WAAU,gDAAgD,YAAE,wBAAwB,GAAE;AAAA,oBAC7F;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,OAAO,MAAM,SAAS,KAAK,IAAI,KAAK;AAAA,wBACpC,UAAU,CAAC,MAAM,gBAAgB,OAAO,WAAW,EAAE,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AAAA,wBAC/G,aAAa,EAAE,qCAAqC;AAAA;AAAA,oBACtD;AAAA,oBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,qCAAqC,GAAE;AAAA,qBACxF;AAAA,kBAIF,oBAAC,SACC,+BAAC,WAAM,WAAU,6DACf;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM;AAAA,wBACf,UAAU,CAAC,MAAM,gBAAgB,OAAO,YAAY,EAAE,OAAO,OAAO;AAAA,wBACpE,WAAU;AAAA;AAAA,oBACZ;AAAA,oBACC,EAAE,8BAA8B;AAAA,qBACnC,GACF;AAAA,kBAGA,oBAAC,SAAI,WAAU,iCACb;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,SAAS,MAAM,gBAAgB,KAAK;AAAA,sBAEpC;AAAA,4CAAC,UAAO,WAAU,eAAc;AAAA,wBAC/B,EAAE,4BAA4B;AAAA;AAAA;AAAA,kBACjC,GACF;AAAA,mBACF;AAAA,mBApJM,KAsJV;AAAA,YAEJ,CAAC,GACH;AAAA,aACF;AAAA,WACF;AAAA,QAID,KAAK,SAAS,eACb,gCACE,+BAAC,SAAI,WAAU,sCACb;AAAA,+BAAC,SAAI,WAAU,0CACb;AAAA,iCAAC,SACC;AAAA,kCAAC,QAAG,WAAU,uCACX,YAAE,iCAAiC,EAAE,OAAO,eAAe,OAAO,CAAC,GACtE;AAAA,cACA,oBAAC,OAAE,WAAU,gCACV,YAAE,wCAAwC,GAC7C;AAAA,eACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,oCAAkB;AAAA,oBAChB,GAAG;AAAA,oBACH;AAAA,sBACE,YAAY,YAAY,eAAe,SAAS,CAAC;AAAA,sBACjD,cAAc,GAAG,EAAE,+BAA+B,CAAC,IAAI,eAAe,SAAS,CAAC;AAAA,sBAChF,cAAc;AAAA,sBACd,QAAQ,CAAC;AAAA,sBACT,OAAO;AAAA,oBACT;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA,gBAEA;AAAA,sCAAC,QAAK,WAAU,eAAc;AAAA,kBAC7B,EAAE,4BAA4B;AAAA;AAAA;AAAA,YACjC;AAAA,aACF;AAAA,UAEC,eAAe,WAAW,KACzB,oBAAC,SAAI,WAAU,sFACZ,YAAE,mCAAmC,GACxC;AAAA,UAGF,oBAAC,SAAI,WAAU,aACZ,yBAAe,IAAI,CAAC,UAAU,UAAU;AACvC,kBAAM,aAAa,uBAAuB,IAAI,KAAK;AACnD,mBACE,qBAAC,SAAgB,WAAU,gDAEzB;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AACb,0BAAM,cAAc,IAAI,IAAI,sBAAsB;AAClD,wBAAI,YAAY;AACd,kCAAY,OAAO,KAAK;AAAA,oBAC1B,OAAO;AACL,kCAAY,IAAI,KAAK;AAAA,oBACvB;AACA,8CAA0B,WAAW;AAAA,kBACvC;AAAA,kBACA,WAAU;AAAA,kBAEV;AAAA,yCAAC,SAAI,WAAU,UACb;AAAA,2CAAC,SAAI,WAAU,2BACb;AAAA,4CAAC,UAAK,WAAU,uCACb,mBAAS,gBAAgB,SAAS,cAAc,YAAY,QAAQ,CAAC,IACxE;AAAA,wBACA,oBAAC,SAAM,SAAQ,aAAY,WAAU,WAClC,mBAAS,cACZ;AAAA,wBACC,SAAS,SACR,oBAAC,SAAM,SAAQ,WAAU,WAAU,WAChC,YAAE,sBAAsB,GAC3B;AAAA,yBAEJ;AAAA,sBACA,qBAAC,OAAE,WAAU,8BAA6B;AAAA;AAAA,wBACpC,oBAAC,UAAK,WAAU,yBAAyB,mBAAS,YAAW;AAAA,yBACnE;AAAA,uBACF;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAW,8CAA8C,aAAa,eAAe,EAAE;AAAA;AAAA,oBACzF;AAAA;AAAA;AAAA,cACF;AAAA,cAGC,cACC,qBAAC,SAAI,WAAU,yDAEb;AAAA,qCAAC,SAAI,WAAU,QACb;AAAA,uCAAC,WAAM,WAAU,gDACd;AAAA,sBAAE,2BAA2B;AAAA,oBAAE;AAAA,qBAClC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,OAAO,SAAS;AAAA,sBAChB,UAAU,CAAC,MAAM;AACf,8BAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAQ,KAAK,EAAE,aAAa,EAAE,OAAO;AACrC,0CAAkB,OAAO;AAAA,sBAC3B;AAAA,sBACA,aAAa,EAAE,wCAAwC;AAAA;AAAA,kBACzD;AAAA,mBACF;AAAA,gBAGA,qBAAC,SACC;AAAA,uCAAC,WAAM,WAAU,gDACd;AAAA,sBAAE,6BAA6B;AAAA,oBAAE;AAAA,qBACpC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,OAAO,SAAS,gBAAgB;AAAA,sBAChC,UAAU,CAAC,MAAM;AACf,8BAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAQ,KAAK,EAAE,eAAe,EAAE,OAAO;AACvC,0CAAkB,OAAO;AAAA,sBAC3B;AAAA,sBACA,aAAa,EAAE,0CAA0C;AAAA;AAAA,kBAC3D;AAAA,mBACF;AAAA,gBAGA,qBAAC,SACC;AAAA,uCAAC,WAAM,WAAU,gDACd;AAAA,sBAAE,6BAA6B;AAAA,oBAAE;AAAA,qBACpC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,SAAS;AAAA,sBAChB,eAAe,CAAC,UAAU;AACxB,8BAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAQ,KAAK,EAAE,eAAe;AAC9B,0CAAkB,OAAO;AAAA,sBAC3B;AAAA,sBAEA;AAAA,4CAAC,iBAAc,MAAK,MAClB,8BAAC,eAAY,GACf;AAAA,wBACA,qBAAC,iBACC;AAAA,8CAAC,cAAW,OAAM,cAAc,YAAE,uCAAuC,GAAE;AAAA,0BAC3E,oBAAC,cAAW,OAAM,YAAY,YAAE,qCAAqC,GAAE;AAAA,0BACvE,oBAAC,cAAW,OAAM,iBAAiB,YAAE,0CAA0C,GAAE;AAAA,0BACjF,oBAAC,cAAW,OAAM,cAAc,YAAE,uCAAuC,GAAE;AAAA,0BAC3E,oBAAC,cAAW,OAAM,gBAAgB,YAAE,yCAAyC,GAAE;AAAA,0BAC/E,oBAAC,cAAW,OAAM,oBAAoB,YAAE,6CAA6C,GAAE;AAAA,2BACzF;AAAA;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA,gBAGA,qBAAC,SACC;AAAA,sCAAC,WAAM,WAAU,gDACd,YAAE,wBAAwB,GAC7B;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,OAAO,SAAS,aAAa;AAAA,sBAC7B,UAAU,CAAC,MAAM;AACf,8BAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAQ,KAAK,EAAE,YAAY,EAAE,OAAO,QAAQ,SAAS,EAAE,OAAO,KAAK,IAAI;AACvE,0CAAkB,OAAO;AAAA,sBAC3B;AAAA,sBACA,aAAa,EAAE,uCAAuC;AAAA;AAAA,kBACxD;AAAA,kBACA,oBAAC,OAAE,WAAU,8BAA8B,YAAE,uCAAuC,GAAE;AAAA,mBACxF;AAAA,gBAGA,qBAAC,SAAI,WAAU,oDACb;AAAA,sCAAC,WAAM,WAAU,kDACd,YAAE,4BAA4B,GACjC;AAAA,kBACA,qBAAC,SAAI,WAAU,yCACb;AAAA,yCAAC,SACC;AAAA,0CAAC,WAAM,WAAU,oCAAoC,YAAE,4BAA4B,GAAE;AAAA,sBACrF;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,SAAS,aAAa,eAAe;AAAA,0BAC5C,UAAU,CAAC,MAAM;AACf,kCAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAI,CAAC,QAAQ,KAAK,EAAE,YAAa,SAAQ,KAAK,EAAE,cAAc,CAAC;AAC/D,oCAAQ,KAAK,EAAE,YAAY,cAAc,SAAS,EAAE,OAAO,KAAK,KAAK;AACrE,8CAAkB,OAAO;AAAA,0BAC3B;AAAA,0BACA,KAAI;AAAA,0BACJ,KAAI;AAAA;AAAA,sBACN;AAAA,uBACF;AAAA,oBACA,qBAAC,SACC;AAAA,0CAAC,WAAM,WAAU,oCAAoC,YAAE,gCAAgC,GAAE;AAAA,sBACzF;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,SAAS,aAAa,qBAAqB;AAAA,0BAClD,UAAU,CAAC,MAAM;AACf,kCAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAI,CAAC,QAAQ,KAAK,EAAE,YAAa,SAAQ,KAAK,EAAE,cAAc,CAAC;AAC/D,oCAAQ,KAAK,EAAE,YAAY,oBAAoB,SAAS,EAAE,OAAO,KAAK,KAAK;AAC3E,8CAAkB,OAAO;AAAA,0BAC3B;AAAA;AAAA,sBACF;AAAA,uBACF;AAAA,oBACA,qBAAC,SACC;AAAA,0CAAC,WAAM,WAAU,oCAAoC,YAAE,mCAAmC,GAAE;AAAA,sBAC5F;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,SAAS,aAAa,sBAAsB;AAAA,0BACnD,UAAU,CAAC,MAAM;AACf,kCAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAI,CAAC,QAAQ,KAAK,EAAE,YAAa,SAAQ,KAAK,EAAE,cAAc,CAAC;AAC/D,oCAAQ,KAAK,EAAE,YAAY,qBAAqB,WAAW,EAAE,OAAO,KAAK,KAAK;AAC9E,8CAAkB,OAAO;AAAA,0BAC3B;AAAA;AAAA,sBACF;AAAA,uBACF;AAAA,oBACA,qBAAC,SACC;AAAA,0CAAC,WAAM,WAAU,oCAAoC,YAAE,4BAA4B,GAAE;AAAA,sBACrF;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,MAAK;AAAA,0BACL,OAAO,SAAS,aAAa,iBAAiB;AAAA,0BAC9C,UAAU,CAAC,MAAM;AACf,kCAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAI,CAAC,QAAQ,KAAK,EAAE,YAAa,SAAQ,KAAK,EAAE,cAAc,CAAC;AAC/D,oCAAQ,KAAK,EAAE,YAAY,gBAAgB,SAAS,EAAE,OAAO,KAAK,KAAK;AACvE,8CAAkB,OAAO;AAAA,0BAC3B;AAAA;AAAA,sBACF;AAAA,uBACF;AAAA,qBACF;AAAA,mBACF;AAAA,gBAGA,oBAAC,SAAI,WAAU,cACb,+BAAC,WAAM,WAAU,0CACf;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,SAAS,SAAS;AAAA,sBAC3B,UAAU,CAAC,MAAM;AACf,8BAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAQ,KAAK,EAAE,QAAQ,EAAE,OAAO;AAChC,0CAAkB,OAAO;AAAA,sBAC3B;AAAA,sBACA,WAAU;AAAA;AAAA,kBACZ;AAAA,kBACA,oBAAC,UAAK,WAAU,yBAAyB,YAAE,6BAA6B,GAAE;AAAA,mBAC5E,GACF;AAAA,gBAGA,qBAAC,SACC;AAAA,sCAAC,WAAM,WAAU,gDACd,YAAE,8BAA8B,GACnC;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,SAAS,UAAU,CAAC;AAAA,sBAC3B,UAAU,CAAC,WAAW;AACpB,8BAAM,UAAU,CAAC,GAAG,cAAc;AAClC,gCAAQ,KAAK,EAAE,SAAS;AACxB,0CAAkB,OAAO;AAAA,sBAC3B;AAAA;AAAA,kBACF;AAAA,kBACA,oBAAC,OAAE,WAAU,8BACV,YAAE,4CAA4C,GACjD;AAAA,mBACF;AAAA,gBAGA,oBAAC,SAAI,WAAU,iCACb;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,wCAAkB,eAAe,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAC9D,4BAAM,cAAc,IAAI,IAAI,sBAAsB;AAClD,kCAAY,OAAO,KAAK;AACxB,gDAA0B,WAAW;AAAA,oBACvC;AAAA,oBAEA;AAAA,0CAAC,UAAO,WAAU,eAAc;AAAA,sBAC/B,EAAE,+BAA+B;AAAA;AAAA;AAAA,gBACpC,GACF;AAAA,iBACF;AAAA,iBAnPM,KAqPV;AAAA,UAEJ,CAAC,GACH;AAAA,WACF,GACF;AAAA,QAID,KAAK,SAAS,iBACb,iCACE;AAAA,8BAAC,SAAI,WAAU,sCACb,8BAAC,QAAG,WAAU,4CACX,YAAE,kCAAkC,GACvC,GACF;AAAA,UAEA,qBAAC,SACC;AAAA,iCAAC,WAAM,WAAU,gDACd;AAAA,gBAAE,iCAAiC;AAAA,cAAE;AAAA,eACxC;AAAA,YACA,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,kBAChD,aAAa,EAAE,2CAA2C;AAAA,kBAC1D,WAAU;AAAA,kBACV,UAAQ;AAAA;AAAA,cACV;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS,MAAM,wBAAwB,IAAI;AAAA,kBAE1C,YAAE,uBAAuB;AAAA;AAAA,cAC5B;AAAA,eACF;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,2CAA2C,GAChD;AAAA,aACF;AAAA,UAEA,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,gDACd,YAAE,wBAAwB,GAC7B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,sBAAsB,EAAE,OAAO,KAAK;AAAA,gBACrD,aAAa,EAAE,qCAAqC;AAAA;AAAA,YACtD;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,gDAAgD,GACrD;AAAA,aACF;AAAA,UAGA,qBAAC,SAAI,WAAU,sCACb;AAAA,iCAAC,SAAI,WAAU,0CACb;AAAA,mCAAC,SACC;AAAA,oCAAC,QAAG,WAAU,uCACX,YAAE,+BAA+B,EAAE,OAAO,cAAc,OAAO,CAAC,GACnE;AAAA,gBACA,oBAAC,OAAE,WAAU,gCACV,YAAE,0CAA0C,GAC/C;AAAA,iBACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS,MAAM,iBAAiB,CAAC,GAAG,eAAe,EAAE,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,kBAE1E;AAAA,wCAAC,QAAK,WAAU,eAAc;AAAA,oBAC7B,EAAE,2BAA2B;AAAA;AAAA;AAAA,cAChC;AAAA,eACF;AAAA,YAEC,cAAc,WAAW,IACxB,oBAAC,OAAE,WAAU,gCACV,YAAE,sCAAsC,GAC3C,IAEA,oBAAC,SAAI,WAAU,aACZ,wBAAc,IAAI,CAAC,SAAS,UAC3B,qBAAC,SAAgB,WAAU,0BACzB;AAAA,mCAAC,SAAI,WAAU,UACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,QAAQ;AAAA,oBACf,UAAU,CAAC,MAAM;AACf,4BAAM,cAAc,CAAC,GAAG,aAAa;AACrC,kCAAY,KAAK,EAAE,MAAM,EAAE,OAAO;AAClC,uCAAiB,WAAW;AAAA,oBAC9B;AAAA,oBACA,aAAa,EAAE,sCAAsC;AAAA;AAAA,gBACvD;AAAA,gBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,sCAAsC,GAAE;AAAA,iBACzF;AAAA,cACA,oBAAC,UAAK,WAAU,sBAAqB,oBAAC;AAAA,cACtC,qBAAC,SAAI,WAAU,UACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,QAAQ;AAAA,oBACf,UAAU,CAAC,MAAM;AACf,4BAAM,cAAc,CAAC,GAAG,aAAa;AACrC,kCAAY,KAAK,EAAE,QAAQ,EAAE,OAAO;AACpC,uCAAiB,WAAW;AAAA,oBAC9B;AAAA,oBACA,aAAa,EAAE,wCAAwC;AAAA;AAAA,gBACzD;AAAA,gBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,wCAAwC,GAAE;AAAA,iBAC3F;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,qCAAiB,cAAc,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,kBAC9D;AAAA,kBACA,WAAU;AAAA,kBAEV,8BAAC,UAAO,WAAU,UAAS;AAAA;AAAA,cAC7B;AAAA,iBAtCQ,KAuCV,CACD,GACH;AAAA,aAEJ;AAAA,UAGA,qBAAC,SAAI,WAAU,sCACb;AAAA,iCAAC,SAAI,WAAU,0CACb;AAAA,mCAAC,SACC;AAAA,oCAAC,QAAG,WAAU,uCACX,YAAE,gCAAgC,EAAE,OAAO,eAAe,OAAO,CAAC,GACrE;AAAA,gBACA,oBAAC,OAAE,WAAU,gCACV,YAAE,2CAA2C,GAChD;AAAA,iBACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS,MAAM,kBAAkB,CAAC,GAAG,gBAAgB,EAAE,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,kBAE5E;AAAA,wCAAC,QAAK,WAAU,eAAc;AAAA,oBAC7B,EAAE,2BAA2B;AAAA;AAAA;AAAA,cAChC;AAAA,eACF;AAAA,YAEC,eAAe,WAAW,IACzB,oBAAC,OAAE,WAAU,gCACV,YAAE,uCAAuC,GAC5C,IAEA,oBAAC,SAAI,WAAU,aACZ,yBAAe,IAAI,CAAC,SAAS,UAC5B,qBAAC,SAAgB,WAAU,0BACzB;AAAA,mCAAC,SAAI,WAAU,UACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,QAAQ;AAAA,oBACf,UAAU,CAAC,MAAM;AACf,4BAAM,cAAc,CAAC,GAAG,cAAc;AACtC,kCAAY,KAAK,EAAE,MAAM,EAAE,OAAO;AAClC,wCAAkB,WAAW;AAAA,oBAC/B;AAAA,oBACA,aAAa,EAAE,uCAAuC;AAAA;AAAA,gBACxD;AAAA,gBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,uCAAuC,GAAE;AAAA,iBAC1F;AAAA,cACA,oBAAC,UAAK,WAAU,sBAAqB,oBAAC;AAAA,cACtC,qBAAC,SAAI,WAAU,UACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,QAAQ;AAAA,oBACf,UAAU,CAAC,MAAM;AACf,4BAAM,cAAc,CAAC,GAAG,cAAc;AACtC,kCAAY,KAAK,EAAE,QAAQ,EAAE,OAAO;AACpC,wCAAkB,WAAW;AAAA,oBAC/B;AAAA,oBACA,aAAa,EAAE,uCAAuC;AAAA;AAAA,gBACxD;AAAA,gBACA,oBAAC,OAAE,WAAU,gCAAgC,YAAE,uCAAuC,GAAE;AAAA,iBAC1F;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS,MAAM;AACb,sCAAkB,eAAe,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,kBAChE;AAAA,kBACA,WAAU;AAAA,kBAEV,8BAAC,UAAO,WAAU,UAAS;AAAA;AAAA,cAC7B;AAAA,iBAtCQ,KAuCV,CACD,GACH;AAAA,aAEJ;AAAA,WACF;AAAA,QAID,KAAK,SAAS,mBACb,iCACE;AAAA,8BAAC,SAAI,WAAU,sCACb,8BAAC,QAAG,WAAU,4CACX,YAAE,6BAA6B,GAClC,GACF;AAAA,UAEA,qBAAC,SACC;AAAA,iCAAC,WAAM,WAAU,gDACd;AAAA,gBAAE,2BAA2B;AAAA,cAAE;AAAA,eAClC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,gBAC7C,aAAa,EAAE,wCAAwC;AAAA;AAAA,YACzD;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,wCAAwC,GAC7C;AAAA,aACF;AAAA,UAEA,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,gDACd,YAAE,wBAAwB,GAC7B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,gBAChD,aAAa,EAAE,2CAA2C;AAAA;AAAA,YAC5D;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,2CAA2C,GAChD;AAAA,aACF;AAAA,WACF;AAAA,QAIF,qBAAC,SAAI,WAAU,sCACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,cAC5C,WAAU;AAAA,cAEV;AAAA,oCAAC,QAAG,WAAU,uCACX,YAAE,sCAAsC,GAC3C;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,gCAAgC,eAAe,eAAe,EAAE;AAAA,oBAC3E,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,SAAQ;AAAA,oBAER,8BAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,kBAAiB;AAAA;AAAA,gBACxF;AAAA;AAAA;AAAA,UACF;AAAA,UACC,gBACC,qBAAC,SAAI,WAAU,QACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU;AAAA;AAAA,YACZ;AAAA,YACA,oBAAC,OAAE,WAAU,8BACV,YAAE,4CAA4C,GACjD;AAAA,aACF;AAAA,WAEJ;AAAA,SACF,GAEJ;AAAA,MAEA,qBAAC,gBAAa,WAAU,wBACrB;AAAA,oBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YAET;AAAA,kCAAC,UAAO,WAAU,UAAS;AAAA,cAC1B,EAAE,2BAA2B;AAAA;AAAA;AAAA,QAChC;AAAA,QAEF,qBAAC,SAAI,WAAU,sBACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,SAAS;AAAA,cAER,YAAE,0BAA0B;AAAA;AAAA,UAC/B;AAAA,UACC,cACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cAER,YAAE,+BAA+B;AAAA;AAAA,UACpC;AAAA,WAEJ;AAAA,SACF;AAAA,OACF;AAAA,IAGC,MAAM,SAAS,iBACd;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,wBAAwB,KAAK;AAAA,QAC5C,UAAU;AAAA,QACV,oBAAoB,CAAC;AAAA,QACrB,OAAO,EAAE,qCAAqC;AAAA,QAC9C,aAAa,EAAE,gDAAgD;AAAA,QAC/D,aAAa;AAAA;AAAA,IACf;AAAA,IAED;AAAA,KACH;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,6 +3,13 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Button } from "@open-mercato/ui/primitives/button";
|
|
4
4
|
import { Input } from "@open-mercato/ui/primitives/input";
|
|
5
5
|
import { Label } from "@open-mercato/ui/primitives/label";
|
|
6
|
+
import {
|
|
7
|
+
Select,
|
|
8
|
+
SelectContent,
|
|
9
|
+
SelectItem,
|
|
10
|
+
SelectTrigger,
|
|
11
|
+
SelectValue
|
|
12
|
+
} from "@open-mercato/ui/primitives/select";
|
|
6
13
|
import { Textarea } from "@open-mercato/ui/primitives/textarea";
|
|
7
14
|
import { Trash2, Plus, ChevronUp, ChevronDown } from "lucide-react";
|
|
8
15
|
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
@@ -138,14 +145,15 @@ function StepsEditor({ value = [], onChange, error }) {
|
|
|
138
145
|
t("workflows.steps.stepType"),
|
|
139
146
|
" *"
|
|
140
147
|
] }),
|
|
141
|
-
/* @__PURE__ */
|
|
142
|
-
|
|
148
|
+
/* @__PURE__ */ jsxs(
|
|
149
|
+
Select,
|
|
143
150
|
{
|
|
144
|
-
id: `step-${index}-type`,
|
|
145
151
|
value: step.stepType,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
152
|
+
onValueChange: (value2) => updateStep(index, "stepType", value2),
|
|
153
|
+
children: [
|
|
154
|
+
/* @__PURE__ */ jsx(SelectTrigger, { id: `step-${index}-type`, className: "mt-1", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
155
|
+
/* @__PURE__ */ jsx(SelectContent, { children: STEP_TYPES.map((type) => /* @__PURE__ */ jsx(SelectItem, { value: type.value, children: t(`workflows.steps.types.${type.value}`) }, type.value)) })
|
|
156
|
+
]
|
|
149
157
|
}
|
|
150
158
|
)
|
|
151
159
|
] }),
|