@open-mercato/core 0.6.7-develop.6828.1.ab1620a63e → 0.6.7-develop.6842.1.8cd8a8883c

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.
Files changed (181) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/modules/attachments/fields/attachment.js +1 -1
  3. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  4. package/dist/modules/auth/components/UserConsentsPanel.js +9 -9
  5. package/dist/modules/auth/components/UserConsentsPanel.js.map +2 -2
  6. package/dist/modules/auth/frontend/reset.js +2 -2
  7. package/dist/modules/auth/frontend/reset.js.map +2 -2
  8. package/dist/modules/business_rules/components/ActionRow.js +1 -1
  9. package/dist/modules/business_rules/components/ActionRow.js.map +1 -1
  10. package/dist/modules/business_rules/components/ConditionRow.js +8 -4
  11. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  12. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +4 -4
  13. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  14. package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -5
  15. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  16. package/dist/modules/catalog/components/PriceKindSettings.js +3 -3
  17. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  18. package/dist/modules/catalog/components/products/ProductCategorizeSection.js +3 -3
  19. package/dist/modules/catalog/components/products/ProductCategorizeSection.js.map +2 -2
  20. package/dist/modules/catalog/components/products/ProductMediaManager.js +1 -1
  21. package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
  22. package/dist/modules/catalog/components/products/VariantBuilder.js +5 -5
  23. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  24. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +1 -1
  25. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
  26. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +2 -3
  27. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
  28. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +1 -1
  29. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +1 -1
  30. package/dist/modules/dashboards/api/widgets/data/schema.js +26 -17
  31. package/dist/modules/dashboards/api/widgets/data/schema.js.map +2 -2
  32. package/dist/modules/dashboards/lib/aggregations.js +20 -6
  33. package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
  34. package/dist/modules/design_system/gallery/entries/detail.js +8 -8
  35. package/dist/modules/design_system/gallery/entries/detail.js.map +1 -1
  36. package/dist/modules/design_system/gallery/entries/overlays.js +2 -2
  37. package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
  38. package/dist/modules/design_system/gallery/entries/scaffolding.js +8 -8
  39. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +1 -1
  40. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +1 -1
  41. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  42. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +6 -6
  43. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
  44. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +3 -3
  45. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  46. package/dist/modules/messages/components/message-detail/panels/dialogs.js +1 -1
  47. package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +1 -1
  48. package/dist/modules/planner/components/AvailabilityRulesEditor.js +4 -4
  49. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  50. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  51. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  52. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +1 -1
  53. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +1 -1
  54. package/dist/modules/workflows/backend/definitions/page.js +1 -1
  55. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  56. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +1 -1
  57. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  58. package/dist/modules/workflows/backend/instances/page.js +8 -8
  59. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  60. package/dist/modules/workflows/backend/tasks/page.js +6 -6
  61. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  62. package/dist/modules/workflows/components/ActivitiesEditor.js +2 -2
  63. package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
  64. package/dist/modules/workflows/components/BusinessRulesSelector.js +1 -1
  65. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  66. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +2 -2
  67. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  68. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +1 -2
  69. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
  70. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +1 -2
  71. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
  72. package/dist/modules/workflows/components/StepsEditor.js +2 -2
  73. package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
  74. package/dist/modules/workflows/components/TransitionsEditor.js +3 -3
  75. package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
  76. package/dist/modules/workflows/components/WorkflowLegend.js +1 -1
  77. package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
  78. package/dist/modules/workflows/components/WorkflowSelector.js +1 -1
  79. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  80. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +1 -1
  81. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  82. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
  83. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
  84. package/dist/modules/workflows/components/fields/MappingArrayEditor.js +1 -1
  85. package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
  86. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +1 -1
  87. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  88. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +4 -4
  89. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
  90. package/package.json +8 -8
  91. package/src/modules/api_keys/i18n/ko.json +42 -0
  92. package/src/modules/attachments/fields/attachment.tsx +1 -1
  93. package/src/modules/attachments/i18n/ko.json +172 -0
  94. package/src/modules/audit_logs/i18n/ko.json +66 -0
  95. package/src/modules/auth/components/UserConsentsPanel.tsx +9 -9
  96. package/src/modules/auth/frontend/reset.tsx +2 -2
  97. package/src/modules/auth/i18n/ko.json +255 -0
  98. package/src/modules/business_rules/components/ActionRow.tsx +1 -1
  99. package/src/modules/business_rules/components/ConditionRow.tsx +9 -6
  100. package/src/modules/business_rules/i18n/ko.json +396 -0
  101. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +4 -4
  102. package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -5
  103. package/src/modules/catalog/components/PriceKindSettings.tsx +3 -3
  104. package/src/modules/catalog/components/products/ProductCategorizeSection.tsx +3 -3
  105. package/src/modules/catalog/components/products/ProductMediaManager.tsx +1 -1
  106. package/src/modules/catalog/components/products/VariantBuilder.tsx +5 -5
  107. package/src/modules/catalog/i18n/ko.json +723 -0
  108. package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +1 -1
  109. package/src/modules/communication_channels/i18n/ko.json +138 -0
  110. package/src/modules/configs/i18n/ko.json +197 -0
  111. package/src/modules/currencies/i18n/de.json +1 -0
  112. package/src/modules/currencies/i18n/en.json +1 -0
  113. package/src/modules/currencies/i18n/es.json +1 -0
  114. package/src/modules/currencies/i18n/ko.json +160 -0
  115. package/src/modules/currencies/i18n/pl.json +1 -0
  116. package/src/modules/customer_accounts/i18n/ko.json +354 -0
  117. package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +2 -3
  118. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +1 -1
  119. package/src/modules/customers/i18n/de.json +10 -0
  120. package/src/modules/customers/i18n/en.json +10 -0
  121. package/src/modules/customers/i18n/es.json +10 -0
  122. package/src/modules/customers/i18n/ko.json +2855 -0
  123. package/src/modules/customers/i18n/pl.json +10 -0
  124. package/src/modules/dashboards/api/widgets/data/schema.ts +48 -19
  125. package/src/modules/dashboards/i18n/ko.json +118 -0
  126. package/src/modules/dashboards/lib/aggregations.ts +42 -6
  127. package/src/modules/data_sync/i18n/ko.json +125 -0
  128. package/src/modules/design_system/gallery/entries/detail.tsx +8 -8
  129. package/src/modules/design_system/gallery/entries/overlays.tsx +2 -2
  130. package/src/modules/design_system/gallery/entries/scaffolding.tsx +8 -8
  131. package/src/modules/design_system/i18n/de.json +12 -0
  132. package/src/modules/design_system/i18n/en.json +12 -0
  133. package/src/modules/design_system/i18n/es.json +12 -0
  134. package/src/modules/design_system/i18n/ko.json +58 -0
  135. package/src/modules/design_system/i18n/pl.json +12 -0
  136. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +1 -1
  137. package/src/modules/dictionaries/i18n/ko.json +130 -0
  138. package/src/modules/directory/i18n/ko.json +105 -0
  139. package/src/modules/entities/i18n/ko.json +260 -0
  140. package/src/modules/feature_toggles/i18n/ko.json +96 -0
  141. package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +6 -6
  142. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +3 -3
  143. package/src/modules/inbox_ops/i18n/ko.json +196 -0
  144. package/src/modules/integrations/i18n/ko.json +129 -0
  145. package/src/modules/messages/components/message-detail/panels/dialogs.tsx +1 -1
  146. package/src/modules/messages/i18n/ko.json +263 -0
  147. package/src/modules/notifications/i18n/ko.json +55 -0
  148. package/src/modules/payment_gateways/i18n/ko.json +87 -0
  149. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -4
  150. package/src/modules/planner/i18n/ko.json +565 -0
  151. package/src/modules/portal/i18n/ko.json +143 -0
  152. package/src/modules/progress/i18n/ko.json +20 -0
  153. package/src/modules/query_index/i18n/ko.json +69 -0
  154. package/src/modules/resources/i18n/ko.json +770 -0
  155. package/src/modules/sales/i18n/ko.json +1442 -0
  156. package/src/modules/shipping_carriers/i18n/ko.json +85 -0
  157. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  158. package/src/modules/staff/i18n/ko.json +1162 -0
  159. package/src/modules/sync_excel/i18n/ko.json +107 -0
  160. package/src/modules/translations/i18n/ko.json +45 -0
  161. package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +1 -1
  162. package/src/modules/wms/i18n/ko.json +1053 -0
  163. package/src/modules/workflows/backend/definitions/page.tsx +1 -1
  164. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +1 -1
  165. package/src/modules/workflows/backend/instances/page.tsx +8 -8
  166. package/src/modules/workflows/backend/tasks/page.tsx +6 -6
  167. package/src/modules/workflows/components/ActivitiesEditor.tsx +2 -2
  168. package/src/modules/workflows/components/BusinessRulesSelector.tsx +1 -1
  169. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +2 -2
  170. package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +1 -2
  171. package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +1 -2
  172. package/src/modules/workflows/components/StepsEditor.tsx +2 -2
  173. package/src/modules/workflows/components/TransitionsEditor.tsx +3 -3
  174. package/src/modules/workflows/components/WorkflowLegend.tsx +1 -1
  175. package/src/modules/workflows/components/WorkflowSelector.tsx +1 -1
  176. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +1 -1
  177. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
  178. package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +1 -1
  179. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +1 -1
  180. package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -4
  181. package/src/modules/workflows/i18n/ko.json +1203 -0
@@ -194,9 +194,8 @@ function EdgeEditDialogCrudForm({ edge, isOpen, onClose, onSave, onDelete }) {
194
194
  Button,
195
195
  {
196
196
  type: "button",
197
- variant: "outline",
197
+ variant: "destructive",
198
198
  onClick: handleDelete,
199
- className: "text-red-600 border-red-200 hover:bg-red-50",
200
199
  children: [
201
200
  /* @__PURE__ */ jsx(Trash2, { className: "size-4 mr-2" }),
202
201
  "Delete Transition"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/components/EdgeEditDialogCrudForm.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport type { Edge } from '@xyflow/react'\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Trash2 } from 'lucide-react'\nimport { CrudForm, type CrudFormGroup, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'\nimport { BusinessRuleConditionsEditor } from './fields/BusinessRuleConditionsEditor'\nimport { ActivityArrayEditor } from './fields/ActivityArrayEditor'\nimport { edgeToFormValues, formValuesToEdgeUpdates, type EdgeFormValues } from '../lib/edgeFormTransforms'\n\n/**\n * JsonConfigEditor - Custom field wrapper for JsonBuilder\n */\nfunction JsonConfigEditor({ value, setValue, disabled }: CrudCustomFieldRenderProps) {\n return (\n <JsonBuilder\n value={value || {}}\n onChange={setValue}\n disabled={disabled}\n />\n )\n}\n\nexport interface EdgeEditDialogCrudFormProps {\n edge: Edge | null\n isOpen: boolean\n onClose: () => void\n onSave: (edgeId: string, updates: Partial<Edge['data']>) => void\n onDelete: (edgeId: string) => void\n}\n\n/**\n * EdgeEditDialogCrudForm - CrudForm-based modal dialog for editing transition properties\n *\n * Migrated from EdgeEditDialog to use CrudForm for:\n * - UI coherence with other admin forms\n * - Custom fields support (future enhancement)\n * - Standardized validation and error handling\n * - Consistent keyboard shortcuts\n *\n * Features:\n * - Basic configuration (name, trigger, priority)\n * - Business rules (pre/post conditions with modal integration)\n * - Activities with nested retry policies\n * - Advanced JSON configuration\n * - Delete functionality with confirmation\n * - Keyboard shortcuts (Cmd/Ctrl+Enter save, Escape cancel)\n */\nexport function EdgeEditDialogCrudForm({ edge, isOpen, onClose, onSave, onDelete }: EdgeEditDialogCrudFormProps) {\n const [initialValues, setInitialValues] = useState<Partial<EdgeFormValues>>({})\n\n // Load edge data when dialog opens\n useEffect(() => {\n if (edge && isOpen) {\n const values = edgeToFormValues(edge)\n setInitialValues(values)\n }\n }, [edge, isOpen])\n\n const handleSubmit = useCallback(async (values: Record<string, unknown>) => {\n if (!edge) return\n\n try {\n const updates = formValuesToEdgeUpdates(values as unknown as EdgeFormValues, edge)\n onSave(edge.id, updates)\n onClose()\n } catch (error) {\n // Error will be displayed in form (e.g., invalid JSON)\n throw error\n }\n }, [edge, onSave, onClose])\n\n const handleDelete = useCallback(() => {\n if (!edge) return\n onDelete(edge.id)\n }, [edge, onDelete])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }, [onClose])\n\n // Define form groups\n const groups: CrudFormGroup[] = useMemo(() => [\n {\n id: 'basic',\n title: 'Basic Configuration',\n column: 1,\n fields: ['transitionName', 'trigger', 'priority', 'continueOnActivityFailure'],\n },\n {\n id: 'businessRules',\n title: 'Business Rules',\n column: 1,\n description: 'Define pre-conditions (guards) and post-conditions (validations) for this transition',\n fields: ['preConditions', 'postConditions'],\n },\n {\n id: 'activities',\n title: 'Activities',\n column: 1,\n description: 'Activities executed when this transition fires',\n fields: ['activities'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional configuration as JSON (merged with above fields)',\n fields: ['advancedConfig'],\n },\n ], [])\n\n // Define form fields\n const fields: CrudField[] = useMemo(() => [\n {\n id: 'transitionName',\n label: 'Transition Name',\n type: 'text',\n placeholder: 'Enter transition name',\n required: true,\n description: 'Display name for this transition',\n },\n {\n id: 'trigger',\n label: 'Trigger Type',\n type: 'select',\n required: true,\n options: [\n { value: 'auto', label: 'Automatic' },\n { value: 'manual', label: 'Manual' },\n { value: 'signal', label: 'Signal' },\n { value: 'timer', label: 'Timer' },\n ],\n description: 'How this transition is triggered',\n },\n {\n id: 'priority',\n label: 'Priority',\n type: 'number',\n placeholder: '100',\n description: 'Higher priority transitions are evaluated first (0-9999)',\n },\n {\n id: 'continueOnActivityFailure',\n label: 'Continue on Activity Failure',\n type: 'checkbox',\n description: 'If checked, transition completes even if activities fail',\n },\n {\n id: 'preConditions',\n label: 'Pre-Conditions (Guards)',\n type: 'custom',\n description: 'Business rules that must pass before transition can fire',\n component: (props) => (\n <BusinessRuleConditionsEditor\n {...props}\n value={props.value as any}\n />\n ),\n },\n {\n id: 'postConditions',\n label: 'Post-Conditions (Validations)',\n type: 'custom',\n description: 'Business rules validated after transition completes',\n component: (props) => (\n <BusinessRuleConditionsEditor\n {...props}\n value={props.value as any}\n />\n ),\n },\n {\n id: 'activities',\n label: 'Activities',\n type: 'custom',\n description: 'Activities executed when this transition fires',\n component: (props) => <ActivityArrayEditor {...props} value={props.value as any} />,\n },\n {\n id: 'advancedConfig',\n label: 'Advanced Configuration (JSON)',\n type: 'custom',\n description: 'Additional JSON configuration merged with the transition data',\n component: (props) => <JsonConfigEditor {...props} />,\n },\n ], [])\n\n if (!isOpen || !edge) return null\n\n const edgeData = edge.data as any\n const trigger = edgeData?.trigger || 'auto'\n const triggerVariant = trigger === 'auto' ? 'default' : trigger === 'manual' ? 'secondary' : 'outline'\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent\n className=\"sm:max-w-3xl max-h-[90vh] overflow-hidden flex flex-col !p-0 [&_.grid]:!grid-cols-1\"\n onKeyDown={handleKeyDown}\n >\n <DialogHeader className=\"flex-shrink-0 p-6 pb-4 border-b border-border/70\">\n <div className=\"flex items-center gap-2 mb-2\">\n <DialogTitle>Edit Transition</DialogTitle>\n <Badge variant={triggerVariant} className=\"text-xs\">\n {trigger === 'auto' ? 'Automatic' :\n trigger === 'manual' ? 'Manual' :\n trigger === 'signal' ? 'Signal' : 'Timer'}\n </Badge>\n </div>\n <div className=\"space-y-1\">\n <DialogDescription>\n Configure transition properties, conditions, and activities\n </DialogDescription>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">ID:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{edge.id}</code>\n </div>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">Flow:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{edge.source}</code>\n <span>\u2192</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{edge.target}</code>\n </div>\n </div>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto min-h-0 px-6 \">\n <CrudForm\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n embedded={true}\n submitLabel=\"Save Transition\"\n extraActions={\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleDelete}\n className=\"text-red-600 border-red-200 hover:bg-red-50\"\n >\n <Trash2 className=\"size-4 mr-2\" />\n Delete Transition\n </Button>\n }\n />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use client'\n\nimport type { Edge } from '@xyflow/react'\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Trash2 } from 'lucide-react'\nimport { CrudForm, type CrudFormGroup, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'\nimport { BusinessRuleConditionsEditor } from './fields/BusinessRuleConditionsEditor'\nimport { ActivityArrayEditor } from './fields/ActivityArrayEditor'\nimport { edgeToFormValues, formValuesToEdgeUpdates, type EdgeFormValues } from '../lib/edgeFormTransforms'\n\n/**\n * JsonConfigEditor - Custom field wrapper for JsonBuilder\n */\nfunction JsonConfigEditor({ value, setValue, disabled }: CrudCustomFieldRenderProps) {\n return (\n <JsonBuilder\n value={value || {}}\n onChange={setValue}\n disabled={disabled}\n />\n )\n}\n\nexport interface EdgeEditDialogCrudFormProps {\n edge: Edge | null\n isOpen: boolean\n onClose: () => void\n onSave: (edgeId: string, updates: Partial<Edge['data']>) => void\n onDelete: (edgeId: string) => void\n}\n\n/**\n * EdgeEditDialogCrudForm - CrudForm-based modal dialog for editing transition properties\n *\n * Migrated from EdgeEditDialog to use CrudForm for:\n * - UI coherence with other admin forms\n * - Custom fields support (future enhancement)\n * - Standardized validation and error handling\n * - Consistent keyboard shortcuts\n *\n * Features:\n * - Basic configuration (name, trigger, priority)\n * - Business rules (pre/post conditions with modal integration)\n * - Activities with nested retry policies\n * - Advanced JSON configuration\n * - Delete functionality with confirmation\n * - Keyboard shortcuts (Cmd/Ctrl+Enter save, Escape cancel)\n */\nexport function EdgeEditDialogCrudForm({ edge, isOpen, onClose, onSave, onDelete }: EdgeEditDialogCrudFormProps) {\n const [initialValues, setInitialValues] = useState<Partial<EdgeFormValues>>({})\n\n // Load edge data when dialog opens\n useEffect(() => {\n if (edge && isOpen) {\n const values = edgeToFormValues(edge)\n setInitialValues(values)\n }\n }, [edge, isOpen])\n\n const handleSubmit = useCallback(async (values: Record<string, unknown>) => {\n if (!edge) return\n\n try {\n const updates = formValuesToEdgeUpdates(values as unknown as EdgeFormValues, edge)\n onSave(edge.id, updates)\n onClose()\n } catch (error) {\n // Error will be displayed in form (e.g., invalid JSON)\n throw error\n }\n }, [edge, onSave, onClose])\n\n const handleDelete = useCallback(() => {\n if (!edge) return\n onDelete(edge.id)\n }, [edge, onDelete])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }, [onClose])\n\n // Define form groups\n const groups: CrudFormGroup[] = useMemo(() => [\n {\n id: 'basic',\n title: 'Basic Configuration',\n column: 1,\n fields: ['transitionName', 'trigger', 'priority', 'continueOnActivityFailure'],\n },\n {\n id: 'businessRules',\n title: 'Business Rules',\n column: 1,\n description: 'Define pre-conditions (guards) and post-conditions (validations) for this transition',\n fields: ['preConditions', 'postConditions'],\n },\n {\n id: 'activities',\n title: 'Activities',\n column: 1,\n description: 'Activities executed when this transition fires',\n fields: ['activities'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional configuration as JSON (merged with above fields)',\n fields: ['advancedConfig'],\n },\n ], [])\n\n // Define form fields\n const fields: CrudField[] = useMemo(() => [\n {\n id: 'transitionName',\n label: 'Transition Name',\n type: 'text',\n placeholder: 'Enter transition name',\n required: true,\n description: 'Display name for this transition',\n },\n {\n id: 'trigger',\n label: 'Trigger Type',\n type: 'select',\n required: true,\n options: [\n { value: 'auto', label: 'Automatic' },\n { value: 'manual', label: 'Manual' },\n { value: 'signal', label: 'Signal' },\n { value: 'timer', label: 'Timer' },\n ],\n description: 'How this transition is triggered',\n },\n {\n id: 'priority',\n label: 'Priority',\n type: 'number',\n placeholder: '100',\n description: 'Higher priority transitions are evaluated first (0-9999)',\n },\n {\n id: 'continueOnActivityFailure',\n label: 'Continue on Activity Failure',\n type: 'checkbox',\n description: 'If checked, transition completes even if activities fail',\n },\n {\n id: 'preConditions',\n label: 'Pre-Conditions (Guards)',\n type: 'custom',\n description: 'Business rules that must pass before transition can fire',\n component: (props) => (\n <BusinessRuleConditionsEditor\n {...props}\n value={props.value as any}\n />\n ),\n },\n {\n id: 'postConditions',\n label: 'Post-Conditions (Validations)',\n type: 'custom',\n description: 'Business rules validated after transition completes',\n component: (props) => (\n <BusinessRuleConditionsEditor\n {...props}\n value={props.value as any}\n />\n ),\n },\n {\n id: 'activities',\n label: 'Activities',\n type: 'custom',\n description: 'Activities executed when this transition fires',\n component: (props) => <ActivityArrayEditor {...props} value={props.value as any} />,\n },\n {\n id: 'advancedConfig',\n label: 'Advanced Configuration (JSON)',\n type: 'custom',\n description: 'Additional JSON configuration merged with the transition data',\n component: (props) => <JsonConfigEditor {...props} />,\n },\n ], [])\n\n if (!isOpen || !edge) return null\n\n const edgeData = edge.data as any\n const trigger = edgeData?.trigger || 'auto'\n const triggerVariant = trigger === 'auto' ? 'default' : trigger === 'manual' ? 'secondary' : 'outline'\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent\n className=\"sm:max-w-3xl max-h-[90vh] overflow-hidden flex flex-col !p-0 [&_.grid]:!grid-cols-1\"\n onKeyDown={handleKeyDown}\n >\n <DialogHeader className=\"flex-shrink-0 p-6 pb-4 border-b border-border/70\">\n <div className=\"flex items-center gap-2 mb-2\">\n <DialogTitle>Edit Transition</DialogTitle>\n <Badge variant={triggerVariant} className=\"text-xs\">\n {trigger === 'auto' ? 'Automatic' :\n trigger === 'manual' ? 'Manual' :\n trigger === 'signal' ? 'Signal' : 'Timer'}\n </Badge>\n </div>\n <div className=\"space-y-1\">\n <DialogDescription>\n Configure transition properties, conditions, and activities\n </DialogDescription>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">ID:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{edge.id}</code>\n </div>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">Flow:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{edge.source}</code>\n <span>\u2192</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{edge.target}</code>\n </div>\n </div>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto min-h-0 px-6 \">\n <CrudForm\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n embedded={true}\n submitLabel=\"Save Transition\"\n extraActions={\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleDelete}\n >\n <Trash2 className=\"size-4 mr-2\" />\n Delete Transition\n </Button>\n }\n />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -403,9 +403,8 @@ function NodeEditDialogCrudForm({ node, isOpen, onClose, onSave, onDelete }) {
403
403
  Button,
404
404
  {
405
405
  type: "button",
406
- variant: "outline",
406
+ variant: "destructive",
407
407
  onClick: handleDelete,
408
- className: "text-red-600 border-red-200 hover:bg-red-50",
409
408
  children: [
410
409
  /* @__PURE__ */ jsx(Trash2, { className: "size-4 mr-2" }),
411
410
  "Delete Step"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/components/NodeEditDialogCrudForm.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport type { Node } from '@xyflow/react'\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Trash2 } from 'lucide-react'\nimport { CrudForm, type CrudFormGroup, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'\nimport { FormFieldArrayEditor } from './fields/FormFieldArrayEditor'\nimport { ActivityArrayEditor } from './fields/ActivityArrayEditor'\nimport { MappingArrayEditor } from './fields/MappingArrayEditor'\nimport { WorkflowSelectorField } from './fields/WorkflowSelectorField'\nimport { StartPreConditionsEditor } from './fields/StartPreConditionsEditor'\nimport { nodeToFormValues, formValuesToNodeUpdates, isJsonSchemaFormat, type NodeFormValues } from '../lib/nodeFormTransforms'\nimport { sanitizeId } from '../lib/graph-utils'\n\n/**\n * JsonConfigEditor - Custom field wrapper for JsonBuilder\n */\nfunction JsonConfigEditor({ value, setValue, disabled }: CrudCustomFieldRenderProps) {\n return (\n <JsonBuilder\n value={value || {}}\n onChange={setValue}\n disabled={disabled}\n />\n )\n}\n\nexport interface NodeEditDialogCrudFormProps {\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 * NodeEditDialogCrudForm - CrudForm-based modal dialog for editing step properties\n *\n * Migrated from NodeEditDialog to use CrudForm for:\n * - UI coherence with other admin forms\n * - Custom fields support (future enhancement)\n * - Standardized validation and error handling\n * - Consistent keyboard shortcuts\n *\n * Handles 7 node types with dynamic groups:\n * - start: Non-editable (alert only)\n * - end: Non-editable (alert only)\n * - userTask: Assignment fields + form builder\n * - automated: Activity type + activities array\n * - subWorkflow: Workflow selector + input/output mappings\n * - waitForSignal: Signal name + timeout\n * - decision: Basic fields only\n */\nexport function NodeEditDialogCrudForm({ node, isOpen, onClose, onSave, onDelete }: NodeEditDialogCrudFormProps) {\n const [initialValues, setInitialValues] = useState<Partial<NodeFormValues>>({})\n const [showJsonSchemaWarning, setShowJsonSchemaWarning] = useState(false)\n\n // Load node data when dialog opens\n useEffect(() => {\n if (node && isOpen) {\n const values = nodeToFormValues(node)\n setInitialValues(values)\n setShowJsonSchemaWarning(isJsonSchemaFormat(node))\n }\n }, [node, isOpen])\n\n const handleSubmit = useCallback(async (values: Record<string, unknown>) => {\n if (!node) return\n\n // Validate and sanitize step ID\n const sanitizedId = sanitizeId(node.id)\n if (sanitizedId !== node.id) {\n if (typeof window !== 'undefined') {\n window.alert(\n `\u26A0\uFE0F Step ID was sanitized from \"${node.id}\" to \"${sanitizedId}\" to match schema requirements (lowercase letters, numbers, hyphens, and underscores only).`\n )\n }\n }\n\n try {\n const updates = formValuesToNodeUpdates(values as unknown as NodeFormValues, node)\n onSave(node.id, updates)\n onClose()\n } catch (error) {\n // Error will be displayed in form (e.g., invalid JSON)\n throw error\n }\n }, [node, onSave, onClose])\n\n const handleDelete = useCallback(() => {\n if (!node || !onDelete) return\n onDelete(node.id)\n }, [node, onDelete])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }, [onClose])\n\n // Dynamic groups based on node type\n const groups: CrudFormGroup[] = useMemo(() => {\n if (!node) return []\n\n // End nodes are non-editable\n if (node.type === 'end') {\n return [\n {\n id: 'info',\n column: 1,\n bare: true,\n component: () => (\n <Alert variant=\"info\">\n <AlertDescription>\n End nodes cannot be edited. They mark the completion of the workflow.\n </AlertDescription>\n </Alert>\n ),\n },\n ]\n }\n\n // Start nodes: allow editing pre-conditions\n if (node.type === 'start') {\n return [\n {\n id: 'info',\n column: 1,\n bare: true,\n component: () => (\n <Alert variant=\"info\" className=\"mb-4\">\n <AlertDescription>\n Start nodes mark the beginning of the workflow. You can define pre-conditions that must pass before the workflow can be started.\n </AlertDescription>\n </Alert>\n ),\n },\n {\n id: 'preConditions',\n title: 'Pre-Conditions',\n column: 1,\n description: 'Business rules that must pass before the workflow can start',\n fields: ['preConditions'],\n },\n ]\n }\n\n const baseGroups: CrudFormGroup[] = [\n {\n id: 'basic',\n title: 'Basic Information',\n column: 1,\n fields: ['stepName', 'description', 'timeout'],\n },\n ]\n\n // UserTask specific groups\n if (node.type === 'userTask') {\n return [\n ...baseGroups,\n {\n id: 'userTask',\n title: 'User Task Configuration',\n column: 1,\n fields: ['assignedTo', 'assignedToRoles', 'formKey'],\n },\n {\n id: 'formFields',\n title: 'Form Fields',\n column: 1,\n description: 'Define the form structure for this user task',\n fields: ['formFields'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration (userTaskConfig, retryPolicy, etc.)',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // Automated specific groups\n if (node.type === 'automated') {\n return [\n ...baseGroups,\n {\n id: 'automated',\n title: 'Automated Task Configuration',\n column: 1,\n fields: ['activityType', 'activityId'],\n },\n {\n id: 'stepActivities',\n title: 'Step Activities',\n column: 1,\n description: 'Activities executed as part of this automated step',\n fields: ['stepActivities'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration (retryPolicy, etc.)',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // SubWorkflow specific groups\n if (node.type === 'subWorkflow') {\n return [\n ...baseGroups,\n {\n id: 'subWorkflow',\n title: 'Sub-Workflow Configuration',\n column: 1,\n fields: ['subWorkflowId', 'subWorkflowVersion'],\n },\n {\n id: 'mappings',\n title: 'Data Mappings',\n column: 1,\n description: 'Map data between parent and sub-workflow',\n fields: ['inputMappings', 'outputMappings'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // WaitForSignal specific groups\n if (node.type === 'waitForSignal') {\n return [\n ...baseGroups,\n {\n id: 'signal',\n title: 'Signal Configuration',\n column: 1,\n fields: ['signalName', 'signalTimeout'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // Decision and other types: just basic fields + advanced\n return [\n ...baseGroups,\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration',\n fields: ['advancedConfig'],\n },\n ]\n }, [node])\n\n // Define all possible form fields (only relevant ones are used based on groups)\n const fields: CrudField[] = useMemo(() => [\n // Basic fields\n {\n id: 'stepName',\n label: 'Step Name',\n type: 'text',\n placeholder: 'Enter step name',\n required: true,\n description: 'Display name for this step',\n },\n {\n id: 'description',\n label: 'Description',\n type: 'textarea',\n placeholder: 'Enter step description',\n description: 'Optional description of what this step does',\n },\n {\n id: 'timeout',\n label: 'Timeout',\n type: 'text',\n placeholder: 'PT30S or 30000',\n description: 'ISO 8601 duration (e.g., PT30S) or milliseconds',\n },\n\n // UserTask fields\n {\n id: 'assignedTo',\n label: 'Assigned To',\n type: 'text',\n placeholder: 'user@example.com or userId',\n description: 'User email or ID to assign this task to',\n },\n {\n id: 'assignedToRoles',\n label: 'Assigned To Roles',\n type: 'text',\n placeholder: 'admin, manager',\n description: 'Comma-separated list of roles that can claim this task',\n },\n {\n id: 'formKey',\n label: 'Form Key',\n type: 'text',\n placeholder: 'approval_form',\n description: 'Optional form key for external form rendering',\n },\n {\n id: 'formFields',\n label: 'Form Fields',\n type: 'custom',\n component: (props) => (\n <FormFieldArrayEditor\n {...props}\n value={props.value as any}\n isJsonSchemaFormat={showJsonSchemaWarning}\n />\n ),\n },\n\n // Automated fields\n {\n id: 'activityType',\n label: 'Activity Type',\n type: 'select',\n options: [\n { value: 'SEND_EMAIL', label: 'Send Email' },\n { value: 'CALL_API', label: 'Call API' },\n { value: 'UPDATE_ENTITY', label: 'Update Entity' },\n { value: 'EMIT_EVENT', label: 'Emit Event' },\n { value: 'CALL_WEBHOOK', label: 'Call Webhook' },\n { value: 'EXECUTE_FUNCTION', label: 'Execute Function' },\n { value: 'WAIT', label: 'Wait' },\n ],\n description: 'Type of activity to execute',\n },\n {\n id: 'activityId',\n label: 'Activity ID',\n type: 'text',\n placeholder: 'send_welcome_email',\n description: 'Unique identifier for this activity',\n },\n {\n id: 'stepActivities',\n label: 'Step Activities',\n type: 'custom',\n component: (props) => <ActivityArrayEditor {...props} value={props.value as any} />,\n },\n\n // SubWorkflow fields\n {\n id: 'subWorkflowId',\n label: 'Sub-Workflow',\n type: 'custom',\n component: (props) => <WorkflowSelectorField {...props} value={props.value as any} />,\n },\n {\n id: 'subWorkflowVersion',\n label: 'Version',\n type: 'number',\n placeholder: '1',\n description: 'Specific version of the sub-workflow to invoke',\n },\n {\n id: 'inputMappings',\n label: 'Input Mappings',\n type: 'custom',\n component: (props) => (\n <MappingArrayEditor\n {...props}\n value={props.value as any}\n label=\"Input Mappings\"\n description=\"Map parent workflow data to sub-workflow input\"\n />\n ),\n },\n {\n id: 'outputMappings',\n label: 'Output Mappings',\n type: 'custom',\n component: (props) => (\n <MappingArrayEditor\n {...props}\n value={props.value as any}\n label=\"Output Mappings\"\n description=\"Map sub-workflow output back to parent workflow\"\n />\n ),\n },\n\n // WaitForSignal fields\n {\n id: 'signalName',\n label: 'Signal Name',\n type: 'text',\n placeholder: 'approval_received',\n description: 'Name of the signal to wait for',\n },\n {\n id: 'signalTimeout',\n label: 'Signal Timeout',\n type: 'text',\n placeholder: 'PT5M',\n description: 'How long to wait for the signal (ISO 8601 duration)',\n },\n\n // Advanced configuration\n {\n id: 'advancedConfig',\n label: 'Advanced Configuration (JSON)',\n type: 'custom',\n description: 'Additional JSON configuration merged with the step data',\n component: (props) => <JsonConfigEditor {...props} />,\n },\n\n // Start node pre-conditions\n {\n id: 'preConditions',\n label: 'Pre-Conditions',\n type: 'custom',\n description: 'Business rules that must pass before the workflow can start',\n component: (props) => <StartPreConditionsEditor {...props} value={props.value as any} />,\n },\n ], [showJsonSchemaWarning])\n\n if (!isOpen || !node) return null\n\n const nodeType = node.type || 'unknown'\n const nodeTypeLabel = nodeType.charAt(0).toUpperCase() + nodeType.slice(1).replace(/([A-Z])/g, ' $1')\n\n const canDelete = !!onDelete\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent\n className=\"sm:max-w-7xl max-h-[90vh] overflow-hidden flex flex-col !p-0 [&_.grid]:!grid-cols-1\"\n onKeyDown={handleKeyDown}\n >\n <DialogHeader className=\"flex-shrink-0 p-6 pb-4 border-b border-border/70\">\n <div className=\"flex items-center gap-2 mb-2\">\n <DialogTitle>Edit Step</DialogTitle>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {nodeTypeLabel}\n </Badge>\n </div>\n <div className=\"space-y-1\">\n <DialogDescription>\n Configure step properties and behavior\n </DialogDescription>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">ID:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{node.id}</code>\n </div>\n </div>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto min-h-0 px-6\">\n {/* JSON Schema Conversion Warning */}\n {showJsonSchemaWarning && (\n <Alert variant=\"info\" className=\"mb-4\">\n <AlertDescription className=\"text-xs\">\n This form uses JSON Schema format. Fields have been converted for visual editing.\n When you save, it will be converted to the simplified format. To preserve the original JSON Schema,\n edit it in the &#34;Advanced Configuration (JSON)&#34; section.\n </AlertDescription>\n </Alert>\n )}\n\n <CrudForm\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n embedded={true}\n submitLabel=\"Save Step\"\n extraActions={\n canDelete ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleDelete}\n className=\"text-red-600 border-red-200 hover:bg-red-50\"\n >\n <Trash2 className=\"size-4 mr-2\" />\n Delete Step\n </Button>\n ) : undefined\n }\n />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
- "mappings": ";AAwBI,cAgbM,YAhbN;AArBJ,SAAS,UAAU,WAAW,aAAa,eAAe;AAC1D,SAAS,QAAQ,eAAe,cAAc,aAAa,yBAAyB;AACpF,SAAS,aAAa;AACtB,SAAS,OAAO,wBAAwB;AACxC,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,gBAAqF;AAC9F,SAAS,mBAAmB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,6BAA6B;AACtC,SAAS,gCAAgC;AACzC,SAAS,kBAAkB,yBAAyB,0BAA+C;AACnG,SAAS,kBAAkB;AAK3B,SAAS,iBAAiB,EAAE,OAAO,UAAU,SAAS,GAA+B;AACnF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS,CAAC;AAAA,MACjB,UAAU;AAAA,MACV;AAAA;AAAA,EACF;AAEJ;AA4BO,SAAS,uBAAuB,EAAE,MAAM,QAAQ,SAAS,QAAQ,SAAS,GAAgC;AAC/G,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAkC,CAAC,CAAC;AAC9E,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAS,KAAK;AAGxE,YAAU,MAAM;AACd,QAAI,QAAQ,QAAQ;AAClB,YAAM,SAAS,iBAAiB,IAAI;AACpC,uBAAiB,MAAM;AACvB,+BAAyB,mBAAmB,IAAI,CAAC;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,QAAM,eAAe,YAAY,OAAO,WAAoC;AAC1E,QAAI,CAAC,KAAM;AAGX,UAAM,cAAc,WAAW,KAAK,EAAE;AACtC,QAAI,gBAAgB,KAAK,IAAI;AAC3B,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO;AAAA,UACL,4CAAkC,KAAK,EAAE,SAAS,WAAW;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,wBAAwB,QAAqC,IAAI;AACjF,aAAO,KAAK,IAAI,OAAO;AACvB,cAAQ;AAAA,IACV,SAAS,OAAO;AAEd,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,OAAO,CAAC;AAE1B,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,QAAQ,CAAC,SAAU;AACxB,aAAS,KAAK,EAAE;AAAA,EAClB,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,gBAAgB,YAAY,CAAC,MAA2B;AAC5D,QAAI,EAAE,QAAQ,UAAU;AACtB,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,SAA0B,QAAQ,MAAM;AAC5C,QAAI,CAAC,KAAM,QAAO,CAAC;AAGnB,QAAI,KAAK,SAAS,OAAO;AACvB,aAAO;AAAA,QACL;AAAA,UACE,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,WAAW,MACT,oBAAC,SAAM,SAAQ,QACb,8BAAC,oBAAiB,mFAElB,GACF;AAAA,QAEJ;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,SAAS;AACzB,aAAO;AAAA,QACL;AAAA,UACE,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,WAAW,MACT,oBAAC,SAAM,SAAQ,QAAO,WAAU,QAC9B,8BAAC,oBAAiB,8IAElB,GACF;AAAA,QAEJ;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,eAAe;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAA8B;AAAA,MAClC;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ,CAAC,YAAY,eAAe,SAAS;AAAA,MAC/C;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,YAAY;AAC5B,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,CAAC,cAAc,mBAAmB,SAAS;AAAA,QACrD;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,YAAY;AAAA,QACvB;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,gBAAgB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,aAAa;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,CAAC,gBAAgB,YAAY;AAAA,QACvC;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,gBAAgB;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,gBAAgB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,eAAe;AAC/B,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,CAAC,iBAAiB,oBAAoB;AAAA,QAChD;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,iBAAiB,gBAAgB;AAAA,QAC5C;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,gBAAgB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,iBAAiB;AACjC,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,CAAC,cAAc,eAAe;AAAA,QACxC;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC,gBAAgB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,QAAQ,CAAC,gBAAgB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAGT,QAAM,SAAsB,QAAQ,MAAM;AAAA;AAAA,IAExC;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,UACV;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,oBAAoB;AAAA;AAAA,MACtB;AAAA,IAEJ;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,QACP,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,QAC3C,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,QACvC,EAAE,OAAO,iBAAiB,OAAO,gBAAgB;AAAA,QACjD,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,QAC3C,EAAE,OAAO,gBAAgB,OAAO,eAAe;AAAA,QAC/C,EAAE,OAAO,oBAAoB,OAAO,mBAAmB;AAAA,QACvD,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,MACjC;AAAA,MACA,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,UAAU,oBAAC,uBAAqB,GAAG,OAAO,OAAO,MAAM,OAAc;AAAA,IACnF;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,UAAU,oBAAC,yBAAuB,GAAG,OAAO,OAAO,MAAM,OAAc;AAAA,IACrF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,UACV;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,OAAM;AAAA,UACN,aAAY;AAAA;AAAA,MACd;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW,CAAC,UACV;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,OAAM;AAAA,UACN,aAAY;AAAA;AAAA,MACd;AAAA,IAEJ;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW,CAAC,UAAU,oBAAC,oBAAkB,GAAG,OAAO;AAAA,IACrD;AAAA;AAAA,IAGA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,WAAW,CAAC,UAAU,oBAAC,4BAA0B,GAAG,OAAO,OAAO,MAAM,OAAc;AAAA,IACxF;AAAA,EACF,GAAG,CAAC,qBAAqB,CAAC;AAE1B,MAAI,CAAC,UAAU,CAAC,KAAM,QAAO;AAE7B,QAAM,WAAW,KAAK,QAAQ;AAC9B,QAAM,gBAAgB,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,EAAE,QAAQ,YAAY,KAAK;AAEpG,QAAM,YAAY,CAAC,CAAC;AAEpB,SACE,oBAAC,UAAO,MAAM,QAAQ,cAAc,SAClC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,6BAAC,gBAAa,WAAU,oDACtB;AAAA,+BAAC,SAAI,WAAU,gCACb;AAAA,gCAAC,eAAY,uBAAS;AAAA,YACtB,oBAAC,SAAM,SAAQ,aAAY,WAAU,WAClC,yBACH;AAAA,aACF;AAAA,UACA,qBAAC,SAAI,WAAU,aACb;AAAA,gCAAC,qBAAkB,oDAEnB;AAAA,YACA,qBAAC,SAAI,WAAU,yDACb;AAAA,kCAAC,UAAK,WAAU,eAAc,iBAAG;AAAA,cACjC,oBAAC,UAAK,WAAU,4CAA4C,eAAK,IAAG;AAAA,eACtE;AAAA,aACF;AAAA,WACF;AAAA,QAEA,qBAAC,SAAI,WAAU,uCAEZ;AAAA,mCACC,oBAAC,SAAM,SAAQ,QAAO,WAAU,QAC9B,8BAAC,oBAAiB,WAAU,WAAU,2PAItC,GACF;AAAA,UAGF;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA,cACV,aAAY;AAAA,cACZ,cACE,YACE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,WAAU;AAAA,kBAEV;AAAA,wCAAC,UAAO,WAAU,eAAc;AAAA,oBAAE;AAAA;AAAA;AAAA,cAEpC,IACE;AAAA;AAAA,UAER;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;",
4
+ "sourcesContent": ["'use client'\n\nimport type { Node } from '@xyflow/react'\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@open-mercato/ui/primitives/dialog'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Trash2 } from 'lucide-react'\nimport { CrudForm, type CrudFormGroup, type CrudField, type CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'\nimport { FormFieldArrayEditor } from './fields/FormFieldArrayEditor'\nimport { ActivityArrayEditor } from './fields/ActivityArrayEditor'\nimport { MappingArrayEditor } from './fields/MappingArrayEditor'\nimport { WorkflowSelectorField } from './fields/WorkflowSelectorField'\nimport { StartPreConditionsEditor } from './fields/StartPreConditionsEditor'\nimport { nodeToFormValues, formValuesToNodeUpdates, isJsonSchemaFormat, type NodeFormValues } from '../lib/nodeFormTransforms'\nimport { sanitizeId } from '../lib/graph-utils'\n\n/**\n * JsonConfigEditor - Custom field wrapper for JsonBuilder\n */\nfunction JsonConfigEditor({ value, setValue, disabled }: CrudCustomFieldRenderProps) {\n return (\n <JsonBuilder\n value={value || {}}\n onChange={setValue}\n disabled={disabled}\n />\n )\n}\n\nexport interface NodeEditDialogCrudFormProps {\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 * NodeEditDialogCrudForm - CrudForm-based modal dialog for editing step properties\n *\n * Migrated from NodeEditDialog to use CrudForm for:\n * - UI coherence with other admin forms\n * - Custom fields support (future enhancement)\n * - Standardized validation and error handling\n * - Consistent keyboard shortcuts\n *\n * Handles 7 node types with dynamic groups:\n * - start: Non-editable (alert only)\n * - end: Non-editable (alert only)\n * - userTask: Assignment fields + form builder\n * - automated: Activity type + activities array\n * - subWorkflow: Workflow selector + input/output mappings\n * - waitForSignal: Signal name + timeout\n * - decision: Basic fields only\n */\nexport function NodeEditDialogCrudForm({ node, isOpen, onClose, onSave, onDelete }: NodeEditDialogCrudFormProps) {\n const [initialValues, setInitialValues] = useState<Partial<NodeFormValues>>({})\n const [showJsonSchemaWarning, setShowJsonSchemaWarning] = useState(false)\n\n // Load node data when dialog opens\n useEffect(() => {\n if (node && isOpen) {\n const values = nodeToFormValues(node)\n setInitialValues(values)\n setShowJsonSchemaWarning(isJsonSchemaFormat(node))\n }\n }, [node, isOpen])\n\n const handleSubmit = useCallback(async (values: Record<string, unknown>) => {\n if (!node) return\n\n // Validate and sanitize step ID\n const sanitizedId = sanitizeId(node.id)\n if (sanitizedId !== node.id) {\n if (typeof window !== 'undefined') {\n window.alert(\n `\u26A0\uFE0F Step ID was sanitized from \"${node.id}\" to \"${sanitizedId}\" to match schema requirements (lowercase letters, numbers, hyphens, and underscores only).`\n )\n }\n }\n\n try {\n const updates = formValuesToNodeUpdates(values as unknown as NodeFormValues, node)\n onSave(node.id, updates)\n onClose()\n } catch (error) {\n // Error will be displayed in form (e.g., invalid JSON)\n throw error\n }\n }, [node, onSave, onClose])\n\n const handleDelete = useCallback(() => {\n if (!node || !onDelete) return\n onDelete(node.id)\n }, [node, onDelete])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }, [onClose])\n\n // Dynamic groups based on node type\n const groups: CrudFormGroup[] = useMemo(() => {\n if (!node) return []\n\n // End nodes are non-editable\n if (node.type === 'end') {\n return [\n {\n id: 'info',\n column: 1,\n bare: true,\n component: () => (\n <Alert variant=\"info\">\n <AlertDescription>\n End nodes cannot be edited. They mark the completion of the workflow.\n </AlertDescription>\n </Alert>\n ),\n },\n ]\n }\n\n // Start nodes: allow editing pre-conditions\n if (node.type === 'start') {\n return [\n {\n id: 'info',\n column: 1,\n bare: true,\n component: () => (\n <Alert variant=\"info\" className=\"mb-4\">\n <AlertDescription>\n Start nodes mark the beginning of the workflow. You can define pre-conditions that must pass before the workflow can be started.\n </AlertDescription>\n </Alert>\n ),\n },\n {\n id: 'preConditions',\n title: 'Pre-Conditions',\n column: 1,\n description: 'Business rules that must pass before the workflow can start',\n fields: ['preConditions'],\n },\n ]\n }\n\n const baseGroups: CrudFormGroup[] = [\n {\n id: 'basic',\n title: 'Basic Information',\n column: 1,\n fields: ['stepName', 'description', 'timeout'],\n },\n ]\n\n // UserTask specific groups\n if (node.type === 'userTask') {\n return [\n ...baseGroups,\n {\n id: 'userTask',\n title: 'User Task Configuration',\n column: 1,\n fields: ['assignedTo', 'assignedToRoles', 'formKey'],\n },\n {\n id: 'formFields',\n title: 'Form Fields',\n column: 1,\n description: 'Define the form structure for this user task',\n fields: ['formFields'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration (userTaskConfig, retryPolicy, etc.)',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // Automated specific groups\n if (node.type === 'automated') {\n return [\n ...baseGroups,\n {\n id: 'automated',\n title: 'Automated Task Configuration',\n column: 1,\n fields: ['activityType', 'activityId'],\n },\n {\n id: 'stepActivities',\n title: 'Step Activities',\n column: 1,\n description: 'Activities executed as part of this automated step',\n fields: ['stepActivities'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration (retryPolicy, etc.)',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // SubWorkflow specific groups\n if (node.type === 'subWorkflow') {\n return [\n ...baseGroups,\n {\n id: 'subWorkflow',\n title: 'Sub-Workflow Configuration',\n column: 1,\n fields: ['subWorkflowId', 'subWorkflowVersion'],\n },\n {\n id: 'mappings',\n title: 'Data Mappings',\n column: 1,\n description: 'Map data between parent and sub-workflow',\n fields: ['inputMappings', 'outputMappings'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // WaitForSignal specific groups\n if (node.type === 'waitForSignal') {\n return [\n ...baseGroups,\n {\n id: 'signal',\n title: 'Signal Configuration',\n column: 1,\n fields: ['signalName', 'signalTimeout'],\n },\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration',\n fields: ['advancedConfig'],\n },\n ]\n }\n\n // Decision and other types: just basic fields + advanced\n return [\n ...baseGroups,\n {\n id: 'advanced',\n title: 'Advanced Configuration',\n column: 1,\n description: 'Additional JSON configuration',\n fields: ['advancedConfig'],\n },\n ]\n }, [node])\n\n // Define all possible form fields (only relevant ones are used based on groups)\n const fields: CrudField[] = useMemo(() => [\n // Basic fields\n {\n id: 'stepName',\n label: 'Step Name',\n type: 'text',\n placeholder: 'Enter step name',\n required: true,\n description: 'Display name for this step',\n },\n {\n id: 'description',\n label: 'Description',\n type: 'textarea',\n placeholder: 'Enter step description',\n description: 'Optional description of what this step does',\n },\n {\n id: 'timeout',\n label: 'Timeout',\n type: 'text',\n placeholder: 'PT30S or 30000',\n description: 'ISO 8601 duration (e.g., PT30S) or milliseconds',\n },\n\n // UserTask fields\n {\n id: 'assignedTo',\n label: 'Assigned To',\n type: 'text',\n placeholder: 'user@example.com or userId',\n description: 'User email or ID to assign this task to',\n },\n {\n id: 'assignedToRoles',\n label: 'Assigned To Roles',\n type: 'text',\n placeholder: 'admin, manager',\n description: 'Comma-separated list of roles that can claim this task',\n },\n {\n id: 'formKey',\n label: 'Form Key',\n type: 'text',\n placeholder: 'approval_form',\n description: 'Optional form key for external form rendering',\n },\n {\n id: 'formFields',\n label: 'Form Fields',\n type: 'custom',\n component: (props) => (\n <FormFieldArrayEditor\n {...props}\n value={props.value as any}\n isJsonSchemaFormat={showJsonSchemaWarning}\n />\n ),\n },\n\n // Automated fields\n {\n id: 'activityType',\n label: 'Activity Type',\n type: 'select',\n options: [\n { value: 'SEND_EMAIL', label: 'Send Email' },\n { value: 'CALL_API', label: 'Call API' },\n { value: 'UPDATE_ENTITY', label: 'Update Entity' },\n { value: 'EMIT_EVENT', label: 'Emit Event' },\n { value: 'CALL_WEBHOOK', label: 'Call Webhook' },\n { value: 'EXECUTE_FUNCTION', label: 'Execute Function' },\n { value: 'WAIT', label: 'Wait' },\n ],\n description: 'Type of activity to execute',\n },\n {\n id: 'activityId',\n label: 'Activity ID',\n type: 'text',\n placeholder: 'send_welcome_email',\n description: 'Unique identifier for this activity',\n },\n {\n id: 'stepActivities',\n label: 'Step Activities',\n type: 'custom',\n component: (props) => <ActivityArrayEditor {...props} value={props.value as any} />,\n },\n\n // SubWorkflow fields\n {\n id: 'subWorkflowId',\n label: 'Sub-Workflow',\n type: 'custom',\n component: (props) => <WorkflowSelectorField {...props} value={props.value as any} />,\n },\n {\n id: 'subWorkflowVersion',\n label: 'Version',\n type: 'number',\n placeholder: '1',\n description: 'Specific version of the sub-workflow to invoke',\n },\n {\n id: 'inputMappings',\n label: 'Input Mappings',\n type: 'custom',\n component: (props) => (\n <MappingArrayEditor\n {...props}\n value={props.value as any}\n label=\"Input Mappings\"\n description=\"Map parent workflow data to sub-workflow input\"\n />\n ),\n },\n {\n id: 'outputMappings',\n label: 'Output Mappings',\n type: 'custom',\n component: (props) => (\n <MappingArrayEditor\n {...props}\n value={props.value as any}\n label=\"Output Mappings\"\n description=\"Map sub-workflow output back to parent workflow\"\n />\n ),\n },\n\n // WaitForSignal fields\n {\n id: 'signalName',\n label: 'Signal Name',\n type: 'text',\n placeholder: 'approval_received',\n description: 'Name of the signal to wait for',\n },\n {\n id: 'signalTimeout',\n label: 'Signal Timeout',\n type: 'text',\n placeholder: 'PT5M',\n description: 'How long to wait for the signal (ISO 8601 duration)',\n },\n\n // Advanced configuration\n {\n id: 'advancedConfig',\n label: 'Advanced Configuration (JSON)',\n type: 'custom',\n description: 'Additional JSON configuration merged with the step data',\n component: (props) => <JsonConfigEditor {...props} />,\n },\n\n // Start node pre-conditions\n {\n id: 'preConditions',\n label: 'Pre-Conditions',\n type: 'custom',\n description: 'Business rules that must pass before the workflow can start',\n component: (props) => <StartPreConditionsEditor {...props} value={props.value as any} />,\n },\n ], [showJsonSchemaWarning])\n\n if (!isOpen || !node) return null\n\n const nodeType = node.type || 'unknown'\n const nodeTypeLabel = nodeType.charAt(0).toUpperCase() + nodeType.slice(1).replace(/([A-Z])/g, ' $1')\n\n const canDelete = !!onDelete\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent\n className=\"sm:max-w-7xl max-h-[90vh] overflow-hidden flex flex-col !p-0 [&_.grid]:!grid-cols-1\"\n onKeyDown={handleKeyDown}\n >\n <DialogHeader className=\"flex-shrink-0 p-6 pb-4 border-b border-border/70\">\n <div className=\"flex items-center gap-2 mb-2\">\n <DialogTitle>Edit Step</DialogTitle>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {nodeTypeLabel}\n </Badge>\n </div>\n <div className=\"space-y-1\">\n <DialogDescription>\n Configure step properties and behavior\n </DialogDescription>\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">ID:</span>\n <code className=\"px-1.5 py-0.5 rounded bg-muted font-mono\">{node.id}</code>\n </div>\n </div>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto min-h-0 px-6\">\n {/* JSON Schema Conversion Warning */}\n {showJsonSchemaWarning && (\n <Alert variant=\"info\" className=\"mb-4\">\n <AlertDescription className=\"text-xs\">\n This form uses JSON Schema format. Fields have been converted for visual editing.\n When you save, it will be converted to the simplified format. To preserve the original JSON Schema,\n edit it in the &#34;Advanced Configuration (JSON)&#34; section.\n </AlertDescription>\n </Alert>\n )}\n\n <CrudForm\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n embedded={true}\n submitLabel=\"Save Step\"\n extraActions={\n canDelete ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={handleDelete}\n >\n <Trash2 className=\"size-4 mr-2\" />\n Delete Step\n </Button>\n ) : undefined\n }\n />\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -57,7 +57,7 @@ function StepsEditor({ value = [], onChange, error }) {
57
57
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", children: [
58
58
  /* @__PURE__ */ jsxs("div", { children: [
59
59
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("workflows.form.descriptions.steps") }),
60
- error && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600 mt-1", children: error })
60
+ error && /* @__PURE__ */ jsx("p", { className: "text-sm text-status-error-text mt-1", children: error })
61
61
  ] }),
62
62
  /* @__PURE__ */ jsxs(Button, { type: "button", onClick: addStep, variant: "outline", size: "sm", className: "w-full sm:w-auto", children: [
63
63
  /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4 mr-1" }),
@@ -134,7 +134,7 @@ function StepsEditor({ value = [], onChange, error }) {
134
134
  size: "sm",
135
135
  onClick: () => removeStep(index),
136
136
  title: t("common.delete"),
137
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 text-red-600" })
137
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 text-destructive" })
138
138
  }
139
139
  )
140
140
  ] })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/components/StepsEditor.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Trash2, Plus, ChevronUp, ChevronDown } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ninterface Step {\n stepId: string\n stepName: string\n stepType: string\n description?: string\n config?: Record<string, any>\n timeout?: number\n retryPolicy?: {\n maxAttempts?: number\n retryDelay?: number\n backoffMultiplier?: number\n }\n}\n\ninterface StepsEditorProps {\n value: Step[]\n onChange: (steps: Step[]) => void\n error?: string\n}\n\nconst STEP_TYPES = [\n { value: 'START', label: 'Start' },\n { value: 'END', label: 'End' },\n { value: 'USER_TASK', label: 'User Task' },\n { value: 'AUTOMATED', label: 'Automated' },\n { value: 'PARALLEL_FORK', label: 'Parallel Fork' },\n { value: 'PARALLEL_JOIN', label: 'Parallel Join' },\n { value: 'SUB_WORKFLOW', label: 'Sub-Workflow' },\n { value: 'WAIT_FOR_SIGNAL', label: 'Wait for Signal' },\n { value: 'WAIT_FOR_TIMER', label: 'Wait for Timer' },\n]\n\nexport function StepsEditor({ value = [], onChange, error }: StepsEditorProps) {\n const t = useT()\n\n const addStep = () => {\n const newStep: Step = {\n stepId: `step_${Date.now()}`,\n stepName: t('workflows.common.newStep'),\n stepType: 'AUTOMATED',\n description: '',\n config: {},\n }\n onChange([...value, newStep])\n }\n\n const updateStep = (index: number, field: keyof Step, fieldValue: any) => {\n const updated = [...value]\n updated[index] = { ...updated[index], [field]: fieldValue }\n onChange(updated)\n }\n\n const removeStep = (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n }\n\n const moveStep = (index: number, direction: 'up' | 'down') => {\n const newIndex = direction === 'up' ? index - 1 : index + 1\n if (newIndex < 0 || newIndex >= value.length) return\n\n const updated = [...value]\n const temp = updated[index]\n updated[index] = updated[newIndex]\n updated[newIndex] = temp\n onChange(updated)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">\n {t('workflows.form.descriptions.steps')}\n </p>\n {error && <p className=\"text-sm text-red-600 mt-1\">{error}</p>}\n </div>\n <Button type=\"button\" onClick={addStep} variant=\"outline\" size=\"sm\" className=\"w-full sm:w-auto\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('workflows.form.addStep')}\n </Button>\n </div>\n\n {value.length === 0 && (\n <div className=\"p-6 text-center text-muted-foreground border rounded-md bg-muted\">\n {t('workflows.form.noSteps')}\n </div>\n )}\n\n <div className=\"space-y-3\">\n {value.map((step, index) => (\n <div key={index} className=\"p-4 border rounded-md bg-card shadow-sm\">\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1 grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`step-${index}-id`} className=\"text-xs\">\n {t('workflows.steps.stepId')} *\n </Label>\n <Input\n id={`step-${index}-id`}\n value={step.stepId}\n onChange={(e) => updateStep(index, 'stepId', e.target.value)}\n placeholder=\"step_name\"\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor={`step-${index}-name`} className=\"text-xs\">\n {t('workflows.steps.stepName')} *\n </Label>\n <Input\n id={`step-${index}-name`}\n value={step.stepName}\n onChange={(e) => updateStep(index, 'stepName', e.target.value)}\n placeholder={t('workflows.steps.stepName')}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-1 self-end sm:self-auto\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveStep(index, 'up')}\n disabled={index === 0}\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveStep(index, 'down')}\n disabled={index === value.length - 1}\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => removeStep(index)}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-4 w-4 text-red-600\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`step-${index}-type`} className=\"text-xs\">\n {t('workflows.steps.stepType')} *\n </Label>\n <Select\n value={step.stepType}\n onValueChange={(value) => updateStep(index, 'stepType', value)}\n >\n <SelectTrigger id={`step-${index}-type`} className=\"mt-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STEP_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {t(`workflows.steps.types.${type.value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`step-${index}-timeout`} className=\"text-xs\">\n {t('workflows.steps.timeout')} (ms)\n </Label>\n <Input\n id={`step-${index}-timeout`}\n type=\"number\"\n value={step.timeout || ''}\n onChange={(e) => updateStep(index, 'timeout', e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder=\"30000\"\n className=\"mt-1\"\n />\n </div>\n </div>\n\n {step.stepType === 'WAIT_FOR_TIMER' && (\n <div className=\"grid grid-cols-1 sm:grid-cols-[1fr_auto_1fr] gap-3 items-end\">\n <div>\n <Label htmlFor={`step-${index}-duration`} className=\"text-xs\">\n {t('workflows.activities.waitDuration')}\n </Label>\n <Input\n id={`step-${index}-duration`}\n value={step.config?.duration || ''}\n onChange={(e) => updateStep(index, 'config', { ...step.config, duration: e.target.value, until: undefined })}\n placeholder={t('workflows.activities.waitDurationPlaceholder')}\n className=\"mt-1\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.activities.waitDurationDescription')}\n </p>\n </div>\n <span className=\"text-xs text-muted-foreground pb-6\">{t('workflows.activities.waitOr')}</span>\n <div>\n <Label htmlFor={`step-${index}-until`} className=\"text-xs\">\n {t('workflows.activities.waitUntil')}\n </Label>\n <Input\n id={`step-${index}-until`}\n type=\"datetime-local\"\n value={step.config?.until ? step.config.until.slice(0, 16) : ''}\n onChange={(e) => updateStep(index, 'config', { ...step.config, until: e.target.value ? new Date(e.target.value).toISOString() : undefined, duration: undefined })}\n className=\"mt-1\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.activities.waitUntilDescription')}\n </p>\n </div>\n </div>\n )}\n\n <div>\n <Label htmlFor={`step-${index}-description`} className=\"text-xs\">\n {t('workflows.steps.singular')} {t('workflows.definitions.description')}\n </Label>\n <Textarea\n id={`step-${index}-description`}\n value={step.description || ''}\n onChange={(e) => updateStep(index, 'description', e.target.value)}\n placeholder={t('workflows.form.placeholders.description')}\n rows={2}\n className=\"mt-1\"\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],
5
- "mappings": ";AAuFQ,SACE,KADF;AApFR,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,QAAQ,MAAM,WAAW,mBAAmB;AACrD,SAAS,YAAY;AAsBrB,MAAM,aAAa;AAAA,EACjB,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,EACzC,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,EACzC,EAAE,OAAO,iBAAiB,OAAO,gBAAgB;AAAA,EACjD,EAAE,OAAO,iBAAiB,OAAO,gBAAgB;AAAA,EACjD,EAAE,OAAO,gBAAgB,OAAO,eAAe;AAAA,EAC/C,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,EACrD,EAAE,OAAO,kBAAkB,OAAO,iBAAiB;AACrD;AAEO,SAAS,YAAY,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM,GAAqB;AAC7E,QAAM,IAAI,KAAK;AAEf,QAAM,UAAU,MAAM;AACpB,UAAM,UAAgB;AAAA,MACpB,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC1B,UAAU,EAAE,0BAA0B;AAAA,MACtC,UAAU;AAAA,MACV,aAAa;AAAA,MACb,QAAQ,CAAC;AAAA,IACX;AACA,aAAS,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,EAC9B;AAEA,QAAM,aAAa,CAAC,OAAe,OAAmB,eAAoB;AACxE,UAAM,UAAU,CAAC,GAAG,KAAK;AACzB,YAAQ,KAAK,IAAI,EAAE,GAAG,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,WAAW;AAC1D,aAAS,OAAO;AAAA,EAClB;AAEA,QAAM,aAAa,CAAC,UAAkB;AACpC,aAAS,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,WAAW,CAAC,OAAe,cAA6B;AAC5D,UAAM,WAAW,cAAc,OAAO,QAAQ,IAAI,QAAQ;AAC1D,QAAI,WAAW,KAAK,YAAY,MAAM,OAAQ;AAE9C,UAAM,UAAU,CAAC,GAAG,KAAK;AACzB,UAAM,OAAO,QAAQ,KAAK;AAC1B,YAAQ,KAAK,IAAI,QAAQ,QAAQ;AACjC,YAAQ,QAAQ,IAAI;AACpB,aAAS,OAAO;AAAA,EAClB;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,sEACb;AAAA,2BAAC,SACC;AAAA,4BAAC,OAAE,WAAU,iCACV,YAAE,mCAAmC,GACxC;AAAA,QACC,SAAS,oBAAC,OAAE,WAAU,6BAA6B,iBAAM;AAAA,SAC5D;AAAA,MACA,qBAAC,UAAO,MAAK,UAAS,SAAS,SAAS,SAAQ,WAAU,MAAK,MAAK,WAAU,oBAC5E;AAAA,4BAAC,QAAK,WAAU,gBAAe;AAAA,QAC9B,EAAE,wBAAwB;AAAA,SAC7B;AAAA,OACF;AAAA,IAEC,MAAM,WAAW,KAChB,oBAAC,SAAI,WAAU,oEACZ,YAAE,wBAAwB,GAC7B;AAAA,IAGF,oBAAC,SAAI,WAAU,aACZ,gBAAM,IAAI,CAAC,MAAM,UAChB,oBAAC,SAAgB,WAAU,2CACzB,+BAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,qEACb;AAAA,6BAAC,SAAI,WAAU,gDACb;AAAA,+BAAC,SACC;AAAA,iCAAC,SAAM,SAAS,QAAQ,KAAK,OAAO,WAAU,WAC3C;AAAA,gBAAE,wBAAwB;AAAA,cAAE;AAAA,eAC/B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,QAAQ,KAAK;AAAA,gBACjB,OAAO,KAAK;AAAA,gBACZ,UAAU,CAAC,MAAM,WAAW,OAAO,UAAU,EAAE,OAAO,KAAK;AAAA,gBAC3D,aAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UACA,qBAAC,SACC;AAAA,iCAAC,SAAM,SAAS,QAAQ,KAAK,SAAS,WAAU,WAC7C;AAAA,gBAAE,0BAA0B;AAAA,cAAE;AAAA,eACjC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,QAAQ,KAAK;AAAA,gBACjB,OAAO,KAAK;AAAA,gBACZ,UAAU,CAAC,MAAM,WAAW,OAAO,YAAY,EAAE,OAAO,KAAK;AAAA,gBAC7D,aAAa,EAAE,0BAA0B;AAAA,gBACzC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,iDACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,SAAS,OAAO,IAAI;AAAA,cACnC,UAAU,UAAU;AAAA,cACpB,OAAO,EAAE,eAAe;AAAA,cAExB,8BAAC,aAAU,WAAU,WAAU;AAAA;AAAA,UACjC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,SAAS,OAAO,MAAM;AAAA,cACrC,UAAU,UAAU,MAAM,SAAS;AAAA,cACnC,OAAO,EAAE,iBAAiB;AAAA,cAE1B,8BAAC,eAAY,WAAU,WAAU;AAAA;AAAA,UACnC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,WAAW,KAAK;AAAA,cAC/B,OAAO,EAAE,eAAe;AAAA,cAExB,8BAAC,UAAO,WAAU,wBAAuB;AAAA;AAAA,UAC3C;AAAA,WACF;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,yCACb;AAAA,6BAAC,SACC;AAAA,+BAAC,SAAM,SAAS,QAAQ,KAAK,SAAS,WAAU,WAC7C;AAAA,cAAE,0BAA0B;AAAA,YAAE;AAAA,aACjC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,KAAK;AAAA,cACZ,eAAe,CAACA,WAAU,WAAW,OAAO,YAAYA,MAAK;AAAA,cAE7D;AAAA,oCAAC,iBAAc,IAAI,QAAQ,KAAK,SAAS,WAAU,QACjD,8BAAC,eAAY,GACf;AAAA,gBACA,oBAAC,iBACE,qBAAW,IAAI,CAAC,SACf,oBAAC,cAA4B,OAAO,KAAK,OACtC,YAAE,yBAAyB,KAAK,KAAK,EAAE,KADzB,KAAK,KAEtB,CACD,GACH;AAAA;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,+BAAC,SAAM,SAAS,QAAQ,KAAK,YAAY,WAAU,WAChD;AAAA,cAAE,yBAAyB;AAAA,YAAE;AAAA,aAChC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,QAAQ,KAAK;AAAA,cACjB,MAAK;AAAA,cACL,OAAO,KAAK,WAAW;AAAA,cACvB,UAAU,CAAC,MAAM,WAAW,OAAO,WAAW,EAAE,OAAO,QAAQ,SAAS,EAAE,OAAO,KAAK,IAAI,MAAS;AAAA,cACnG,aAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,MAEC,KAAK,aAAa,oBACjB,qBAAC,SAAI,WAAU,gEACb;AAAA,6BAAC,SACC;AAAA,8BAAC,SAAM,SAAS,QAAQ,KAAK,aAAa,WAAU,WACjD,YAAE,mCAAmC,GACxC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,QAAQ,KAAK;AAAA,cACjB,OAAO,KAAK,QAAQ,YAAY;AAAA,cAChC,UAAU,CAAC,MAAM,WAAW,OAAO,UAAU,EAAE,GAAG,KAAK,QAAQ,UAAU,EAAE,OAAO,OAAO,OAAO,OAAU,CAAC;AAAA,cAC3G,aAAa,EAAE,8CAA8C;AAAA,cAC7D,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,oBAAC,OAAE,WAAU,sCACV,YAAE,8CAA8C,GACnD;AAAA,WACF;AAAA,QACA,oBAAC,UAAK,WAAU,sCAAsC,YAAE,6BAA6B,GAAE;AAAA,QACvF,qBAAC,SACC;AAAA,8BAAC,SAAM,SAAS,QAAQ,KAAK,UAAU,WAAU,WAC9C,YAAE,gCAAgC,GACrC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,QAAQ,KAAK;AAAA,cACjB,MAAK;AAAA,cACL,OAAO,KAAK,QAAQ,QAAQ,KAAK,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI;AAAA,cAC7D,UAAU,CAAC,MAAM,WAAW,OAAO,UAAU,EAAE,GAAG,KAAK,QAAQ,OAAO,EAAE,OAAO,QAAQ,IAAI,KAAK,EAAE,OAAO,KAAK,EAAE,YAAY,IAAI,QAAW,UAAU,OAAU,CAAC;AAAA,cAChK,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,oBAAC,OAAE,WAAU,sCACV,YAAE,2CAA2C,GAChD;AAAA,WACF;AAAA,SACF;AAAA,MAGF,qBAAC,SACC;AAAA,6BAAC,SAAM,SAAS,QAAQ,KAAK,gBAAgB,WAAU,WACpD;AAAA,YAAE,0BAA0B;AAAA,UAAE;AAAA,UAAE,EAAE,mCAAmC;AAAA,WACxE;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,QAAQ,KAAK;AAAA,YACjB,OAAO,KAAK,eAAe;AAAA,YAC3B,UAAU,CAAC,MAAM,WAAW,OAAO,eAAe,EAAE,OAAO,KAAK;AAAA,YAChE,aAAa,EAAE,yCAAyC;AAAA,YACxD,MAAM;AAAA,YACN,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,OACF,KAnJQ,KAoJV,CACD,GACH;AAAA,KACF;AAEJ;",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Trash2, Plus, ChevronUp, ChevronDown } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ninterface Step {\n stepId: string\n stepName: string\n stepType: string\n description?: string\n config?: Record<string, any>\n timeout?: number\n retryPolicy?: {\n maxAttempts?: number\n retryDelay?: number\n backoffMultiplier?: number\n }\n}\n\ninterface StepsEditorProps {\n value: Step[]\n onChange: (steps: Step[]) => void\n error?: string\n}\n\nconst STEP_TYPES = [\n { value: 'START', label: 'Start' },\n { value: 'END', label: 'End' },\n { value: 'USER_TASK', label: 'User Task' },\n { value: 'AUTOMATED', label: 'Automated' },\n { value: 'PARALLEL_FORK', label: 'Parallel Fork' },\n { value: 'PARALLEL_JOIN', label: 'Parallel Join' },\n { value: 'SUB_WORKFLOW', label: 'Sub-Workflow' },\n { value: 'WAIT_FOR_SIGNAL', label: 'Wait for Signal' },\n { value: 'WAIT_FOR_TIMER', label: 'Wait for Timer' },\n]\n\nexport function StepsEditor({ value = [], onChange, error }: StepsEditorProps) {\n const t = useT()\n\n const addStep = () => {\n const newStep: Step = {\n stepId: `step_${Date.now()}`,\n stepName: t('workflows.common.newStep'),\n stepType: 'AUTOMATED',\n description: '',\n config: {},\n }\n onChange([...value, newStep])\n }\n\n const updateStep = (index: number, field: keyof Step, fieldValue: any) => {\n const updated = [...value]\n updated[index] = { ...updated[index], [field]: fieldValue }\n onChange(updated)\n }\n\n const removeStep = (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n }\n\n const moveStep = (index: number, direction: 'up' | 'down') => {\n const newIndex = direction === 'up' ? index - 1 : index + 1\n if (newIndex < 0 || newIndex >= value.length) return\n\n const updated = [...value]\n const temp = updated[index]\n updated[index] = updated[newIndex]\n updated[newIndex] = temp\n onChange(updated)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">\n {t('workflows.form.descriptions.steps')}\n </p>\n {error && <p className=\"text-sm text-status-error-text mt-1\">{error}</p>}\n </div>\n <Button type=\"button\" onClick={addStep} variant=\"outline\" size=\"sm\" className=\"w-full sm:w-auto\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('workflows.form.addStep')}\n </Button>\n </div>\n\n {value.length === 0 && (\n <div className=\"p-6 text-center text-muted-foreground border rounded-md bg-muted\">\n {t('workflows.form.noSteps')}\n </div>\n )}\n\n <div className=\"space-y-3\">\n {value.map((step, index) => (\n <div key={index} className=\"p-4 border rounded-md bg-card shadow-sm\">\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1 grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`step-${index}-id`} className=\"text-xs\">\n {t('workflows.steps.stepId')} *\n </Label>\n <Input\n id={`step-${index}-id`}\n value={step.stepId}\n onChange={(e) => updateStep(index, 'stepId', e.target.value)}\n placeholder=\"step_name\"\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor={`step-${index}-name`} className=\"text-xs\">\n {t('workflows.steps.stepName')} *\n </Label>\n <Input\n id={`step-${index}-name`}\n value={step.stepName}\n onChange={(e) => updateStep(index, 'stepName', e.target.value)}\n placeholder={t('workflows.steps.stepName')}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-1 self-end sm:self-auto\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveStep(index, 'up')}\n disabled={index === 0}\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveStep(index, 'down')}\n disabled={index === value.length - 1}\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => removeStep(index)}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-4 w-4 text-destructive\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`step-${index}-type`} className=\"text-xs\">\n {t('workflows.steps.stepType')} *\n </Label>\n <Select\n value={step.stepType}\n onValueChange={(value) => updateStep(index, 'stepType', value)}\n >\n <SelectTrigger id={`step-${index}-type`} className=\"mt-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STEP_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {t(`workflows.steps.types.${type.value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`step-${index}-timeout`} className=\"text-xs\">\n {t('workflows.steps.timeout')} (ms)\n </Label>\n <Input\n id={`step-${index}-timeout`}\n type=\"number\"\n value={step.timeout || ''}\n onChange={(e) => updateStep(index, 'timeout', e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder=\"30000\"\n className=\"mt-1\"\n />\n </div>\n </div>\n\n {step.stepType === 'WAIT_FOR_TIMER' && (\n <div className=\"grid grid-cols-1 sm:grid-cols-[1fr_auto_1fr] gap-3 items-end\">\n <div>\n <Label htmlFor={`step-${index}-duration`} className=\"text-xs\">\n {t('workflows.activities.waitDuration')}\n </Label>\n <Input\n id={`step-${index}-duration`}\n value={step.config?.duration || ''}\n onChange={(e) => updateStep(index, 'config', { ...step.config, duration: e.target.value, until: undefined })}\n placeholder={t('workflows.activities.waitDurationPlaceholder')}\n className=\"mt-1\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.activities.waitDurationDescription')}\n </p>\n </div>\n <span className=\"text-xs text-muted-foreground pb-6\">{t('workflows.activities.waitOr')}</span>\n <div>\n <Label htmlFor={`step-${index}-until`} className=\"text-xs\">\n {t('workflows.activities.waitUntil')}\n </Label>\n <Input\n id={`step-${index}-until`}\n type=\"datetime-local\"\n value={step.config?.until ? step.config.until.slice(0, 16) : ''}\n onChange={(e) => updateStep(index, 'config', { ...step.config, until: e.target.value ? new Date(e.target.value).toISOString() : undefined, duration: undefined })}\n className=\"mt-1\"\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.activities.waitUntilDescription')}\n </p>\n </div>\n </div>\n )}\n\n <div>\n <Label htmlFor={`step-${index}-description`} className=\"text-xs\">\n {t('workflows.steps.singular')} {t('workflows.definitions.description')}\n </Label>\n <Textarea\n id={`step-${index}-description`}\n value={step.description || ''}\n onChange={(e) => updateStep(index, 'description', e.target.value)}\n placeholder={t('workflows.form.placeholders.description')}\n rows={2}\n className=\"mt-1\"\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["value"]
7
7
  }
@@ -157,7 +157,7 @@ function TransitionsEditor({ value = [], onChange, steps = [], error }) {
157
157
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", children: [
158
158
  /* @__PURE__ */ jsxs("div", { children: [
159
159
  /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("workflows.form.descriptions.transitions") }),
160
- error && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600 mt-1", children: error })
160
+ error && /* @__PURE__ */ jsx("p", { className: "text-sm text-status-error-text mt-1", children: error })
161
161
  ] }),
162
162
  /* @__PURE__ */ jsxs(Button, { type: "button", onClick: addTransition, variant: "outline", size: "sm", className: "w-full sm:w-auto", children: [
163
163
  /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4 mr-1" }),
@@ -234,7 +234,7 @@ function TransitionsEditor({ value = [], onChange, steps = [], error }) {
234
234
  size: "sm",
235
235
  onClick: () => removeTransition(index),
236
236
  title: t("common.delete"),
237
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 text-red-600" })
237
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 text-destructive" })
238
238
  }
239
239
  )
240
240
  ] })
@@ -411,7 +411,7 @@ function TransitionsEditor({ value = [], onChange, steps = [], error }) {
411
411
  size: "sm",
412
412
  onClick: () => removeActivity(index, activityIndex),
413
413
  title: t("common.delete"),
414
- children: /* @__PURE__ */ jsx(Trash2, { className: "h-3 w-3 text-red-600" })
414
+ children: /* @__PURE__ */ jsx(Trash2, { className: "h-3 w-3 text-destructive" })
415
415
  }
416
416
  )
417
417
  ] })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/components/TransitionsEditor.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Trash2, Plus, ChevronUp, ChevronDown } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ninterface Activity {\n activityId: string\n activityName: string\n activityType: string\n config?: Record<string, any>\n async?: boolean\n retryPolicy?: {\n maxAttempts?: number\n retryDelay?: number\n backoffMultiplier?: number\n }\n // Milliseconds, matching the executor and the definition schema. This field\n // used to be written as `timeout` (a number) while the schema typed `timeout`\n // as an ISO 8601 string, so saving a timeout from this editor failed\n // validation outright (#4424).\n timeoutMs?: number\n compensation?: Record<string, any>\n}\n\ninterface Transition {\n transitionId: string\n transitionName: string\n fromStepId: string\n toStepId: string\n trigger: string\n preConditions?: string[]\n postConditions?: string[]\n activities?: Activity[]\n priority?: number\n}\n\ninterface TransitionsEditorProps {\n value: Transition[]\n onChange: (transitions: Transition[]) => void\n steps?: any[]\n error?: string\n}\n\nconst TRIGGER_TYPES = [\n { value: 'auto', label: 'Automatic' },\n { value: 'manual', label: 'Manual' },\n { value: 'signal', label: 'Signal' },\n { value: 'timer', label: 'Timer' },\n]\n\nconst ACTIVITY_TYPES = [\n { value: 'SEND_EMAIL', label: 'Send Email' },\n { value: 'CALL_API', label: 'Call API' },\n { value: 'UPDATE_ENTITY', label: 'Update Entity' },\n { value: 'EMIT_EVENT', label: 'Emit Event' },\n { value: 'CALL_WEBHOOK', label: 'Call Webhook' },\n { value: 'EXECUTE_FUNCTION', label: 'Execute Function' },\n { value: 'WAIT', label: 'Wait' },\n]\n\ntype ConfigDraft = { text: string; error: string | null }\n\nexport function TransitionsEditor({ value = [], onChange, steps = [], error }: TransitionsEditorProps) {\n const t = useT()\n const [configDrafts, setConfigDrafts] = React.useState<Record<string, ConfigDraft>>({})\n\n const configDraftKey = (transition: Transition, activity: Activity) =>\n `${transition.transitionId}:${activity.activityId}`\n\n const handleConfigTextChange = (\n transitionIndex: number,\n activityIndex: number,\n text: string,\n ) => {\n const transition = value[transitionIndex]\n const activity = transition.activities?.[activityIndex]\n if (!activity) return\n\n let parsed: Record<string, unknown> | null = null\n let parseError: string | null = null\n try {\n const candidate = JSON.parse(text) as unknown\n if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) {\n parsed = candidate as Record<string, unknown>\n } else {\n parseError = t('workflows.activities.configMustBeObject', 'Config must be a JSON object')\n }\n } catch (err) {\n parseError = err instanceof Error\n ? err.message\n : t('workflows.activities.configInvalidJson', 'Invalid JSON')\n }\n\n const key = configDraftKey(transition, activity)\n setConfigDrafts((drafts) => ({ ...drafts, [key]: { text, error: parseError } }))\n if (parsed) updateActivity(transitionIndex, activityIndex, 'config', parsed)\n }\n\n const handleConfigBlur = (transition: Transition, activity: Activity) => {\n const key = configDraftKey(transition, activity)\n setConfigDrafts((drafts) => {\n if (!drafts[key] || drafts[key].error) return drafts\n const next = { ...drafts }\n delete next[key]\n return next\n })\n }\n\n const addTransition = () => {\n const newTransition: Transition = {\n transitionId: `transition_${Date.now()}`,\n transitionName: t('workflows.common.newTransition'),\n fromStepId: '',\n toStepId: '',\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n priority: 100,\n }\n onChange([...value, newTransition])\n }\n\n const updateTransition = (index: number, field: keyof Transition, fieldValue: any) => {\n const updated = [...value]\n updated[index] = { ...updated[index], [field]: fieldValue }\n onChange(updated)\n }\n\n const removeTransition = (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n }\n\n const moveTransition = (index: number, direction: 'up' | 'down') => {\n const newIndex = direction === 'up' ? index - 1 : index + 1\n if (newIndex < 0 || newIndex >= value.length) return\n\n const updated = [...value]\n const temp = updated[index]\n updated[index] = updated[newIndex]\n updated[newIndex] = temp\n onChange(updated)\n }\n\n const addActivity = (transitionIndex: number) => {\n const newActivity: Activity = {\n activityId: `activity_${Date.now()}`,\n activityName: t('workflows.common.newActivity'),\n activityType: 'CALL_API',\n config: {},\n async: false,\n retryPolicy: {\n maxAttempts: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n },\n }\n const updated = [...value]\n updated[transitionIndex] = {\n ...updated[transitionIndex],\n activities: [...(updated[transitionIndex].activities || []), newActivity],\n }\n onChange(updated)\n }\n\n const updateActivity = (transitionIndex: number, activityIndex: number, field: keyof Activity, fieldValue: any) => {\n const updated = [...value]\n const activities = [...(updated[transitionIndex].activities || [])]\n activities[activityIndex] = { ...activities[activityIndex], [field]: fieldValue }\n updated[transitionIndex] = { ...updated[transitionIndex], activities }\n onChange(updated)\n }\n\n const updateRetryPolicy = (transitionIndex: number, activityIndex: number, field: string, fieldValue: any) => {\n const updated = [...value]\n const activities = [...(updated[transitionIndex].activities || [])]\n activities[activityIndex] = {\n ...activities[activityIndex],\n retryPolicy: {\n ...activities[activityIndex].retryPolicy,\n [field]: fieldValue,\n },\n }\n updated[transitionIndex] = { ...updated[transitionIndex], activities }\n onChange(updated)\n }\n\n const removeActivity = (transitionIndex: number, activityIndex: number) => {\n const updated = [...value]\n updated[transitionIndex] = {\n ...updated[transitionIndex],\n activities: (updated[transitionIndex].activities || []).filter((_, i) => i !== activityIndex),\n }\n onChange(updated)\n }\n\n const moveActivity = (transitionIndex: number, activityIndex: number, direction: 'up' | 'down') => {\n const activities = value[transitionIndex].activities || []\n const newIndex = direction === 'up' ? activityIndex - 1 : activityIndex + 1\n if (newIndex < 0 || newIndex >= activities.length) return\n\n const updated = [...value]\n const updatedActivities = [...activities]\n const temp = updatedActivities[activityIndex]\n updatedActivities[activityIndex] = updatedActivities[newIndex]\n updatedActivities[newIndex] = temp\n updated[transitionIndex] = { ...updated[transitionIndex], activities: updatedActivities }\n onChange(updated)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">\n {t('workflows.form.descriptions.transitions')}\n </p>\n {error && <p className=\"text-sm text-red-600 mt-1\">{error}</p>}\n </div>\n <Button type=\"button\" onClick={addTransition} variant=\"outline\" size=\"sm\" className=\"w-full sm:w-auto\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('workflows.form.addTransition')}\n </Button>\n </div>\n\n {value.length === 0 && (\n <div className=\"p-6 text-center text-muted-foreground border rounded-md bg-muted\">\n {t('workflows.form.noTransitions')}\n </div>\n )}\n\n <div className=\"space-y-3\">\n {value.map((transition, index) => (\n <div key={index} className=\"p-4 border rounded-md bg-card shadow-sm border-l-4 border-l-blue-500\">\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1 grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`transition-${index}-id`} className=\"text-xs\">\n {t('workflows.transitions.transitionId')} *\n </Label>\n <Input\n id={`transition-${index}-id`}\n value={transition.transitionId}\n onChange={(e) => updateTransition(index, 'transitionId', e.target.value)}\n placeholder=\"transition_name\"\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor={`transition-${index}-name`} className=\"text-xs\">\n {t('workflows.transitions.transitionName')} *\n </Label>\n <Input\n id={`transition-${index}-name`}\n value={transition.transitionName}\n onChange={(e) => updateTransition(index, 'transitionName', e.target.value)}\n placeholder={t('workflows.transitions.transitionName')}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-1 self-end sm:self-auto\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveTransition(index, 'up')}\n disabled={index === 0}\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveTransition(index, 'down')}\n disabled={index === value.length - 1}\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => removeTransition(index)}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-4 w-4 text-red-600\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-3\">\n <div>\n <Label htmlFor={`transition-${index}-from`} className=\"text-xs\">\n {t('workflows.transitions.fromStep')} *\n </Label>\n <Select\n value={transition.fromStepId || undefined}\n onValueChange={(value) => updateTransition(index, 'fromStepId', value ?? '')}\n >\n <SelectTrigger id={`transition-${index}-from`} className=\"mt-1\">\n <SelectValue placeholder={t('workflows.form.selectStep')} />\n </SelectTrigger>\n <SelectContent>\n {steps.map((step: any) => (\n <SelectItem key={step.stepId} value={step.stepId}>\n {step.stepName || step.stepId}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`transition-${index}-to`} className=\"text-xs\">\n {t('workflows.transitions.toStep')} *\n </Label>\n <Select\n value={transition.toStepId || undefined}\n onValueChange={(value) => updateTransition(index, 'toStepId', value ?? '')}\n >\n <SelectTrigger id={`transition-${index}-to`} className=\"mt-1\">\n <SelectValue placeholder={t('workflows.form.selectStep')} />\n </SelectTrigger>\n <SelectContent>\n {steps.map((step: any) => (\n <SelectItem key={step.stepId} value={step.stepId}>\n {step.stepName || step.stepId}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`transition-${index}-trigger`} className=\"text-xs\">\n {t('workflows.transitions.trigger')} *\n </Label>\n <Select\n value={transition.trigger}\n onValueChange={(value) => updateTransition(index, 'trigger', value)}\n >\n <SelectTrigger id={`transition-${index}-trigger`} className=\"mt-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRIGGER_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {t(`workflows.transitions.triggers.${type.value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`transition-${index}-priority`} className=\"text-xs\">\n {t('workflows.transitions.priority')}\n </Label>\n <Input\n id={`transition-${index}-priority`}\n type=\"number\"\n value={transition.priority || 100}\n onChange={(e) => updateTransition(index, 'priority', parseInt(e.target.value))}\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor={`transition-${index}-preconditions`} className=\"text-xs\">\n {t('workflows.transitions.preConditions')}\n </Label>\n <Input\n id={`transition-${index}-preconditions`}\n value={(transition.preConditions || []).join(', ')}\n onChange={(e) => updateTransition(index, 'preConditions', e.target.value.split(',').map(s => s.trim()).filter(Boolean))}\n placeholder=\"rule_id_1, rule_id_2\"\n className=\"mt-1\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 pl-4 border-l-2 border-border\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between mb-3\">\n <Label className=\"text-xs font-semibold text-foreground\">\n {t('workflows.transitions.activities')}\n </Label>\n <Button\n type=\"button\"\n onClick={() => addActivity(index)}\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full sm:w-auto\"\n >\n <Plus className=\"h-3 w-3 mr-1\" />\n {t('workflows.form.addActivity')}\n </Button>\n </div>\n\n {(transition.activities || []).length === 0 && (\n <div className=\"p-3 text-center text-xs text-muted-foreground border rounded-md bg-muted\">\n {t('workflows.form.noActivitiesInTransition')}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {(transition.activities || []).map((activity, activityIndex) => {\n const draftKey = configDraftKey(transition, activity)\n const configDraft = configDrafts[draftKey]\n return (\n <div key={draftKey} className=\"p-3 border rounded-md bg-muted shadow-sm border-l-4 border-l-green-500\">\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1 grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-id`} className=\"text-xs\">\n {t('workflows.activities.activityId')} *\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-id`}\n value={activity.activityId}\n onChange={(e) => updateActivity(index, activityIndex, 'activityId', e.target.value)}\n placeholder=\"activity_name\"\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-name`} className=\"text-xs\">\n {t('workflows.activities.activityName')} *\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-name`}\n value={activity.activityName}\n onChange={(e) => updateActivity(index, activityIndex, 'activityName', e.target.value)}\n placeholder={t('workflows.activities.activityName')}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-1 self-end sm:self-auto\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveActivity(index, activityIndex, 'up')}\n disabled={activityIndex === 0}\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveActivity(index, activityIndex, 'down')}\n disabled={activityIndex === (transition.activities || []).length - 1}\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => removeActivity(index, activityIndex)}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-3 w-3 text-red-600\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-type`} className=\"text-xs\">\n {t('workflows.activities.activityType')} *\n </Label>\n <Select\n value={activity.activityType}\n onValueChange={(value) => updateActivity(index, activityIndex, 'activityType', value)}\n >\n <SelectTrigger id={`activity-${index}-${activityIndex}-type`} size=\"sm\" className=\"mt-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ACTIVITY_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {t(`workflows.activities.types.${type.value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-timeout`} className=\"text-xs\">\n {t('workflows.activities.timeout')} (ms)\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-timeout`}\n type=\"number\"\n value={activity.timeoutMs || ''}\n onChange={(e) => updateActivity(index, activityIndex, 'timeoutMs', e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder=\"30000\"\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div className=\"flex items-end pb-1\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id={`activity-${index}-${activityIndex}-async`}\n checked={activity.async || false}\n onChange={(e) => updateActivity(index, activityIndex, 'async', e.target.checked)}\n className=\"h-3 w-3\"\n />\n <Label htmlFor={`activity-${index}-${activityIndex}-async`} className=\"text-xs cursor-pointer\">\n {t('workflows.activities.async')}\n </Label>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-retry-attempts`} className=\"text-xs\">\n {t('workflows.form.maxRetryAttempts')}\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-retry-attempts`}\n type=\"number\"\n value={activity.retryPolicy?.maxAttempts || 3}\n onChange={(e) => updateRetryPolicy(index, activityIndex, 'maxAttempts', parseInt(e.target.value))}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-retry-delay`} className=\"text-xs\">\n {t('workflows.form.retryDelay')} (ms)\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-retry-delay`}\n type=\"number\"\n value={activity.retryPolicy?.retryDelay || 1000}\n onChange={(e) => updateRetryPolicy(index, activityIndex, 'retryDelay', parseInt(e.target.value))}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-backoff`} className=\"text-xs\">\n {t('workflows.form.backoffMultiplier')}\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-backoff`}\n type=\"number\"\n step=\"0.1\"\n value={activity.retryPolicy?.backoffMultiplier || 2}\n onChange={(e) => updateRetryPolicy(index, activityIndex, 'backoffMultiplier', parseFloat(e.target.value))}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n </div>\n\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-config`} className=\"text-xs\">\n {t('workflows.activities.config')} (JSON)\n </Label>\n <Textarea\n id={`activity-${index}-${activityIndex}-config`}\n value={configDraft?.text ?? JSON.stringify(activity.config || {}, null, 2)}\n onChange={(e) => handleConfigTextChange(index, activityIndex, e.target.value)}\n onBlur={() => handleConfigBlur(transition, activity)}\n aria-invalid={configDraft?.error ? true : undefined}\n aria-describedby={configDraft?.error ? `activity-${index}-${activityIndex}-config-error` : undefined}\n placeholder='{\"key\": \"value\"}'\n rows={2}\n className=\"mt-1 font-mono text-xs\"\n />\n {configDraft?.error ? (\n <p\n id={`activity-${index}-${activityIndex}-config-error`}\n className=\"mt-1 text-xs text-status-error-text\"\n role=\"alert\"\n >\n {configDraft.error}\n </p>\n ) : null}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Trash2, Plus, ChevronUp, ChevronDown } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\ninterface Activity {\n activityId: string\n activityName: string\n activityType: string\n config?: Record<string, any>\n async?: boolean\n retryPolicy?: {\n maxAttempts?: number\n retryDelay?: number\n backoffMultiplier?: number\n }\n // Milliseconds, matching the executor and the definition schema. This field\n // used to be written as `timeout` (a number) while the schema typed `timeout`\n // as an ISO 8601 string, so saving a timeout from this editor failed\n // validation outright (#4424).\n timeoutMs?: number\n compensation?: Record<string, any>\n}\n\ninterface Transition {\n transitionId: string\n transitionName: string\n fromStepId: string\n toStepId: string\n trigger: string\n preConditions?: string[]\n postConditions?: string[]\n activities?: Activity[]\n priority?: number\n}\n\ninterface TransitionsEditorProps {\n value: Transition[]\n onChange: (transitions: Transition[]) => void\n steps?: any[]\n error?: string\n}\n\nconst TRIGGER_TYPES = [\n { value: 'auto', label: 'Automatic' },\n { value: 'manual', label: 'Manual' },\n { value: 'signal', label: 'Signal' },\n { value: 'timer', label: 'Timer' },\n]\n\nconst ACTIVITY_TYPES = [\n { value: 'SEND_EMAIL', label: 'Send Email' },\n { value: 'CALL_API', label: 'Call API' },\n { value: 'UPDATE_ENTITY', label: 'Update Entity' },\n { value: 'EMIT_EVENT', label: 'Emit Event' },\n { value: 'CALL_WEBHOOK', label: 'Call Webhook' },\n { value: 'EXECUTE_FUNCTION', label: 'Execute Function' },\n { value: 'WAIT', label: 'Wait' },\n]\n\ntype ConfigDraft = { text: string; error: string | null }\n\nexport function TransitionsEditor({ value = [], onChange, steps = [], error }: TransitionsEditorProps) {\n const t = useT()\n const [configDrafts, setConfigDrafts] = React.useState<Record<string, ConfigDraft>>({})\n\n const configDraftKey = (transition: Transition, activity: Activity) =>\n `${transition.transitionId}:${activity.activityId}`\n\n const handleConfigTextChange = (\n transitionIndex: number,\n activityIndex: number,\n text: string,\n ) => {\n const transition = value[transitionIndex]\n const activity = transition.activities?.[activityIndex]\n if (!activity) return\n\n let parsed: Record<string, unknown> | null = null\n let parseError: string | null = null\n try {\n const candidate = JSON.parse(text) as unknown\n if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) {\n parsed = candidate as Record<string, unknown>\n } else {\n parseError = t('workflows.activities.configMustBeObject', 'Config must be a JSON object')\n }\n } catch (err) {\n parseError = err instanceof Error\n ? err.message\n : t('workflows.activities.configInvalidJson', 'Invalid JSON')\n }\n\n const key = configDraftKey(transition, activity)\n setConfigDrafts((drafts) => ({ ...drafts, [key]: { text, error: parseError } }))\n if (parsed) updateActivity(transitionIndex, activityIndex, 'config', parsed)\n }\n\n const handleConfigBlur = (transition: Transition, activity: Activity) => {\n const key = configDraftKey(transition, activity)\n setConfigDrafts((drafts) => {\n if (!drafts[key] || drafts[key].error) return drafts\n const next = { ...drafts }\n delete next[key]\n return next\n })\n }\n\n const addTransition = () => {\n const newTransition: Transition = {\n transitionId: `transition_${Date.now()}`,\n transitionName: t('workflows.common.newTransition'),\n fromStepId: '',\n toStepId: '',\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n priority: 100,\n }\n onChange([...value, newTransition])\n }\n\n const updateTransition = (index: number, field: keyof Transition, fieldValue: any) => {\n const updated = [...value]\n updated[index] = { ...updated[index], [field]: fieldValue }\n onChange(updated)\n }\n\n const removeTransition = (index: number) => {\n onChange(value.filter((_, i) => i !== index))\n }\n\n const moveTransition = (index: number, direction: 'up' | 'down') => {\n const newIndex = direction === 'up' ? index - 1 : index + 1\n if (newIndex < 0 || newIndex >= value.length) return\n\n const updated = [...value]\n const temp = updated[index]\n updated[index] = updated[newIndex]\n updated[newIndex] = temp\n onChange(updated)\n }\n\n const addActivity = (transitionIndex: number) => {\n const newActivity: Activity = {\n activityId: `activity_${Date.now()}`,\n activityName: t('workflows.common.newActivity'),\n activityType: 'CALL_API',\n config: {},\n async: false,\n retryPolicy: {\n maxAttempts: 3,\n retryDelay: 1000,\n backoffMultiplier: 2,\n },\n }\n const updated = [...value]\n updated[transitionIndex] = {\n ...updated[transitionIndex],\n activities: [...(updated[transitionIndex].activities || []), newActivity],\n }\n onChange(updated)\n }\n\n const updateActivity = (transitionIndex: number, activityIndex: number, field: keyof Activity, fieldValue: any) => {\n const updated = [...value]\n const activities = [...(updated[transitionIndex].activities || [])]\n activities[activityIndex] = { ...activities[activityIndex], [field]: fieldValue }\n updated[transitionIndex] = { ...updated[transitionIndex], activities }\n onChange(updated)\n }\n\n const updateRetryPolicy = (transitionIndex: number, activityIndex: number, field: string, fieldValue: any) => {\n const updated = [...value]\n const activities = [...(updated[transitionIndex].activities || [])]\n activities[activityIndex] = {\n ...activities[activityIndex],\n retryPolicy: {\n ...activities[activityIndex].retryPolicy,\n [field]: fieldValue,\n },\n }\n updated[transitionIndex] = { ...updated[transitionIndex], activities }\n onChange(updated)\n }\n\n const removeActivity = (transitionIndex: number, activityIndex: number) => {\n const updated = [...value]\n updated[transitionIndex] = {\n ...updated[transitionIndex],\n activities: (updated[transitionIndex].activities || []).filter((_, i) => i !== activityIndex),\n }\n onChange(updated)\n }\n\n const moveActivity = (transitionIndex: number, activityIndex: number, direction: 'up' | 'down') => {\n const activities = value[transitionIndex].activities || []\n const newIndex = direction === 'up' ? activityIndex - 1 : activityIndex + 1\n if (newIndex < 0 || newIndex >= activities.length) return\n\n const updated = [...value]\n const updatedActivities = [...activities]\n const temp = updatedActivities[activityIndex]\n updatedActivities[activityIndex] = updatedActivities[newIndex]\n updatedActivities[newIndex] = temp\n updated[transitionIndex] = { ...updated[transitionIndex], activities: updatedActivities }\n onChange(updated)\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">\n {t('workflows.form.descriptions.transitions')}\n </p>\n {error && <p className=\"text-sm text-status-error-text mt-1\">{error}</p>}\n </div>\n <Button type=\"button\" onClick={addTransition} variant=\"outline\" size=\"sm\" className=\"w-full sm:w-auto\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('workflows.form.addTransition')}\n </Button>\n </div>\n\n {value.length === 0 && (\n <div className=\"p-6 text-center text-muted-foreground border rounded-md bg-muted\">\n {t('workflows.form.noTransitions')}\n </div>\n )}\n\n <div className=\"space-y-3\">\n {value.map((transition, index) => (\n <div key={index} className=\"p-4 border rounded-md bg-card shadow-sm border-l-4 border-l-blue-500\">\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1 grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`transition-${index}-id`} className=\"text-xs\">\n {t('workflows.transitions.transitionId')} *\n </Label>\n <Input\n id={`transition-${index}-id`}\n value={transition.transitionId}\n onChange={(e) => updateTransition(index, 'transitionId', e.target.value)}\n placeholder=\"transition_name\"\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor={`transition-${index}-name`} className=\"text-xs\">\n {t('workflows.transitions.transitionName')} *\n </Label>\n <Input\n id={`transition-${index}-name`}\n value={transition.transitionName}\n onChange={(e) => updateTransition(index, 'transitionName', e.target.value)}\n placeholder={t('workflows.transitions.transitionName')}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-1 self-end sm:self-auto\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveTransition(index, 'up')}\n disabled={index === 0}\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveTransition(index, 'down')}\n disabled={index === value.length - 1}\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => removeTransition(index)}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-4 w-4 text-destructive\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-3\">\n <div>\n <Label htmlFor={`transition-${index}-from`} className=\"text-xs\">\n {t('workflows.transitions.fromStep')} *\n </Label>\n <Select\n value={transition.fromStepId || undefined}\n onValueChange={(value) => updateTransition(index, 'fromStepId', value ?? '')}\n >\n <SelectTrigger id={`transition-${index}-from`} className=\"mt-1\">\n <SelectValue placeholder={t('workflows.form.selectStep')} />\n </SelectTrigger>\n <SelectContent>\n {steps.map((step: any) => (\n <SelectItem key={step.stepId} value={step.stepId}>\n {step.stepName || step.stepId}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`transition-${index}-to`} className=\"text-xs\">\n {t('workflows.transitions.toStep')} *\n </Label>\n <Select\n value={transition.toStepId || undefined}\n onValueChange={(value) => updateTransition(index, 'toStepId', value ?? '')}\n >\n <SelectTrigger id={`transition-${index}-to`} className=\"mt-1\">\n <SelectValue placeholder={t('workflows.form.selectStep')} />\n </SelectTrigger>\n <SelectContent>\n {steps.map((step: any) => (\n <SelectItem key={step.stepId} value={step.stepId}>\n {step.stepName || step.stepId}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`transition-${index}-trigger`} className=\"text-xs\">\n {t('workflows.transitions.trigger')} *\n </Label>\n <Select\n value={transition.trigger}\n onValueChange={(value) => updateTransition(index, 'trigger', value)}\n >\n <SelectTrigger id={`transition-${index}-trigger`} className=\"mt-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRIGGER_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {t(`workflows.transitions.triggers.${type.value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <Label htmlFor={`transition-${index}-priority`} className=\"text-xs\">\n {t('workflows.transitions.priority')}\n </Label>\n <Input\n id={`transition-${index}-priority`}\n type=\"number\"\n value={transition.priority || 100}\n onChange={(e) => updateTransition(index, 'priority', parseInt(e.target.value))}\n className=\"mt-1\"\n />\n </div>\n <div>\n <Label htmlFor={`transition-${index}-preconditions`} className=\"text-xs\">\n {t('workflows.transitions.preConditions')}\n </Label>\n <Input\n id={`transition-${index}-preconditions`}\n value={(transition.preConditions || []).join(', ')}\n onChange={(e) => updateTransition(index, 'preConditions', e.target.value.split(',').map(s => s.trim()).filter(Boolean))}\n placeholder=\"rule_id_1, rule_id_2\"\n className=\"mt-1\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 pl-4 border-l-2 border-border\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between mb-3\">\n <Label className=\"text-xs font-semibold text-foreground\">\n {t('workflows.transitions.activities')}\n </Label>\n <Button\n type=\"button\"\n onClick={() => addActivity(index)}\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full sm:w-auto\"\n >\n <Plus className=\"h-3 w-3 mr-1\" />\n {t('workflows.form.addActivity')}\n </Button>\n </div>\n\n {(transition.activities || []).length === 0 && (\n <div className=\"p-3 text-center text-xs text-muted-foreground border rounded-md bg-muted\">\n {t('workflows.form.noActivitiesInTransition')}\n </div>\n )}\n\n <div className=\"space-y-2\">\n {(transition.activities || []).map((activity, activityIndex) => {\n const draftKey = configDraftKey(transition, activity)\n const configDraft = configDrafts[draftKey]\n return (\n <div key={draftKey} className=\"p-3 border rounded-md bg-muted shadow-sm border-l-4 border-l-green-500\">\n <div className=\"space-y-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex-1 grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-id`} className=\"text-xs\">\n {t('workflows.activities.activityId')} *\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-id`}\n value={activity.activityId}\n onChange={(e) => updateActivity(index, activityIndex, 'activityId', e.target.value)}\n placeholder=\"activity_name\"\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-name`} className=\"text-xs\">\n {t('workflows.activities.activityName')} *\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-name`}\n value={activity.activityName}\n onChange={(e) => updateActivity(index, activityIndex, 'activityName', e.target.value)}\n placeholder={t('workflows.activities.activityName')}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-1 self-end sm:self-auto\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveActivity(index, activityIndex, 'up')}\n disabled={activityIndex === 0}\n title={t('common.moveUp')}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => moveActivity(index, activityIndex, 'down')}\n disabled={activityIndex === (transition.activities || []).length - 1}\n title={t('common.moveDown')}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => removeActivity(index, activityIndex)}\n title={t('common.delete')}\n >\n <Trash2 className=\"h-3 w-3 text-destructive\" />\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-type`} className=\"text-xs\">\n {t('workflows.activities.activityType')} *\n </Label>\n <Select\n value={activity.activityType}\n onValueChange={(value) => updateActivity(index, activityIndex, 'activityType', value)}\n >\n <SelectTrigger id={`activity-${index}-${activityIndex}-type`} size=\"sm\" className=\"mt-1\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ACTIVITY_TYPES.map((type) => (\n <SelectItem key={type.value} value={type.value}>\n {t(`workflows.activities.types.${type.value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-timeout`} className=\"text-xs\">\n {t('workflows.activities.timeout')} (ms)\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-timeout`}\n type=\"number\"\n value={activity.timeoutMs || ''}\n onChange={(e) => updateActivity(index, activityIndex, 'timeoutMs', e.target.value ? parseInt(e.target.value) : undefined)}\n placeholder=\"30000\"\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div className=\"flex items-end pb-1\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id={`activity-${index}-${activityIndex}-async`}\n checked={activity.async || false}\n onChange={(e) => updateActivity(index, activityIndex, 'async', e.target.checked)}\n className=\"h-3 w-3\"\n />\n <Label htmlFor={`activity-${index}-${activityIndex}-async`} className=\"text-xs cursor-pointer\">\n {t('workflows.activities.async')}\n </Label>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-retry-attempts`} className=\"text-xs\">\n {t('workflows.form.maxRetryAttempts')}\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-retry-attempts`}\n type=\"number\"\n value={activity.retryPolicy?.maxAttempts || 3}\n onChange={(e) => updateRetryPolicy(index, activityIndex, 'maxAttempts', parseInt(e.target.value))}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-retry-delay`} className=\"text-xs\">\n {t('workflows.form.retryDelay')} (ms)\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-retry-delay`}\n type=\"number\"\n value={activity.retryPolicy?.retryDelay || 1000}\n onChange={(e) => updateRetryPolicy(index, activityIndex, 'retryDelay', parseInt(e.target.value))}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-backoff`} className=\"text-xs\">\n {t('workflows.form.backoffMultiplier')}\n </Label>\n <Input\n id={`activity-${index}-${activityIndex}-backoff`}\n type=\"number\"\n step=\"0.1\"\n value={activity.retryPolicy?.backoffMultiplier || 2}\n onChange={(e) => updateRetryPolicy(index, activityIndex, 'backoffMultiplier', parseFloat(e.target.value))}\n className=\"mt-1 text-xs h-8\"\n />\n </div>\n </div>\n\n <div>\n <Label htmlFor={`activity-${index}-${activityIndex}-config`} className=\"text-xs\">\n {t('workflows.activities.config')} (JSON)\n </Label>\n <Textarea\n id={`activity-${index}-${activityIndex}-config`}\n value={configDraft?.text ?? JSON.stringify(activity.config || {}, null, 2)}\n onChange={(e) => handleConfigTextChange(index, activityIndex, e.target.value)}\n onBlur={() => handleConfigBlur(transition, activity)}\n aria-invalid={configDraft?.error ? true : undefined}\n aria-describedby={configDraft?.error ? `activity-${index}-${activityIndex}-config-error` : undefined}\n placeholder='{\"key\": \"value\"}'\n rows={2}\n className=\"mt-1 font-mono text-xs\"\n />\n {configDraft?.error ? (\n <p\n id={`activity-${index}-${activityIndex}-config-error`}\n className=\"mt-1 text-xs text-status-error-text\"\n role=\"alert\"\n >\n {configDraft.error}\n </p>\n ) : null}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["value"]
7
7
  }
@@ -30,7 +30,7 @@ function WorkflowLegend() {
30
30
  /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold text-foreground mb-3", children: t("workflows.legend.edgeStatesTitle") }),
31
31
  /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
32
32
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
33
- /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 w-8 h-0.5 bg-emerald-500" }),
33
+ /* @__PURE__ */ jsx("div", { className: "flex-shrink-0 w-8 h-0.5 bg-status-success-solid" }),
34
34
  /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: t("workflows.legend.edgeState.completed") })
35
35
  ] }),
36
36
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [