@gadmin2n/schematics 0.0.141 → 0.0.143

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/package.json +1 -1
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +4 -2
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +36 -1
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/agenda.seed.ts +14 -14
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/bootstrap.ts +18 -13
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/canvas.seed.ts +14 -14
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -1
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +67 -404
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +16 -40
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +12 -124
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +3 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +0 -21
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +3 -10
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +1 -2
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-callback.controller.spec.ts +48 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-callback.controller.ts +96 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -59
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +8 -43
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -23
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +2 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +2 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +7 -3
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +2 -2
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +18 -123
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +4 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +3 -10
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +1 -2
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +0 -10
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +12 -4
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +1 -1
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +42 -209
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +108 -225
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +0 -2
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +27 -22
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +9 -1
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.spec.ts +30 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +8 -15
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +0 -2
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/runtime-connectivity-probe.service.spec.ts +14 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/runtime-connectivity-probe.service.ts +37 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +41 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +53 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.module.ts +7 -2
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/workflow-runtime-health.controller.ts +21 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +2 -2
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +16 -88
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +23 -59
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +125 -39
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +95 -28
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +0 -20
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +23 -26
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +6 -52
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +2 -2
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +24 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +26 -21
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +0 -1
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +0 -1
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflow-runtime-config.service.spec.ts +32 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflow-runtime-config.service.ts +41 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowRuntimeConfig/workflowRuntimeConfig.module.ts +10 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.build.json +10 -1
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +16 -12
  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
@@ -15,24 +15,17 @@ describe('resolveOutputs', () => {
15
15
  expect(resolveOutputs(node, { outputs: [] })).toEqual(['true', 'false']);
16
16
  });
17
17
 
18
- it('uses configured external outcomes and the timeout branch', () => {
18
+ it('exposes received and timeout branches for an external wait', () => {
19
19
  const node = {
20
20
  id: 'wait-1',
21
21
  type: 'external_wait',
22
22
  label: '等待签署',
23
23
  position: { x: 0, y: 0 },
24
- config: {
25
- outcomes: [
26
- { code: 'SIGNED', label: '已签署' },
27
- { code: 'REJECTED', label: '已拒绝' },
28
- ],
29
- timeout: { durationSeconds: 3600, outcome: 'TIMEOUT' },
30
- },
24
+ config: {},
31
25
  } as WorkflowNode;
32
26
 
33
27
  expect(resolveOutputs(node, { outputs: [] })).toEqual([
34
- 'SIGNED',
35
- 'REJECTED',
28
+ 'RECEIVED',
36
29
  'TIMEOUT',
37
30
  ]);
38
31
  });
@@ -27,22 +27,7 @@ export function resolveOutputs(
27
27
  .filter((v): v is string => typeof v === 'string' && v.length > 0);
28
28
  }
29
29
  if (node.type === 'external_wait') {
30
- const outcomes = Array.isArray((node.config as any)?.outcomes)
31
- ? ((node.config as any).outcomes as Array<{ code?: unknown }>)
32
- : [];
33
- const codes = outcomes
34
- .map((item) => item?.code)
35
- .filter(
36
- (code): code is string =>
37
- typeof code === 'string' && code.trim().length > 0,
38
- );
39
- const timeoutOutcome = (node.config as any)?.timeout?.outcome;
40
- return [
41
- ...codes,
42
- ...(typeof timeoutOutcome === 'string' && timeoutOutcome.trim()
43
- ? [timeoutOutcome]
44
- : []),
45
- ];
30
+ return ['RECEIVED', 'TIMEOUT'];
46
31
  }
47
32
  return nodeTypeMeta?.outputs ?? [];
48
33
  }
@@ -51,25 +36,5 @@ export function resolveOutputLabels(
51
36
  node: WorkflowNode,
52
37
  ): Record<string, string> {
53
38
  if (node.type !== 'external_wait') return {};
54
- const outcomes = Array.isArray((node.config as any)?.outcomes)
55
- ? ((node.config as any).outcomes as Array<{
56
- code?: unknown;
57
- label?: unknown;
58
- }>)
59
- : [];
60
- const labels = Object.fromEntries(
61
- outcomes.flatMap((item) =>
62
- typeof item.code === 'string' &&
63
- item.code.trim() &&
64
- typeof item.label === 'string' &&
65
- item.label.trim()
66
- ? [[item.code, item.label]]
67
- : [],
68
- ),
69
- );
70
- const timeoutOutcome = (node.config as any)?.timeout?.outcome;
71
- if (typeof timeoutOutcome === 'string' && timeoutOutcome.trim()) {
72
- labels[timeoutOutcome] = '已超时';
73
- }
74
- return labels;
39
+ return { RECEIVED: '已收到', TIMEOUT: '已超时' };
75
40
  }
@@ -26,6 +26,7 @@ import { useLocation, useNavigate } 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';
@@ -135,20 +136,43 @@ export const WorkflowEventOutboxList: React.FC<
135
136
  t,
136
137
  });
137
138
 
138
- // Export all
139
+ // Export all (fields 来自 config/ui 的 toolbar.actions EXPORT 配置,缺省导出全部字段)
140
+ const exportAllAction = tableConfig.toolbar.actions.find(
141
+ (a) => a.action === 'EXPORT',
142
+ );
143
+ const exportAllFields =
144
+ exportAllAction?.action === 'EXPORT' ? exportAllAction.fields : undefined;
139
145
  const { triggerExport, isLoading: exportLoading } =
140
146
  useExport<WorkflowEventOutbox>({
141
147
  maxItemCount: 200,
142
148
  pageSize: 100,
149
+ ...(exportAllFields?.length
150
+ ? {
151
+ mapData: (item: WorkflowEventOutbox) => pick(item, exportAllFields),
152
+ }
153
+ : {}),
143
154
  });
144
155
 
145
- // Export selected
156
+ // Export selected (fields 来自 config/ui 的 rowSelection.actions EXPORT 配置)
157
+ const exportSelectedAction = tableConfig.rowSelection.actions.find(
158
+ (a) => a.action === 'EXPORT',
159
+ );
160
+ const exportSelectedFields =
161
+ exportSelectedAction?.action === 'EXPORT'
162
+ ? exportSelectedAction.fields
163
+ : undefined;
146
164
  const {
147
165
  triggerExport: triggerExportSelected,
148
166
  isLoading: exportSelectedLoading,
149
167
  } = useExport<WorkflowEventOutbox>({
150
168
  pageSize: 100,
151
169
  meta: { where: { id: { in: batchOps.selectedRowKeys.map(Number) } } },
170
+ ...(exportSelectedFields?.length
171
+ ? {
172
+ mapData: (item: WorkflowEventOutbox) =>
173
+ pick(item, exportSelectedFields),
174
+ }
175
+ : {}),
152
176
  });
153
177
 
154
178
  // Import
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gadmin2n/schematics",
3
- "version": "0.0.141",
3
+ "version": "0.0.143",
4
4
  "description": "Gadmin - modern, fast, powerful node.js web framework (@schematics)",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -1,89 +0,0 @@
1
- import { ACGuard } from '@gadmin2n/nest-common';
2
- import {
3
- Body,
4
- Controller,
5
- Get,
6
- Param,
7
- Patch,
8
- Post,
9
- Query,
10
- Req,
11
- UseGuards,
12
- } from '@nestjs/common';
13
- import { ApiTags } from '@nestjs/swagger';
14
- import { UseRoles } from 'nest-access-control';
15
- import {
16
- actorContextFromRequest,
17
- AuthenticatedActorRequest,
18
- } from '../subjectProvider/actor-context.util';
19
- import {
20
- CreateApprovalChannelDto,
21
- UpdateApprovalChannelDto,
22
- } from './approval-channel.dto';
23
- import { ApprovalChannelService } from './approval-channel.service';
24
-
25
- @ApiTags('approval-channels')
26
- @UseGuards(ACGuard)
27
- @Controller('approval-channels')
28
- export class ApprovalChannelController {
29
- constructor(private readonly service: ApprovalChannelService) {}
30
-
31
- @Get()
32
- @UseRoles({
33
- resource: 'approvalChannel',
34
- action: 'read',
35
- possession: 'any',
36
- })
37
- list(@Query('q') query?: string) {
38
- return this.service.list(query?.trim() ?? '');
39
- }
40
-
41
- @Get('dispatch-workflows')
42
- @UseRoles({
43
- resource: 'approvalChannel',
44
- action: 'read',
45
- possession: 'any',
46
- })
47
- listDispatchWorkflows(
48
- @Query('includeWorkflowId') includeWorkflowId?: string,
49
- ) {
50
- return this.service.listDispatchWorkflows(includeWorkflowId?.trim());
51
- }
52
-
53
- @Get(':code')
54
- @UseRoles({
55
- resource: 'approvalChannel',
56
- action: 'read',
57
- possession: 'any',
58
- })
59
- get(@Param('code') code: string) {
60
- return this.service.get(code);
61
- }
62
-
63
- @Post()
64
- @UseRoles({
65
- resource: 'approvalChannel',
66
- action: 'create',
67
- possession: 'any',
68
- })
69
- create(
70
- @Body() input: CreateApprovalChannelDto,
71
- @Req() request: AuthenticatedActorRequest,
72
- ) {
73
- return this.service.create(input, actorContextFromRequest(request));
74
- }
75
-
76
- @Patch(':code')
77
- @UseRoles({
78
- resource: 'approvalChannel',
79
- action: 'update',
80
- possession: 'any',
81
- })
82
- update(
83
- @Param('code') code: string,
84
- @Body() input: UpdateApprovalChannelDto,
85
- @Req() request: AuthenticatedActorRequest,
86
- ) {
87
- return this.service.update(code, input, actorContextFromRequest(request));
88
- }
89
- }
@@ -1,68 +0,0 @@
1
- import { Type } from 'class-transformer';
2
- import {
3
- IsBoolean,
4
- IsInt,
5
- IsNotEmpty,
6
- IsOptional,
7
- IsString,
8
- Matches,
9
- MaxLength,
10
- Min,
11
- } from 'class-validator';
12
-
13
- const CHANNEL_CODE_PATTERN = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/;
14
- const POSITIVE_BIGINT_PATTERN = /^[1-9]\d*$/;
15
-
16
- export class CreateApprovalChannelDto {
17
- @IsOptional()
18
- @IsString()
19
- @IsNotEmpty()
20
- @MaxLength(64)
21
- @Matches(CHANNEL_CODE_PATTERN)
22
- code?: string;
23
-
24
- @IsString()
25
- @IsNotEmpty()
26
- @MaxLength(128)
27
- name!: string;
28
-
29
- @IsOptional()
30
- @IsString()
31
- @MaxLength(512)
32
- description?: string;
33
-
34
- @IsString()
35
- @Matches(POSITIVE_BIGINT_PATTERN)
36
- dispatchWorkflowId!: string;
37
-
38
- @IsOptional()
39
- @IsBoolean()
40
- isEnabled?: boolean;
41
- }
42
-
43
- export class UpdateApprovalChannelDto {
44
- @Type(() => Number)
45
- @IsInt()
46
- @Min(1)
47
- expectedRevision!: number;
48
-
49
- @IsOptional()
50
- @IsString()
51
- @IsNotEmpty()
52
- @MaxLength(128)
53
- name?: string;
54
-
55
- @IsOptional()
56
- @IsString()
57
- @MaxLength(512)
58
- description?: string | null;
59
-
60
- @IsOptional()
61
- @IsString()
62
- @Matches(POSITIVE_BIGINT_PATTERN)
63
- dispatchWorkflowId?: string;
64
-
65
- @IsOptional()
66
- @IsBoolean()
67
- isEnabled?: boolean;
68
- }
@@ -1,177 +0,0 @@
1
- import { BadRequestException } from '@nestjs/common';
2
- import { ApprovalChannelService } from './approval-channel.service';
3
-
4
- const dispatchWorkflow = {
5
- id: BigInt(11),
6
- name: 'Dispatch approvals',
7
- status: 'PUBLISHED',
8
- isEnabled: true,
9
- versions: [
10
- {
11
- dsl: {
12
- nodes: [
13
- {
14
- type: 'callable_trigger',
15
- config: {
16
- inputParameters: [
17
- { key: 'title', label: '单据标题', required: true },
18
- { key: 'content', label: '审批内容', required: true },
19
- { key: 'callbackToken', label: '回调凭证', required: true },
20
- ],
21
- },
22
- },
23
- ],
24
- },
25
- },
26
- ],
27
- };
28
-
29
- describe('ApprovalChannelService', () => {
30
- const prisma = {
31
- workflow: {
32
- findUnique: jest.fn(),
33
- findMany: jest.fn(),
34
- },
35
- approvalChannel: {
36
- create: jest.fn(),
37
- },
38
- };
39
- const service = new ApprovalChannelService(prisma as any);
40
-
41
- beforeEach(() => {
42
- jest.clearAllMocks();
43
- prisma.workflow.findUnique.mockResolvedValue(dispatchWorkflow);
44
- prisma.approvalChannel.create.mockImplementation(({ data }) =>
45
- Promise.resolve({
46
- id: BigInt(1),
47
- ...data,
48
- description: data.description ?? null,
49
- revision: 1,
50
- creator: 'admin',
51
- createdAt: new Date('2026-07-24T00:00:00Z'),
52
- updatedAt: new Date('2026-07-24T00:00:00Z'),
53
- dispatchWorkflow,
54
- }),
55
- );
56
- });
57
-
58
- it('creates a channel with an internal code generated by the server', async () => {
59
- const result = await service.create(
60
- {
61
- name: 'External approval',
62
- dispatchWorkflowId: '11',
63
- isEnabled: true,
64
- },
65
- { userId: 'admin' },
66
- );
67
-
68
- expect(result).toMatchObject({
69
- id: '1',
70
- dispatchWorkflowId: '11',
71
- dispatchWorkflowName: 'Dispatch approvals',
72
- inputParameters: [
73
- { key: 'title', label: '单据标题', required: true },
74
- { key: 'content', label: '审批内容', required: true },
75
- { key: 'callbackToken', label: '回调凭证', required: true },
76
- ],
77
- });
78
- expect(result.code).toMatch(/^approval-[0-9a-f-]{36}$/);
79
- expect(prisma.approvalChannel.create).toHaveBeenCalledWith(
80
- expect.objectContaining({
81
- data: expect.objectContaining({ code: result.code }),
82
- }),
83
- );
84
- });
85
-
86
- it('keeps accepting a legacy channel whose event name matches its explicit code', async () => {
87
- prisma.workflow.findUnique.mockResolvedValueOnce({
88
- ...dispatchWorkflow,
89
- versions: [
90
- {
91
- dsl: {
92
- nodes: [
93
- {
94
- type: 'event_trigger',
95
- config: { eventName: 'approval.requested.external-main' },
96
- },
97
- ],
98
- },
99
- },
100
- ],
101
- });
102
-
103
- await expect(
104
- service.create(
105
- {
106
- code: 'external-main',
107
- name: 'Legacy external approval',
108
- dispatchWorkflowId: '11',
109
- isEnabled: true,
110
- },
111
- { userId: 'admin' },
112
- ),
113
- ).resolves.toMatchObject({ code: 'external-main' });
114
- });
115
-
116
- it('rejects a workflow that cannot receive a one-way call', async () => {
117
- prisma.workflow.findUnique.mockResolvedValueOnce({
118
- ...dispatchWorkflow,
119
- versions: [
120
- {
121
- dsl: {
122
- nodes: [{ type: 'manual_trigger', config: {} }],
123
- },
124
- },
125
- ],
126
- });
127
-
128
- await expect(
129
- service.create(
130
- {
131
- name: 'External approval',
132
- dispatchWorkflowId: '11',
133
- isEnabled: true,
134
- },
135
- { userId: 'admin' },
136
- ),
137
- ).rejects.toBeInstanceOf(BadRequestException);
138
- });
139
-
140
- it('lists only published workflows that can receive approval requests', async () => {
141
- prisma.workflow.findMany.mockResolvedValueOnce([
142
- dispatchWorkflow,
143
- {
144
- ...dispatchWorkflow,
145
- id: BigInt(12),
146
- name: 'Legacy dispatcher',
147
- versions: [
148
- {
149
- dsl: {
150
- nodes: [
151
- {
152
- type: 'event_trigger',
153
- config: { eventName: 'approval.requested.legacy' },
154
- },
155
- ],
156
- },
157
- },
158
- ],
159
- },
160
- {
161
- ...dispatchWorkflow,
162
- id: BigInt(13),
163
- name: 'Ordinary workflow',
164
- versions: [
165
- {
166
- dsl: { nodes: [{ type: 'manual_trigger', config: {} }] },
167
- },
168
- ],
169
- },
170
- ]);
171
-
172
- await expect(service.listDispatchWorkflows('12')).resolves.toEqual([
173
- { id: '11', name: 'Dispatch approvals' },
174
- { id: '12', name: 'Legacy dispatcher' },
175
- ]);
176
- });
177
- });