@gadmin2n/schematics 0.0.142 → 0.0.144

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 (140) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +5 -23
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +4 -2
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +36 -1
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/agenda.seed.ts +14 -14
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/bootstrap.ts +18 -13
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/canvas.seed.ts +14 -14
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +67 -404
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +16 -40
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +12 -124
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +3 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +0 -21
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +3 -10
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +1 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-callback.controller.spec.ts +48 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-callback.controller.ts +96 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -59
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +8 -43
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -23
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +2 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +2 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +7 -3
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +2 -2
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +18 -123
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +4 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +3 -10
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +1 -2
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +0 -10
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +12 -4
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +1 -1
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +42 -209
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +108 -225
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +0 -2
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +27 -22
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +9 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.spec.ts +30 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +8 -15
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +0 -2
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/runtime-connectivity-probe.service.spec.ts +14 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/runtime-connectivity-probe.service.ts +37 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +41 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +53 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.module.ts +7 -2
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/workflow-runtime-health.controller.ts +21 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +2 -2
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +16 -88
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +23 -59
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +125 -39
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +95 -28
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +0 -20
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +23 -26
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +6 -52
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +2 -2
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +24 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +26 -21
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +0 -1
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +0 -1
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflow-runtime-config.service.spec.ts +32 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflow-runtime-config.service.ts +41 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflowRuntimeConfig.module.ts +10 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.build.json +10 -1
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +16 -12
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +1 -1
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/PageHeader.tsx +1 -1
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +19 -19
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +1 -1
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +15 -11
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +0 -6
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +3 -3
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +1 -1
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +1 -1
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +1 -1
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +85 -95
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +85 -95
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +2 -2
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +21 -2
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +21 -2
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +14 -66
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +4 -4
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +3 -3
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +3 -3
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +29 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +4 -2
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +4 -6
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +3 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +3 -1
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +4 -6
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +23 -92
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +200 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +61 -136
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +96 -195
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +36 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +5 -10
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +47 -22
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +7 -5
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +8 -6
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +35 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +1 -6
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +1 -4
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +1 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +1 -1
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +82 -259
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +1 -2
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +7 -6
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +77 -71
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +10 -57
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +8 -273
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.test.tsx +54 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +110 -20
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +4 -34
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +3 -10
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +2 -37
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +26 -2
  115. package/package.json +1 -1
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +0 -89
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +0 -68
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +0 -177
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +0 -283
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +0 -10
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +0 -84
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +0 -141
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +0 -16
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +0 -210
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +0 -39
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +0 -104
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +0 -98
  128. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/AssignRolesModal.tsx +0 -0
  129. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/CreatePageModal.tsx +0 -0
  130. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/EditPageModal.tsx +0 -0
  131. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/PageDetailDrawer.tsx +0 -0
  132. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/{Components → components}/PageFormModal.tsx +0 -0
  133. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/CreateModal.tsx +0 -0
  134. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/EditModal.tsx +0 -0
  135. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/ResourceDetailDrawer.tsx +0 -0
  136. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/{Components → components}/modal.tsx +0 -0
  137. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/CreateModal.tsx +0 -0
  138. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/EditModal.tsx +0 -0
  139. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/RoleDetailDrawer.tsx +0 -0
  140. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/{Components → components}/modal.tsx +0 -0
@@ -26,6 +26,7 @@ import { useLocation } from 'react-router-dom';
26
26
  import {
27
27
  getColumns,
28
28
  ModelType,
29
+ pick,
29
30
  produceModel,
30
31
  tableSearchBar,
31
32
  } from '@gadmin2n/react-common';
@@ -123,19 +124,37 @@ export const GameList: React.FC<IResourceComponentsProps> = () => {
123
124
  t,
124
125
  });
125
126
 
126
- // Export all
127
+ // Export all (fields 来自 config/ui 的 toolbar.actions EXPORT 配置,缺省导出全部字段)
128
+ const exportAllAction = tableConfig.toolbar.actions.find(
129
+ (a) => a.action === 'EXPORT',
130
+ );
131
+ const exportAllFields =
132
+ exportAllAction?.action === 'EXPORT' ? exportAllAction.fields : undefined;
127
133
  const { triggerExport, isLoading: exportLoading } = useExport<Game>({
128
134
  maxItemCount: 200,
129
135
  pageSize: 100,
136
+ ...(exportAllFields?.length
137
+ ? { mapData: (item: Game) => pick(item, exportAllFields) }
138
+ : {}),
130
139
  });
131
140
 
132
- // Export selected
141
+ // Export selected (fields 来自 config/ui 的 rowSelection.actions EXPORT 配置)
142
+ const exportSelectedAction = tableConfig.rowSelection.actions.find(
143
+ (a) => a.action === 'EXPORT',
144
+ );
145
+ const exportSelectedFields =
146
+ exportSelectedAction?.action === 'EXPORT'
147
+ ? exportSelectedAction.fields
148
+ : undefined;
133
149
  const {
134
150
  triggerExport: triggerExportSelected,
135
151
  isLoading: exportSelectedLoading,
136
152
  } = useExport<Game>({
137
153
  pageSize: 100,
138
154
  meta: { where: { id: { in: batchOps.selectedRowKeys.map(Number) } } },
155
+ ...(exportSelectedFields?.length
156
+ ? { mapData: (item: Game) => pick(item, exportSelectedFields) }
157
+ : {}),
139
158
  });
140
159
 
141
160
  // Import
@@ -9,11 +9,7 @@ import {
9
9
  Typography,
10
10
  message,
11
11
  } from 'antd';
12
- import {
13
- CheckCircleOutlined,
14
- ReloadOutlined,
15
- SyncOutlined,
16
- } from '@ant-design/icons';
12
+ import { CheckCircleOutlined, ReloadOutlined } from '@ant-design/icons';
17
13
  import { customRequest } from 'helpers/http';
18
14
  import { PageHeader } from 'components';
19
15
  import { PAGE_WRAPPER_STYLE } from 'constants/layout';
@@ -31,11 +27,6 @@ interface InboxItem {
31
27
  expiresAt: string | null;
32
28
  approvalRule: Record<string, unknown>;
33
29
  rejectionRule: Record<string, unknown>;
34
- dispatch?: {
35
- state: 'DISPATCHING' | 'WAITING_APPROVAL' | 'DISPATCH_FAILED';
36
- canRetry: boolean;
37
- error?: string;
38
- };
39
30
  };
40
31
  }
41
32
 
@@ -43,7 +34,6 @@ export default function ApprovalInboxPage() {
43
34
  const [items, setItems] = useState<InboxItem[]>([]);
44
35
  const [loading, setLoading] = useState(false);
45
36
  const [submitting, setSubmitting] = useState(false);
46
- const [retryingId, setRetryingId] = useState<string>();
47
37
  const [selected, setSelected] = useState<InboxItem>();
48
38
 
49
39
  const load = useCallback(async () => {
@@ -85,23 +75,6 @@ export default function ApprovalInboxPage() {
85
75
  }
86
76
  }
87
77
 
88
- async function retryDispatch(item: InboxItem) {
89
- if (retryingId) return;
90
- setRetryingId(item.request.id);
91
- try {
92
- await customRequest(
93
- `human-approval/${item.request.id}/retry-dispatch`,
94
- 'POST',
95
- );
96
- message.success('Approval request is being sent again');
97
- await load();
98
- } catch (error: any) {
99
- message.error(error?.message ?? 'Unable to retry approval dispatch');
100
- } finally {
101
- setRetryingId(undefined);
102
- }
103
- }
104
-
105
78
  return (
106
79
  <div style={PAGE_WRAPPER_STYLE}>
107
80
  <PageHeader
@@ -139,22 +112,9 @@ export default function ApprovalInboxPage() {
139
112
  },
140
113
  {
141
114
  title: 'Status',
142
- render: (_, item) => {
143
- if (item.request.dispatch?.state === 'DISPATCH_FAILED')
144
- return (
145
- <Space direction="vertical" size={0}>
146
- <Tag color="error">Send failed</Tag>
147
- {item.request.dispatch.error && (
148
- <Typography.Text type="danger">
149
- {item.request.dispatch.error}
150
- </Typography.Text>
151
- )}
152
- </Space>
153
- );
154
- if (item.request.dispatch?.state === 'DISPATCHING')
155
- return <Tag color="processing">Sending</Tag>;
156
- return <Tag color="gold">{item.request.status}</Tag>;
157
- },
115
+ render: (_, item) => (
116
+ <Tag color="gold">{item.request.status}</Tag>
117
+ ),
158
118
  },
159
119
  {
160
120
  title: 'Started',
@@ -171,28 +131,16 @@ export default function ApprovalInboxPage() {
171
131
  {
172
132
  title: 'Action',
173
133
  width: 140,
174
- render: (_, item) =>
175
- item.request.dispatch?.state === 'DISPATCH_FAILED' ? (
176
- <Button
177
- icon={<SyncOutlined />}
178
- loading={retryingId === item.request.id}
179
- disabled={
180
- Boolean(retryingId) || !item.request.dispatch.canRetry
181
- }
182
- onClick={() => void retryDispatch(item)}
183
- >
184
- Retry sending
185
- </Button>
186
- ) : (
187
- <Button
188
- type="primary"
189
- icon={<CheckCircleOutlined />}
190
- disabled={submitting}
191
- onClick={() => setSelected(item)}
192
- >
193
- Decide
194
- </Button>
195
- ),
134
+ render: (_, item) => (
135
+ <Button
136
+ type="primary"
137
+ icon={<CheckCircleOutlined />}
138
+ disabled={submitting}
139
+ onClick={() => setSelected(item)}
140
+ >
141
+ Decide
142
+ </Button>
143
+ ),
196
144
  },
197
145
  ]}
198
146
  />
@@ -52,10 +52,10 @@ import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
52
52
 
53
53
  import { customRequest } from '@/helpers/http';
54
54
 
55
- import { AssignRolesModal } from './Components/AssignRolesModal';
56
- import { EditPageModal } from './Components/EditPageModal';
57
- import { CreatePageModal } from './Components/CreatePageModal';
58
- import { PageDetailDrawer } from './Components/PageDetailDrawer';
55
+ import { AssignRolesModal } from './components/AssignRolesModal';
56
+ import { EditPageModal } from './components/EditPageModal';
57
+ import { CreatePageModal } from './components/CreatePageModal';
58
+ import { PageDetailDrawer } from './components/PageDetailDrawer';
59
59
  import type {
60
60
  PageMenuTreeNode,
61
61
  PageResourceAssignment,
@@ -13,9 +13,9 @@ import {
13
13
  useGetIdentity,
14
14
  } from '@refinedev/core';
15
15
  import type { Resource } from './types';
16
- import { EditModal } from './Components/EditModal';
17
- import { CreateModal } from './Components/CreateModal';
18
- import { ResourceDetailDrawer } from './Components/ResourceDetailDrawer';
16
+ import { EditModal } from './components/EditModal';
17
+ import { CreateModal } from './components/CreateModal';
18
+ import { ResourceDetailDrawer } from './components/ResourceDetailDrawer';
19
19
  import { SqlModal, generateResourceSql } from '../../components/SqlModal';
20
20
  import { PageHeader } from 'components';
21
21
  import { PAGE_WRAPPER_STYLE } from 'constants/layout';
@@ -3,12 +3,12 @@ import { useTable } from '@refinedev/antd';
3
3
  import { useGetLocale, useGetIdentity } from '@refinedev/core';
4
4
  import { Table, Button, Card, Space, Tooltip, message } from 'antd';
5
5
 
6
- import { EditModal } from './Components/EditModal';
7
- import { CreateModal } from './Components/CreateModal';
6
+ import { EditModal } from './components/EditModal';
7
+ import { CreateModal } from './components/CreateModal';
8
8
  import type { RolePageTreeNode } from './types';
9
9
  import { useRolePage } from './hooks/useRolePage';
10
10
  import { EditOutlined, EyeOutlined, CodeOutlined } from '@ant-design/icons';
11
- import { RoleDetailDrawer } from './Components/RoleDetailDrawer';
11
+ import { RoleDetailDrawer } from './components/RoleDetailDrawer';
12
12
  import { SqlModal, generateRoleSql } from '../../components/SqlModal';
13
13
  import { customRequest } from '@/helpers/http';
14
14
  import { buildPageTree } from '@/helpers/page-tree';
@@ -0,0 +1,29 @@
1
+ import { ReactFlowProvider } from '@xyflow/react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { describe, expect, it } from 'vitest';
4
+ import '../../../i18n';
5
+ import { CustomNode } from './CustomNode';
6
+
7
+ describe('CustomNode', () => {
8
+ it('shows the node type separately from its custom label', () => {
9
+ render(
10
+ <ReactFlowProvider>
11
+ <CustomNode
12
+ {...({
13
+ id: 'approval-1',
14
+ data: {
15
+ label: 'MyOA 人工审批',
16
+ type: 'approval',
17
+ category: 'APPROVAL',
18
+ isSelected: false,
19
+ readonly: true,
20
+ },
21
+ } as any)}
22
+ />
23
+ </ReactFlowProvider>,
24
+ );
25
+
26
+ expect(screen.getByText('人工审批节点')).toBeInTheDocument();
27
+ expect(screen.getByText('MyOA 人工审批')).toBeInTheDocument();
28
+ });
29
+ });
@@ -2,12 +2,13 @@ import { Handle, Position, type NodeProps } from '@xyflow/react';
2
2
  import React, { memo } from 'react';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import type { LookupPort, RuntimePorts } from '../utils/resolveLookupPorts';
5
+ import { NodeTypeBadge } from './NodeTypeBadge';
5
6
 
6
7
  const CATEGORY_COLORS: Record<string, { bg: string; border: string }> = {
7
8
  TRIGGER: { bg: '#e6f7ff', border: '#91caff' },
8
9
  ACTION: { bg: '#f6ffed', border: '#b7eb8f' },
9
10
  CONDITION: { bg: '#fff7e6', border: '#ffd591' },
10
- LOOP: { bg: '#f9f0ff', border: '#d3adf7' },
11
+ FLOW_CONTROL: { bg: '#f9f0ff', border: '#d3adf7' },
11
12
  APPROVAL: { bg: '#fff1f0', border: '#ffa39e' },
12
13
  SUB_WORKFLOW: { bg: '#f0f5ff', border: '#adc6ff' },
13
14
  };
@@ -136,7 +137,8 @@ export const CustomNode = memo(({ data }: NodeProps) => {
136
137
  {runtimePorts.inputLabel}
137
138
  </span>
138
139
  )}
139
- <div>{nodeData.label}</div>
140
+ <NodeTypeBadge type={nodeData.type} borderColor={colors.border} />
141
+ <div style={{ fontWeight: 500 }}>{nodeData.label}</div>
140
142
  {lookupRowCount > 0 && (
141
143
  <div
142
144
  style={{
@@ -150,11 +150,9 @@ function EnhancedFlowCanvas({
150
150
 
151
151
  const nodeData: any = {
152
152
  label:
153
- n.type === 'approval_request_trigger'
154
- ? t('nodeTypes.callable_trigger')
155
- : n.type === 'webhook_trigger'
156
- ? t('nodeTypes.webhook_trigger')
157
- : n.label,
153
+ n.type === 'webhook_trigger'
154
+ ? t('nodeTypes.webhook_trigger')
155
+ : n.label,
158
156
  category,
159
157
  type: n.type,
160
158
  outputs: resolveOutputs(n, nodeTypeMap?.[n.type]),
@@ -502,7 +500,7 @@ function EnhancedFlowCanvas({
502
500
  TRIGGER: '#91caff',
503
501
  ACTION: '#b7eb8f',
504
502
  CONDITION: '#ffd591',
505
- LOOP: '#d3adf7',
503
+ FLOW_CONTROL: '#d3adf7',
506
504
  APPROVAL: '#ffa39e',
507
505
  SUB_WORKFLOW: '#adc6ff',
508
506
  };
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { render } from '@testing-library/react';
3
3
  import { ReactFlowProvider } from '@xyflow/react';
4
4
  import { describe, expect, it } from 'vitest';
5
+ import '../../../i18n';
5
6
  import { ExecutionStatusNode } from './ExecutionStatusNode';
6
7
 
7
8
  describe('ExecutionStatusNode', () => {
@@ -14,6 +15,7 @@ describe('ExecutionStatusNode', () => {
14
15
  data: {
15
16
  label: '审批人查询',
16
17
  category: 'ACTION',
18
+ type: 'code',
17
19
  isSelected: false,
18
20
  readonly: true,
19
21
  lookupPorts: [
@@ -58,5 +60,6 @@ describe('ExecutionStatusNode', () => {
58
60
  '[data-handleid="lookup:dynamic_user_groups"].source',
59
61
  ),
60
62
  ).toBeInTheDocument();
63
+ expect(container).toHaveTextContent('代码处理节点');
61
64
  });
62
65
  });
@@ -8,12 +8,13 @@ import { Handle, Position, type NodeProps } from '@xyflow/react';
8
8
  import React, { memo } from 'react';
9
9
  import { useTranslation } from 'react-i18next';
10
10
  import type { LookupPort, RuntimePorts } from '../utils/resolveLookupPorts';
11
+ import { NodeTypeBadge } from './NodeTypeBadge';
11
12
 
12
13
  const CATEGORY_COLORS: Record<string, { bg: string; border: string }> = {
13
14
  TRIGGER: { bg: '#e6f7ff', border: '#91caff' },
14
15
  ACTION: { bg: '#f6ffed', border: '#b7eb8f' },
15
16
  CONDITION: { bg: '#fff7e6', border: '#ffd591' },
16
- LOOP: { bg: '#f9f0ff', border: '#d3adf7' },
17
+ FLOW_CONTROL: { bg: '#f9f0ff', border: '#d3adf7' },
17
18
  APPROVAL: { bg: '#fff1f0', border: '#ffa39e' },
18
19
  SUB_WORKFLOW: { bg: '#f0f5ff', border: '#adc6ff' },
19
20
  };
@@ -249,6 +250,7 @@ export const ExecutionStatusNode = memo(({ data }: NodeProps) => {
249
250
  </div>
250
251
  )}
251
252
 
253
+ <NodeTypeBadge type={nodeData.type} borderColor={borderColor} />
252
254
  <div style={{ fontWeight: 500, marginBottom: nodeData.duration ? 4 : 0 }}>
253
255
  {nodeData.label}
254
256
  </div>
@@ -161,11 +161,9 @@ function FlowCanvas({
161
161
  selected: n.id === selectedNodeId,
162
162
  data: {
163
163
  label:
164
- n.type === 'approval_request_trigger'
165
- ? t('nodeTypes.callable_trigger')
166
- : n.type === 'webhook_trigger'
167
- ? t('nodeTypes.webhook_trigger')
168
- : n.label,
164
+ n.type === 'webhook_trigger'
165
+ ? t('nodeTypes.webhook_trigger')
166
+ : n.label,
169
167
  category,
170
168
  type: n.type,
171
169
  outputs: resolveOutputs(n, nodeTypeMap?.[n.type]),
@@ -444,7 +442,7 @@ function FlowCanvas({
444
442
  TRIGGER: '#91caff',
445
443
  ACTION: '#b7eb8f',
446
444
  CONDITION: '#ffd591',
447
- LOOP: '#d3adf7',
445
+ FLOW_CONTROL: '#d3adf7',
448
446
  APPROVAL: '#ffa39e',
449
447
  SUB_WORKFLOW: '#adc6ff',
450
448
  };
@@ -35,8 +35,6 @@ function nodeType(
35
35
  | 'return_result'
36
36
  | 'http_request'
37
37
  | 'webhook_trigger'
38
- | 'submit_approval_result'
39
- | 'submit_external_result'
40
38
  | 'external_wait',
41
39
  ): WorkflowNodeType {
42
40
  return {
@@ -52,30 +50,23 @@ function nodeType(
52
50
  type === 'code'
53
51
  ? { code: { type: 'string' } }
54
52
  : type === 'return_result'
55
- ? {
56
- resultType: { type: 'string' },
57
- path: { type: 'string' },
58
- }
53
+ ? {}
59
54
  : type === 'webhook_trigger'
60
55
  ? {
61
56
  method: { type: 'string' },
62
57
  path: { type: 'string' },
63
58
  secret: { type: 'string' },
64
59
  }
65
- : type === 'submit_approval_result' ||
66
- type === 'submit_external_result'
67
- ? { inputBindings: { type: 'object' } }
68
- : type === 'external_wait'
69
- ? {
70
- dispatchWorkflowId: { type: 'string' },
71
- outcomes: { type: 'array' },
72
- timeout: { type: 'object' },
73
- }
74
- : {
75
- connectionRef: { type: 'string' },
76
- method: { type: 'string' },
77
- path: { type: 'string' },
78
- },
60
+ : type === 'external_wait'
61
+ ? {
62
+ callbackTokenBinding: { type: 'object' },
63
+ timeout: { type: 'object' },
64
+ }
65
+ : {
66
+ connectionRef: { type: 'string' },
67
+ method: { type: 'string' },
68
+ path: { type: 'string' },
69
+ },
79
70
  },
80
71
  uiSchema: {},
81
72
  inputSchema: {},
@@ -86,8 +77,6 @@ function nodeType(
86
77
  instancePolicy:
87
78
  type === 'return_result' ||
88
79
  type === 'webhook_trigger' ||
89
- type === 'submit_approval_result' ||
90
- type === 'submit_external_result' ||
91
80
  type === 'external_wait'
92
81
  ? 'INLINE_ONLY'
93
82
  : 'OPTIONAL',
@@ -100,8 +89,6 @@ function dropNode(
100
89
  | 'return_result'
101
90
  | 'http_request'
102
91
  | 'webhook_trigger'
103
- | 'submit_approval_result'
104
- | 'submit_external_result'
105
92
  | 'external_wait',
106
93
  ) {
107
94
  fireEvent.drop(screen.getByTestId('react-flow'), {
@@ -117,7 +104,7 @@ describe.each([
117
104
  ['FlowRenderer', FlowRenderer],
118
105
  ['EnhancedFlowRenderer', EnhancedFlowRenderer],
119
106
  ] as const)('%s new-node defaults', (_name, Renderer) => {
120
- it('gives a new Return Result node ordinary data from the previous step', () => {
107
+ it('creates a zero-config Finish and return node', () => {
121
108
  const onDslChange = vi.fn();
122
109
  render(
123
110
  <Renderer dsl={{ nodes: [], edges: [] }} onDslChange={onDslChange} />,
@@ -130,12 +117,7 @@ describe.each([
130
117
  nodes: [
131
118
  expect.objectContaining({
132
119
  type: 'return_result',
133
- config: expect.objectContaining({
134
- resultType: 'JSON',
135
- sourceMode: 'INPUT',
136
- httpStatusCode: 200,
137
- httpHeaders: {},
138
- }),
120
+ config: {},
139
121
  }),
140
122
  ],
141
123
  }),
@@ -198,61 +180,7 @@ describe.each([
198
180
  );
199
181
  });
200
182
 
201
- it('reads a new approval result from the previous node by default', () => {
202
- const onDslChange = vi.fn();
203
- render(
204
- <Renderer dsl={{ nodes: [], edges: [] }} onDslChange={onDslChange} />,
205
- );
206
-
207
- dropNode('submit_approval_result');
208
-
209
- expect(onDslChange).toHaveBeenCalledWith(
210
- expect.objectContaining({
211
- nodes: [
212
- expect.objectContaining({
213
- type: 'submit_approval_result',
214
- config: {
215
- inputBindings: {
216
- requestId: { source: 'INPUT', path: 'requestId' },
217
- channelRef: { source: 'INPUT', path: 'channelRef' },
218
- eventId: { source: 'INPUT', path: 'eventId' },
219
- approverId: { source: 'INPUT', path: 'approverId' },
220
- decision: { source: 'INPUT', path: 'decision' },
221
- },
222
- },
223
- }),
224
- ],
225
- }),
226
- );
227
- });
228
-
229
- it('reads a new external result from the previous node by default', () => {
230
- const onDslChange = vi.fn();
231
- render(
232
- <Renderer dsl={{ nodes: [], edges: [] }} onDslChange={onDslChange} />,
233
- );
234
-
235
- dropNode('submit_external_result');
236
-
237
- expect(onDslChange).toHaveBeenCalledWith(
238
- expect.objectContaining({
239
- nodes: [
240
- expect.objectContaining({
241
- type: 'submit_external_result',
242
- config: {
243
- inputBindings: {
244
- callbackToken: { source: 'INPUT', path: 'callbackToken' },
245
- eventId: { source: 'INPUT', path: 'eventId' },
246
- outcome: { source: 'INPUT', path: 'outcome' },
247
- },
248
- },
249
- }),
250
- ],
251
- }),
252
- );
253
- });
254
-
255
- it('gives a new external wait understandable result branches', () => {
183
+ it('binds a new external wait to the supplied token and deadline', () => {
256
184
  const onDslChange = vi.fn();
257
185
  render(
258
186
  <Renderer dsl={{ nodes: [], edges: [] }} onDslChange={onDslChange} />,
@@ -266,13 +194,16 @@ describe.each([
266
194
  expect.objectContaining({
267
195
  type: 'external_wait',
268
196
  config: expect.objectContaining({
269
- outcomes: [
270
- { code: 'COMPLETED', label: '已完成' },
271
- { code: 'REJECTED', label: '已拒绝' },
272
- ],
197
+ callbackTokenBinding: {
198
+ source: 'WORKFLOW',
199
+ path: 'callbackToken',
200
+ },
273
201
  timeout: {
274
- durationSeconds: 86400,
275
- outcome: 'TIMEOUT',
202
+ mode: 'DEADLINE',
203
+ deadlineBinding: {
204
+ source: 'WORKFLOW',
205
+ path: 'expiresAt',
206
+ },
276
207
  },
277
208
  }),
278
209
  }),