@open-mercato/core 0.6.8-develop.6908.1.4792c7717e → 0.6.8-develop.6910.1.560e304de2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/workflows/components/NodeEditDialog.js +3 -2
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/TransitionsEditor.js +8 -4
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +8 -4
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +1 -14
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/dist/modules/workflows/lib/activityTimeoutFields.js +28 -0
- package/dist/modules/workflows/lib/activityTimeoutFields.js.map +7 -0
- package/dist/modules/workflows/lib/duration.js +20 -1
- package/dist/modules/workflows/lib/duration.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/workflows/components/NodeEditDialog.tsx +3 -2
- package/src/modules/workflows/components/TransitionsEditor.tsx +11 -4
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +9 -4
- package/src/modules/workflows/lib/activity-executor.ts +7 -27
- package/src/modules/workflows/lib/activityTimeoutFields.ts +75 -0
- package/src/modules/workflows/lib/duration.ts +37 -0
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { Textarea } from "@open-mercato/ui/primitives/textarea";
|
|
15
15
|
import { Trash2, Plus, ChevronUp, ChevronDown } from "lucide-react";
|
|
16
16
|
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
17
|
+
import { millisecondTimeoutInputValue, millisecondTimeoutPatch } from "../lib/activityTimeoutFields.js";
|
|
17
18
|
const TRIGGER_TYPES = [
|
|
18
19
|
{ value: "auto", label: "Automatic" },
|
|
19
20
|
{ value: "manual", label: "Manual" },
|
|
@@ -113,13 +114,16 @@ function TransitionsEditor({ value = [], onChange, steps = [], error }) {
|
|
|
113
114
|
};
|
|
114
115
|
onChange(updated);
|
|
115
116
|
};
|
|
116
|
-
const
|
|
117
|
+
const patchActivity = (transitionIndex, activityIndex, patch) => {
|
|
117
118
|
const updated = [...value];
|
|
118
119
|
const activities = [...updated[transitionIndex].activities || []];
|
|
119
|
-
activities[activityIndex] = { ...activities[activityIndex],
|
|
120
|
+
activities[activityIndex] = { ...activities[activityIndex], ...patch };
|
|
120
121
|
updated[transitionIndex] = { ...updated[transitionIndex], activities };
|
|
121
122
|
onChange(updated);
|
|
122
123
|
};
|
|
124
|
+
const updateActivity = (transitionIndex, activityIndex, field, fieldValue) => {
|
|
125
|
+
patchActivity(transitionIndex, activityIndex, { [field]: fieldValue });
|
|
126
|
+
};
|
|
123
127
|
const updateRetryPolicy = (transitionIndex, activityIndex, field, fieldValue) => {
|
|
124
128
|
const updated = [...value];
|
|
125
129
|
const activities = [...updated[transitionIndex].activities || []];
|
|
@@ -444,8 +448,8 @@ function TransitionsEditor({ value = [], onChange, steps = [], error }) {
|
|
|
444
448
|
{
|
|
445
449
|
id: `activity-${index}-${activityIndex}-timeout`,
|
|
446
450
|
type: "number",
|
|
447
|
-
value: activity
|
|
448
|
-
onChange: (e) =>
|
|
451
|
+
value: millisecondTimeoutInputValue(activity),
|
|
452
|
+
onChange: (e) => patchActivity(index, activityIndex, millisecondTimeoutPatch(e.target.value)),
|
|
449
453
|
placeholder: "30000",
|
|
450
454
|
className: "mt-1 text-xs h-8"
|
|
451
455
|
}
|
|
@@ -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-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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",
|
|
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'\nimport { millisecondTimeoutInputValue, millisecondTimeoutPatch } from '../lib/activityTimeoutFields'\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 /** @deprecated Use `timeoutMs`. Written by the CrudForm activity editor as a duration or millisecond string. */\n timeout?: string\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 patchActivity = (transitionIndex: number, activityIndex: number, patch: Partial<Activity>) => {\n const updated = [...value]\n const activities = [...(updated[transitionIndex].activities || [])]\n activities[activityIndex] = { ...activities[activityIndex], ...patch }\n updated[transitionIndex] = { ...updated[transitionIndex], activities }\n onChange(updated)\n }\n\n const updateActivity = (transitionIndex: number, activityIndex: number, field: keyof Activity, fieldValue: any) => {\n patchActivity(transitionIndex, activityIndex, { [field]: fieldValue })\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={millisecondTimeoutInputValue(activity)}\n onChange={(e) => patchActivity(index, activityIndex, millisecondTimeoutPatch(e.target.value))}\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
|
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
import { ChevronDown, Plus, Trash2 } from "lucide-react";
|
|
17
17
|
import { JsonBuilder } from "@open-mercato/ui/backend/JsonBuilder";
|
|
18
18
|
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
19
|
+
import { durationTimeoutInputValue, durationTimeoutPatch } from "../../lib/activityTimeoutFields.js";
|
|
19
20
|
function ActivityArrayEditor({ id, value = [], error, setValue, disabled }) {
|
|
20
21
|
const t = useT();
|
|
21
22
|
const { confirm, ConfirmDialogElement } = useConfirmDialog();
|
|
@@ -63,11 +64,14 @@ function ActivityArrayEditor({ id, value = [], error, setValue, disabled }) {
|
|
|
63
64
|
newExpanded.delete(index);
|
|
64
65
|
setExpandedIndices(newExpanded);
|
|
65
66
|
};
|
|
66
|
-
const
|
|
67
|
+
const patchActivity = (index, patch) => {
|
|
67
68
|
const updated = [...activities];
|
|
68
|
-
updated[index] = { ...updated[index],
|
|
69
|
+
updated[index] = { ...updated[index], ...patch };
|
|
69
70
|
setValue(updated);
|
|
70
71
|
};
|
|
72
|
+
const updateActivity = (index, field, fieldValue) => {
|
|
73
|
+
patchActivity(index, { [field]: fieldValue });
|
|
74
|
+
};
|
|
71
75
|
const updateRetryPolicy = (index, field, fieldValue) => {
|
|
72
76
|
const updated = [...activities];
|
|
73
77
|
updated[index] = {
|
|
@@ -194,8 +198,8 @@ function ActivityArrayEditor({ id, value = [], error, setValue, disabled }) {
|
|
|
194
198
|
{
|
|
195
199
|
id: `${id}-${index}-timeout`,
|
|
196
200
|
type: "text",
|
|
197
|
-
value: activity
|
|
198
|
-
onChange: (e) =>
|
|
201
|
+
value: durationTimeoutInputValue(activity),
|
|
202
|
+
onChange: (e) => patchActivity(index, durationTimeoutPatch(e.target.value)),
|
|
199
203
|
placeholder: t("workflows.fieldEditors.activities.timeoutPlaceholder"),
|
|
200
204
|
className: "text-xs",
|
|
201
205
|
disabled
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/workflows/components/fields/ActivityArrayEditor.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport { useState } from 'react'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\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 { ChevronDown, Plus, Trash2 } from 'lucide-react'\nimport { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'\nimport type { CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\n/**\n * Activity definition structure\n */\nexport interface Activity {\n activityId: string\n activityName: string\n activityType: 'SEND_EMAIL' | 'CALL_API' | 'UPDATE_ENTITY' | 'EMIT_EVENT' | 'CALL_WEBHOOK' | 'EXECUTE_FUNCTION' | 'WAIT'\n config: Record<string, any>\n timeout?: string\n timeoutMs?: number\n async?: boolean\n compensate?: boolean\n retryPolicy?: {\n maxAttempts?: number\n initialIntervalMs?: number\n backoffCoefficient?: number\n maxIntervalMs?: number\n }\n}\n\ninterface ActivityArrayEditorProps extends CrudCustomFieldRenderProps {\n value: Activity[]\n}\n\n/**\n * ActivityArrayEditor - Custom field component for managing workflow activities\n *\n * Provides an interface to add, edit, and remove activities with:\n * - Activity ID, Name, Type selection\n * - Timeout configuration\n * - Nested retry policy (maxAttempts, intervals, backoff)\n * - Activity-specific JSON configuration\n * - Async and compensate flags\n *\n * Used by both EdgeEditDialog and NodeEditDialog (automated type)\n */\nexport function ActivityArrayEditor({ id, value = [], error, setValue, disabled }: ActivityArrayEditorProps) {\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [expandedIndices, setExpandedIndices] = useState<Set<number>>(new Set())\n\n const activities = Array.isArray(value) ? value : []\n\n const toggleExpanded = (index: number) => {\n const newExpanded = new Set(expandedIndices)\n if (newExpanded.has(index)) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedIndices(newExpanded)\n }\n\n const addActivity = () => {\n const newActivity: Activity = {\n activityId: `activity_${Date.now()}`,\n activityName: t('workflows.common.newActivity'),\n activityType: 'CALL_API',\n config: {},\n timeout: '',\n retryPolicy: {\n maxAttempts: 3,\n initialIntervalMs: 1000,\n backoffCoefficient: 2,\n maxIntervalMs: 10000,\n },\n }\n const newActivities = [...activities, newActivity]\n setValue(newActivities)\n\n // Auto-expand the newly added activity\n const newExpanded = new Set(expandedIndices)\n newExpanded.add(activities.length)\n setExpandedIndices(newExpanded)\n }\n\n const removeActivity = async (index: number) => {\n const confirmed = await confirm({\n title: t('workflows.fieldEditors.activities.removeActivity'),\n text: t('workflows.fieldEditors.activities.confirmRemove'),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const newActivities = activities.filter((_, i) => i !== index)\n setValue(newActivities)\n\n // Remove from expanded set\n const newExpanded = new Set(expandedIndices)\n newExpanded.delete(index)\n setExpandedIndices(newExpanded)\n }\n\n const updateActivity = (index: number, field: keyof Activity, fieldValue: any) => {\n const updated = [...activities]\n updated[index] = { ...updated[index], [field]: fieldValue }\n setValue(updated)\n }\n\n const updateRetryPolicy = (index: number, field: string, fieldValue: any) => {\n const updated = [...activities]\n updated[index] = {\n ...updated[index],\n retryPolicy: {\n ...updated[index].retryPolicy,\n [field]: fieldValue,\n },\n }\n setValue(updated)\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-end\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={addActivity}\n disabled={disabled}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.fieldEditors.activities.addActivity')}\n </Button>\n </div>\n\n {activities.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground bg-muted rounded-lg border\">\n {t('workflows.fieldEditors.activities.emptyState')}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {activities.map((activity, index) => {\n const isExpanded = expandedIndices.has(index)\n return (\n <div key={index} className=\"border border-gray-200 rounded-lg bg-gray-50\">\n {/* Collapsed Header */}\n <button\n type=\"button\"\n onClick={() => toggleExpanded(index)}\n disabled={disabled}\n className=\"w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 transition-colors rounded-t-lg disabled:opacity-50\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {activity.activityName || activity.activityId || `Activity ${index + 1}`}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {activity.activityType}\n </Badge>\n {activity.async && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Async\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-gray-600 mt-1\">\n ID: <code className=\"bg-white px-1 rounded\">{activity.activityId}</code>\n </p>\n </div>\n <ChevronDown\n className={`w-5 h-5 text-gray-400 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-gray-200 bg-white\">\n {/* Activity ID */}\n <div className=\"pt-3\">\n <Label htmlFor={`${id}-${index}-activityId`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.activityId')} *\n </Label>\n <Input\n id={`${id}-${index}-activityId`}\n type=\"text\"\n value={activity.activityId}\n onChange={(e) => updateActivity(index, 'activityId', e.target.value)}\n placeholder={t('workflows.fieldEditors.activities.activityIdPlaceholder')}\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n\n {/* Activity Name */}\n <div>\n <Label htmlFor={`${id}-${index}-activityName`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.activityName')} *\n </Label>\n <Input\n id={`${id}-${index}-activityName`}\n type=\"text\"\n value={activity.activityName || ''}\n onChange={(e) => updateActivity(index, 'activityName', e.target.value)}\n placeholder={t('workflows.fieldEditors.activities.activityNamePlaceholder')}\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n\n {/* Activity Type */}\n <div>\n <Label htmlFor={`${id}-${index}-activityType`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.activityType')} *\n </Label>\n <Select\n value={activity.activityType}\n onValueChange={(value) => updateActivity(index, 'activityType', value)}\n disabled={disabled}\n >\n <SelectTrigger id={`${id}-${index}-activityType`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"SEND_EMAIL\">{t('workflows.activities.types.SEND_EMAIL')}</SelectItem>\n <SelectItem value=\"CALL_API\">{t('workflows.activities.types.CALL_API')}</SelectItem>\n <SelectItem value=\"UPDATE_ENTITY\">{t('workflows.activities.types.UPDATE_ENTITY')}</SelectItem>\n <SelectItem value=\"EMIT_EVENT\">{t('workflows.activities.types.EMIT_EVENT')}</SelectItem>\n <SelectItem value=\"CALL_WEBHOOK\">{t('workflows.activities.types.CALL_WEBHOOK')}</SelectItem>\n <SelectItem value=\"EXECUTE_FUNCTION\">{t('workflows.activities.types.EXECUTE_FUNCTION')}</SelectItem>\n <SelectItem value=\"WAIT\">{t('workflows.activities.types.WAIT')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Timeout */}\n <div>\n <Label htmlFor={`${id}-${index}-timeout`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.timeout')}\n </Label>\n <Input\n id={`${id}-${index}-timeout`}\n type=\"text\"\n value={activity.timeout || ''}\n onChange={(e) => updateActivity(index, 'timeout', e.target.value)}\n placeholder={t('workflows.fieldEditors.activities.timeoutPlaceholder')}\n className=\"text-xs\"\n disabled={disabled}\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.fieldEditors.activities.timeoutHint')}\n </p>\n </div>\n\n {/* Retry Policy */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Label className=\"text-xs font-semibold mb-2 block\">{t('workflows.fieldEditors.activities.retryPolicy')}</Label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div>\n <Label htmlFor={`${id}-${index}-maxAttempts`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.maxAttempts')}\n </Label>\n <Input\n id={`${id}-${index}-maxAttempts`}\n type=\"number\"\n value={activity.retryPolicy?.maxAttempts || ''}\n onChange={(e) => updateRetryPolicy(index, 'maxAttempts', parseInt(e.target.value) || 0)}\n placeholder=\"3\"\n min=\"1\"\n max=\"10\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n <div>\n <Label htmlFor={`${id}-${index}-initialIntervalMs`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.initialInterval')}\n </Label>\n <Input\n id={`${id}-${index}-initialIntervalMs`}\n type=\"number\"\n value={activity.retryPolicy?.initialIntervalMs || ''}\n onChange={(e) => updateRetryPolicy(index, 'initialIntervalMs', parseInt(e.target.value) || 0)}\n placeholder=\"1000\"\n min=\"0\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n <div>\n <Label htmlFor={`${id}-${index}-backoffCoefficient`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.backoffCoefficient')}\n </Label>\n <Input\n id={`${id}-${index}-backoffCoefficient`}\n type=\"number\"\n step=\"0.1\"\n value={activity.retryPolicy?.backoffCoefficient || ''}\n onChange={(e) => updateRetryPolicy(index, 'backoffCoefficient', parseFloat(e.target.value) || 1)}\n placeholder=\"2\"\n min=\"1\"\n max=\"10\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n <div>\n <Label htmlFor={`${id}-${index}-maxIntervalMs`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.maxInterval')}\n </Label>\n <Input\n id={`${id}-${index}-maxIntervalMs`}\n type=\"number\"\n value={activity.retryPolicy?.maxIntervalMs || ''}\n onChange={(e) => updateRetryPolicy(index, 'maxIntervalMs', parseInt(e.target.value) || 0)}\n placeholder=\"10000\"\n min=\"0\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n\n {/* Activity Options */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Label className=\"text-xs font-semibold mb-2 block\">{t('workflows.fieldEditors.activities.activityOptions')}</Label>\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id={`${id}-${index}-async`}\n checked={activity.async || false}\n onChange={(e) => updateActivity(index, 'async', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n disabled={disabled}\n />\n <Label htmlFor={`${id}-${index}-async`} className=\"text-xs text-gray-700 cursor-pointer\">\n {t('workflows.fieldEditors.activities.asyncOption')}\n </Label>\n </div>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id={`${id}-${index}-compensate`}\n checked={activity.compensate || false}\n onChange={(e) => updateActivity(index, 'compensate', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n disabled={disabled}\n />\n <Label htmlFor={`${id}-${index}-compensate`} className=\"text-xs text-gray-700 cursor-pointer\">\n {t('workflows.fieldEditors.activities.compensateOption')}\n </Label>\n </div>\n </div>\n </div>\n\n {/* Configuration JSON */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Label className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.configurationJson')}\n </Label>\n <JsonBuilder\n value={activity.config || {}}\n onChange={(config) => updateActivity(index, 'config', config)}\n disabled={disabled}\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.fieldEditors.activities.configurationHint')}\n </p>\n </div>\n\n {/* Delete Button */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => removeActivity(index)}\n disabled={disabled}\n >\n <Trash2 className=\"size-4 mr-1\" />\n {t('workflows.fieldEditors.activities.removeActivity')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n {ConfirmDialogElement}\n </div>\n )\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport { useState } from 'react'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\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 { ChevronDown, Plus, Trash2 } from 'lucide-react'\nimport { JsonBuilder } from '@open-mercato/ui/backend/JsonBuilder'\nimport type { CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { durationTimeoutInputValue, durationTimeoutPatch } from '../../lib/activityTimeoutFields'\n\n/**\n * Activity definition structure\n */\nexport interface Activity {\n activityId: string\n activityName: string\n activityType: 'SEND_EMAIL' | 'CALL_API' | 'UPDATE_ENTITY' | 'EMIT_EVENT' | 'CALL_WEBHOOK' | 'EXECUTE_FUNCTION' | 'WAIT'\n config: Record<string, any>\n timeout?: string\n timeoutMs?: number\n async?: boolean\n compensate?: boolean\n retryPolicy?: {\n maxAttempts?: number\n initialIntervalMs?: number\n backoffCoefficient?: number\n maxIntervalMs?: number\n }\n}\n\ninterface ActivityArrayEditorProps extends CrudCustomFieldRenderProps {\n value: Activity[]\n}\n\n/**\n * ActivityArrayEditor - Custom field component for managing workflow activities\n *\n * Provides an interface to add, edit, and remove activities with:\n * - Activity ID, Name, Type selection\n * - Timeout configuration\n * - Nested retry policy (maxAttempts, intervals, backoff)\n * - Activity-specific JSON configuration\n * - Async and compensate flags\n *\n * Used by both EdgeEditDialog and NodeEditDialog (automated type)\n */\nexport function ActivityArrayEditor({ id, value = [], error, setValue, disabled }: ActivityArrayEditorProps) {\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [expandedIndices, setExpandedIndices] = useState<Set<number>>(new Set())\n\n const activities = Array.isArray(value) ? value : []\n\n const toggleExpanded = (index: number) => {\n const newExpanded = new Set(expandedIndices)\n if (newExpanded.has(index)) {\n newExpanded.delete(index)\n } else {\n newExpanded.add(index)\n }\n setExpandedIndices(newExpanded)\n }\n\n const addActivity = () => {\n const newActivity: Activity = {\n activityId: `activity_${Date.now()}`,\n activityName: t('workflows.common.newActivity'),\n activityType: 'CALL_API',\n config: {},\n timeout: '',\n retryPolicy: {\n maxAttempts: 3,\n initialIntervalMs: 1000,\n backoffCoefficient: 2,\n maxIntervalMs: 10000,\n },\n }\n const newActivities = [...activities, newActivity]\n setValue(newActivities)\n\n // Auto-expand the newly added activity\n const newExpanded = new Set(expandedIndices)\n newExpanded.add(activities.length)\n setExpandedIndices(newExpanded)\n }\n\n const removeActivity = async (index: number) => {\n const confirmed = await confirm({\n title: t('workflows.fieldEditors.activities.removeActivity'),\n text: t('workflows.fieldEditors.activities.confirmRemove'),\n variant: 'destructive',\n })\n if (!confirmed) return\n\n const newActivities = activities.filter((_, i) => i !== index)\n setValue(newActivities)\n\n // Remove from expanded set\n const newExpanded = new Set(expandedIndices)\n newExpanded.delete(index)\n setExpandedIndices(newExpanded)\n }\n\n const patchActivity = (index: number, patch: Partial<Activity>) => {\n const updated = [...activities]\n updated[index] = { ...updated[index], ...patch }\n setValue(updated)\n }\n\n const updateActivity = (index: number, field: keyof Activity, fieldValue: any) => {\n patchActivity(index, { [field]: fieldValue })\n }\n\n const updateRetryPolicy = (index: number, field: string, fieldValue: any) => {\n const updated = [...activities]\n updated[index] = {\n ...updated[index],\n retryPolicy: {\n ...updated[index].retryPolicy,\n [field]: fieldValue,\n },\n }\n setValue(updated)\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-end\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={addActivity}\n disabled={disabled}\n >\n <Plus className=\"size-3 mr-1\" />\n {t('workflows.fieldEditors.activities.addActivity')}\n </Button>\n </div>\n\n {activities.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground bg-muted rounded-lg border\">\n {t('workflows.fieldEditors.activities.emptyState')}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {activities.map((activity, index) => {\n const isExpanded = expandedIndices.has(index)\n return (\n <div key={index} className=\"border border-gray-200 rounded-lg bg-gray-50\">\n {/* Collapsed Header */}\n <button\n type=\"button\"\n onClick={() => toggleExpanded(index)}\n disabled={disabled}\n className=\"w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 transition-colors rounded-t-lg disabled:opacity-50\"\n >\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {activity.activityName || activity.activityId || `Activity ${index + 1}`}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {activity.activityType}\n </Badge>\n {activity.async && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Async\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-gray-600 mt-1\">\n ID: <code className=\"bg-white px-1 rounded\">{activity.activityId}</code>\n </p>\n </div>\n <ChevronDown\n className={`w-5 h-5 text-gray-400 transition-transform ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div className=\"px-4 pb-4 space-y-3 border-t border-gray-200 bg-white\">\n {/* Activity ID */}\n <div className=\"pt-3\">\n <Label htmlFor={`${id}-${index}-activityId`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.activityId')} *\n </Label>\n <Input\n id={`${id}-${index}-activityId`}\n type=\"text\"\n value={activity.activityId}\n onChange={(e) => updateActivity(index, 'activityId', e.target.value)}\n placeholder={t('workflows.fieldEditors.activities.activityIdPlaceholder')}\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n\n {/* Activity Name */}\n <div>\n <Label htmlFor={`${id}-${index}-activityName`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.activityName')} *\n </Label>\n <Input\n id={`${id}-${index}-activityName`}\n type=\"text\"\n value={activity.activityName || ''}\n onChange={(e) => updateActivity(index, 'activityName', e.target.value)}\n placeholder={t('workflows.fieldEditors.activities.activityNamePlaceholder')}\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n\n {/* Activity Type */}\n <div>\n <Label htmlFor={`${id}-${index}-activityType`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.activityType')} *\n </Label>\n <Select\n value={activity.activityType}\n onValueChange={(value) => updateActivity(index, 'activityType', value)}\n disabled={disabled}\n >\n <SelectTrigger id={`${id}-${index}-activityType`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"SEND_EMAIL\">{t('workflows.activities.types.SEND_EMAIL')}</SelectItem>\n <SelectItem value=\"CALL_API\">{t('workflows.activities.types.CALL_API')}</SelectItem>\n <SelectItem value=\"UPDATE_ENTITY\">{t('workflows.activities.types.UPDATE_ENTITY')}</SelectItem>\n <SelectItem value=\"EMIT_EVENT\">{t('workflows.activities.types.EMIT_EVENT')}</SelectItem>\n <SelectItem value=\"CALL_WEBHOOK\">{t('workflows.activities.types.CALL_WEBHOOK')}</SelectItem>\n <SelectItem value=\"EXECUTE_FUNCTION\">{t('workflows.activities.types.EXECUTE_FUNCTION')}</SelectItem>\n <SelectItem value=\"WAIT\">{t('workflows.activities.types.WAIT')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Timeout */}\n <div>\n <Label htmlFor={`${id}-${index}-timeout`} className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.timeout')}\n </Label>\n <Input\n id={`${id}-${index}-timeout`}\n type=\"text\"\n value={durationTimeoutInputValue(activity)}\n onChange={(e) => patchActivity(index, durationTimeoutPatch(e.target.value))}\n placeholder={t('workflows.fieldEditors.activities.timeoutPlaceholder')}\n className=\"text-xs\"\n disabled={disabled}\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.fieldEditors.activities.timeoutHint')}\n </p>\n </div>\n\n {/* Retry Policy */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Label className=\"text-xs font-semibold mb-2 block\">{t('workflows.fieldEditors.activities.retryPolicy')}</Label>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n <div>\n <Label htmlFor={`${id}-${index}-maxAttempts`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.maxAttempts')}\n </Label>\n <Input\n id={`${id}-${index}-maxAttempts`}\n type=\"number\"\n value={activity.retryPolicy?.maxAttempts || ''}\n onChange={(e) => updateRetryPolicy(index, 'maxAttempts', parseInt(e.target.value) || 0)}\n placeholder=\"3\"\n min=\"1\"\n max=\"10\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n <div>\n <Label htmlFor={`${id}-${index}-initialIntervalMs`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.initialInterval')}\n </Label>\n <Input\n id={`${id}-${index}-initialIntervalMs`}\n type=\"number\"\n value={activity.retryPolicy?.initialIntervalMs || ''}\n onChange={(e) => updateRetryPolicy(index, 'initialIntervalMs', parseInt(e.target.value) || 0)}\n placeholder=\"1000\"\n min=\"0\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n <div>\n <Label htmlFor={`${id}-${index}-backoffCoefficient`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.backoffCoefficient')}\n </Label>\n <Input\n id={`${id}-${index}-backoffCoefficient`}\n type=\"number\"\n step=\"0.1\"\n value={activity.retryPolicy?.backoffCoefficient || ''}\n onChange={(e) => updateRetryPolicy(index, 'backoffCoefficient', parseFloat(e.target.value) || 1)}\n placeholder=\"2\"\n min=\"1\"\n max=\"10\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n <div>\n <Label htmlFor={`${id}-${index}-maxIntervalMs`} className=\"text-xs text-gray-600 mb-1\">\n {t('workflows.fieldEditors.activities.maxInterval')}\n </Label>\n <Input\n id={`${id}-${index}-maxIntervalMs`}\n type=\"number\"\n value={activity.retryPolicy?.maxIntervalMs || ''}\n onChange={(e) => updateRetryPolicy(index, 'maxIntervalMs', parseInt(e.target.value) || 0)}\n placeholder=\"10000\"\n min=\"0\"\n className=\"text-xs\"\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n\n {/* Activity Options */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Label className=\"text-xs font-semibold mb-2 block\">{t('workflows.fieldEditors.activities.activityOptions')}</Label>\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id={`${id}-${index}-async`}\n checked={activity.async || false}\n onChange={(e) => updateActivity(index, 'async', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n disabled={disabled}\n />\n <Label htmlFor={`${id}-${index}-async`} className=\"text-xs text-gray-700 cursor-pointer\">\n {t('workflows.fieldEditors.activities.asyncOption')}\n </Label>\n </div>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id={`${id}-${index}-compensate`}\n checked={activity.compensate || false}\n onChange={(e) => updateActivity(index, 'compensate', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300\"\n disabled={disabled}\n />\n <Label htmlFor={`${id}-${index}-compensate`} className=\"text-xs text-gray-700 cursor-pointer\">\n {t('workflows.fieldEditors.activities.compensateOption')}\n </Label>\n </div>\n </div>\n </div>\n\n {/* Configuration JSON */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Label className=\"text-xs font-medium mb-1\">\n {t('workflows.fieldEditors.activities.configurationJson')}\n </Label>\n <JsonBuilder\n value={activity.config || {}}\n onChange={(config) => updateActivity(index, 'config', config)}\n disabled={disabled}\n />\n <p className=\"text-xs text-muted-foreground mt-1\">\n {t('workflows.fieldEditors.activities.configurationHint')}\n </p>\n </div>\n\n {/* Delete Button */}\n <div className=\"border-t border-gray-200 pt-3\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => removeActivity(index)}\n disabled={disabled}\n >\n <Trash2 className=\"size-4 mr-1\" />\n {t('workflows.fieldEditors.activities.removeActivity')}\n </Button>\n </div>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n {ConfirmDialogElement}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["value"]
|
|
7
7
|
}
|
|
@@ -8,6 +8,7 @@ import { callWebhookConfigSchema } from "../data/validators.js";
|
|
|
8
8
|
import { WORKFLOW_ACTIVITIES_QUEUE_NAME } from "./activity-queue-types.js";
|
|
9
9
|
import { logWorkflowEvent } from "./event-logger.js";
|
|
10
10
|
import { parseDuration } from "./duration.js";
|
|
11
|
+
import { resolveActivityTimeoutMs } from "./activityTimeoutFields.js";
|
|
11
12
|
import { getWorkflowSafeCommand } from "./workflow-safe-commands.js";
|
|
12
13
|
import { isPrivateUrl } from "@open-mercato/shared/lib/network";
|
|
13
14
|
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
@@ -53,20 +54,6 @@ function resolveWorkflowEnvInterpolation(envKey) {
|
|
|
53
54
|
}
|
|
54
55
|
return process.env[envKey] ?? "";
|
|
55
56
|
}
|
|
56
|
-
function resolveActivityTimeoutMs(activity) {
|
|
57
|
-
if (typeof activity.timeoutMs === "number" && activity.timeoutMs > 0) {
|
|
58
|
-
return activity.timeoutMs;
|
|
59
|
-
}
|
|
60
|
-
if (typeof activity.timeout === "string" && activity.timeout.trim().length > 0) {
|
|
61
|
-
try {
|
|
62
|
-
const parsed = parseDuration(activity.timeout.trim());
|
|
63
|
-
if (Number.isFinite(parsed) && parsed > 0) return parsed;
|
|
64
|
-
} catch {
|
|
65
|
-
return void 0;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return void 0;
|
|
69
|
-
}
|
|
70
57
|
async function workflowUserHasAllFeatures(container, userId, required, tenantId, organizationId) {
|
|
71
58
|
try {
|
|
72
59
|
const rbac = container.resolve("rbacService");
|