@gadmin2n/schematics 0.0.106 → 0.0.108
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.
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +8 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/AgendaJob.ts +17 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +13 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +48 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +1 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +14 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +42 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +28 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +42 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +1 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +14 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +28 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +13 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +14 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +17 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeInstance.ts +9 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeType.ts +9 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +54 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +7 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +75 -71
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +36 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +41 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +153 -144
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/agentAllowed.tsx +35 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/env.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +20 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +48 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +40 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +3 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +6 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +4 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +4 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +99 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +28 -30
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +80 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +6 -6
- package/package.json +2 -1
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@faker-js/faker": "^10.4.0",
|
|
91
91
|
"@gadmin2n/prisma-nest-generator": "^0.0.46",
|
|
92
|
-
"@gadmin2n/prisma-react-generator": "^0.0.
|
|
92
|
+
"@gadmin2n/prisma-react-generator": "^0.0.61",
|
|
93
93
|
"@nestjs/cli": "^11.0.21",
|
|
94
94
|
"@nestjs/testing": "^10.4.15",
|
|
95
95
|
"@types/cookie-parser": "^1.4.3",
|
|
@@ -18,7 +18,13 @@ export class TemporalService implements OnModuleInit, OnModuleDestroy {
|
|
|
18
18
|
private client: Client;
|
|
19
19
|
private readonly logger = new Logger(TemporalService.name);
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
onModuleInit() {
|
|
22
|
+
// Fire-and-forget: 不 await 连接,避免 Temporal 不可用时阻塞 server 启动。
|
|
23
|
+
// 连接成功前调用 startWorkflow 等方法会抛 "Temporal client not connected"。
|
|
24
|
+
this.connectInBackground();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private async connectInBackground() {
|
|
22
28
|
try {
|
|
23
29
|
this.connection = await Connection.connect({ address: TEMPORAL_ADDRESS });
|
|
24
30
|
this.client = new Client({
|
|
@@ -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
|
-
//
|
|
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
|
-
|
|
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
|
-
<
|
|
62
|
-
<
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
98
|
+
path="/"
|
|
104
99
|
element={
|
|
105
|
-
<
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
}
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
133
|
-
showExport
|
|
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
|
-
{
|
|
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
|
-
{
|
|
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
|
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
/**
|
|
26
|
+
/** Refresh handler */
|
|
27
|
+
onRefresh?: () => void;
|
|
28
|
+
/** Custom buttons before defaults */
|
|
20
29
|
extraButtons?: React.ReactNode;
|
|
21
|
-
/** Custom 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
|
-
*
|
|
37
|
+
* 列表页头部按钮:按 actions 数组驱动 REFRESH/SETTING/IMPORT/EXPORT/INSERT 的显示。
|
|
29
38
|
*/
|
|
30
39
|
export const ListPageHeader: React.FC<ListPageHeaderProps> = ({
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
{
|
|
46
|
-
|
|
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>
|