@gadmin2n/schematics 0.0.146 → 0.0.148

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 (95) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/CODEBUDDY.local.md +8 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/CODEBUDDY.md +70 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +1 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +1 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permission.seed.ts +67 -15
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +17 -4
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +5 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +24 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +15 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +2 -6
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +28 -29
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +16 -34
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +3 -3
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +61 -6
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +2 -2
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +11 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +126 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +136 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.controller.ts +24 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.dto.ts +8 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.service.spec.ts +62 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.service.ts +94 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.types.ts +6 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staffDirectory.module.ts +10 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +6 -2
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +20 -12
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +21 -19
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +11 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +97 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +150 -2
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +13 -1
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +13 -1
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +1 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +125 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +118 -5
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +20 -3
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +6 -9
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +2 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +4 -1
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +5 -1
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +44 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +15 -1
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +2 -3
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +33 -22
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +10 -23
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/StaffSelect/StaffSelect.test.tsx +69 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/StaffSelect/StaffSelect.tsx +145 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/StaffSelect/index.ts +2 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/StaffSelect/staff-directory.api.ts +16 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.test.ts +10 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +20 -2
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +6 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +49 -11
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +49 -11
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/people-groups/PeopleGroupModal.tsx +181 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/people-groups/index.tsx +203 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/people-groups/people-groups.api.ts +145 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/person-directory/PersonModal.tsx +112 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/person-directory/index.tsx +214 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/person-directory/person-directory.api.ts +79 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +7 -11
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +7 -7
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +20 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +97 -28
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +87 -119
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +22 -1
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +8 -2
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +8 -46
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +7 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +32 -3
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +163 -106
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +8 -1
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.test.tsx +26 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +34 -6
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +13 -16
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-instance-show.css +185 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +224 -105
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +1 -1
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +21 -12
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +1 -2
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +160 -8
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +125 -55
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +47 -3
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +33 -1
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +28 -46
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +16 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +0 -6
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.test.tsx +24 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +14 -17
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +1 -0
  93. package/package.json +1 -1
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +0 -162
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +0 -72
@@ -10,9 +10,8 @@ import {
10
10
  Typography,
11
11
  message,
12
12
  } from 'antd';
13
- import { EditOutlined, PlusOutlined, TeamOutlined } from '@ant-design/icons';
13
+ import { EditOutlined, TeamOutlined } from '@ant-design/icons';
14
14
  import type { WidgetProps } from '../schema-form/widget-registry';
15
- import { UserGroupCreateModal } from './UserGroupCreateModal';
16
15
  import { UserGroupEditModal } from './UserGroupEditModal';
17
16
  import { useTranslation } from 'react-i18next';
18
17
  import {
@@ -27,11 +26,16 @@ export interface SubjectSelection {
27
26
  refs: string[];
28
27
  }
29
28
 
29
+ interface SubjectPickerProps extends WidgetProps<SubjectSelection[]> {
30
+ allowedProviders?: readonly string[];
31
+ }
32
+
30
33
  export function SubjectPicker({
31
34
  value = [],
32
35
  onChange,
33
36
  disabled,
34
- }: WidgetProps<SubjectSelection[]>) {
37
+ allowedProviders,
38
+ }: SubjectPickerProps) {
35
39
  const { t } = useTranslation('workflow');
36
40
  const [providers, setProviders] = useState<SubjectProviderDescriptor[]>([]);
37
41
  const [activeProvider, setActiveProvider] = useState<string>(
@@ -44,7 +48,6 @@ export function SubjectPicker({
44
48
  );
45
49
  const [preview, setPreview] = useState<SubjectPreview>();
46
50
  const [loading, setLoading] = useState(false);
47
- const [createOpen, setCreateOpen] = useState(false);
48
51
  const [editingGroupRef, setEditingGroupRef] = useState<string>();
49
52
  const [previewRefresh, setPreviewRefresh] = useState(0);
50
53
  const debounce = useRef<ReturnType<typeof setTimeout>>();
@@ -53,15 +56,20 @@ export function SubjectPicker({
53
56
  subjectProviderApi
54
57
  .descriptors()
55
58
  .then((items) => {
56
- setProviders(items);
59
+ const visibleProviders = allowedProviders?.length
60
+ ? items.filter((item) => allowedProviders.includes(item.key))
61
+ : items;
62
+ setProviders(visibleProviders);
57
63
  setActiveProvider((current) =>
58
- items.some((item) => item.key === current) ? current : items[0]?.key,
64
+ visibleProviders.some((item) => item.key === current)
65
+ ? current
66
+ : visibleProviders[0]?.key,
59
67
  );
60
68
  })
61
69
  .catch((error) =>
62
70
  message.error(error?.message ?? t('subject.loadFailed')),
63
71
  );
64
- }, []);
72
+ }, [allowedProviders]);
65
73
 
66
74
  const selected = useMemo(
67
75
  () => value.find((item) => item.provider === activeProvider)?.refs ?? [],
@@ -132,17 +140,19 @@ export function SubjectPicker({
132
140
  return (
133
141
  <Card size="small" className="workflow-subject-picker">
134
142
  <Space direction="vertical" size={12} style={{ width: '100%' }}>
135
- <Select
136
- aria-label={t('subject.provider')}
137
- value={activeProvider}
138
- disabled={disabled}
139
- options={providers.map((item) => ({
140
- label: item.label,
141
- value: item.key,
142
- }))}
143
- onChange={setActiveProvider}
144
- style={{ width: '100%' }}
145
- />
143
+ {providers.length > 1 ? (
144
+ <Select
145
+ aria-label={t('subject.provider')}
146
+ value={activeProvider}
147
+ disabled={disabled}
148
+ options={providers.map((item) => ({
149
+ label: item.label,
150
+ value: item.key,
151
+ }))}
152
+ onChange={setActiveProvider}
153
+ style={{ width: '100%' }}
154
+ />
155
+ ) : null}
146
156
  {descriptor ? (
147
157
  <Space.Compact style={{ width: '100%' }}>
148
158
  <Select
@@ -171,16 +181,6 @@ export function SubjectPicker({
171
181
  name: descriptor.label.toLowerCase(),
172
182
  })}
173
183
  />
174
- {descriptor.capabilities.inlineCreate && (
175
- <Button
176
- className="workflow-panel-action"
177
- icon={<PlusOutlined />}
178
- disabled={disabled}
179
- onClick={() => setCreateOpen(true)}
180
- >
181
- {t('subject.create')}
182
- </Button>
183
- )}
184
184
  </Space.Compact>
185
185
  ) : (
186
186
  <Spin size="small" />
@@ -223,24 +223,6 @@ export function SubjectPicker({
223
223
  </div>
224
224
  ))}
225
225
  </Space>
226
- {descriptor && (
227
- <UserGroupCreateModal
228
- open={createOpen}
229
- provider={descriptor.key}
230
- providerLabel={descriptor.label.replace(/s$/, '')}
231
- createSchema={descriptor.createSchema}
232
- createUiSchema={descriptor.createUiSchema}
233
- onCancel={() => setCreateOpen(false)}
234
- onCreated={(resource) => {
235
- setCreateOpen(false);
236
- setResources((current) => ({
237
- ...current,
238
- [descriptor.key]: [resource, ...(current[descriptor.key] ?? [])],
239
- }));
240
- changeRefs([...selected, resource.ref]);
241
- }}
242
- />
243
- )}
244
226
  <UserGroupEditModal
245
227
  open={Boolean(editingGroupRef)}
246
228
  groupRef={editingGroupRef}
@@ -64,7 +64,9 @@
64
64
 
65
65
  .human-approval-config__field-heading,
66
66
  .human-approval-config__detail-head,
67
+ .human-approval-config__fixed-heading,
67
68
  .human-approval-config__dynamic-heading,
69
+ .human-approval-config__static-source-header,
68
70
  .human-approval-config__dynamic-source-header {
69
71
  display: flex;
70
72
  align-items: center;
@@ -72,6 +74,19 @@
72
74
  gap: 10px;
73
75
  }
74
76
 
77
+ .human-approval-config__static-source {
78
+ margin-top: 12px;
79
+ padding: 12px;
80
+ border: 1px solid var(--ant-color-border-secondary);
81
+ border-radius: 8px;
82
+ background: var(--ant-color-fill-quaternary);
83
+ }
84
+
85
+ .human-approval-config__static-source .workflow-subject-picker {
86
+ margin-top: 8px;
87
+ background: var(--ant-color-bg-container);
88
+ }
89
+
75
90
  .human-approval-config__dynamic-heading {
76
91
  align-items: flex-start;
77
92
  margin-top: 16px;
@@ -183,6 +198,7 @@
183
198
 
184
199
  @media (max-width: 620px) {
185
200
  .human-approval-config__field-heading,
201
+ .human-approval-config__fixed-heading,
186
202
  .human-approval-config__dynamic-heading {
187
203
  align-items: stretch;
188
204
  flex-direction: column;
@@ -55,12 +55,6 @@ export const subjectProviderApi = {
55
55
  'POST',
56
56
  { refs },
57
57
  ),
58
- create: (provider: string, input: Record<string, unknown>) =>
59
- customRequest<SubjectResource>(
60
- `subject-providers/${encodeURIComponent(provider)}/resources`,
61
- 'POST',
62
- input,
63
- ),
64
58
  userGroupDetail: (code: string) =>
65
59
  customRequest<UserGroupDetail>(
66
60
  `user-groups/${encodeURIComponent(code)}/preview`,
@@ -125,6 +125,12 @@ describe('TemporalTenantPage', () => {
125
125
 
126
126
  await user.click(screen.getByRole('button', { name: '显示 Admin Token' }));
127
127
  expect(screen.getByText('admin-token-1234567890')).toBeInTheDocument();
128
+ await user.click(
129
+ screen.getByRole('button', { name: '显示 Runtime Token' }),
130
+ );
131
+ expect(
132
+ screen.getByText('runtime-token-1234567890-runtime'),
133
+ ).toBeInTheDocument();
128
134
 
129
135
  await user.click(screen.getByRole('button', { name: '修改配置' }));
130
136
 
@@ -136,6 +142,7 @@ describe('TemporalTenantPage', () => {
136
142
  expect(screen.getByLabelText('Runtime API 地址')).toHaveValue(
137
143
  'http://gadmin-server:8000/api',
138
144
  );
145
+ expect(screen.queryByLabelText('Runtime Token')).not.toBeInTheDocument();
139
146
 
140
147
  const displayNameInput = screen.getByLabelText('显示名称');
141
148
  await user.clear(displayNameInput);
@@ -152,6 +159,14 @@ describe('TemporalTenantPage', () => {
152
159
  }),
153
160
  ),
154
161
  );
162
+ const updateCall = vi
163
+ .mocked(customRequest)
164
+ .mock.calls.find(
165
+ ([resource, method]) =>
166
+ resource === 'temporalTenantConfig/updateUnique/1' &&
167
+ method === 'PATCH',
168
+ );
169
+ expect(updateCall?.[2]).not.toHaveProperty('runtimeToken');
155
170
  expect(
156
171
  (await screen.findAllByText('GAdmin Workflow Updated')).length,
157
172
  ).toBeGreaterThan(0);
@@ -197,6 +212,15 @@ describe('TemporalTenantPage', () => {
197
212
  }),
198
213
  ),
199
214
  );
215
+ const testCall = vi
216
+ .mocked(customRequest)
217
+ .mock.calls.find(
218
+ ([resource, method]) =>
219
+ resource === 'temporalTenantConfig/testConnection' &&
220
+ method === 'POST',
221
+ );
222
+ expect(testCall?.[2]).not.toHaveProperty('runtimeToken');
223
+ expect(testCall?.[2]).not.toHaveProperty('id');
200
224
  expect(customRequest).not.toHaveBeenCalledWith(
201
225
  'temporalTenantConfig/updateUnique/1',
202
226
  'PATCH',
@@ -62,7 +62,7 @@ interface ConnectivityTestResponse {
62
62
  }>;
63
63
  }
64
64
 
65
- type TenantConfigFormValues = Omit<TenantConfig, 'id'>;
65
+ type TenantConfigFormValues = Omit<TenantConfig, 'id' | 'runtimeToken'>;
66
66
 
67
67
  const configSelect = {
68
68
  id: true,
@@ -85,6 +85,17 @@ function maskDatabaseUrl(value: string) {
85
85
  return value.replace(/(\/\/[^:/?#]+:)[^@/?#]+(@)/, '$1••••••$2');
86
86
  }
87
87
 
88
+ function toFormValues(config: TenantConfig): TenantConfigFormValues {
89
+ return {
90
+ adminUrl: config.adminUrl,
91
+ adminToken: config.adminToken,
92
+ namespace: config.namespace,
93
+ dbUrl: config.dbUrl,
94
+ displayName: config.displayName,
95
+ runtimeBaseUrl: config.runtimeBaseUrl,
96
+ };
97
+ }
98
+
88
99
  function SensitiveValue({
89
100
  label,
90
101
  value,
@@ -177,7 +188,7 @@ export default function TemporalTenantPage() {
177
188
  const openEditor = () => {
178
189
  form.resetFields();
179
190
  if (existing) {
180
- form.setFieldsValue(existing);
191
+ form.setFieldsValue(toFormValues(existing));
181
192
  }
182
193
  setEditorOpen(true);
183
194
  };
@@ -303,7 +314,7 @@ export default function TemporalTenantPage() {
303
314
  aria-label="测试连通性"
304
315
  icon={<ApiOutlined />}
305
316
  loading={testing}
306
- onClick={() => testConnection(existing)}
317
+ onClick={() => testConnection(toFormValues(existing))}
307
318
  >
308
319
  测试连通性
309
320
  </Button>
@@ -588,20 +599,6 @@ export default function TemporalTenantPage() {
588
599
  >
589
600
  <Input placeholder="http://gadmin-server:8000/api" />
590
601
  </Form.Item>
591
- <Form.Item
592
- label="Runtime Token"
593
- name="runtimeToken"
594
- extra="在这里设置 Worker 调用本 GAdmin Runtime API 时使用的凭据。"
595
- rules={[
596
- { required: true, message: '请输入 Runtime Token' },
597
- { min: 32, message: 'Runtime Token 至少需要 32 个字符' },
598
- ]}
599
- >
600
- <Input.Password
601
- placeholder="至少 32 个字符"
602
- autoComplete="new-password"
603
- />
604
- </Form.Item>
605
602
  </Form>
606
603
  </Drawer>
607
604
  </div>
@@ -68,6 +68,7 @@ export interface Workflow {
68
68
  running: number;
69
69
  completed: number;
70
70
  failed: number;
71
+ cancelled: number;
71
72
  };
72
73
  lastRun?: string | null;
73
74
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gadmin2n/schematics",
3
- "version": "0.0.146",
3
+ "version": "0.0.148",
4
4
  "description": "Gadmin - modern, fast, powerful node.js web framework (@schematics)",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -1,162 +0,0 @@
1
- import {
2
- Button,
3
- Drawer,
4
- Form,
5
- Input,
6
- Space,
7
- Switch,
8
- Typography,
9
- message,
10
- } from 'antd';
11
- import { customRequest } from 'helpers/http';
12
- import React, { useEffect, useState } from 'react';
13
- import { SchemaForm } from '../node-instances/schema-form/SchemaForm';
14
- import { schemaConfigDefaults } from '../node-instances/schema-form/schema-defaults';
15
- import type { WorkflowNodeInstance, WorkflowNodeType } from '../types';
16
- import { useTranslation } from 'react-i18next';
17
- import { useWorkflowFormValidation } from '../useWorkflowFormValidation';
18
-
19
- interface Props {
20
- open: boolean;
21
- nodeType?: WorkflowNodeType;
22
- onCancel(): void;
23
- onCreated(instance: WorkflowNodeInstance): void;
24
- }
25
-
26
- export function CreateNodeInstanceDrawer({
27
- open,
28
- nodeType,
29
- onCancel,
30
- onCreated,
31
- }: Props) {
32
- const { t } = useTranslation('workflow');
33
- const formValidation = useWorkflowFormValidation();
34
- const [form] = Form.useForm();
35
- const [submitting, setSubmitting] = useState(false);
36
- const [schemaError, setSchemaError] = useState<Error | null>(null);
37
-
38
- useEffect(() => {
39
- if (!open || !nodeType) return;
40
- form.resetFields();
41
- form.setFieldsValue({
42
- name: '',
43
- description: '',
44
- isEnabled: true,
45
- config: schemaConfigDefaults(nodeType.configSchema),
46
- });
47
- setSchemaError(null);
48
- }, [form, nodeType, open]);
49
-
50
- async function handleCreate() {
51
- if (!nodeType || schemaError) return;
52
- try {
53
- const values = await form.validateFields();
54
- setSubmitting(true);
55
- const instance = await customRequest<WorkflowNodeInstance>(
56
- 'workflowNodeInstance/createOne',
57
- 'POST',
58
- {
59
- nodeTypeId: Number(nodeType.id),
60
- name: values.name.trim(),
61
- description: values.description?.trim() || undefined,
62
- isEnabled: values.isEnabled ?? true,
63
- config: values.config ?? {},
64
- },
65
- );
66
- message.success(t('nodeInstance.createdAndAdded'));
67
- onCreated(instance);
68
- } catch (error: any) {
69
- if (error?.errorFields) return;
70
- message.error(error?.message ?? t('nodeInstance.createFailed'));
71
- } finally {
72
- setSubmitting(false);
73
- }
74
- }
75
-
76
- const usesCustomEditor = Boolean((nodeType?.uiSchema as any)?.widget);
77
-
78
- return (
79
- <Drawer
80
- open={open}
81
- title={t('nodeInstance.createNamed', {
82
- name: nodeType?.label ?? 'Node',
83
- })}
84
- width={usesCustomEditor ? 880 : 640}
85
- onClose={onCancel}
86
- destroyOnHidden
87
- maskClosable={!submitting}
88
- footer={
89
- <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
90
- <Space>
91
- <Button disabled={submitting} onClick={onCancel}>
92
- {t('common.back')}
93
- </Button>
94
- <Button
95
- type="primary"
96
- loading={submitting}
97
- disabled={Boolean(schemaError)}
98
- onClick={() => void handleCreate()}
99
- >
100
- {t('nodeInstance.createAndUse')}
101
- </Button>
102
- </Space>
103
- </div>
104
- }
105
- styles={{ body: { paddingBottom: 32 } }}
106
- >
107
- <Typography.Paragraph type="secondary">
108
- {t('nodeInstance.createAndUseDescription')}
109
- </Typography.Paragraph>
110
- <Form
111
- form={form}
112
- layout="vertical"
113
- disabled={submitting}
114
- {...formValidation}
115
- >
116
- <Form.Item
117
- name="name"
118
- label={t('nodeInstance.instanceName')}
119
- rules={[
120
- {
121
- required: true,
122
- whitespace: true,
123
- message: t('nodeInstance.nameRequired'),
124
- },
125
- ]}
126
- >
127
- <Input
128
- placeholder={t('nodeInstance.nameExample', {
129
- name: nodeType?.label ?? 'Node',
130
- })}
131
- />
132
- </Form.Item>
133
-
134
- <Form.Item name="description" label={t('common.description')}>
135
- <Input.TextArea
136
- rows={2}
137
- placeholder={t('common.optionalDescription')}
138
- />
139
- </Form.Item>
140
-
141
- <Form.Item
142
- name="isEnabled"
143
- label={t('common.enabled')}
144
- valuePropName="checked"
145
- >
146
- <Switch />
147
- </Form.Item>
148
-
149
- <Typography.Title level={5}>
150
- {t('common.configuration')}
151
- </Typography.Title>
152
- <SchemaForm
153
- schema={nodeType?.configSchema ?? null}
154
- uiSchema={nodeType?.uiSchema ?? null}
155
- disabled={submitting}
156
- validate={false}
157
- onSchemaError={setSchemaError}
158
- />
159
- </Form>
160
- </Drawer>
161
- );
162
- }
@@ -1,72 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { Form, Modal, message } from 'antd';
3
- import { SchemaForm } from '../schema-form/SchemaForm';
4
- import type { JsonSchema, UiSchema } from '../schema-form/schema.types';
5
- import {
6
- subjectProviderApi,
7
- type SubjectResource,
8
- } from './subject-provider.api';
9
- import { useWorkflowFormValidation } from '../../useWorkflowFormValidation';
10
-
11
- interface Props {
12
- open: boolean;
13
- provider: string;
14
- providerLabel: string;
15
- createSchema?: Record<string, unknown>;
16
- createUiSchema?: Record<string, unknown>;
17
- onCancel(): void;
18
- onCreated(resource: SubjectResource): void;
19
- }
20
-
21
- export function UserGroupCreateModal({
22
- open,
23
- provider,
24
- providerLabel,
25
- createSchema,
26
- createUiSchema,
27
- onCancel,
28
- onCreated,
29
- }: Props) {
30
- const formValidation = useWorkflowFormValidation();
31
- const [form] = Form.useForm();
32
- const [saving, setSaving] = useState(false);
33
-
34
- async function submit() {
35
- try {
36
- const values = await form.validateFields();
37
- setSaving(true);
38
- const resource = await subjectProviderApi.create(
39
- provider,
40
- values.config ?? {},
41
- );
42
- message.success(`${providerLabel} created and selected`);
43
- form.resetFields();
44
- onCreated(resource);
45
- } catch (error: any) {
46
- if (error?.errorFields) return;
47
- message.error(error?.message ?? `Failed to create ${providerLabel}`);
48
- } finally {
49
- setSaving(false);
50
- }
51
- }
52
-
53
- return (
54
- <Modal
55
- open={open}
56
- title={`Create ${providerLabel}`}
57
- okText="Create and select"
58
- confirmLoading={saving}
59
- onOk={submit}
60
- onCancel={onCancel}
61
- destroyOnClose
62
- >
63
- <Form form={form} layout="vertical" preserve={false} {...formValidation}>
64
- <SchemaForm
65
- schema={(createSchema ?? null) as JsonSchema | null}
66
- uiSchema={(createUiSchema ?? null) as UiSchema | null}
67
- disabled={saving}
68
- />
69
- </Form>
70
- </Modal>
71
- );
72
- }