@gadmin2n/schematics 0.0.144 → 0.0.146

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +10 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +140 -19
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/data-mngt.seed.ts +0 -2
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +694 -327
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-outbox.ts +49 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +35 -5
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +14 -24
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +23 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +16 -5
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +98 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +26 -6
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +17 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +3 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -2
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +30 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +28 -6
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +63 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +151 -38
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +4 -1
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +16 -5
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +23 -6
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.spec.ts +130 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +62 -62
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +15 -1
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +70 -9
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +31 -7
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.spec.ts +30 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +28 -6
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +50 -3
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +26 -3
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +53 -47
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +0 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +541 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +442 -200
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +150 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +56 -40
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +16 -60
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +13 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +44 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +6 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +258 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +127 -14
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.spec.ts +85 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.ts +108 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +5 -5
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +96 -25
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +77 -34
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +23 -34
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +0 -21
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +245 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +639 -188
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +408 -235
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +1 -3
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +279 -95
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +360 -80
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-event-catalog.spec.ts +323 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +773 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +7 -13
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +0 -16
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.spec.ts +184 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +69 -138
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.spec.ts +113 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +59 -13
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +86 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.spec.ts +25 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.ts +45 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +78 -43
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +103 -40
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +57 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +3 -1
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +1000 -240
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +2184 -317
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +279 -2
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +5 -1
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +4 -1
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +5 -1
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +12 -3
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +10 -1
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +2 -24
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +3 -70
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +3 -1
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +25 -5
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.test.tsx +71 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.tsx +89 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +52 -12
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +12 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +10 -33
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +13 -37
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -7
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +14 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/workflowAction.ts +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +1 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +3 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -6
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useReferenceUpload.ts +95 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -2
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +672 -110
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -2
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +676 -114
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +13 -1
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +38 -4
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +276 -376
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +126 -6
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.test.tsx +50 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +48 -11
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +32 -34
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.test.tsx +111 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.tsx +167 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/business-events.css +99 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.test.tsx +106 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +324 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.test.tsx +73 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +359 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CanvasZoomControls.tsx +46 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +9 -1
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +105 -4
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +90 -48
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +3 -2
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.test.tsx +259 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +167 -103
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +142 -140
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +60 -15
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +25 -12
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +364 -200
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +220 -52
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +260 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +300 -130
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +507 -33
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +630 -592
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +67 -70
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.test.tsx +90 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.tsx +325 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.test.tsx +52 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +14 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +2 -1
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +2 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +42 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +76 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowWorkspaceHeader.tsx +56 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/parameter-binding-editor.css +46 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/workflow-code-editor.css +34 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +53 -7
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +123 -62
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +85 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +29 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +75 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +69 -36
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.test.tsx +494 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +665 -194
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.test.tsx +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.ts +96 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.test.tsx +297 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +135 -65
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +53 -42
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +344 -155
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +79 -58
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +123 -144
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +169 -98
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/node-instance-form.css +91 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +54 -31
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +854 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +41 -14
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +75 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +3 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +20 -2
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +2 -1
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +61 -66
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +33 -1
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +47 -15
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/BranchConfigEditors.test.tsx +104 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +22 -52
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +72 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +78 -70
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CronTriggerConfigEditor.tsx +569 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +130 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DelayConfigEditor.tsx +100 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +620 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +22 -45
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +25 -92
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +3 -11
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.test.tsx +58 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.tsx +107 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +212 -31
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +214 -304
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +175 -40
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +693 -293
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/IfElseConfigEditor.tsx +190 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.test.tsx +152 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.tsx +286 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParallelConfigEditor.tsx +101 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParameterBindingListEditor.tsx +99 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +495 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.test.tsx +124 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.tsx +222 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +2 -4
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SwitchConfigEditor.tsx +204 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +3 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +9 -6
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/callable-workflow.ts +4 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/code-config.css +96 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/event-catalog.api.ts +117 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/http-request-config.css +242 -0
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +194 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +264 -167
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +6 -9
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +19 -16
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +28 -4
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.test.tsx +59 -0
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.ts +24 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.test.ts +311 -0
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.ts +198 -0
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.test.ts +143 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.ts +19 -0
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +103 -5
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +158 -3
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +117 -9
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.test.ts +70 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.ts +48 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.test.ts +55 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +95 -22
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +148 -1
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +62 -11
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +19 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.test.ts +45 -0
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.ts +26 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.test.ts +502 -0
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.ts +694 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.test.ts +27 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.ts +33 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.test.ts +34 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.ts +52 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.test.ts +99 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.ts +91 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.test.ts +74 -0
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.ts +120 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/workflow-ui.css +481 -0
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
  248. package/package.json +1 -1
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +0 -62
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +0 -86
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +0 -60
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +0 -698
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
@@ -1,11 +1,14 @@
1
1
  import { render, screen, waitFor } from '@testing-library/react';
2
2
  import userEvent from '@testing-library/user-event';
3
3
  import { customRequest } from 'helpers/http';
4
- import { act } from 'react';
4
+ import { act, createRef, useState } from 'react';
5
5
  import { beforeEach, describe, expect, it, vi } from 'vitest';
6
6
  import i18n from '../../../i18n';
7
7
  import type { WorkflowNode, WorkflowNodeType } from '../types';
8
- import { NodePropertyPanel } from './NodePropertyPanel';
8
+ import {
9
+ NodePropertyPanel,
10
+ type NodePropertyPanelHandle,
11
+ } from './NodePropertyPanel';
9
12
 
10
13
  vi.mock('helpers/http', () => ({ customRequest: vi.fn() }));
11
14
 
@@ -21,6 +24,15 @@ const nodeType = {
21
24
  subjects: { type: 'array', title: 'Approvers' },
22
25
  },
23
26
  },
27
+ outputSchema: {
28
+ type: 'object',
29
+ required: ['previous', 'result'],
30
+ properties: {
31
+ previous: {},
32
+ result: { type: 'object' },
33
+ },
34
+ },
35
+ outputs: ['true', 'false'],
24
36
  uiSchema: { widget: 'human-approval-config' },
25
37
  } as unknown as WorkflowNodeType;
26
38
 
@@ -51,6 +63,216 @@ describe('NodePropertyPanel instance references', () => {
51
63
  });
52
64
  });
53
65
 
66
+ it('uses the standard wide panel for a manual trigger', () => {
67
+ vi.mocked(customRequest).mockResolvedValue({ data: [] } as never);
68
+ const manualNodeType = {
69
+ ...nodeType,
70
+ id: '1',
71
+ type: 'manual_trigger',
72
+ label: 'Manual Trigger',
73
+ category: 'TRIGGER',
74
+ instancePolicy: 'INLINE_ONLY',
75
+ configSchema: { type: 'object', properties: {} },
76
+ uiSchema: {},
77
+ } as unknown as WorkflowNodeType;
78
+
79
+ render(
80
+ <NodePropertyPanel
81
+ node={{
82
+ ...node,
83
+ type: 'manual_trigger',
84
+ label: 'Manual Trigger',
85
+ config: {},
86
+ instanceRef: undefined,
87
+ }}
88
+ nodeTypes={[manualNodeType]}
89
+ onSave={vi.fn()}
90
+ onLabelChange={vi.fn()}
91
+ onAiEdit={vi.fn()}
92
+ aiLoading={false}
93
+ />,
94
+ );
95
+
96
+ expect(
97
+ screen.getByTestId('workflow-editor-panel-node-property'),
98
+ ).toHaveStyle({ width: 'clamp(440px, 38vw, 520px)' });
99
+ });
100
+
101
+ it('allows incomplete node configuration to be saved as a draft', async () => {
102
+ const user = userEvent.setup();
103
+ const onSave = vi.fn();
104
+ vi.mocked(customRequest).mockResolvedValue([] as never);
105
+ const httpNodeType = {
106
+ id: '20',
107
+ type: 'http_request',
108
+ label: 'HTTP Request',
109
+ category: 'ACTION',
110
+ instancePolicy: 'OPTIONAL',
111
+ configSchema: {
112
+ type: 'object',
113
+ properties: {
114
+ connectionRef: { type: 'string' },
115
+ method: { type: 'string' },
116
+ path: { type: 'string' },
117
+ timeoutSeconds: { type: 'integer' },
118
+ },
119
+ required: ['connectionRef', 'method', 'path'],
120
+ },
121
+ uiSchema: { widget: 'http-request-config' },
122
+ } as unknown as WorkflowNodeType;
123
+ const databaseNodeType = {
124
+ id: '21',
125
+ type: 'db_execute',
126
+ label: 'Database Operation',
127
+ category: 'ACTION',
128
+ instancePolicy: 'OPTIONAL',
129
+ configSchema: {
130
+ type: 'object',
131
+ properties: {
132
+ allowWrite: { type: 'boolean' },
133
+ sql: { type: 'string' },
134
+ timeoutSeconds: { type: 'integer' },
135
+ },
136
+ required: ['allowWrite', 'sql'],
137
+ },
138
+ uiSchema: { widget: 'db-execute-config' },
139
+ } as unknown as WorkflowNodeType;
140
+
141
+ function SwitchingPanel() {
142
+ const [currentNode, setCurrentNode] = useState<WorkflowNode>({
143
+ id: 'http-1',
144
+ type: 'http_request',
145
+ label: 'HTTP Request',
146
+ position: { x: 0, y: 0 },
147
+ config: {},
148
+ });
149
+ return (
150
+ <>
151
+ <button
152
+ type="button"
153
+ onClick={() =>
154
+ setCurrentNode({
155
+ id: 'database-1',
156
+ type: 'db_execute',
157
+ label: 'Database Operation',
158
+ position: { x: 0, y: 0 },
159
+ config: {
160
+ allowWrite: false,
161
+ sql: 'SELECT 1',
162
+ timeoutSeconds: 3,
163
+ },
164
+ })
165
+ }
166
+ >
167
+ Switch node
168
+ </button>
169
+ <NodePropertyPanel
170
+ node={currentNode}
171
+ nodeTypes={[httpNodeType, databaseNodeType]}
172
+ onSave={onSave}
173
+ onConfigDraftChange={(nodeId, config) =>
174
+ setCurrentNode((current) =>
175
+ current.id === nodeId ? { ...current, config } : current,
176
+ )
177
+ }
178
+ onLabelChange={vi.fn()}
179
+ onAiEdit={vi.fn()}
180
+ aiLoading={false}
181
+ />
182
+ </>
183
+ );
184
+ }
185
+
186
+ render(<SwitchingPanel />);
187
+
188
+ expect(
189
+ screen.queryByText('Connection is required'),
190
+ ).not.toBeInTheDocument();
191
+ await user.click(screen.getByRole('button', { name: 'Save changes' }));
192
+ expect(onSave).toHaveBeenCalledWith(
193
+ 'http-1',
194
+ expect.objectContaining({ config: expect.any(Object) }),
195
+ );
196
+ expect(
197
+ screen.queryByText('Connection is required'),
198
+ ).not.toBeInTheDocument();
199
+ await user.click(screen.getByRole('button', { name: 'Switch node' }));
200
+
201
+ expect(await screen.findByRole('spinbutton')).toHaveValue('3');
202
+ expect(
203
+ screen.queryByText('Connection is required'),
204
+ ).not.toBeInTheDocument();
205
+ });
206
+
207
+ it('refreshes a dirty panel from the latest Workflow DSL', async () => {
208
+ const user = userEvent.setup();
209
+ vi.mocked(customRequest).mockResolvedValue([] as never);
210
+ const httpNodeType = {
211
+ id: '20',
212
+ type: 'http_request',
213
+ label: 'HTTP Request',
214
+ category: 'ACTION',
215
+ instancePolicy: 'OPTIONAL',
216
+ configSchema: {
217
+ type: 'object',
218
+ properties: {
219
+ path: { type: 'string', title: 'Request path' },
220
+ },
221
+ },
222
+ uiSchema: {},
223
+ } as unknown as WorkflowNodeType;
224
+
225
+ function DslControlledPanel() {
226
+ const [currentNode, setCurrentNode] = useState<WorkflowNode>({
227
+ id: 'http-1',
228
+ type: 'http_request',
229
+ label: 'HTTP Request',
230
+ position: { x: 0, y: 0 },
231
+ config: { path: '/initial' },
232
+ });
233
+ return (
234
+ <>
235
+ <button
236
+ type="button"
237
+ onClick={() =>
238
+ setCurrentNode((current) => ({
239
+ ...current,
240
+ config: { path: '/from-dsl' },
241
+ }))
242
+ }
243
+ >
244
+ Apply DSL
245
+ </button>
246
+ <NodePropertyPanel
247
+ node={currentNode}
248
+ nodeTypes={[httpNodeType]}
249
+ onSave={vi.fn()}
250
+ onConfigDraftChange={(nodeId, config) =>
251
+ setCurrentNode((current) =>
252
+ current.id === nodeId ? { ...current, config } : current,
253
+ )
254
+ }
255
+ onLabelChange={vi.fn()}
256
+ onAiEdit={vi.fn()}
257
+ aiLoading={false}
258
+ />
259
+ </>
260
+ );
261
+ }
262
+
263
+ render(<DslControlledPanel />);
264
+
265
+ const pathInput = screen.getByDisplayValue('/initial');
266
+ await user.clear(pathInput);
267
+ await user.type(pathInput, '/panel-draft');
268
+ expect(screen.getByDisplayValue('/panel-draft')).toBeInTheDocument();
269
+
270
+ await user.click(screen.getByRole('button', { name: 'Apply DSL' }));
271
+
272
+ expect(screen.getByDisplayValue('/from-dsl')).toBeInTheDocument();
273
+ expect(screen.queryByDisplayValue('/panel-draft')).not.toBeInTheDocument();
274
+ });
275
+
54
276
  it('renders a referenced node with the editable template config form', async () => {
55
277
  vi.mocked(customRequest).mockImplementation((path) => {
56
278
  if (path === 'subject-providers') return Promise.resolve([]) as never;
@@ -75,6 +297,9 @@ describe('NodePropertyPanel instance references', () => {
75
297
  <NodePropertyPanel
76
298
  node={node}
77
299
  nodeTypes={[nodeType]}
300
+ referencedConfigs={{
301
+ '12': { subjects: [{ provider: 'USER', refs: ['bob'] }] },
302
+ }}
78
303
  onSave={vi.fn()}
79
304
  onLabelChange={vi.fn()}
80
305
  onAiEdit={vi.fn()}
@@ -94,50 +319,247 @@ describe('NodePropertyPanel instance references', () => {
94
319
  expect(
95
320
  screen.getByRole('heading', { name: 'Node configuration' }),
96
321
  ).toBeInTheDocument();
97
- expect(screen.getByText('Node type')).toBeInTheDocument();
322
+ expect(
323
+ screen.getByTestId('workflow-editor-panel-node-property'),
324
+ ).toBeInTheDocument();
325
+ expect(
326
+ screen.getByTestId('workflow-node-properties-node-identity'),
327
+ ).toBeInTheDocument();
328
+ expect(
329
+ screen.queryByRole('button', { name: 'Delete node' }),
330
+ ).not.toBeInTheDocument();
98
331
  expect(screen.getByText('Human Approval')).toBeInTheDocument();
332
+ expect(screen.queryByText('Human approval')).not.toBeInTheDocument();
99
333
  expect(screen.queryByText('approval')).not.toBeInTheDocument();
334
+ expect(
335
+ screen.getByText('Data received before approval'),
336
+ ).toBeInTheDocument();
337
+ expect(screen.getByText("This approval's outcome")).toBeInTheDocument();
338
+ expect(screen.getByText('input.previous')).toBeInTheDocument();
339
+ expect(screen.getByText('input.result')).toBeInTheDocument();
340
+ const resultFieldHead = screen
341
+ .getByText("This approval's outcome")
342
+ .closest('.workflow-node-output__field-head');
343
+ expect(resultFieldHead).toHaveTextContent('Always returned');
344
+ expect(resultFieldHead).toHaveTextContent('Object');
345
+ expect(
346
+ screen.getByText('Includes the approver and completion time'),
347
+ ).toBeInTheDocument();
100
348
  expect(
101
349
  screen.getByRole('button', { name: 'Save changes' }),
102
350
  ).toBeInTheDocument();
351
+ expect(customRequest).not.toHaveBeenCalledWith(
352
+ 'workflowNodeInstance/findMany',
353
+ expect.anything(),
354
+ expect.anything(),
355
+ );
103
356
  });
104
357
 
105
- it('uses the simple return editor even when stored node metadata has no widget', () => {
106
- const returnNodeType = {
107
- id: '9',
108
- type: 'return_result',
109
- label: 'Finish and return',
110
- category: 'ACTION',
111
- instancePolicy: 'INLINE_ONLY',
112
- configSchema: {
113
- type: 'object',
114
- properties: {},
115
- },
116
- uiSchema: {},
117
- } as unknown as WorkflowNodeType;
118
- const returnNode: WorkflowNode = {
119
- id: 'return-1',
120
- type: 'return_result',
121
- label: 'Finish and return',
122
- position: { x: 0, y: 0 },
123
- config: {},
124
- };
358
+ it('lets approval nodes use a template or configure directly', async () => {
359
+ const user = userEvent.setup();
360
+ const onSave = vi.fn();
361
+ vi.mocked(customRequest).mockImplementation((path) => {
362
+ if (path === 'subject-providers') return Promise.resolve([]) as never;
363
+ if (path === 'workflow/callable') return Promise.resolve([]) as never;
364
+ return Promise.resolve({
365
+ data: [
366
+ {
367
+ id: '12',
368
+ code: 'FINANCE_APPROVAL',
369
+ name: 'Finance approval',
370
+ nodeTypeId: '7',
371
+ isEnabled: true,
372
+ config: { subjects: [{ provider: 'USER', refs: ['bob'] }] },
373
+ },
374
+ ],
375
+ }) as never;
376
+ });
125
377
 
126
378
  render(
127
379
  <NodePropertyPanel
128
- node={returnNode}
129
- nodeTypes={[returnNodeType]}
130
- onSave={vi.fn()}
380
+ node={{ ...node, instanceRef: undefined }}
381
+ nodeTypes={[nodeType]}
382
+ onSave={onSave}
131
383
  onLabelChange={vi.fn()}
132
384
  onAiEdit={vi.fn()}
133
385
  aiLoading={false}
134
386
  />,
135
387
  );
136
388
 
389
+ expect(screen.getByRole('button', { name: 'Save changes' })).toBeEnabled();
137
390
  expect(
138
- screen.getByText('Returns the previous node result'),
391
+ screen.getByText('Use a template or configure this node directly'),
139
392
  ).toBeInTheDocument();
140
- expect(screen.queryByText('Result type')).toBeNull();
393
+ expect(screen.getByRole('button', { name: /New template/ })).toHaveClass(
394
+ 'workflow-panel-action',
395
+ );
396
+ expect(screen.getByText('Who can approve')).toBeInTheDocument();
397
+ expect(screen.queryByText('Parameters')).not.toBeInTheDocument();
398
+ expect(
399
+ screen
400
+ .getByText('GAdmin approval task')
401
+ .closest('.workflow-node-panel__parameters-card'),
402
+ ).toBeNull();
403
+
404
+ await waitFor(() =>
405
+ expect(screen.getAllByRole('combobox')[0]).not.toBeDisabled(),
406
+ );
407
+ await user.click(screen.getAllByRole('combobox')[0]);
408
+ await user.click(await screen.findByText('Finance approval'));
409
+
410
+ expect(onSave).toHaveBeenCalledWith(
411
+ 'node-1',
412
+ expect.objectContaining({
413
+ label: 'Finance approval',
414
+ instanceRef: {
415
+ instanceId: '12',
416
+ instanceCode: 'FINANCE_APPROVAL',
417
+ },
418
+ }),
419
+ );
420
+ });
421
+
422
+ it('keeps an inline approval configuration after saving it', async () => {
423
+ const user = userEvent.setup();
424
+ const onSave = vi.fn();
425
+ const onConfigDraftChange = vi.fn();
426
+ const panelRef = createRef<NodePropertyPanelHandle>();
427
+ vi.mocked(customRequest).mockResolvedValue([] as never);
428
+ const inlineNodeType = {
429
+ ...nodeType,
430
+ instancePolicy: 'OPTIONAL',
431
+ configSchema: {
432
+ type: 'object',
433
+ properties: {
434
+ task: { type: 'object' },
435
+ subjects: { type: 'array' },
436
+ approvalRule: { type: 'object' },
437
+ rejectionRule: { type: 'object' },
438
+ timeout: { type: 'object' },
439
+ },
440
+ },
441
+ } as unknown as WorkflowNodeType;
442
+ const inlineNode: WorkflowNode = {
443
+ ...node,
444
+ instanceRef: undefined,
445
+ config: {
446
+ external: {
447
+ request: {
448
+ connectionRef: 'ticketing',
449
+ method: 'POST',
450
+ path: '/approvals',
451
+ queryBindings: {},
452
+ headerBindings: {},
453
+ bodyMode: 'FIELDS',
454
+ bodyBindings: {},
455
+ timeoutSeconds: 30,
456
+ },
457
+ creationResult: {
458
+ mode: 'runOnceForAll',
459
+ timeout: 5000,
460
+ script: 'return response;',
461
+ },
462
+ callbackResult: {
463
+ mode: 'runOnceForAll',
464
+ timeout: 5000,
465
+ script: 'return callback.body;',
466
+ },
467
+ },
468
+ task: {
469
+ title: { source: 'WORKFLOW', path: 'request.title' },
470
+ description: {
471
+ source: 'FIXED',
472
+ valueType: 'STRING',
473
+ value: '',
474
+ },
475
+ details: [],
476
+ },
477
+ subjects: [],
478
+ approvalRule: { mode: 'ANY' },
479
+ rejectionRule: { mode: 'ANY' },
480
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
481
+ },
482
+ };
483
+ function StatefulPanel() {
484
+ const [currentNode, setCurrentNode] = useState(inlineNode);
485
+ return (
486
+ <NodePropertyPanel
487
+ ref={panelRef}
488
+ node={currentNode}
489
+ nodeTypes={[inlineNodeType]}
490
+ onSave={(nodeId, updates) => {
491
+ onSave(nodeId, updates);
492
+ setCurrentNode((current) => ({
493
+ ...current,
494
+ label: updates.label ?? current.label,
495
+ config: updates.config ?? current.config,
496
+ }));
497
+ }}
498
+ onConfigDraftChange={(nodeId, config) => {
499
+ onConfigDraftChange(nodeId, config);
500
+ setCurrentNode((current) => ({ ...current, config }));
501
+ }}
502
+ onLabelChange={vi.fn()}
503
+ onAiEdit={vi.fn()}
504
+ aiLoading={false}
505
+ />
506
+ );
507
+ }
508
+
509
+ render(<StatefulPanel />);
510
+
511
+ const titlePath = screen.getByLabelText('Task title field path');
512
+ await user.clear(titlePath);
513
+ await user.type(titlePath, 'request.subject');
514
+
515
+ expect(onConfigDraftChange).toHaveBeenCalledWith(
516
+ inlineNode.id,
517
+ expect.objectContaining({
518
+ task: expect.objectContaining({
519
+ title: { source: 'WORKFLOW', path: 'request.subject' },
520
+ }),
521
+ }),
522
+ );
523
+ expect(panelRef.current?.getPendingUpdate()).toMatchObject({
524
+ nodeId: inlineNode.id,
525
+ updates: {
526
+ config: {
527
+ task: {
528
+ title: { source: 'WORKFLOW', path: 'request.subject' },
529
+ },
530
+ },
531
+ },
532
+ });
533
+
534
+ await user.click(screen.getByRole('button', { name: 'Save changes' }));
535
+
536
+ const savedConfig = onSave.mock.lastCall?.[1].config;
537
+ expect(savedConfig).toMatchObject({
538
+ external: {
539
+ request: {
540
+ connectionRef: 'ticketing',
541
+ method: 'POST',
542
+ path: '/approvals',
543
+ },
544
+ },
545
+ task: {
546
+ title: { source: 'WORKFLOW', path: 'request.subject' },
547
+ },
548
+ approvalRule: { mode: 'ANY' },
549
+ rejectionRule: { mode: 'ANY' },
550
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
551
+ });
552
+
553
+ await waitFor(() =>
554
+ expect(screen.getByLabelText('Task title field path')).toHaveValue(
555
+ 'request.subject',
556
+ ),
557
+ );
558
+ expect(
559
+ screen.getByRole('switch', {
560
+ name: 'Also send to an external system',
561
+ }),
562
+ ).toBeChecked();
141
563
  });
142
564
 
143
565
  it('shows the node output contract as read-only input paths', () => {
@@ -152,7 +574,7 @@ describe('NodePropertyPanel instance references', () => {
152
574
  type: 'object',
153
575
  properties: {
154
576
  status: { type: 'number', description: 'HTTP status code' },
155
- data: { description: 'Response body' },
577
+ data: { description: 'Unmodified response body' },
156
578
  headers: { type: 'object' },
157
579
  },
158
580
  },
@@ -178,13 +600,17 @@ describe('NodePropertyPanel instance references', () => {
178
600
  />,
179
601
  );
180
602
 
181
- expect(
182
- screen.getByRole('region', { name: 'Output (read-only)' }),
183
- ).toBeInTheDocument();
603
+ expect(screen.getByRole('region', { name: 'Output' })).toBeInTheDocument();
184
604
  expect(screen.getByText('input.status')).toBeInTheDocument();
185
605
  expect(screen.getByText('input.data')).toBeInTheDocument();
186
606
  expect(screen.getByText('input.headers')).toBeInTheDocument();
187
- expect(screen.getByText('HTTP status code')).toBeInTheDocument();
607
+ expect(screen.getByText('For example, 200')).toBeInTheDocument();
608
+ expect(
609
+ screen.queryByText('Business data returned by the API'),
610
+ ).not.toBeInTheDocument();
611
+ expect(
612
+ screen.queryByText('Unmodified response body'),
613
+ ).not.toBeInTheDocument();
188
614
  expect(screen.getByText('Any value')).toBeInTheDocument();
189
615
  });
190
616
 
@@ -257,4 +683,52 @@ describe('NodePropertyPanel instance references', () => {
257
683
  }),
258
684
  );
259
685
  });
686
+
687
+ it('filters the node palette by translated name and technical type', async () => {
688
+ const user = userEvent.setup();
689
+ const httpNodeType = {
690
+ id: '10',
691
+ type: 'http_request',
692
+ label: 'HTTP Request',
693
+ category: 'ACTION',
694
+ instancePolicy: 'INLINE_ONLY',
695
+ configSchema: { type: 'object', properties: {} },
696
+ } as unknown as WorkflowNodeType;
697
+ const delayNodeType = {
698
+ id: '11',
699
+ type: 'delay',
700
+ label: 'Timed Wait',
701
+ category: 'FLOW_CONTROL',
702
+ instancePolicy: 'INLINE_ONLY',
703
+ configSchema: { type: 'object', properties: {} },
704
+ } as unknown as WorkflowNodeType;
705
+
706
+ render(
707
+ <NodePropertyPanel
708
+ node={null}
709
+ nodeTypes={[httpNodeType, delayNodeType]}
710
+ onSave={vi.fn()}
711
+ onLabelChange={vi.fn()}
712
+ onAiEdit={vi.fn()}
713
+ aiLoading={false}
714
+ />,
715
+ );
716
+
717
+ const httpPaletteItem = screen
718
+ .getByText('HTTP Request')
719
+ .closest('.workflow-node-palette__item');
720
+ const delayPaletteItem = screen
721
+ .getByText('Timed Wait')
722
+ .closest('.workflow-node-palette__item');
723
+ expect(httpPaletteItem).toHaveStyle({ borderColor: '#b7eb8f' });
724
+ expect(delayPaletteItem).toHaveStyle({ borderColor: '#d3adf7' });
725
+
726
+ await user.type(
727
+ screen.getByPlaceholderText('Search nodes by name or purpose'),
728
+ 'http_request',
729
+ );
730
+
731
+ expect(screen.getByText('HTTP Request')).toBeInTheDocument();
732
+ expect(screen.queryByText('Timed Wait')).not.toBeInTheDocument();
733
+ });
260
734
  });