@gadmin2n/schematics 0.0.144 → 0.0.145
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +140 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/data-mngt.seed.ts +0 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +694 -327
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-outbox.ts +57 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +35 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +224 -59
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +23 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +16 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +98 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +26 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +17 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +28 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +63 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +151 -38
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +16 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +23 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.spec.ts +130 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +62 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +15 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +70 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +31 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.spec.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +28 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +50 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +26 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +53 -47
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +541 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +442 -200
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +150 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +56 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +16 -60
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +44 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +258 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +127 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.spec.ts +85 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.ts +108 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +96 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +77 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +23 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +0 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +245 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +639 -188
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +408 -235
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +1 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +279 -95
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +360 -80
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-event-catalog.spec.ts +323 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +773 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +7 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +0 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.spec.ts +184 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +69 -138
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.spec.ts +113 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +59 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +86 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.spec.ts +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +78 -43
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +103 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +57 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +1000 -240
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +2184 -317
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +279 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +5 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +5 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +12 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +10 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +2 -24
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +3 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +25 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.test.tsx +71 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.tsx +89 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +52 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +10 -33
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +13 -37
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +14 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/workflowAction.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useReferenceUpload.ts +95 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +672 -110
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +676 -114
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +13 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +38 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +276 -376
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +126 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.test.tsx +50 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +48 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +32 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.test.tsx +111 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.tsx +167 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/business-events.css +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.test.tsx +106 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +324 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.test.tsx +73 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +359 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CanvasZoomControls.tsx +46 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +9 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +105 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +90 -48
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +3 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.test.tsx +259 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +167 -103
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +142 -140
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +60 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +25 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +364 -200
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +220 -52
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +260 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +300 -130
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +507 -33
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +630 -592
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +67 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.test.tsx +90 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.tsx +325 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.test.tsx +52 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +14 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +42 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +76 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowWorkspaceHeader.tsx +56 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/parameter-binding-editor.css +46 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/workflow-code-editor.css +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +53 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +123 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +85 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +29 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +75 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +69 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.test.tsx +494 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +665 -194
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.test.tsx +92 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.ts +96 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.test.tsx +297 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +135 -65
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +53 -42
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +344 -155
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +79 -58
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +123 -144
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +169 -98
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/node-instance-form.css +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +54 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +854 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +41 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +75 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +20 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +61 -66
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +33 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +47 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/BranchConfigEditors.test.tsx +104 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +22 -52
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +72 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +78 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CronTriggerConfigEditor.tsx +569 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +130 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DelayConfigEditor.tsx +100 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +620 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +22 -45
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +25 -92
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +3 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.test.tsx +58 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.tsx +107 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +212 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +214 -304
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +175 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +693 -293
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/IfElseConfigEditor.tsx +190 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.test.tsx +152 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.tsx +286 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParallelConfigEditor.tsx +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParameterBindingListEditor.tsx +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +495 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.test.tsx +124 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.tsx +222 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +2 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SwitchConfigEditor.tsx +204 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +3 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +9 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/callable-workflow.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/code-config.css +96 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/event-catalog.api.ts +117 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/http-request-config.css +242 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +194 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +264 -167
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +6 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +19 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +28 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.test.tsx +59 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.ts +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.test.ts +311 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.ts +198 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.test.ts +143 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +103 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +158 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +117 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.test.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.ts +48 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.test.ts +55 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +95 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +148 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +62 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.test.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.ts +26 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.test.ts +502 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.ts +694 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.test.ts +27 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.ts +33 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.test.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.ts +52 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.test.ts +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.ts +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.test.ts +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.ts +120 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/workflow-ui.css +481 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +0 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +0 -86
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +0 -60
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { BadRequestException } from '@nestjs/common';
|
|
2
|
+
import { NODE_TYPES } from '../../../seed/workflow-node-types';
|
|
2
3
|
import { NodeConfigValidatorService } from './node-config-validator.service';
|
|
4
|
+
import type { JsonSchema } from './schema.types';
|
|
3
5
|
|
|
4
6
|
describe('NodeConfigValidatorService', () => {
|
|
5
7
|
const schema = {
|
|
@@ -32,6 +34,7 @@ describe('NodeConfigValidatorService', () => {
|
|
|
32
34
|
expect(error).toBeInstanceOf(BadRequestException);
|
|
33
35
|
expect((error as BadRequestException).getResponse()).toEqual({
|
|
34
36
|
code: 'NODE_CONFIG_INVALID',
|
|
37
|
+
message: '节点配置不完整或有误',
|
|
35
38
|
errors: expect.arrayContaining([
|
|
36
39
|
{ path: '/count', keyword: 'minimum', message: 'must be >= 1' },
|
|
37
40
|
{
|
|
@@ -53,8 +56,9 @@ describe('NodeConfigValidatorService', () => {
|
|
|
53
56
|
(config) => {
|
|
54
57
|
expect(() => service.validateOrThrow('12:3', schema, config)).toThrow(
|
|
55
58
|
expect.objectContaining({
|
|
56
|
-
response: {
|
|
59
|
+
response: expect.objectContaining({
|
|
57
60
|
code: 'NODE_CONFIG_INVALID',
|
|
61
|
+
message: '节点配置不完整或有误',
|
|
58
62
|
errors: [
|
|
59
63
|
{
|
|
60
64
|
path: '/',
|
|
@@ -62,7 +66,7 @@ describe('NodeConfigValidatorService', () => {
|
|
|
62
66
|
message: 'must be object',
|
|
63
67
|
},
|
|
64
68
|
],
|
|
65
|
-
},
|
|
69
|
+
}),
|
|
66
70
|
}),
|
|
67
71
|
);
|
|
68
72
|
},
|
|
@@ -76,4 +80,277 @@ describe('NodeConfigValidatorService', () => {
|
|
|
76
80
|
|
|
77
81
|
expect(compile).toHaveBeenCalledTimes(1);
|
|
78
82
|
});
|
|
83
|
+
|
|
84
|
+
it('rejects an approval without any possible approver', () => {
|
|
85
|
+
const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
|
|
86
|
+
const approvalSchema = approval.configSchema as JsonSchema;
|
|
87
|
+
|
|
88
|
+
expect(() =>
|
|
89
|
+
service.validateOrThrow('approval:10', approvalSchema, {
|
|
90
|
+
subjects: [],
|
|
91
|
+
approvalRule: { mode: 'ANY' },
|
|
92
|
+
rejectionRule: { mode: 'ANY' },
|
|
93
|
+
timeout: { durationSeconds: 0, action: 'REJECTED' },
|
|
94
|
+
}),
|
|
95
|
+
).toThrow(BadRequestException);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('accepts a complete approval and requires threshold values', () => {
|
|
99
|
+
const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
|
|
100
|
+
const approvalSchema = approval.configSchema as JsonSchema;
|
|
101
|
+
const baseConfig = {
|
|
102
|
+
task: {
|
|
103
|
+
title: {
|
|
104
|
+
source: 'FIXED',
|
|
105
|
+
valueType: 'STRING',
|
|
106
|
+
value: '请审批',
|
|
107
|
+
},
|
|
108
|
+
description: {
|
|
109
|
+
source: 'FIXED',
|
|
110
|
+
valueType: 'STRING',
|
|
111
|
+
value: '',
|
|
112
|
+
},
|
|
113
|
+
details: [],
|
|
114
|
+
},
|
|
115
|
+
subjects: [{ source: 'STATIC', provider: 'USER', refs: ['reviewer'] }],
|
|
116
|
+
rejectionRule: { mode: 'ANY' },
|
|
117
|
+
timeout: { durationSeconds: 0, action: 'REJECTED' },
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
expect(() =>
|
|
121
|
+
service.validateOrThrow('approval:10-valid', approvalSchema, {
|
|
122
|
+
...baseConfig,
|
|
123
|
+
approvalRule: { mode: 'COUNT', count: 1 },
|
|
124
|
+
}),
|
|
125
|
+
).not.toThrow();
|
|
126
|
+
expect(() =>
|
|
127
|
+
service.validateOrThrow('approval:10-invalid', approvalSchema, {
|
|
128
|
+
...baseConfig,
|
|
129
|
+
approvalRule: { mode: 'COUNT' },
|
|
130
|
+
}),
|
|
131
|
+
).toThrow(BadRequestException);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('requires a complete embedded external approval configuration when enabled', () => {
|
|
135
|
+
const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
|
|
136
|
+
const approvalSchema = approval.configSchema as JsonSchema;
|
|
137
|
+
const config = {
|
|
138
|
+
task: {
|
|
139
|
+
title: {
|
|
140
|
+
source: 'FIXED',
|
|
141
|
+
valueType: 'STRING',
|
|
142
|
+
value: '请审批',
|
|
143
|
+
},
|
|
144
|
+
description: {
|
|
145
|
+
source: 'FIXED',
|
|
146
|
+
valueType: 'STRING',
|
|
147
|
+
value: '',
|
|
148
|
+
},
|
|
149
|
+
details: [],
|
|
150
|
+
},
|
|
151
|
+
subjects: [{ source: 'STATIC', provider: 'USER', refs: ['reviewer'] }],
|
|
152
|
+
approvalRule: { mode: 'ANY' },
|
|
153
|
+
rejectionRule: { mode: 'ANY' },
|
|
154
|
+
timeout: { durationSeconds: 0, action: 'REJECTED' },
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
expect(() =>
|
|
158
|
+
service.validateOrThrow('approval:external-missing', approvalSchema, {
|
|
159
|
+
...config,
|
|
160
|
+
external: {
|
|
161
|
+
request: {
|
|
162
|
+
connectionRef: 'myoa',
|
|
163
|
+
method: 'POST',
|
|
164
|
+
path: '/approvals',
|
|
165
|
+
bodyMode: 'JSON',
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
}),
|
|
169
|
+
).toThrow(BadRequestException);
|
|
170
|
+
expect(() =>
|
|
171
|
+
service.validateOrThrow('approval:external-valid', approvalSchema, {
|
|
172
|
+
...config,
|
|
173
|
+
external: {
|
|
174
|
+
request: {
|
|
175
|
+
connectionRef: 'myoa',
|
|
176
|
+
method: 'POST',
|
|
177
|
+
path: '/approvals',
|
|
178
|
+
bodyMode: 'FIELDS',
|
|
179
|
+
bodyBindings: {
|
|
180
|
+
callbackToken: {
|
|
181
|
+
source: 'APPROVAL',
|
|
182
|
+
path: 'callbackToken',
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
creationResult: { script: 'return response;' },
|
|
187
|
+
callbackResult: { script: 'return callback.body;' },
|
|
188
|
+
},
|
|
189
|
+
}),
|
|
190
|
+
).not.toThrow();
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('requires the HTTP and Code configuration for dynamic approvers', () => {
|
|
194
|
+
const approval = NODE_TYPES.find((node) => node.type === 'approval')!;
|
|
195
|
+
const approvalSchema = approval.configSchema as JsonSchema;
|
|
196
|
+
const config = {
|
|
197
|
+
task: {
|
|
198
|
+
title: {
|
|
199
|
+
source: 'FIXED',
|
|
200
|
+
valueType: 'STRING',
|
|
201
|
+
value: '请审批',
|
|
202
|
+
},
|
|
203
|
+
description: {
|
|
204
|
+
source: 'FIXED',
|
|
205
|
+
valueType: 'STRING',
|
|
206
|
+
value: '',
|
|
207
|
+
},
|
|
208
|
+
details: [],
|
|
209
|
+
},
|
|
210
|
+
subjects: [
|
|
211
|
+
{
|
|
212
|
+
source: 'DYNAMIC',
|
|
213
|
+
provider: 'USER',
|
|
214
|
+
inputKey: 'direct_manager',
|
|
215
|
+
label: '查询直属领导',
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
approvalRule: { mode: 'ANY' },
|
|
219
|
+
rejectionRule: { mode: 'ANY' },
|
|
220
|
+
timeout: { durationSeconds: 0, action: 'REJECTED' },
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
expect(() =>
|
|
224
|
+
service.validateOrThrow(
|
|
225
|
+
'approval:lookup-missing',
|
|
226
|
+
approvalSchema,
|
|
227
|
+
config,
|
|
228
|
+
),
|
|
229
|
+
).toThrow(BadRequestException);
|
|
230
|
+
expect(() =>
|
|
231
|
+
service.validateOrThrow('approval:lookup-valid', approvalSchema, {
|
|
232
|
+
...config,
|
|
233
|
+
subjects: [
|
|
234
|
+
{
|
|
235
|
+
...config.subjects[0],
|
|
236
|
+
lookup: {
|
|
237
|
+
request: {
|
|
238
|
+
connectionRef: 'erp',
|
|
239
|
+
method: 'GET',
|
|
240
|
+
path: '/',
|
|
241
|
+
bodyMode: 'FIELDS',
|
|
242
|
+
},
|
|
243
|
+
result: { script: 'return response;' },
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
}),
|
|
248
|
+
).not.toThrow();
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it.each(['', ' '])(
|
|
252
|
+
'rejects a blank HTTP request field name when publishing',
|
|
253
|
+
(fieldName) => {
|
|
254
|
+
const httpRequest = NODE_TYPES.find(
|
|
255
|
+
(node) => node.type === 'http_request',
|
|
256
|
+
)!;
|
|
257
|
+
const httpRequestSchema = httpRequest.configSchema as JsonSchema;
|
|
258
|
+
|
|
259
|
+
expect(() =>
|
|
260
|
+
service.validateOrThrow('http-request:empty-field', httpRequestSchema, {
|
|
261
|
+
connectionRef: 'erp',
|
|
262
|
+
method: 'GET',
|
|
263
|
+
path: '/',
|
|
264
|
+
queryBindings: {
|
|
265
|
+
[fieldName]: {
|
|
266
|
+
source: 'FIXED',
|
|
267
|
+
valueType: 'STRING',
|
|
268
|
+
value: '',
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
bodyMode: 'FIELDS',
|
|
272
|
+
}),
|
|
273
|
+
).toThrow(BadRequestException);
|
|
274
|
+
},
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
it('requires the matching external wait timeout value', () => {
|
|
278
|
+
const externalWait = NODE_TYPES.find(
|
|
279
|
+
(node) => node.type === 'external_wait',
|
|
280
|
+
)!;
|
|
281
|
+
const externalWaitSchema = externalWait.configSchema as JsonSchema;
|
|
282
|
+
const callbackTokenBinding = { source: 'INPUT', path: 'callbackToken' };
|
|
283
|
+
|
|
284
|
+
expect(() =>
|
|
285
|
+
service.validateOrThrow(
|
|
286
|
+
'external-wait:duration-invalid',
|
|
287
|
+
externalWaitSchema,
|
|
288
|
+
{
|
|
289
|
+
callbackTokenBinding,
|
|
290
|
+
timeout: { mode: 'DURATION' },
|
|
291
|
+
},
|
|
292
|
+
),
|
|
293
|
+
).toThrow(BadRequestException);
|
|
294
|
+
expect(() =>
|
|
295
|
+
service.validateOrThrow(
|
|
296
|
+
'external-wait:deadline-invalid',
|
|
297
|
+
externalWaitSchema,
|
|
298
|
+
{
|
|
299
|
+
callbackTokenBinding,
|
|
300
|
+
timeout: { mode: 'DEADLINE' },
|
|
301
|
+
},
|
|
302
|
+
),
|
|
303
|
+
).toThrow(BadRequestException);
|
|
304
|
+
expect(() =>
|
|
305
|
+
service.validateOrThrow(
|
|
306
|
+
'external-wait:duration-valid',
|
|
307
|
+
externalWaitSchema,
|
|
308
|
+
{
|
|
309
|
+
callbackTokenBinding,
|
|
310
|
+
timeout: { mode: 'DURATION', durationSeconds: 60 },
|
|
311
|
+
},
|
|
312
|
+
),
|
|
313
|
+
).not.toThrow();
|
|
314
|
+
expect(() =>
|
|
315
|
+
service.validateOrThrow(
|
|
316
|
+
'external-wait:deadline-valid',
|
|
317
|
+
externalWaitSchema,
|
|
318
|
+
{
|
|
319
|
+
callbackTokenBinding,
|
|
320
|
+
timeout: {
|
|
321
|
+
mode: 'DEADLINE',
|
|
322
|
+
deadlineBinding: { source: 'WORKFLOW', path: 'deadline' },
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
),
|
|
326
|
+
).not.toThrow();
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
it('requires concurrency for parallel for-each execution', () => {
|
|
330
|
+
const forEach = NODE_TYPES.find((node) => node.type === 'for_each')!;
|
|
331
|
+
const forEachSchema = forEach.configSchema as JsonSchema;
|
|
332
|
+
const baseConfig = {
|
|
333
|
+
itemsBinding: { source: 'INPUT', path: 'items' },
|
|
334
|
+
errorPolicy: 'STOP',
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
expect(() =>
|
|
338
|
+
service.validateOrThrow('for-each:parallel-invalid', forEachSchema, {
|
|
339
|
+
...baseConfig,
|
|
340
|
+
execution: { mode: 'PARALLEL' },
|
|
341
|
+
}),
|
|
342
|
+
).toThrow(BadRequestException);
|
|
343
|
+
expect(() =>
|
|
344
|
+
service.validateOrThrow('for-each:parallel-valid', forEachSchema, {
|
|
345
|
+
...baseConfig,
|
|
346
|
+
execution: { mode: 'PARALLEL', concurrency: 3 },
|
|
347
|
+
}),
|
|
348
|
+
).not.toThrow();
|
|
349
|
+
expect(() =>
|
|
350
|
+
service.validateOrThrow('for-each:sequential-valid', forEachSchema, {
|
|
351
|
+
...baseConfig,
|
|
352
|
+
execution: { mode: 'SEQUENTIAL' },
|
|
353
|
+
}),
|
|
354
|
+
).not.toThrow();
|
|
355
|
+
});
|
|
79
356
|
});
|
|
@@ -57,6 +57,10 @@ export class NodeConfigValidatorService {
|
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
private throwInvalid(errors: NodeConfigValidationError[]): never {
|
|
60
|
-
throw new BadRequestException({
|
|
60
|
+
throw new BadRequestException({
|
|
61
|
+
code: 'NODE_CONFIG_INVALID',
|
|
62
|
+
message: '节点配置不完整或有误',
|
|
63
|
+
errors,
|
|
64
|
+
});
|
|
61
65
|
}
|
|
62
66
|
}
|
|
@@ -212,7 +212,11 @@ export class SubjectConfigValidatorService {
|
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
private throwInvalid(issues: SubjectValidationIssue[]): never {
|
|
215
|
-
throw new BadRequestException({
|
|
215
|
+
throw new BadRequestException({
|
|
216
|
+
code: 'SUBJECT_REF_INVALID',
|
|
217
|
+
message: '审批人配置不完整或无效',
|
|
218
|
+
issues,
|
|
219
|
+
});
|
|
216
220
|
}
|
|
217
221
|
}
|
|
218
222
|
|
|
@@ -11,7 +11,15 @@ describe('WidgetCatalogService', () => {
|
|
|
11
11
|
externalWait: { widget: 'external-wait-config' },
|
|
12
12
|
callableInputs: { widget: 'callable-input-parameters' },
|
|
13
13
|
approvalRequest: { widget: 'approval-request-trigger-config' },
|
|
14
|
-
|
|
14
|
+
manualTrigger: { widget: 'manual-trigger-config' },
|
|
15
|
+
forEach: { widget: 'for-each-config' },
|
|
16
|
+
subWorkflow: { widget: 'sub-workflow-config' },
|
|
17
|
+
eventTrigger: { widget: 'event-trigger-config' },
|
|
18
|
+
database: { widget: 'db-execute-config' },
|
|
19
|
+
delay: { widget: 'delay-config' },
|
|
20
|
+
parallel: { widget: 'parallel-config' },
|
|
21
|
+
ifElse: { widget: 'if-else-config' },
|
|
22
|
+
switch: { widget: 'switch-config' },
|
|
15
23
|
}),
|
|
16
24
|
).not.toThrow();
|
|
17
25
|
});
|
|
@@ -37,11 +45,12 @@ describe('WidgetCatalogService', () => {
|
|
|
37
45
|
}),
|
|
38
46
|
).toThrow(
|
|
39
47
|
expect.objectContaining({
|
|
40
|
-
response: {
|
|
48
|
+
response: expect.objectContaining({
|
|
41
49
|
code: 'NODE_WIDGET_NOT_REGISTERED',
|
|
50
|
+
message: '服务端尚未启用当前节点所需的配置组件',
|
|
42
51
|
widget: 'missing-widget',
|
|
43
52
|
path: '/approval/subjects/widget',
|
|
44
|
-
},
|
|
53
|
+
}),
|
|
45
54
|
}),
|
|
46
55
|
);
|
|
47
56
|
});
|
|
@@ -13,10 +13,18 @@ const PRIMITIVE_WIDGETS = [
|
|
|
13
13
|
const WORKFLOW_WIDGETS = [
|
|
14
14
|
'callable-input-parameters',
|
|
15
15
|
'approval-request-trigger-config',
|
|
16
|
-
'return-result-config',
|
|
17
16
|
'external-request-config',
|
|
18
17
|
'submit-approval-result-config',
|
|
19
18
|
'external-wait-config',
|
|
19
|
+
'manual-trigger-config',
|
|
20
|
+
'for-each-config',
|
|
21
|
+
'sub-workflow-config',
|
|
22
|
+
'event-trigger-config',
|
|
23
|
+
'db-execute-config',
|
|
24
|
+
'delay-config',
|
|
25
|
+
'parallel-config',
|
|
26
|
+
'if-else-config',
|
|
27
|
+
'switch-config',
|
|
20
28
|
] as const;
|
|
21
29
|
|
|
22
30
|
@Injectable()
|
|
@@ -50,6 +58,7 @@ export class WidgetCatalogService {
|
|
|
50
58
|
if (!this.widgets.has(child)) {
|
|
51
59
|
throw new BadRequestException({
|
|
52
60
|
code: 'NODE_WIDGET_NOT_REGISTERED',
|
|
61
|
+
message: '服务端尚未启用当前节点所需的配置组件',
|
|
53
62
|
widget: child,
|
|
54
63
|
path: toJsonPointer(childPath),
|
|
55
64
|
});
|
|
@@ -26,18 +26,6 @@ const mockPrismaService = {
|
|
|
26
26
|
},
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
const mockNodeConfigValidator = {
|
|
30
|
-
validateOrThrow: jest.fn(),
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const mockWidgetCatalog = {
|
|
34
|
-
assertUiSchemaSupported: jest.fn(),
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const mockSubjectConfigValidator = {
|
|
38
|
-
validateSubjects: jest.fn(),
|
|
39
|
-
};
|
|
40
|
-
|
|
41
29
|
describe('WorkflowNodeInstanceService', () => {
|
|
42
30
|
let service: WorkflowNodeInstanceService;
|
|
43
31
|
let prisma: typeof mockPrismaService;
|
|
@@ -46,12 +34,7 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
46
34
|
// 每个测试前重置所有 mock
|
|
47
35
|
jest.clearAllMocks();
|
|
48
36
|
|
|
49
|
-
service = new WorkflowNodeInstanceService(
|
|
50
|
-
mockPrismaService as any,
|
|
51
|
-
mockNodeConfigValidator as any,
|
|
52
|
-
mockWidgetCatalog as any,
|
|
53
|
-
mockSubjectConfigValidator as any,
|
|
54
|
-
);
|
|
37
|
+
service = new WorkflowNodeInstanceService(mockPrismaService as any);
|
|
55
38
|
prisma = mockPrismaService;
|
|
56
39
|
});
|
|
57
40
|
|
|
@@ -76,7 +59,7 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
76
59
|
};
|
|
77
60
|
const actor = { userId: 'user-1', username: 'tester' };
|
|
78
61
|
|
|
79
|
-
it('should
|
|
62
|
+
it('should save an incomplete config without publish-time validation', async () => {
|
|
80
63
|
const expectedResult = {
|
|
81
64
|
id: BigInt(1),
|
|
82
65
|
...input,
|
|
@@ -90,11 +73,6 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
90
73
|
|
|
91
74
|
const result = await service.createConfigured(input, actor);
|
|
92
75
|
|
|
93
|
-
expect(mockNodeConfigValidator.validateOrThrow).toHaveBeenCalledWith(
|
|
94
|
-
'1:1',
|
|
95
|
-
nodeType.configSchema,
|
|
96
|
-
input.config,
|
|
97
|
-
);
|
|
98
76
|
expect(prisma.workflowNodeInstance.create).toHaveBeenCalledWith({
|
|
99
77
|
data: {
|
|
100
78
|
nodeTypeId: BigInt(1),
|
|
@@ -3,10 +3,6 @@ import { Prisma, WorkflowNodeInstance } from '@prisma/client';
|
|
|
3
3
|
import { PrismaService } from 'nestjs-prisma';
|
|
4
4
|
|
|
5
5
|
import { ActorContext } from '../subjectProvider/subject-provider.types';
|
|
6
|
-
import { NodeConfigValidatorService } from '../workflowConfig/node-config-validator.service';
|
|
7
|
-
import { JsonSchema } from '../workflowConfig/schema.types';
|
|
8
|
-
import { SubjectConfigValidatorService } from '../workflowConfig/subject-config-validator.service';
|
|
9
|
-
import { WidgetCatalogService } from '../workflowConfig/widget-catalog.service';
|
|
10
6
|
import {
|
|
11
7
|
CreateConfiguredNodeInstanceDto,
|
|
12
8
|
UpdateConfiguredNodeInstanceDto,
|
|
@@ -14,12 +10,7 @@ import {
|
|
|
14
10
|
|
|
15
11
|
@Injectable()
|
|
16
12
|
export class WorkflowNodeInstanceService {
|
|
17
|
-
constructor(
|
|
18
|
-
private prisma: PrismaService,
|
|
19
|
-
private readonly nodeConfigValidator: NodeConfigValidatorService,
|
|
20
|
-
private readonly widgetCatalog: WidgetCatalogService,
|
|
21
|
-
private readonly subjectConfigValidator: SubjectConfigValidatorService,
|
|
22
|
-
) {}
|
|
13
|
+
constructor(private prisma: PrismaService) {}
|
|
23
14
|
|
|
24
15
|
async createConfigured(
|
|
25
16
|
input: CreateConfiguredNodeInstanceDto,
|
|
@@ -27,18 +18,10 @@ export class WorkflowNodeInstanceService {
|
|
|
27
18
|
) {
|
|
28
19
|
const nodeType = await this.prisma.workflowNodeType.findUnique({
|
|
29
20
|
where: { id: BigInt(input.nodeTypeId) },
|
|
30
|
-
select: {
|
|
31
|
-
id: true,
|
|
32
|
-
runtimeKey: true,
|
|
33
|
-
schemaVersion: true,
|
|
34
|
-
configSchema: true,
|
|
35
|
-
uiSchema: true,
|
|
36
|
-
},
|
|
21
|
+
select: { id: true },
|
|
37
22
|
});
|
|
38
23
|
if (!nodeType) throw new NotFoundException('Node type not found');
|
|
39
24
|
|
|
40
|
-
await this.validateConfig(nodeType, input.config, actor);
|
|
41
|
-
|
|
42
25
|
const config = input.config as Prisma.InputJsonValue;
|
|
43
26
|
const creator = this.creatorFrom(actor);
|
|
44
27
|
const instance = await this.prisma.workflowNodeInstance.create({
|
|
@@ -63,23 +46,10 @@ export class WorkflowNodeInstanceService {
|
|
|
63
46
|
const id = BigInt(instanceId);
|
|
64
47
|
const instance = await this.prisma.workflowNodeInstance.findUnique({
|
|
65
48
|
where: { id },
|
|
66
|
-
select: {
|
|
67
|
-
id: true,
|
|
68
|
-
nodeType: {
|
|
69
|
-
select: {
|
|
70
|
-
id: true,
|
|
71
|
-
runtimeKey: true,
|
|
72
|
-
schemaVersion: true,
|
|
73
|
-
configSchema: true,
|
|
74
|
-
uiSchema: true,
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
},
|
|
49
|
+
select: { id: true },
|
|
78
50
|
});
|
|
79
51
|
if (!instance) throw new NotFoundException('Node instance not found');
|
|
80
52
|
|
|
81
|
-
if (input.config !== undefined)
|
|
82
|
-
await this.validateConfig(instance.nodeType, input.config, actor);
|
|
83
53
|
const data = {
|
|
84
54
|
...(input.name !== undefined && { name: input.name }),
|
|
85
55
|
...(input.description !== undefined && {
|
|
@@ -102,43 +72,6 @@ export class WorkflowNodeInstanceService {
|
|
|
102
72
|
return updated;
|
|
103
73
|
}
|
|
104
74
|
|
|
105
|
-
private async validateConfig(
|
|
106
|
-
nodeType: {
|
|
107
|
-
id: bigint;
|
|
108
|
-
runtimeKey: string;
|
|
109
|
-
schemaVersion: number;
|
|
110
|
-
configSchema: Prisma.JsonValue;
|
|
111
|
-
uiSchema: Prisma.JsonValue;
|
|
112
|
-
},
|
|
113
|
-
config: unknown,
|
|
114
|
-
actor: ActorContext,
|
|
115
|
-
): Promise<void> {
|
|
116
|
-
const schemaKey = `${nodeType.id}:${nodeType.schemaVersion}`;
|
|
117
|
-
const configSchema = nodeType.configSchema as JsonSchema;
|
|
118
|
-
|
|
119
|
-
this.nodeConfigValidator.validateOrThrow(schemaKey, configSchema, config);
|
|
120
|
-
this.widgetCatalog.assertUiSchemaSupported(nodeType.uiSchema);
|
|
121
|
-
await this.subjectConfigValidator.validateSubjects(
|
|
122
|
-
configSchema,
|
|
123
|
-
config,
|
|
124
|
-
actor,
|
|
125
|
-
);
|
|
126
|
-
if (nodeType.runtimeKey === 'http_request') {
|
|
127
|
-
const connectionRef = (config as Record<string, unknown>)?.connectionRef;
|
|
128
|
-
const connection =
|
|
129
|
-
typeof connectionRef === 'string'
|
|
130
|
-
? await this.prisma.integrationConnection.findUnique({
|
|
131
|
-
where: { code: connectionRef },
|
|
132
|
-
select: { isEnabled: true },
|
|
133
|
-
})
|
|
134
|
-
: null;
|
|
135
|
-
if (!connection?.isEnabled)
|
|
136
|
-
throw new NotFoundException(
|
|
137
|
-
'HTTP Request Connection was not found or is disabled',
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
75
|
private creatorFrom(actor: ActorContext): string {
|
|
143
76
|
return actor.username ?? actor.userId;
|
|
144
77
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"@dnd-kit/sortable": "^7.0.2",
|
|
12
12
|
"@dnd-kit/utilities": "^3.2.2",
|
|
13
13
|
"@gadmin2n/charts": "0.0.10",
|
|
14
|
-
"@gadmin2n/react-common": "^0.0.
|
|
14
|
+
"@gadmin2n/react-common": "^0.0.75",
|
|
15
15
|
"@monaco-editor/react": "^4.7.0",
|
|
16
16
|
"@refinedev/antd": "^6.0.3",
|
|
17
17
|
"@refinedev/cli": "^2.16.52",
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
"@tanstack/react-query": "^5.81.5",
|
|
23
23
|
"@uiw/react-md-editor": "^3.19.5",
|
|
24
24
|
"@xyflow/react": "^12.10.2",
|
|
25
|
+
"ajv": "^8.16.0",
|
|
26
|
+
"ajv-formats": "^2.1.1",
|
|
25
27
|
"antd": "^5.24.6",
|
|
26
28
|
"class-validator": "^0.14.0",
|
|
27
29
|
"dayjs": "^1.11.19",
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx
CHANGED
|
@@ -49,7 +49,7 @@ export interface RowActionsProps<T = any> {
|
|
|
49
49
|
showDetail?: boolean;
|
|
50
50
|
showClone?: boolean;
|
|
51
51
|
showDelete?: boolean;
|
|
52
|
-
/** History/Log button —— actions
|
|
52
|
+
/** History/Log button —— 强制显式覆盖;actions 未声明 HISTORY 时需显式 showHistory 或 LogButton 开启 */
|
|
53
53
|
showHistory?: boolean;
|
|
54
54
|
/** Custom children - if provided, replaces entire default UI */
|
|
55
55
|
children?:
|
|
@@ -95,7 +95,7 @@ export function RowActions<T extends { id: number | string }>({
|
|
|
95
95
|
showDetail,
|
|
96
96
|
showClone,
|
|
97
97
|
showDelete,
|
|
98
|
-
showHistory
|
|
98
|
+
showHistory,
|
|
99
99
|
children,
|
|
100
100
|
renderEditButton,
|
|
101
101
|
renderDetailButton,
|
|
@@ -132,6 +132,7 @@ export function RowActions<T extends { id: number | string }>({
|
|
|
132
132
|
const resolvedShowDetail = showDetail ?? flags.showDetail;
|
|
133
133
|
const resolvedShowClone = showClone ?? flags.showClone;
|
|
134
134
|
const resolvedShowDelete = showDelete ?? flags.showDelete;
|
|
135
|
+
const resolvedShowHistory = showHistory ?? flags.showHistory;
|
|
135
136
|
|
|
136
137
|
// ---------- 默认按钮渲染器 ----------
|
|
137
138
|
const defaultEditButton = (id: number | string) => (
|
|
@@ -212,6 +213,22 @@ export function RowActions<T extends { id: number | string }>({
|
|
|
212
213
|
: defaultDetailButton(recordId),
|
|
213
214
|
}
|
|
214
215
|
: null;
|
|
216
|
+
case 'CLONE':
|
|
217
|
+
return resolvedShowClone
|
|
218
|
+
? {
|
|
219
|
+
key,
|
|
220
|
+
node: renderCloneButton
|
|
221
|
+
? renderCloneButton(recordId)
|
|
222
|
+
: defaultCloneButton(recordId),
|
|
223
|
+
}
|
|
224
|
+
: null;
|
|
225
|
+
case 'HISTORY': {
|
|
226
|
+
if (!resolvedShowHistory) return null;
|
|
227
|
+
const node = renderHistoryButton
|
|
228
|
+
? renderHistoryButton(recordId)
|
|
229
|
+
: defaultHistoryButton(recordId);
|
|
230
|
+
return node != null ? { key, node } : null;
|
|
231
|
+
}
|
|
215
232
|
case 'DELETE':
|
|
216
233
|
return resolvedShowDelete
|
|
217
234
|
? {
|
|
@@ -281,8 +298,8 @@ export function RowActions<T extends { id: number | string }>({
|
|
|
281
298
|
.map((a, i) => renderAction(a, i))
|
|
282
299
|
.filter((x): x is Renderable => x != null);
|
|
283
300
|
|
|
284
|
-
//
|
|
285
|
-
if (resolvedShowClone) {
|
|
301
|
+
// 隐式按钮:CLONE/HISTORY 未在 actions 声明时,分别由显式 showClone、showHistory 或 LogButton 触发
|
|
302
|
+
if (resolvedShowClone && !actions.some((a) => a.action === 'CLONE')) {
|
|
286
303
|
renderables.push({
|
|
287
304
|
key: 'clone-implicit',
|
|
288
305
|
node: renderCloneButton
|
|
@@ -290,7 +307,10 @@ export function RowActions<T extends { id: number | string }>({
|
|
|
290
307
|
: defaultCloneButton(recordId),
|
|
291
308
|
});
|
|
292
309
|
}
|
|
293
|
-
if (
|
|
310
|
+
if (
|
|
311
|
+
(showHistory || LogButton) &&
|
|
312
|
+
!actions.some((a) => a.action === 'HISTORY')
|
|
313
|
+
) {
|
|
294
314
|
const node = renderHistoryButton
|
|
295
315
|
? renderHistoryButton(recordId)
|
|
296
316
|
: defaultHistoryButton(recordId);
|