@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.
Files changed (279) 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 +57 -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/seed/workflows.ts +224 -59
  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/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
@@ -9,7 +9,7 @@ import {
9
9
  Spin,
10
10
  Modal,
11
11
  Input,
12
- Typography,
12
+ Segmented,
13
13
  Space,
14
14
  } from 'antd';
15
15
  import {
@@ -36,10 +36,9 @@ import { ImportModal } from './components/ImportModal';
36
36
  import PublishModal from './PublishModal';
37
37
  import { useTranslation } from 'react-i18next';
38
38
  import { useUserPageAccess } from 'hooks/useUserPageAccess';
39
- import { customRequest } from 'helpers/http';
40
39
  import { useIsAgentAllowed } from 'config/agentAllowed';
41
40
  import { PageHeader } from 'components';
42
- import { PAGE_WRAPPER_STYLE } from 'constants/layout';
41
+ import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
43
42
 
44
43
  const COLS = 48;
45
44
  const ROW_HEIGHT = 10;
@@ -91,30 +90,19 @@ const CanvasListPage: React.FC = () => {
91
90
  const { roleNames } = useUserPageAccess();
92
91
  const isSystemAdmin = roleNames.includes('SYSTEM_ADMIN');
93
92
 
94
- const [othersCanvases, setOthersCanvases] = useState<SavedCanvasWithOwner[]>(
95
- [],
96
- );
97
- const [othersLoading, setOthersLoading] = useState(false);
98
-
99
- const [currentUserId, setCurrentUserId] = useState<string>('');
100
- useEffect(() => {
101
- customRequest<{ userid: string }>('userinfo', 'GET')
102
- .then((res) => {
103
- setCurrentUserId(res.userid ?? '');
104
- })
105
- .catch(() => {});
106
- }, []);
93
+ const [allCanvases, setAllCanvases] = useState<SavedCanvasWithOwner[]>([]);
94
+ const [allLoading, setAllLoading] = useState(false);
95
+ const [filter, setFilter] = useState<'mine' | 'all'>('mine');
96
+ const showAll = isSystemAdmin && filter === 'all';
107
97
 
108
98
  useEffect(() => {
109
- if (!isSystemAdmin || !currentUserId) return;
110
- setOthersLoading(true);
99
+ if (!isSystemAdmin) return;
100
+ setAllLoading(true);
111
101
  fetchAllCanvases()
112
- .then((all) => {
113
- setOthersCanvases(all.filter((c) => c.userId !== currentUserId));
114
- })
115
- .catch(() => message.error('加载其他人的 Canvas 失败'))
116
- .finally(() => setOthersLoading(false));
117
- }, [isSystemAdmin, currentUserId]);
102
+ .then(setAllCanvases)
103
+ .catch(() => message.error('加载所有 Canvas 失败'))
104
+ .finally(() => setAllLoading(false));
105
+ }, [isSystemAdmin]);
118
106
 
119
107
  useEffect(() => {
120
108
  fetchCanvases()
@@ -146,6 +134,7 @@ const CanvasListPage: React.FC = () => {
146
134
  try {
147
135
  await deleteCanvas(id);
148
136
  setCanvases((prev) => prev.filter((c) => c.id !== id));
137
+ setAllCanvases((prev) => prev.filter((c) => c.id !== id));
149
138
  message.success(t('canvas.list.deleted'));
150
139
  } catch {
151
140
  message.error(t('canvas.list.deleteFailed'));
@@ -192,6 +181,11 @@ const CanvasListPage: React.FC = () => {
192
181
  c.id === renameModal.id ? { ...c, name: trimmed } : c,
193
182
  ),
194
183
  );
184
+ setAllCanvases((prev) =>
185
+ prev.map((c) =>
186
+ c.id === renameModal.id ? { ...c, name: trimmed } : c,
187
+ ),
188
+ );
195
189
  setRenameModal(null);
196
190
  message.success(t('canvas.list.renamed'));
197
191
  // 如果已发布,清除导航缓存并刷新
@@ -223,10 +217,216 @@ const CanvasListPage: React.FC = () => {
223
217
  fetchCanvases()
224
218
  .then(setCanvases)
225
219
  .catch(() => message.error(t('canvas.list.loadFailed')));
226
- }, [t]);
220
+ if (isSystemAdmin) {
221
+ fetchAllCanvases()
222
+ .then(setAllCanvases)
223
+ .catch(() => message.error('加载所有 Canvas 失败'));
224
+ }
225
+ }, [t, isSystemAdmin]);
226
+
227
+ // 统一的 Canvas 卡片:名称叠在缩略图上,自己的卡带操作菜单;传 ownerName 时显示创建者
228
+ const ownIds = new Set(canvases.map((c) => c.id));
229
+ const renderCanvasCard = (
230
+ canvas: SavedCanvas,
231
+ options: { isOwn: boolean; ownerName?: string },
232
+ ) => {
233
+ const { isOwn, ownerName } = options;
234
+ return (
235
+ <div
236
+ key={canvas.id}
237
+ style={{
238
+ background: 'var(--ant-color-bg-container)',
239
+ borderRadius: 8,
240
+ overflow: 'hidden',
241
+ border: '1px solid var(--ant-color-border-secondary)',
242
+ cursor: 'pointer',
243
+ transition: 'box-shadow 0.2s',
244
+ }}
245
+ onMouseEnter={(e) => {
246
+ (e.currentTarget as HTMLDivElement).style.boxShadow =
247
+ '0 4px 12px rgba(0,0,0,0.1)';
248
+ }}
249
+ onMouseLeave={(e) => {
250
+ (e.currentTarget as HTMLDivElement).style.boxShadow = 'none';
251
+ }}
252
+ onClick={() => navigate(`/admin/canvas/edit/${canvas.id}`)}
253
+ >
254
+ {/* Thumbnail */}
255
+ <div
256
+ style={{
257
+ height: 180,
258
+ overflow: 'hidden',
259
+ background: 'var(--ant-color-fill-quaternary)',
260
+ position: 'relative',
261
+ pointerEvents: 'none',
262
+ display: 'flex',
263
+ justifyContent: 'center',
264
+ }}
265
+ >
266
+ <span
267
+ style={{
268
+ position: 'absolute',
269
+ top: 8,
270
+ left: 12,
271
+ zIndex: 1,
272
+ fontWeight: 500,
273
+ fontSize: 14,
274
+ maxWidth: '70%',
275
+ overflow: 'hidden',
276
+ textOverflow: 'ellipsis',
277
+ whiteSpace: 'nowrap',
278
+ }}
279
+ >
280
+ {canvas.name}
281
+ </span>
282
+ {canvas.items.length > 0 ? (
283
+ <div
284
+ style={{
285
+ transform: 'scale(0.28)',
286
+ transformOrigin: 'top center',
287
+ width: 1200,
288
+ height: 640,
289
+ marginTop: 36,
290
+ flexShrink: 0,
291
+ }}
292
+ >
293
+ <IsolatedLivePreview code={buildPreviewCode(canvas)} />
294
+ </div>
295
+ ) : (
296
+ <div
297
+ style={{
298
+ display: 'flex',
299
+ alignItems: 'center',
300
+ justifyContent: 'center',
301
+ height: '100%',
302
+ color: 'var(--ant-color-text-quaternary)',
303
+ fontSize: 14,
304
+ }}
305
+ >
306
+ 空画布
307
+ </div>
308
+ )}
309
+ {isOwn && isAgentAllowed && (
310
+ <div
311
+ style={{
312
+ position: 'absolute',
313
+ top: 8,
314
+ right: 8,
315
+ pointerEvents: 'auto',
316
+ }}
317
+ >
318
+ <Dropdown
319
+ menu={{
320
+ items: [
321
+ {
322
+ key: 'publish',
323
+ icon: <RocketOutlined />,
324
+ label: t('canvas.publish'),
325
+ },
326
+ {
327
+ key: 'export',
328
+ icon: <ExportOutlined />,
329
+ label: t('canvas.list.export'),
330
+ },
331
+ {
332
+ key: 'rename',
333
+ icon: <EditOutlined />,
334
+ label: t('canvas.list.rename'),
335
+ },
336
+ { type: 'divider' },
337
+ {
338
+ key: 'delete',
339
+ icon: <DeleteOutlined />,
340
+ label: t('canvas.list.deleteBtn'),
341
+ danger: true,
342
+ },
343
+ ],
344
+ onClick: ({ key, domEvent }) => {
345
+ domEvent.stopPropagation();
346
+ if (key === 'publish') {
347
+ setPublishCanvas(canvas);
348
+ } else if (key === 'export') {
349
+ setExportCanvasId(canvas.id);
350
+ setExportModalOpen(true);
351
+ } else if (key === 'rename') {
352
+ openRename(canvas);
353
+ } else if (key === 'delete') {
354
+ Modal.confirm({
355
+ title: t('canvas.list.deleteTitle'),
356
+ content: canvas.publishedPageCode
357
+ ? t('canvas.list.deletePublishedConfirm')
358
+ : t('canvas.list.deleteConfirm'),
359
+ okText: t('canvas.list.deleteBtn'),
360
+ okButtonProps: { danger: true },
361
+ cancelText: t('canvas.list.cancel'),
362
+ onOk: () => handleDelete(canvas.id),
363
+ });
364
+ }
365
+ },
366
+ }}
367
+ trigger={['click']}
368
+ >
369
+ <Button
370
+ type="text"
371
+ size="small"
372
+ icon={<MoreOutlined />}
373
+ onClick={(e) => e.stopPropagation()}
374
+ />
375
+ </Dropdown>
376
+ </div>
377
+ )}
378
+ </div>
227
379
 
228
- // ── 删除确认 ──
229
- const [deleteConfirm, setDeleteConfirm] = useState<SavedCanvas | null>(null);
380
+ {/* Info */}
381
+ <div
382
+ style={{
383
+ padding: '12px 16px',
384
+ borderTop: '1px solid var(--ant-color-border-secondary)',
385
+ }}
386
+ >
387
+ <div
388
+ style={{
389
+ display: 'flex',
390
+ justifyContent: 'space-between',
391
+ alignItems: 'center',
392
+ }}
393
+ >
394
+ <Badge
395
+ status={canvas.publishedPageCode ? 'success' : 'default'}
396
+ text={
397
+ canvas.publishedPageCode
398
+ ? t('canvas.list.published')
399
+ : t('canvas.list.unpublished')
400
+ }
401
+ style={{
402
+ fontSize: 12,
403
+ color: 'var(--ant-color-text-secondary)',
404
+ }}
405
+ />
406
+ <span
407
+ style={{
408
+ fontSize: 12,
409
+ color: 'var(--ant-color-text-tertiary)',
410
+ }}
411
+ >
412
+ 修改于 {new Date(canvas.updatedAt).toLocaleString('zh-CN')}
413
+ </span>
414
+ </div>
415
+ {ownerName !== undefined && (
416
+ <div
417
+ style={{
418
+ fontSize: 12,
419
+ color: 'var(--ant-color-text-tertiary)',
420
+ marginTop: 4,
421
+ }}
422
+ >
423
+ 创建者: {ownerName}
424
+ </div>
425
+ )}
426
+ </div>
427
+ </div>
428
+ );
429
+ };
230
430
 
231
431
  if (loading) {
232
432
  return (
@@ -271,210 +471,24 @@ const CanvasListPage: React.FC = () => {
271
471
  }
272
472
  />
273
473
 
474
+ {/* Filter(仅 system_admin 可见) */}
475
+ {isSystemAdmin && (
476
+ <Card {...SEARCH_CARD_PROPS}>
477
+ <Segmented
478
+ value={filter}
479
+ onChange={(v) => setFilter(v as 'mine' | 'all')}
480
+ options={[
481
+ { label: t('canvas.list.filterMine'), value: 'mine' },
482
+ { label: t('canvas.list.filterAll'), value: 'all' },
483
+ ]}
484
+ />
485
+ </Card>
486
+ )}
487
+
274
488
  {/* Grid */}
275
489
  <Card>
276
- <Typography.Title level={5} style={{ margin: '0 0 16px 0' }}>
277
- {t('canvas.list.myCanvases')}
278
- </Typography.Title>
279
- {canvases.length > 0 ? (
280
- <div
281
- style={{
282
- display: 'grid',
283
- gridTemplateColumns: 'repeat(3, 1fr)',
284
- gap: 20,
285
- }}
286
- >
287
- {canvases.map((canvas) => (
288
- <div
289
- key={canvas.id}
290
- style={{
291
- background: 'var(--ant-color-bg-container)',
292
- borderRadius: 8,
293
- overflow: 'hidden',
294
- border: '1px solid var(--ant-color-border-secondary)',
295
- cursor: 'pointer',
296
- transition: 'box-shadow 0.2s',
297
- }}
298
- onMouseEnter={(e) => {
299
- (e.currentTarget as HTMLDivElement).style.boxShadow =
300
- '0 4px 12px rgba(0,0,0,0.1)';
301
- }}
302
- onMouseLeave={(e) => {
303
- (e.currentTarget as HTMLDivElement).style.boxShadow = 'none';
304
- }}
305
- onClick={() => navigate(`/admin/canvas/edit/${canvas.id}`)}
306
- >
307
- {/* Thumbnail */}
308
- <div
309
- style={{
310
- height: 180,
311
- overflow: 'hidden',
312
- background: 'var(--ant-color-fill-quaternary)',
313
- position: 'relative',
314
- pointerEvents: 'none',
315
- display: 'flex',
316
- justifyContent: 'center',
317
- }}
318
- >
319
- <span
320
- style={{
321
- position: 'absolute',
322
- top: 8,
323
- left: 12,
324
- zIndex: 1,
325
- fontWeight: 500,
326
- fontSize: 14,
327
- maxWidth: '70%',
328
- overflow: 'hidden',
329
- textOverflow: 'ellipsis',
330
- whiteSpace: 'nowrap',
331
- }}
332
- >
333
- {canvas.name}
334
- </span>
335
- {canvas.items.length > 0 ? (
336
- <div
337
- style={{
338
- transform: 'scale(0.28)',
339
- transformOrigin: 'top center',
340
- width: 1200,
341
- height: 640,
342
- marginTop: 36,
343
- flexShrink: 0,
344
- }}
345
- >
346
- <IsolatedLivePreview code={buildPreviewCode(canvas)} />
347
- </div>
348
- ) : (
349
- <div
350
- style={{
351
- display: 'flex',
352
- alignItems: 'center',
353
- justifyContent: 'center',
354
- height: '100%',
355
- color: 'var(--ant-color-text-quaternary)',
356
- fontSize: 14,
357
- }}
358
- >
359
- 空画布
360
- </div>
361
- )}
362
- {isAgentAllowed && (
363
- <div
364
- style={{
365
- position: 'absolute',
366
- top: 8,
367
- right: 8,
368
- pointerEvents: 'auto',
369
- }}
370
- >
371
- <Dropdown
372
- menu={{
373
- items: [
374
- {
375
- key: 'publish',
376
- icon: <RocketOutlined />,
377
- label: t('canvas.publish'),
378
- },
379
- {
380
- key: 'export',
381
- icon: <ExportOutlined />,
382
- label: t('canvas.list.export'),
383
- },
384
- {
385
- key: 'rename',
386
- icon: <EditOutlined />,
387
- label: t('canvas.list.rename'),
388
- },
389
- { type: 'divider' },
390
- {
391
- key: 'delete',
392
- icon: <DeleteOutlined />,
393
- label: t('canvas.list.deleteBtn'),
394
- danger: true,
395
- },
396
- ],
397
- onClick: ({ key, domEvent }) => {
398
- domEvent.stopPropagation();
399
- if (key === 'publish') {
400
- setPublishCanvas(canvas);
401
- } else if (key === 'export') {
402
- setExportCanvasId(canvas.id);
403
- setExportModalOpen(true);
404
- } else if (key === 'rename') {
405
- openRename(canvas);
406
- } else if (key === 'delete') {
407
- setDeleteConfirm(canvas);
408
- }
409
- },
410
- }}
411
- trigger={['click']}
412
- >
413
- <Button
414
- type="text"
415
- size="small"
416
- icon={<MoreOutlined />}
417
- onClick={(e) => e.stopPropagation()}
418
- />
419
- </Dropdown>
420
- </div>
421
- )}
422
- </div>
423
-
424
- {/* Info */}
425
- <div
426
- style={{
427
- padding: '12px 16px',
428
- borderTop: '1px solid var(--ant-color-border-secondary)',
429
- display: 'flex',
430
- justifyContent: 'space-between',
431
- alignItems: 'center',
432
- }}
433
- >
434
- <Badge
435
- status={canvas.publishedPageCode ? 'success' : 'default'}
436
- text={
437
- canvas.publishedPageCode
438
- ? t('canvas.list.published')
439
- : t('canvas.list.unpublished')
440
- }
441
- style={{
442
- fontSize: 12,
443
- color: 'var(--ant-color-text-secondary)',
444
- }}
445
- />
446
- <span
447
- style={{
448
- fontSize: 12,
449
- color: 'var(--ant-color-text-tertiary)',
450
- }}
451
- >
452
- 修改于 {new Date(canvas.updatedAt).toLocaleString('zh-CN')}
453
- </span>
454
- </div>
455
- </div>
456
- ))}
457
- </div>
458
- ) : (
459
- <div
460
- style={{
461
- textAlign: 'center',
462
- color: 'var(--ant-color-text-tertiary)',
463
- padding: '80px 0',
464
- }}
465
- >
466
- <p>还没有 Canvas,点击上方按钮新建一个吧</p>
467
- </div>
468
- )}
469
- </Card>
470
-
471
- {/* 其他人的 Canvas(仅 system_admin 可见) */}
472
- {isSystemAdmin && (
473
- <Card style={{ marginTop: 16 }}>
474
- <Typography.Title level={5} style={{ margin: '0 0 16px 0' }}>
475
- {t('canvas.list.othersCanvases')}
476
- </Typography.Title>
477
- {othersLoading ? (
490
+ {showAll ? (
491
+ allLoading ? (
478
492
  <div
479
493
  style={{
480
494
  display: 'flex',
@@ -484,7 +498,7 @@ const CanvasListPage: React.FC = () => {
484
498
  >
485
499
  <Spin size="large" />
486
500
  </div>
487
- ) : othersCanvases.length > 0 ? (
501
+ ) : allCanvases.length > 0 ? (
488
502
  <div
489
503
  style={{
490
504
  display: 'grid',
@@ -492,126 +506,12 @@ const CanvasListPage: React.FC = () => {
492
506
  gap: 20,
493
507
  }}
494
508
  >
495
- {othersCanvases.map((canvas) => (
496
- <div
497
- key={canvas.id}
498
- style={{
499
- background: 'var(--ant-color-bg-container)',
500
- borderRadius: 8,
501
- overflow: 'hidden',
502
- border: '1px solid var(--ant-color-border-secondary)',
503
- cursor: 'pointer',
504
- transition: 'box-shadow 0.2s',
505
- }}
506
- onMouseEnter={(e) => {
507
- (e.currentTarget as HTMLDivElement).style.boxShadow =
508
- '0 4px 12px rgba(0,0,0,0.1)';
509
- }}
510
- onMouseLeave={(e) => {
511
- (e.currentTarget as HTMLDivElement).style.boxShadow =
512
- 'none';
513
- }}
514
- onClick={() => navigate(`/admin/canvas/edit/${canvas.id}`)}
515
- >
516
- {/* Thumbnail */}
517
- <div
518
- style={{
519
- height: 180,
520
- overflow: 'hidden',
521
- background: 'var(--ant-color-fill-quaternary)',
522
- position: 'relative',
523
- pointerEvents: 'none',
524
- }}
525
- >
526
- {canvas.items.length > 0 ? (
527
- <div
528
- style={{
529
- transform: 'scale(0.28)',
530
- transformOrigin: 'top left',
531
- width: 1200,
532
- height: 640,
533
- }}
534
- >
535
- <IsolatedLivePreview code={buildPreviewCode(canvas)} />
536
- </div>
537
- ) : (
538
- <div
539
- style={{
540
- display: 'flex',
541
- alignItems: 'center',
542
- justifyContent: 'center',
543
- height: '100%',
544
- color: 'var(--ant-color-text-quaternary)',
545
- fontSize: 14,
546
- }}
547
- >
548
- 空画布
549
- </div>
550
- )}
551
- </div>
552
- {/* Info */}
553
- <div
554
- style={{
555
- padding: '12px 16px',
556
- borderTop: '1px solid var(--ant-color-border-secondary)',
557
- }}
558
- >
559
- <div
560
- style={{
561
- display: 'flex',
562
- justifyContent: 'space-between',
563
- alignItems: 'center',
564
- marginBottom: 4,
565
- }}
566
- >
567
- <span
568
- style={{
569
- fontWeight: 500,
570
- fontSize: 14,
571
- overflow: 'hidden',
572
- textOverflow: 'ellipsis',
573
- whiteSpace: 'nowrap',
574
- maxWidth: 180,
575
- }}
576
- >
577
- {canvas.name}
578
- </span>
579
- <Badge
580
- status={
581
- canvas.publishedPageCode ? 'success' : 'default'
582
- }
583
- text={
584
- canvas.publishedPageCode
585
- ? t('canvas.list.published')
586
- : t('canvas.list.unpublished')
587
- }
588
- style={{
589
- fontSize: 12,
590
- color: 'var(--ant-color-text-secondary)',
591
- }}
592
- />
593
- </div>
594
- <div
595
- style={{
596
- fontSize: 12,
597
- color: 'var(--ant-color-text-tertiary)',
598
- marginBottom: 4,
599
- }}
600
- >
601
- 创建者: {canvas.ownerName}
602
- </div>
603
- <div
604
- style={{
605
- fontSize: 12,
606
- color: 'var(--ant-color-text-tertiary)',
607
- }}
608
- >
609
- 修改于{' '}
610
- {new Date(canvas.updatedAt).toLocaleString('zh-CN')}
611
- </div>
612
- </div>
613
- </div>
614
- ))}
509
+ {allCanvases.map((canvas) =>
510
+ renderCanvasCard(canvas, {
511
+ isOwn: ownIds.has(canvas.id),
512
+ ownerName: canvas.ownerName,
513
+ }),
514
+ )}
615
515
  </div>
616
516
  ) : (
617
517
  <div
@@ -621,11 +521,33 @@ const CanvasListPage: React.FC = () => {
621
521
  padding: '40px 0',
622
522
  }}
623
523
  >
624
- 没有其他用户的 Canvas
524
+ 暂无 Canvas
625
525
  </div>
626
- )}
627
- </Card>
628
- )}
526
+ )
527
+ ) : canvases.length > 0 ? (
528
+ <div
529
+ style={{
530
+ display: 'grid',
531
+ gridTemplateColumns: 'repeat(3, 1fr)',
532
+ gap: 20,
533
+ }}
534
+ >
535
+ {canvases.map((canvas) =>
536
+ renderCanvasCard(canvas, { isOwn: true }),
537
+ )}
538
+ </div>
539
+ ) : (
540
+ <div
541
+ style={{
542
+ textAlign: 'center',
543
+ color: 'var(--ant-color-text-tertiary)',
544
+ padding: '80px 0',
545
+ }}
546
+ >
547
+ <p>还没有 Canvas,点击上方按钮新建一个吧</p>
548
+ </div>
549
+ )}
550
+ </Card>
629
551
 
630
552
  {/* 重命名 Modal */}
631
553
  <Modal
@@ -665,28 +587,6 @@ const CanvasListPage: React.FC = () => {
665
587
  )}
666
588
  </Modal>
667
589
 
668
- {/* 删除确认 Modal */}
669
- <Modal
670
- title={t('canvas.list.deleteTitle')}
671
- open={!!deleteConfirm}
672
- onOk={() => {
673
- if (deleteConfirm) {
674
- handleDelete(deleteConfirm.id);
675
- setDeleteConfirm(null);
676
- }
677
- }}
678
- onCancel={() => setDeleteConfirm(null)}
679
- okText={t('canvas.list.deleteBtn')}
680
- okButtonProps={{ danger: true }}
681
- cancelText={t('canvas.list.cancel')}
682
- >
683
- <p>
684
- {deleteConfirm?.publishedPageCode
685
- ? t('canvas.list.deletePublishedConfirm')
686
- : t('canvas.list.deleteConfirm')}
687
- </p>
688
- </Modal>
689
-
690
590
  {publishCanvas && (
691
591
  <PublishModal
692
592
  open