@open-mercato/core 0.6.3-develop.3901.1.ddad60693a → 0.6.3
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/global.d.js +1 -0
- package/dist/global.d.js.map +7 -0
- package/dist/modules/catalog/commands/variants.js +11 -5
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/create/page.js +3 -61
- package/dist/modules/customers/backend/customers/deals/create/page.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +2 -0
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/create/CreateDealForm.js +233 -0
- package/dist/modules/customers/components/detail/create/CreateDealForm.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsField.js +209 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsField.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsSection.js +67 -0
- package/dist/modules/customers/components/detail/create/DealAssociationsSection.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealCreateSidebar.js +73 -0
- package/dist/modules/customers/components/detail/create/DealCreateSidebar.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealCurrencyField.js +92 -0
- package/dist/modules/customers/components/detail/create/DealCurrencyField.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealCustomAttributes.js +81 -0
- package/dist/modules/customers/components/detail/create/DealCustomAttributes.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealDetailsFields.js +171 -0
- package/dist/modules/customers/components/detail/create/DealDetailsFields.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealFormField.js +24 -0
- package/dist/modules/customers/components/detail/create/DealFormField.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealSectionCard.js +29 -0
- package/dist/modules/customers/components/detail/create/DealSectionCard.js.map +7 -0
- package/dist/modules/customers/components/detail/create/DealTipsCard.js +19 -0
- package/dist/modules/customers/components/detail/create/DealTipsCard.js.map +7 -0
- package/dist/modules/customers/components/detail/create/PipelineSelect.js +41 -0
- package/dist/modules/customers/components/detail/create/PipelineSelect.js.map +7 -0
- package/dist/modules/customers/components/detail/create/PipelineStageSelect.js +49 -0
- package/dist/modules/customers/components/detail/create/PipelineStageSelect.js.map +7 -0
- package/dist/modules/customers/components/detail/create/SuffixInput.js +21 -0
- package/dist/modules/customers/components/detail/create/SuffixInput.js.map +7 -0
- package/dist/modules/customers/components/detail/create/dealCustomFieldControl.js +270 -0
- package/dist/modules/customers/components/detail/create/dealCustomFieldControl.js.map +7 -0
- package/dist/modules/customers/components/detail/create/dealFormTypes.js +17 -0
- package/dist/modules/customers/components/detail/create/dealFormTypes.js.map +7 -0
- package/dist/modules/customers/components/detail/create/dealNumericInput.js +16 -0
- package/dist/modules/customers/components/detail/create/dealNumericInput.js.map +7 -0
- package/dist/modules/customers/components/detail/create/useDealCustomFields.js +93 -0
- package/dist/modules/customers/components/detail/create/useDealCustomFields.js.map +7 -0
- package/dist/modules/customers/components/detail/create/useDealPipelines.js +59 -0
- package/dist/modules/customers/components/detail/create/useDealPipelines.js.map +7 -0
- package/dist/modules/customers/components/formConfig.js +4 -2
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +5 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/feature_toggles/lib/feature-flag-check.js +13 -5
- package/dist/modules/feature_toggles/lib/feature-flag-check.js.map +2 -2
- package/dist/modules/query_index/subscribers/coverage_refresh.js +6 -1
- package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraph.js +29 -186
- package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +196 -0
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +7 -0
- package/package.json +8 -9
- package/src/global.d.ts +9 -0
- package/src/modules/catalog/commands/variants.ts +14 -5
- package/src/modules/customers/backend/customers/deals/create/page.tsx +3 -64
- package/src/modules/customers/components/detail/DealForm.tsx +2 -0
- package/src/modules/customers/components/detail/create/CreateDealForm.tsx +254 -0
- package/src/modules/customers/components/detail/create/DealAssociationsField.tsx +253 -0
- package/src/modules/customers/components/detail/create/DealAssociationsSection.tsx +72 -0
- package/src/modules/customers/components/detail/create/DealCreateSidebar.tsx +79 -0
- package/src/modules/customers/components/detail/create/DealCurrencyField.tsx +108 -0
- package/src/modules/customers/components/detail/create/DealCustomAttributes.tsx +118 -0
- package/src/modules/customers/components/detail/create/DealDetailsFields.tsx +171 -0
- package/src/modules/customers/components/detail/create/DealFormField.tsx +39 -0
- package/src/modules/customers/components/detail/create/DealSectionCard.tsx +40 -0
- package/src/modules/customers/components/detail/create/DealTipsCard.tsx +26 -0
- package/src/modules/customers/components/detail/create/PipelineSelect.tsx +55 -0
- package/src/modules/customers/components/detail/create/PipelineStageSelect.tsx +70 -0
- package/src/modules/customers/components/detail/create/SuffixInput.tsx +20 -0
- package/src/modules/customers/components/detail/create/dealCustomFieldControl.tsx +310 -0
- package/src/modules/customers/components/detail/create/dealFormTypes.ts +29 -0
- package/src/modules/customers/components/detail/create/dealNumericInput.ts +20 -0
- package/src/modules/customers/components/detail/create/useDealCustomFields.ts +118 -0
- package/src/modules/customers/components/detail/create/useDealPipelines.ts +80 -0
- package/src/modules/customers/components/formConfig.tsx +3 -0
- package/src/modules/customers/i18n/de.json +26 -0
- package/src/modules/customers/i18n/en.json +26 -0
- package/src/modules/customers/i18n/es.json +26 -0
- package/src/modules/customers/i18n/pl.json +26 -0
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +12 -1
- package/src/modules/feature_toggles/lib/feature-flag-check.ts +14 -4
- package/src/modules/query_index/subscribers/coverage_refresh.ts +7 -1
- package/src/modules/resources/i18n/de.json +1 -0
- package/src/modules/resources/i18n/en.json +1 -0
- package/src/modules/resources/i18n/es.json +1 -0
- package/src/modules/resources/i18n/pl.json +1 -0
- package/src/modules/sales/i18n/de.json +2 -0
- package/src/modules/sales/i18n/en.json +2 -0
- package/src/modules/sales/i18n/es.json +2 -0
- package/src/modules/sales/i18n/pl.json +2 -0
- package/src/modules/workflows/components/WorkflowGraph.tsx +39 -235
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +233 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import '@xyflow/react/dist/style.css'
|
|
4
|
+
|
|
5
|
+
import { useCallback, useMemo, useEffect, useState } from 'react'
|
|
6
|
+
import {
|
|
7
|
+
ReactFlow,
|
|
8
|
+
Node,
|
|
9
|
+
Edge,
|
|
10
|
+
Controls,
|
|
11
|
+
Background,
|
|
12
|
+
BackgroundVariant,
|
|
13
|
+
MiniMap,
|
|
14
|
+
Panel,
|
|
15
|
+
useNodesState,
|
|
16
|
+
useEdgesState,
|
|
17
|
+
addEdge,
|
|
18
|
+
Connection,
|
|
19
|
+
ConnectionMode,
|
|
20
|
+
MarkerType,
|
|
21
|
+
} from '@xyflow/react'
|
|
22
|
+
import {StartNode, EndNode, UserTaskNode, AutomatedNode, SubWorkflowNode, WaitForSignalNode, WaitForTimerNode} from './nodes'
|
|
23
|
+
import { WorkflowTransitionEdge } from './WorkflowTransitionEdge'
|
|
24
|
+
import { STATUS_COLORS } from '../lib/status-colors'
|
|
25
|
+
import { Alert, AlertDescription } from '@open-mercato/ui/primitives/alert'
|
|
26
|
+
import { Edit3 } from 'lucide-react'
|
|
27
|
+
import { useTheme } from '@open-mercato/ui/theme'
|
|
28
|
+
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
29
|
+
|
|
30
|
+
export interface WorkflowGraphImplProps {
|
|
31
|
+
initialNodes?: Node[]
|
|
32
|
+
initialEdges?: Edge[]
|
|
33
|
+
onNodesChange?: (changes: any[]) => void
|
|
34
|
+
onEdgesChange?: (changes: any[]) => void
|
|
35
|
+
onNodeClick?: (event: React.MouseEvent, node: Node) => void
|
|
36
|
+
onEdgeClick?: (event: React.MouseEvent, edge: Edge) => void
|
|
37
|
+
onConnect?: (connection: Connection) => void
|
|
38
|
+
editable?: boolean
|
|
39
|
+
className?: string
|
|
40
|
+
height?: string
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default function WorkflowGraphImpl({
|
|
44
|
+
initialNodes = [],
|
|
45
|
+
initialEdges = [],
|
|
46
|
+
onNodesChange: onNodesChangeProp,
|
|
47
|
+
onEdgesChange: onEdgesChangeProp,
|
|
48
|
+
onNodeClick: onNodeClickProp,
|
|
49
|
+
onEdgeClick: onEdgeClickProp,
|
|
50
|
+
onConnect: onConnectProp,
|
|
51
|
+
editable = false,
|
|
52
|
+
className = '',
|
|
53
|
+
height = '600px',
|
|
54
|
+
}: WorkflowGraphImplProps) {
|
|
55
|
+
const t = useT()
|
|
56
|
+
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes)
|
|
57
|
+
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges)
|
|
58
|
+
|
|
59
|
+
const { resolvedTheme } = useTheme()
|
|
60
|
+
const isDark = resolvedTheme === 'dark'
|
|
61
|
+
const backgroundDotColor = isDark ? '#374151' : '#e5e7eb'
|
|
62
|
+
const [isCompactViewport, setIsCompactViewport] = useState(false)
|
|
63
|
+
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (typeof window === 'undefined') return
|
|
66
|
+
const mediaQuery = window.matchMedia('(max-width: 1279px)')
|
|
67
|
+
const updateViewportMode = () => setIsCompactViewport(mediaQuery.matches)
|
|
68
|
+
|
|
69
|
+
updateViewportMode()
|
|
70
|
+
mediaQuery.addEventListener('change', updateViewportMode)
|
|
71
|
+
|
|
72
|
+
return () => {
|
|
73
|
+
mediaQuery.removeEventListener('change', updateViewportMode)
|
|
74
|
+
}
|
|
75
|
+
}, [])
|
|
76
|
+
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
setNodes(initialNodes)
|
|
79
|
+
}, [initialNodes, setNodes])
|
|
80
|
+
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
setEdges(initialEdges)
|
|
83
|
+
}, [initialEdges, setEdges])
|
|
84
|
+
|
|
85
|
+
const onConnect = useCallback(
|
|
86
|
+
(connection: Connection) => {
|
|
87
|
+
if (onConnectProp) {
|
|
88
|
+
onConnectProp(connection)
|
|
89
|
+
} else {
|
|
90
|
+
const newEdge = {
|
|
91
|
+
...connection,
|
|
92
|
+
type: 'workflowTransition',
|
|
93
|
+
animated: false,
|
|
94
|
+
markerEnd: {
|
|
95
|
+
type: MarkerType.ArrowClosed,
|
|
96
|
+
width: 16,
|
|
97
|
+
height: 16,
|
|
98
|
+
color: '#9ca3af',
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
setEdges((eds) => addEdge(newEdge, eds))
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
[setEdges, onConnectProp]
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
const handleNodesChange = useCallback(
|
|
108
|
+
(changes: any) => {
|
|
109
|
+
onNodesChange(changes)
|
|
110
|
+
if (onNodesChangeProp) {
|
|
111
|
+
onNodesChangeProp(changes)
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
[onNodesChange, onNodesChangeProp]
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
const handleEdgesChange = useCallback(
|
|
118
|
+
(changes: any) => {
|
|
119
|
+
onEdgesChange(changes)
|
|
120
|
+
if (onEdgesChangeProp) {
|
|
121
|
+
onEdgesChangeProp(changes)
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
[onEdgesChange, onEdgesChangeProp]
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
const nodeTypes = useMemo(
|
|
128
|
+
() => ({
|
|
129
|
+
start: StartNode,
|
|
130
|
+
end: EndNode,
|
|
131
|
+
userTask: UserTaskNode,
|
|
132
|
+
automated: AutomatedNode,
|
|
133
|
+
subWorkflow: SubWorkflowNode,
|
|
134
|
+
waitForSignal: WaitForSignalNode,
|
|
135
|
+
waitForTimer: WaitForTimerNode,
|
|
136
|
+
}),
|
|
137
|
+
[]
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
const edgeTypes = useMemo(
|
|
141
|
+
() => ({
|
|
142
|
+
workflowTransition: WorkflowTransitionEdge,
|
|
143
|
+
}),
|
|
144
|
+
[]
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return (
|
|
148
|
+
<div className={`workflow-graph-container ${className}`} style={{ height }}>
|
|
149
|
+
<ReactFlow
|
|
150
|
+
nodes={nodes}
|
|
151
|
+
edges={edges}
|
|
152
|
+
nodeTypes={nodeTypes}
|
|
153
|
+
edgeTypes={edgeTypes}
|
|
154
|
+
onNodesChange={handleNodesChange}
|
|
155
|
+
onEdgesChange={handleEdgesChange}
|
|
156
|
+
onConnect={editable ? onConnect : undefined}
|
|
157
|
+
onNodeClick={onNodeClickProp}
|
|
158
|
+
onEdgeClick={onEdgeClickProp}
|
|
159
|
+
connectionMode={ConnectionMode.Loose}
|
|
160
|
+
fitView
|
|
161
|
+
fitViewOptions={{
|
|
162
|
+
padding: 0.2,
|
|
163
|
+
maxZoom: isCompactViewport ? 0.9 : 1,
|
|
164
|
+
}}
|
|
165
|
+
minZoom={0.1}
|
|
166
|
+
maxZoom={2}
|
|
167
|
+
defaultEdgeOptions={{
|
|
168
|
+
type: 'workflowTransition',
|
|
169
|
+
animated: false,
|
|
170
|
+
markerEnd: {
|
|
171
|
+
type: MarkerType.ArrowClosed,
|
|
172
|
+
width: 16,
|
|
173
|
+
height: 16,
|
|
174
|
+
color: '#9ca3af',
|
|
175
|
+
},
|
|
176
|
+
}}
|
|
177
|
+
nodesDraggable={editable}
|
|
178
|
+
nodesConnectable={editable}
|
|
179
|
+
elementsSelectable={editable}
|
|
180
|
+
proOptions={{ hideAttribution: true }}
|
|
181
|
+
>
|
|
182
|
+
<Background
|
|
183
|
+
variant={BackgroundVariant.Dots}
|
|
184
|
+
gap={16}
|
|
185
|
+
size={1}
|
|
186
|
+
color={backgroundDotColor}
|
|
187
|
+
/>
|
|
188
|
+
|
|
189
|
+
<Controls
|
|
190
|
+
showZoom={true}
|
|
191
|
+
showFitView={true}
|
|
192
|
+
showInteractive={false}
|
|
193
|
+
position={isCompactViewport ? 'bottom-right' : 'top-right'}
|
|
194
|
+
className={`!bg-card !border-border !shadow-md [&>button]:!bg-card [&>button]:!border-border [&>button]:!fill-foreground [&>button:hover]:!bg-muted ${isCompactViewport ? 'scale-90 origin-bottom-right' : ''}`}
|
|
195
|
+
/>
|
|
196
|
+
|
|
197
|
+
{!isCompactViewport && (
|
|
198
|
+
<MiniMap
|
|
199
|
+
nodeStrokeWidth={3}
|
|
200
|
+
nodeColor={(node) => {
|
|
201
|
+
const status = (node.data?.status || 'not_started') as keyof typeof STATUS_COLORS
|
|
202
|
+
return STATUS_COLORS[status]?.hex || STATUS_COLORS.not_started.hex
|
|
203
|
+
}}
|
|
204
|
+
maskColor="rgba(0, 0, 0, 0.1)"
|
|
205
|
+
position="bottom-left"
|
|
206
|
+
className="!bg-card !border !border-border !rounded-lg"
|
|
207
|
+
/>
|
|
208
|
+
)}
|
|
209
|
+
|
|
210
|
+
{!editable && !isCompactViewport && (
|
|
211
|
+
<Panel position="top-left" style={{ margin: 10 }}>
|
|
212
|
+
<div className="bg-card rounded-lg shadow-sm border border-border px-4 py-2">
|
|
213
|
+
<p className="text-sm text-muted-foreground font-medium">
|
|
214
|
+
{t('workflows.graph.visualization')}
|
|
215
|
+
</p>
|
|
216
|
+
</div>
|
|
217
|
+
</Panel>
|
|
218
|
+
)}
|
|
219
|
+
|
|
220
|
+
{editable && !isCompactViewport && (
|
|
221
|
+
<Panel position="top-left" style={{ margin: 10 }}>
|
|
222
|
+
<Alert variant="info" className="max-w-sm">
|
|
223
|
+
<Edit3 className="size-4" />
|
|
224
|
+
<AlertDescription className="font-medium">
|
|
225
|
+
{t('workflows.graph.editModeInfo')}
|
|
226
|
+
</AlertDescription>
|
|
227
|
+
</Alert>
|
|
228
|
+
</Panel>
|
|
229
|
+
)}
|
|
230
|
+
</ReactFlow>
|
|
231
|
+
</div>
|
|
232
|
+
)
|
|
233
|
+
}
|