@gadmin2n/schematics 0.0.107 → 0.0.109

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 (45) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +8 -9
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/AgendaJob.ts +17 -15
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +13 -17
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +48 -17
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +1 -2
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +14 -18
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +0 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +42 -18
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +28 -18
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +42 -18
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +1 -2
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +14 -18
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +28 -18
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +13 -17
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +14 -18
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +17 -17
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeInstance.ts +9 -14
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeType.ts +9 -14
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +1 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +7 -1
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +75 -71
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +36 -6
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +41 -14
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +153 -144
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +3 -3
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/agentAllowed.tsx +35 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/env.ts +2 -2
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -2
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +20 -1
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +48 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +40 -2
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +3 -2
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +6 -6
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +4 -3
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +4 -3
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +99 -5
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +28 -30
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +80 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +6 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +2 -1
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +2 -1
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +2 -1
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +6 -6
  45. package/package.json +1 -1
@@ -25,12 +25,14 @@ import { gadminCrudProvider as dataProvider } from './helpers/http';
25
25
  import { useDynamicResources } from 'hooks/useDynamicResources';
26
26
  import { renderRoutes } from 'config/routeRegistry';
27
27
  import { isAgentEnabled } from 'config/env';
28
+ import { AgentAllowedProvider, useIsAgentAllowed } from 'config/agentAllowed';
28
29
 
29
- // Wrapper component that only renders AgentProvider when agent is enabled
30
+ // Renders AgentProvider only when the logged-in user matches VITE_BRANCH_OWNER.
30
31
  const DevAgentWrapper: React.FC<{ children: React.ReactNode }> = ({
31
32
  children,
32
33
  }) => {
33
- if (!isAgentEnabled) return <>{children}</>;
34
+ const allowed = useIsAgentAllowed();
35
+ if (!allowed) return <>{children}</>;
34
36
  return (
35
37
  <AgentProvider>
36
38
  {children}
@@ -58,79 +60,81 @@ function App() {
58
60
 
59
61
  return (
60
62
  <BrowserRouter basename={isAgentEnabled ? '/app' : '/'}>
61
- <RefineKbarProvider>
62
- <BusinessContextProvider>
63
- <ColorModeContextProvider>
64
- <DevAgentWrapper>
65
- <Refine
66
- resources={resources}
67
- notificationProvider={notificationProvider}
68
- routerProvider={routerProvider}
69
- i18nProvider={i18nProvider}
70
- authProvider={authProvider}
71
- auditLogProvider={auditLogProvider(dataProvider)}
72
- dataProvider={{
73
- default: dataProvider,
74
- }}
75
- options={{
76
- syncWithLocation: true,
77
- warnWhenUnsavedChanges: true,
78
- breadcrumb: null,
79
- }}
80
- >
81
- {resources.length === 0 ? (
82
- <div
83
- style={{
84
- display: 'flex',
85
- justifyContent: 'center',
86
- alignItems: 'center',
87
- height: '100vh',
88
- }}
89
- >
90
- <Spin size="large" />
91
- </div>
92
- ) : (
93
- <Routes>
94
- <Route
95
- path="/"
96
- element={
97
- <Layout>
98
- <Outlet />
99
- </Layout>
100
- }
63
+ <AgentAllowedProvider>
64
+ <RefineKbarProvider>
65
+ <BusinessContextProvider>
66
+ <ColorModeContextProvider>
67
+ <DevAgentWrapper>
68
+ <Refine
69
+ resources={resources}
70
+ notificationProvider={notificationProvider}
71
+ routerProvider={routerProvider}
72
+ i18nProvider={i18nProvider}
73
+ authProvider={authProvider}
74
+ auditLogProvider={auditLogProvider(dataProvider)}
75
+ dataProvider={{
76
+ default: dataProvider,
77
+ }}
78
+ options={{
79
+ syncWithLocation: true,
80
+ warnWhenUnsavedChanges: true,
81
+ breadcrumb: null,
82
+ }}
83
+ >
84
+ {resources.length === 0 ? (
85
+ <div
86
+ style={{
87
+ display: 'flex',
88
+ justifyContent: 'center',
89
+ alignItems: 'center',
90
+ height: '100vh',
91
+ }}
101
92
  >
93
+ <Spin size="large" />
94
+ </div>
95
+ ) : (
96
+ <Routes>
102
97
  <Route
103
- index
98
+ path="/"
104
99
  element={
105
- <NavigateToResource
106
- resource={(() => {
107
- // Find first leaf resource (has list URL, not used as parent by others)
108
- const parentNames = new Set(
109
- resources
110
- .map((r) => r.meta?.parent)
111
- .filter(Boolean),
112
- );
113
- return (
114
- resources.find(
115
- (r) => r.list && !parentNames.has(r.name),
116
- ) ?? resources.find((r) => r.list)
117
- )?.name;
118
- })()}
119
- />
100
+ <Layout>
101
+ <Outlet />
102
+ </Layout>
120
103
  }
121
- />
122
- {renderRoutes()}
123
- <Route path="*" element={<ErrorComponent />} />
124
- </Route>
125
- </Routes>
126
- )}
127
- <RefineKbar />
128
- <UnsavedChangesNotifier />
129
- </Refine>
130
- </DevAgentWrapper>
131
- </ColorModeContextProvider>
132
- </BusinessContextProvider>
133
- </RefineKbarProvider>
104
+ >
105
+ <Route
106
+ index
107
+ element={
108
+ <NavigateToResource
109
+ resource={(() => {
110
+ // Find first leaf resource (has list URL, not used as parent by others)
111
+ const parentNames = new Set(
112
+ resources
113
+ .map((r) => r.meta?.parent)
114
+ .filter(Boolean),
115
+ );
116
+ return (
117
+ resources.find(
118
+ (r) => r.list && !parentNames.has(r.name),
119
+ ) ?? resources.find((r) => r.list)
120
+ )?.name;
121
+ })()}
122
+ />
123
+ }
124
+ />
125
+ {renderRoutes()}
126
+ <Route path="*" element={<ErrorComponent />} />
127
+ </Route>
128
+ </Routes>
129
+ )}
130
+ <RefineKbar />
131
+ <UnsavedChangesNotifier />
132
+ </Refine>
133
+ </DevAgentWrapper>
134
+ </ColorModeContextProvider>
135
+ </BusinessContextProvider>
136
+ </RefineKbarProvider>
137
+ </AgentAllowedProvider>
134
138
  </BrowserRouter>
135
139
  );
136
140
  }
@@ -4,6 +4,7 @@ import { agentAttrs } from './agentPanel/agentAttributes';
4
4
  import { useAgent } from './agentPanel/AgentContext';
5
5
  import { ExportButton } from '@refinedev/antd';
6
6
  import { RowAction } from '../hooks/types';
7
+ import { interpolateActionUrl } from '../helpers/list';
7
8
 
8
9
  export interface BulkActionsRenderContext {
9
10
  /** Number of selected items */
@@ -45,9 +46,8 @@ export interface BulkActionsProps {
45
46
  t?: (key: string, defaultValue?: string) => string;
46
47
  /** Resource name for i18n keys */
47
48
  resourceName?: string;
48
- /** Show delete button */
49
+ /** 强制显式覆盖:传 boolean 时优先于 actions 推导值 */
49
50
  showDelete?: boolean;
50
- /** Show export button */
51
51
  showExport?: boolean;
52
52
  /** Custom children - if provided, replaces entire default UI */
53
53
  children?:
@@ -129,8 +129,8 @@ export const BulkActions: React.FC<BulkActionsProps> = ({
129
129
  exportLoading = false,
130
130
  t = (key, defaultValue) => defaultValue || key,
131
131
  resourceName = '',
132
- showDelete = true,
133
- showExport = true,
132
+ showDelete,
133
+ showExport,
134
134
  children,
135
135
  renderUpdateButton,
136
136
  renderDeleteButton,
@@ -193,6 +193,12 @@ export const BulkActions: React.FC<BulkActionsProps> = ({
193
193
  const statusActions = actions.filter(
194
194
  (action) => action.action === 'CHANGE_STATUS',
195
195
  );
196
+ const jumpActions = actions.filter((action) => action.action === 'JUMP');
197
+
198
+ // actions 是按钮显示与否的唯一真相源;显式 show* 可强制覆盖。
199
+ const set = new Set(actions.map((a) => a.action));
200
+ const resolvedShowDelete = showDelete ?? set.has('DELETE');
201
+ const resolvedShowExport = showExport ?? set.has('EXPORT');
196
202
 
197
203
  const defaultUpdateButton = (
198
204
  action: RowAction,
@@ -260,19 +266,43 @@ export const BulkActions: React.FC<BulkActionsProps> = ({
260
266
  )}
261
267
 
262
268
  {/* Export selected */}
263
- {showExport &&
269
+ {resolvedShowExport &&
264
270
  onExportSelected &&
265
271
  (renderExportButton
266
272
  ? renderExportButton(onExportSelected, exportLoading)
267
273
  : defaultExportButton(onExportSelected, exportLoading))}
268
274
 
269
275
  {/* Delete selected */}
270
- {showDelete &&
276
+ {resolvedShowDelete &&
271
277
  onDeleteSelected &&
272
278
  (renderDeleteButton
273
279
  ? renderDeleteButton(onDeleteSelected, deleteLoading)
274
280
  : defaultDeleteButton(onDeleteSelected, deleteLoading))}
275
281
 
282
+ {/* JUMP actions */}
283
+ {jumpActions.map((action) => {
284
+ const url = interpolateActionUrl((action as any).url || '', {
285
+ ids: selectedRowKeys.join(','),
286
+ });
287
+ const isExternal = /^https?:\/\//.test(url);
288
+ return (
289
+ <Button
290
+ key={action.desc}
291
+ type="link"
292
+ onClick={() => {
293
+ if (!url) return;
294
+ if (isExternal) {
295
+ window.open(url, '_blank', 'noopener,noreferrer');
296
+ } else {
297
+ window.location.href = url;
298
+ }
299
+ }}
300
+ >
301
+ {t(`resources.${resourceName}.actions.${action.desc}`, action.desc)}
302
+ </Button>
303
+ );
304
+ })}
305
+
276
306
  {/* Extra actions */}
277
307
  {extraActions}
278
308
 
@@ -1,52 +1,79 @@
1
1
  import React from 'react';
2
- import { Space } from 'antd';
2
+ import { Button, Space } from 'antd';
3
+ import { ReloadOutlined } from '@ant-design/icons';
3
4
  import { CreateButton, ExportButton, ImportButton } from '@refinedev/antd';
4
5
  import { agentAttrs } from './agentPanel/agentAttributes';
6
+ import { actionsToShowFlags } from '../helpers/list';
7
+
8
+ type ToolbarAction = { action: string; desc?: string; [k: string]: any };
5
9
 
6
10
  export interface ListPageHeaderProps {
7
- /** Show import button */
11
+ /**
12
+ * config 中的 actions 数组(建议同时传入 toolbar.actions 与 rowSelection.actions 合并的结果,
13
+ * 因为 INSERT/EXPORT 可能出现在任一处)。`actions` 是按钮显示与否的唯一真相源。
14
+ */
15
+ actions?: ToolbarAction[];
16
+ /** 强制显式覆盖:传 boolean 时优先于 actions 推导值 */
8
17
  showImport?: boolean;
9
- /** Show export button */
10
18
  showExport?: boolean;
11
- /** Show create button */
12
19
  showCreate?: boolean;
20
+ showRefresh?: boolean;
13
21
  /** Import button props */
14
22
  importProps?: any;
15
23
  /** Export handler */
16
24
  onExport?: () => void;
17
- /** Export loading state */
18
25
  exportLoading?: boolean;
19
- /** Custom buttons to render before default buttons */
26
+ /** Refresh handler */
27
+ onRefresh?: () => void;
28
+ /** Custom buttons before defaults */
20
29
  extraButtons?: React.ReactNode;
21
- /** Custom buttons to render after default buttons */
30
+ /** Custom buttons after defaults */
22
31
  extraButtonsAfter?: React.ReactNode;
23
32
  /** Resource name for agent inspector */
24
33
  resourceName?: string;
25
34
  }
26
35
 
27
36
  /**
28
- * Default header buttons for list page
37
+ * 列表页头部按钮:按 actions 数组驱动 REFRESH/SETTING/IMPORT/EXPORT/INSERT 的显示。
29
38
  */
30
39
  export const ListPageHeader: React.FC<ListPageHeaderProps> = ({
31
- showImport = true,
32
- showExport = true,
33
- showCreate = true,
40
+ actions,
41
+ showImport,
42
+ showExport,
43
+ showCreate,
44
+ showRefresh,
34
45
  importProps,
35
46
  onExport,
36
47
  exportLoading = false,
48
+ onRefresh,
37
49
  extraButtons,
38
50
  extraButtonsAfter,
39
51
  resourceName = '',
40
52
  }) => {
53
+ const flags = actionsToShowFlags(actions);
54
+ const resolved = {
55
+ showImport: showImport ?? flags.showImport,
56
+ showExport: showExport ?? flags.showExport,
57
+ showCreate: showCreate ?? flags.showInsert,
58
+ showRefresh: showRefresh ?? flags.showRefresh,
59
+ };
60
+
41
61
  return (
42
62
  <div {...agentAttrs({ type: 'list-header', resource: resourceName })}>
43
63
  <Space>
44
64
  {extraButtons}
45
- {showImport && importProps && <ImportButton {...importProps} />}
46
- {showExport && onExport && (
65
+ {resolved.showRefresh && (
66
+ <Button icon={<ReloadOutlined />} onClick={onRefresh}>
67
+ 刷新
68
+ </Button>
69
+ )}
70
+ {resolved.showImport && importProps && (
71
+ <ImportButton {...importProps} />
72
+ )}
73
+ {resolved.showExport && onExport && (
47
74
  <ExportButton onClick={onExport} loading={exportLoading} />
48
75
  )}
49
- {showCreate && <CreateButton type="primary" />}
76
+ {resolved.showCreate && <CreateButton type="primary" />}
50
77
  {extraButtonsAfter}
51
78
  </Space>
52
79
  </div>