@gadmin2n/schematics 0.0.151 → 0.0.153
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/prisma/workflow.prisma +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.seed-timestamp +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permission.seed.ts +23 -44
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +25 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +74 -64
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +0 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +17 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +58 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +66 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +61 -149
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-lifecycle-runtime.controller.spec.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-lifecycle-runtime.controller.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-lifecycle.service.spec.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +38 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +18 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +131 -242
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.test.ts +7 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +6 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +0 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +29 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +29 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/people-groups/index.tsx +20 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/person-directory/index.tsx +38 -35
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +24 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +0 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +20 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +7 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +28 -79
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +227 -97
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/settings/index.tsx +73 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +21 -46
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +1 -0
- package/package.json +1 -1
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx
CHANGED
|
@@ -6,8 +6,6 @@ import {
|
|
|
6
6
|
BgColorsOutlined,
|
|
7
7
|
ScheduleOutlined,
|
|
8
8
|
ApartmentOutlined,
|
|
9
|
-
TeamOutlined,
|
|
10
|
-
UserOutlined,
|
|
11
9
|
} from '@ant-design/icons';
|
|
12
10
|
import { getRoutePath } from 'config/routeRegistry';
|
|
13
11
|
import { useUserPageAccess } from './useUserPageAccess';
|
|
@@ -48,8 +46,6 @@ export const iconMapping: Record<string, React.ReactNode> = {
|
|
|
48
46
|
canvas: <BgColorsOutlined />,
|
|
49
47
|
agenda: <ScheduleOutlined />,
|
|
50
48
|
workflow: <ApartmentOutlined />,
|
|
51
|
-
person_directory: <UserOutlined />,
|
|
52
|
-
people_group: <TeamOutlined />,
|
|
53
49
|
};
|
|
54
50
|
|
|
55
51
|
// Pages whose children are tabs (not separate menu items)
|
|
@@ -257,6 +257,15 @@
|
|
|
257
257
|
"runOnceEach": "Run once for each item",
|
|
258
258
|
"timeoutMilliseconds": "Timeout (milliseconds)"
|
|
259
259
|
},
|
|
260
|
+
"settings": {
|
|
261
|
+
"title": "Feature Settings",
|
|
262
|
+
"subtitle": "Manage the service registration, connections, business events and people data that Workflow depends on.",
|
|
263
|
+
"tabTenant": "Service Registration",
|
|
264
|
+
"tabConnections": "Connections",
|
|
265
|
+
"tabEvents": "Business Events",
|
|
266
|
+
"tabPeople": "People Directory",
|
|
267
|
+
"tabGroups": "People Groups"
|
|
268
|
+
},
|
|
260
269
|
"connection": {
|
|
261
270
|
"title": "Connections",
|
|
262
271
|
"subtitle": "Manage external system addresses and encrypted credentials for reuse by Workflow nodes.",
|
|
@@ -581,6 +590,9 @@
|
|
|
581
590
|
}
|
|
582
591
|
},
|
|
583
592
|
"database": {
|
|
593
|
+
"mode": "Execution mode",
|
|
594
|
+
"functionMode": "Database Function",
|
|
595
|
+
"sqlMode": "Raw SQL",
|
|
584
596
|
"function": "Database Function",
|
|
585
597
|
"functionHint": "Only Functions in workflow_api in the current GAdmin database are shown.",
|
|
586
598
|
"selectFunction": "Select a Function",
|
|
@@ -588,6 +600,17 @@
|
|
|
588
600
|
"functionMissing": "This Function no longer exists. Select another Function.",
|
|
589
601
|
"returnType": "Return type: {{type}}",
|
|
590
602
|
"noArguments": "This Function has no arguments.",
|
|
603
|
+
"sql": "SQL statement",
|
|
604
|
+
"readOnly": "Read-only SQL",
|
|
605
|
+
"writeEnabled": "Writes enabled",
|
|
606
|
+
"allowWrite": "Allow writes",
|
|
607
|
+
"readOnlyDescription": "When off, this node can only query data.",
|
|
608
|
+
"readWriteDescription": "When on, this node can query, insert, update, or delete data.",
|
|
609
|
+
"parameters": "Parameter values",
|
|
610
|
+
"parameter": "Parameter",
|
|
611
|
+
"value": "Value",
|
|
612
|
+
"parametersHint": "Values are used by $1, $2, and so on in order.",
|
|
613
|
+
"addParameter": "Add parameter value",
|
|
591
614
|
"timeout": "Timeout",
|
|
592
615
|
"seconds": "seconds"
|
|
593
616
|
},
|
|
@@ -999,6 +1022,7 @@
|
|
|
999
1022
|
"total": "Total",
|
|
1000
1023
|
"last24h": "24H",
|
|
1001
1024
|
"running": "Running",
|
|
1025
|
+
"waitingRetry": "Waiting to retry",
|
|
1002
1026
|
"pending": "Pending",
|
|
1003
1027
|
"average24h": "Avg (24H)",
|
|
1004
1028
|
"averageTotal": "Avg (Total)"
|
|
@@ -1030,6 +1054,7 @@
|
|
|
1030
1054
|
"pending": "Pending",
|
|
1031
1055
|
"completed": "Completed",
|
|
1032
1056
|
"running": "Running",
|
|
1057
|
+
"waitingRetry": "Waiting to retry",
|
|
1033
1058
|
"failed": "Failed",
|
|
1034
1059
|
"cancelled": "Cancelled",
|
|
1035
1060
|
"publishedStatus": "Published",
|
|
@@ -1071,6 +1096,7 @@
|
|
|
1071
1096
|
"statuses": {
|
|
1072
1097
|
"pending": "Pending",
|
|
1073
1098
|
"running": "Running",
|
|
1099
|
+
"waiting_retry": "Waiting to retry",
|
|
1074
1100
|
"completed": "Completed",
|
|
1075
1101
|
"failed": "Failed",
|
|
1076
1102
|
"cancelled": "Cancelled"
|
|
@@ -1093,15 +1119,11 @@
|
|
|
1093
1119
|
"retryAllStarted": "The full Workflow retry has started",
|
|
1094
1120
|
"retryFromNode": "Retry from here",
|
|
1095
1121
|
"retryFromNodeConfirm": "Run again from “{{name}}”?",
|
|
1096
|
-
"retryFromNodeDescription": "
|
|
1097
|
-
"retryFromNodeStarted": "
|
|
1122
|
+
"retryFromNodeDescription": "The same run will retry this failed node, then continue with the remaining nodes.",
|
|
1123
|
+
"retryFromNodeStarted": "The failed node is retrying in the same run",
|
|
1098
1124
|
"retryFromNodeFailed": "Unable to retry from this node",
|
|
1099
1125
|
"viewRetryAttempt": "View retry #{{id}}",
|
|
1100
|
-
"retrySource": "Resumed from"
|
|
1101
|
-
"reusedResults": "Earlier results",
|
|
1102
|
-
"reusedResultsCount": "Reused results from {{count}} successful nodes",
|
|
1103
|
-
"reusedResult": "Reused earlier result",
|
|
1104
|
-
"reusedResultDescription": "This node succeeded earlier, so its result was reused for this run."
|
|
1126
|
+
"retrySource": "Resumed from"
|
|
1105
1127
|
},
|
|
1106
1128
|
"nodeTypeBadge": "{{type}} node",
|
|
1107
1129
|
"nodeCategories": {
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json
CHANGED
|
@@ -257,6 +257,15 @@
|
|
|
257
257
|
"runOnceEach": "对每一项分别运行",
|
|
258
258
|
"timeoutMilliseconds": "超时时间(毫秒)"
|
|
259
259
|
},
|
|
260
|
+
"settings": {
|
|
261
|
+
"title": "功能设置",
|
|
262
|
+
"subtitle": "统一管理 Workflow 运行依赖的服务注册、连接、业务事件与人员数据。",
|
|
263
|
+
"tabTenant": "服务注册",
|
|
264
|
+
"tabConnections": "连接管理",
|
|
265
|
+
"tabEvents": "业务事件",
|
|
266
|
+
"tabPeople": "人员目录",
|
|
267
|
+
"tabGroups": "人员组"
|
|
268
|
+
},
|
|
260
269
|
"connection": {
|
|
261
270
|
"title": "连接管理",
|
|
262
271
|
"subtitle": "集中管理外部系统地址和加密凭据,供 Workflow 节点复用。",
|
|
@@ -581,6 +590,9 @@
|
|
|
581
590
|
}
|
|
582
591
|
},
|
|
583
592
|
"database": {
|
|
593
|
+
"mode": "执行方式",
|
|
594
|
+
"functionMode": "数据库 Function",
|
|
595
|
+
"sqlMode": "Raw SQL",
|
|
584
596
|
"function": "数据库 Function",
|
|
585
597
|
"functionHint": "只显示当前 GAdmin 数据库 workflow_api 中的 Function。",
|
|
586
598
|
"selectFunction": "选择 Function",
|
|
@@ -588,6 +600,17 @@
|
|
|
588
600
|
"functionMissing": "当前 Function 已不存在,请重新选择。",
|
|
589
601
|
"returnType": "返回类型:{{type}}",
|
|
590
602
|
"noArguments": "这个 Function 不需要参数。",
|
|
603
|
+
"sql": "SQL 语句",
|
|
604
|
+
"readOnly": "只读 SQL",
|
|
605
|
+
"writeEnabled": "允许写入",
|
|
606
|
+
"allowWrite": "允许写入",
|
|
607
|
+
"readOnlyDescription": "关闭时只能查询数据。",
|
|
608
|
+
"readWriteDescription": "开启后可以查询、新增、更新或删除数据。",
|
|
609
|
+
"parameters": "参数值",
|
|
610
|
+
"parameter": "参数",
|
|
611
|
+
"value": "值",
|
|
612
|
+
"parametersHint": "SQL 中的 $1、$2… 会依次使用这里的值。",
|
|
613
|
+
"addParameter": "添加参数值",
|
|
591
614
|
"timeout": "超时时间",
|
|
592
615
|
"seconds": "秒"
|
|
593
616
|
},
|
|
@@ -999,6 +1022,7 @@
|
|
|
999
1022
|
"total": "总计",
|
|
1000
1023
|
"last24h": "24 小时",
|
|
1001
1024
|
"running": "运行中",
|
|
1025
|
+
"waitingRetry": "等待重试",
|
|
1002
1026
|
"pending": "等待中",
|
|
1003
1027
|
"average24h": "平均耗时(24 小时)",
|
|
1004
1028
|
"averageTotal": "平均耗时(全部)"
|
|
@@ -1030,6 +1054,7 @@
|
|
|
1030
1054
|
"pending": "等待中",
|
|
1031
1055
|
"completed": "已完成",
|
|
1032
1056
|
"running": "运行中",
|
|
1057
|
+
"waitingRetry": "等待重试",
|
|
1033
1058
|
"failed": "失败",
|
|
1034
1059
|
"cancelled": "已取消",
|
|
1035
1060
|
"publishedStatus": "已发布",
|
|
@@ -1071,6 +1096,7 @@
|
|
|
1071
1096
|
"statuses": {
|
|
1072
1097
|
"pending": "等待中",
|
|
1073
1098
|
"running": "运行中",
|
|
1099
|
+
"waiting_retry": "等待重试",
|
|
1074
1100
|
"completed": "已完成",
|
|
1075
1101
|
"failed": "失败",
|
|
1076
1102
|
"cancelled": "已取消"
|
|
@@ -1093,15 +1119,11 @@
|
|
|
1093
1119
|
"retryAllStarted": "已开始重新运行整个流程",
|
|
1094
1120
|
"retryFromNode": "从这里重试",
|
|
1095
1121
|
"retryFromNodeConfirm": "从“{{name}}”重新执行吗?",
|
|
1096
|
-
"retryFromNodeDescription": "
|
|
1097
|
-
"retryFromNodeStarted": "
|
|
1122
|
+
"retryFromNodeDescription": "将在当前运行中重试这个失败节点,成功后继续执行后续节点。",
|
|
1123
|
+
"retryFromNodeStarted": "已在当前运行中重试失败节点",
|
|
1098
1124
|
"retryFromNodeFailed": "无法从该节点重试",
|
|
1099
1125
|
"viewRetryAttempt": "查看重试 #{{id}}",
|
|
1100
|
-
"retrySource": "恢复来源"
|
|
1101
|
-
"reusedResults": "前序结果",
|
|
1102
|
-
"reusedResultsCount": "已复用 {{count}} 个成功节点的结果",
|
|
1103
|
-
"reusedResult": "复用前序结果",
|
|
1104
|
-
"reusedResultDescription": "这个节点此前已成功,本次直接复用其结果。"
|
|
1126
|
+
"retrySource": "恢复来源"
|
|
1105
1127
|
},
|
|
1106
1128
|
"nodeTypeBadge": "{{type}}节点",
|
|
1107
1129
|
"nodeCategories": {
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/people-groups/index.tsx
CHANGED
|
@@ -18,8 +18,7 @@ import {
|
|
|
18
18
|
message,
|
|
19
19
|
type TableColumnsType,
|
|
20
20
|
} from 'antd';
|
|
21
|
-
import {
|
|
22
|
-
import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
|
|
21
|
+
import { SEARCH_CARD_PROPS } from 'constants/layout';
|
|
23
22
|
import { useCallback, useEffect, useState } from 'react';
|
|
24
23
|
import { PeopleGroupModal } from './PeopleGroupModal';
|
|
25
24
|
import {
|
|
@@ -153,11 +152,23 @@ export default function PeopleGroupsPage() {
|
|
|
153
152
|
];
|
|
154
153
|
|
|
155
154
|
return (
|
|
156
|
-
|
|
157
|
-
<
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
155
|
+
<>
|
|
156
|
+
<Card {...SEARCH_CARD_PROPS}>
|
|
157
|
+
<div
|
|
158
|
+
style={{
|
|
159
|
+
display: 'flex',
|
|
160
|
+
justifyContent: 'space-between',
|
|
161
|
+
alignItems: 'center',
|
|
162
|
+
flexWrap: 'wrap',
|
|
163
|
+
gap: 8,
|
|
164
|
+
}}
|
|
165
|
+
>
|
|
166
|
+
<Input.Search
|
|
167
|
+
allowClear
|
|
168
|
+
placeholder="搜索名称或组标识"
|
|
169
|
+
style={{ width: 280 }}
|
|
170
|
+
onSearch={setQuery}
|
|
171
|
+
/>
|
|
161
172
|
<Space>
|
|
162
173
|
<Button icon={<ReloadOutlined />} onClick={load} />
|
|
163
174
|
<Button
|
|
@@ -168,15 +179,7 @@ export default function PeopleGroupsPage() {
|
|
|
168
179
|
新建人员组
|
|
169
180
|
</Button>
|
|
170
181
|
</Space>
|
|
171
|
-
|
|
172
|
-
/>
|
|
173
|
-
<Card {...SEARCH_CARD_PROPS}>
|
|
174
|
-
<Input.Search
|
|
175
|
-
allowClear
|
|
176
|
-
placeholder="搜索名称或组标识"
|
|
177
|
-
style={{ width: 280 }}
|
|
178
|
-
onSearch={setQuery}
|
|
179
|
-
/>
|
|
182
|
+
</div>
|
|
180
183
|
</Card>
|
|
181
184
|
<Card className="card-table">
|
|
182
185
|
<Table
|
|
@@ -198,6 +201,6 @@ export default function PeopleGroupsPage() {
|
|
|
198
201
|
}}
|
|
199
202
|
/>
|
|
200
203
|
)}
|
|
201
|
-
|
|
204
|
+
</>
|
|
202
205
|
);
|
|
203
206
|
}
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/person-directory/index.tsx
CHANGED
|
@@ -18,8 +18,7 @@ import {
|
|
|
18
18
|
message,
|
|
19
19
|
type TableColumnsType,
|
|
20
20
|
} from 'antd';
|
|
21
|
-
import {
|
|
22
|
-
import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
|
|
21
|
+
import { SEARCH_CARD_PROPS } from 'constants/layout';
|
|
23
22
|
import { useCallback, useEffect, useState } from 'react';
|
|
24
23
|
import { PersonModal } from './PersonModal';
|
|
25
24
|
import {
|
|
@@ -140,11 +139,41 @@ export default function PersonDirectoryPage() {
|
|
|
140
139
|
];
|
|
141
140
|
|
|
142
141
|
return (
|
|
143
|
-
|
|
144
|
-
<
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
142
|
+
<>
|
|
143
|
+
<Card {...SEARCH_CARD_PROPS}>
|
|
144
|
+
<div
|
|
145
|
+
style={{
|
|
146
|
+
display: 'flex',
|
|
147
|
+
justifyContent: 'space-between',
|
|
148
|
+
alignItems: 'center',
|
|
149
|
+
flexWrap: 'wrap',
|
|
150
|
+
gap: 8,
|
|
151
|
+
}}
|
|
152
|
+
>
|
|
153
|
+
<Space wrap>
|
|
154
|
+
<Input.Search
|
|
155
|
+
allowClear
|
|
156
|
+
placeholder="搜索姓名或账号"
|
|
157
|
+
style={{ width: 260 }}
|
|
158
|
+
onSearch={(value) => {
|
|
159
|
+
setPage(1);
|
|
160
|
+
setQuery(value);
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
|
+
<Select
|
|
164
|
+
allowClear
|
|
165
|
+
placeholder="全部状态"
|
|
166
|
+
style={{ width: 140 }}
|
|
167
|
+
options={[
|
|
168
|
+
{ label: '已启用', value: true },
|
|
169
|
+
{ label: '已停用', value: false },
|
|
170
|
+
]}
|
|
171
|
+
onChange={(value) => {
|
|
172
|
+
setPage(1);
|
|
173
|
+
setActive(value);
|
|
174
|
+
}}
|
|
175
|
+
/>
|
|
176
|
+
</Space>
|
|
148
177
|
<Space>
|
|
149
178
|
<Button icon={<ReloadOutlined />} onClick={load} />
|
|
150
179
|
<Button
|
|
@@ -155,33 +184,7 @@ export default function PersonDirectoryPage() {
|
|
|
155
184
|
添加人员
|
|
156
185
|
</Button>
|
|
157
186
|
</Space>
|
|
158
|
-
|
|
159
|
-
/>
|
|
160
|
-
<Card {...SEARCH_CARD_PROPS}>
|
|
161
|
-
<Space wrap>
|
|
162
|
-
<Input.Search
|
|
163
|
-
allowClear
|
|
164
|
-
placeholder="搜索姓名或账号"
|
|
165
|
-
style={{ width: 260 }}
|
|
166
|
-
onSearch={(value) => {
|
|
167
|
-
setPage(1);
|
|
168
|
-
setQuery(value);
|
|
169
|
-
}}
|
|
170
|
-
/>
|
|
171
|
-
<Select
|
|
172
|
-
allowClear
|
|
173
|
-
placeholder="全部状态"
|
|
174
|
-
style={{ width: 140 }}
|
|
175
|
-
options={[
|
|
176
|
-
{ label: '已启用', value: true },
|
|
177
|
-
{ label: '已停用', value: false },
|
|
178
|
-
]}
|
|
179
|
-
onChange={(value) => {
|
|
180
|
-
setPage(1);
|
|
181
|
-
setActive(value);
|
|
182
|
-
}}
|
|
183
|
-
/>
|
|
184
|
-
</Space>
|
|
187
|
+
</div>
|
|
185
188
|
</Card>
|
|
186
189
|
<Card className="card-table">
|
|
187
190
|
<Table
|
|
@@ -209,6 +212,6 @@ export default function PersonDirectoryPage() {
|
|
|
209
212
|
}}
|
|
210
213
|
/>
|
|
211
214
|
)}
|
|
212
|
-
|
|
215
|
+
</>
|
|
213
216
|
);
|
|
214
217
|
}
|
|
@@ -28,6 +28,7 @@ const PAGE_SIZE = 20;
|
|
|
28
28
|
const STATUS_COLOR: Record<string, string> = {
|
|
29
29
|
PENDING: 'gold',
|
|
30
30
|
RUNNING: 'blue',
|
|
31
|
+
WAITING_RETRY: 'orange',
|
|
31
32
|
COMPLETED: 'green',
|
|
32
33
|
FAILED: 'red',
|
|
33
34
|
CANCELLED: 'default',
|
|
@@ -222,7 +223,7 @@ export default function BusinessEventDetailPage() {
|
|
|
222
223
|
<Typography.Text code>{event.registrationCode}</Typography.Text>
|
|
223
224
|
) : null
|
|
224
225
|
}
|
|
225
|
-
onBack={() => navigate('/admin/workflow/
|
|
226
|
+
onBack={() => navigate('/admin/workflow/settings?tab=events')}
|
|
226
227
|
backLabel={t('common.back')}
|
|
227
228
|
actions={
|
|
228
229
|
<Select
|
|
@@ -236,6 +237,10 @@ export default function BusinessEventDetailPage() {
|
|
|
236
237
|
options={[
|
|
237
238
|
{ value: 'PENDING', label: t('instances.statuses.pending') },
|
|
238
239
|
{ value: 'RUNNING', label: t('instances.statuses.running') },
|
|
240
|
+
{
|
|
241
|
+
value: 'WAITING_RETRY',
|
|
242
|
+
label: t('instances.statuses.waiting_retry'),
|
|
243
|
+
},
|
|
239
244
|
{
|
|
240
245
|
value: 'COMPLETED',
|
|
241
246
|
label: t('instances.statuses.completed'),
|
|
@@ -13,8 +13,7 @@ import {
|
|
|
13
13
|
message,
|
|
14
14
|
} from 'antd';
|
|
15
15
|
import type { TableColumnsType } from 'antd';
|
|
16
|
-
import {
|
|
17
|
-
import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
|
|
16
|
+
import { SEARCH_CARD_PROPS } from 'constants/layout';
|
|
18
17
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
19
18
|
import { useTranslation } from 'react-i18next';
|
|
20
19
|
import { useNavigate } from 'react-router-dom';
|
|
@@ -183,11 +182,29 @@ export default function BusinessEventCatalogPage() {
|
|
|
183
182
|
];
|
|
184
183
|
|
|
185
184
|
return (
|
|
186
|
-
<div className="workflow-page-stack"
|
|
187
|
-
<
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
185
|
+
<div className="workflow-page-stack">
|
|
186
|
+
<Card {...SEARCH_CARD_PROPS}>
|
|
187
|
+
<div
|
|
188
|
+
style={{
|
|
189
|
+
display: 'flex',
|
|
190
|
+
justifyContent: 'space-between',
|
|
191
|
+
alignItems: 'center',
|
|
192
|
+
flexWrap: 'wrap',
|
|
193
|
+
gap: 8,
|
|
194
|
+
}}
|
|
195
|
+
>
|
|
196
|
+
<div className="workflow-event-catalog__filters">
|
|
197
|
+
<Input.Search
|
|
198
|
+
allowClear
|
|
199
|
+
value={query}
|
|
200
|
+
placeholder={t('eventCatalog.searchPlaceholder')}
|
|
201
|
+
onChange={(event) => setQuery(event.target.value)}
|
|
202
|
+
className="workflow-event-catalog__search"
|
|
203
|
+
/>
|
|
204
|
+
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
|
205
|
+
{t('eventCatalog.resultCount', { count: filteredEvents.length })}
|
|
206
|
+
</Typography.Text>
|
|
207
|
+
</div>
|
|
191
208
|
<Space>
|
|
192
209
|
<Button icon={<ReloadOutlined />} onClick={load} loading={loading}>
|
|
193
210
|
{t('eventCatalog.refresh')}
|
|
@@ -200,21 +217,6 @@ export default function BusinessEventCatalogPage() {
|
|
|
200
217
|
{t('eventCatalog.registration.register')}
|
|
201
218
|
</Button>
|
|
202
219
|
</Space>
|
|
203
|
-
}
|
|
204
|
-
/>
|
|
205
|
-
|
|
206
|
-
<Card {...SEARCH_CARD_PROPS}>
|
|
207
|
-
<div className="workflow-event-catalog__filters">
|
|
208
|
-
<Input.Search
|
|
209
|
-
allowClear
|
|
210
|
-
value={query}
|
|
211
|
-
placeholder={t('eventCatalog.searchPlaceholder')}
|
|
212
|
-
onChange={(event) => setQuery(event.target.value)}
|
|
213
|
-
className="workflow-event-catalog__search"
|
|
214
|
-
/>
|
|
215
|
-
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
|
216
|
-
{t('eventCatalog.resultCount', { count: filteredEvents.length })}
|
|
217
|
-
</Typography.Text>
|
|
218
220
|
</div>
|
|
219
221
|
</Card>
|
|
220
222
|
|
|
@@ -76,7 +76,6 @@ interface EnhancedFlowRendererProps {
|
|
|
76
76
|
onDslChange?: (dsl: WorkflowDSL) => void;
|
|
77
77
|
// New props for execution status
|
|
78
78
|
nodeExecutions?: NodeExecution[];
|
|
79
|
-
reusedNodeIds?: string[];
|
|
80
79
|
showExecutionStatus?: boolean;
|
|
81
80
|
}
|
|
82
81
|
|
|
@@ -103,7 +102,6 @@ function EnhancedFlowCanvas({
|
|
|
103
102
|
onNodeClick,
|
|
104
103
|
onDslChange,
|
|
105
104
|
nodeExecutions,
|
|
106
|
-
reusedNodeIds,
|
|
107
105
|
showExecutionStatus,
|
|
108
106
|
}: EnhancedFlowRendererProps) {
|
|
109
107
|
const { t } = useTranslation('workflow');
|
|
@@ -134,11 +132,6 @@ function EnhancedFlowCanvas({
|
|
|
134
132
|
});
|
|
135
133
|
return map;
|
|
136
134
|
}, [nodeExecutions]);
|
|
137
|
-
const reusedNodeSet = useMemo(
|
|
138
|
-
() => new Set(reusedNodeIds ?? []),
|
|
139
|
-
[reusedNodeIds],
|
|
140
|
-
);
|
|
141
|
-
|
|
142
135
|
const { nodes, edges } = useMemo(() => {
|
|
143
136
|
if (!dsl) return { nodes: [] as Node[], edges: [] as Edge[] };
|
|
144
137
|
|
|
@@ -178,9 +171,6 @@ function EnhancedFlowCanvas({
|
|
|
178
171
|
execution.finishedAt,
|
|
179
172
|
);
|
|
180
173
|
nodeData.error = execution.error;
|
|
181
|
-
} else if (reusedNodeSet.has(n.id)) {
|
|
182
|
-
nodeData.executionStatus = 'COMPLETED';
|
|
183
|
-
nodeData.executionStatusLabel = t('instanceDetail.reusedResult');
|
|
184
174
|
} else {
|
|
185
175
|
nodeData.executionStatus = 'NOT_EXECUTED';
|
|
186
176
|
}
|
|
@@ -234,7 +224,6 @@ function EnhancedFlowCanvas({
|
|
|
234
224
|
selectedNodeId,
|
|
235
225
|
selectedEdgeId,
|
|
236
226
|
executionMap,
|
|
237
|
-
reusedNodeSet,
|
|
238
227
|
showExecutionStatus,
|
|
239
228
|
readonly,
|
|
240
229
|
deleteEdges,
|
|
@@ -198,6 +198,30 @@ export function StatusCards({ overview, activeFilter, onFilter }: Props) {
|
|
|
198
198
|
</div>
|
|
199
199
|
</Card>
|
|
200
200
|
</Col>
|
|
201
|
+
|
|
202
|
+
{/* Waiting for retry — clickable */}
|
|
203
|
+
<Col flex="1">
|
|
204
|
+
<Card
|
|
205
|
+
size="small"
|
|
206
|
+
hoverable
|
|
207
|
+
onClick={() => handleClick('WAITING_RETRY')}
|
|
208
|
+
style={cardStyle('WAITING_RETRY')}
|
|
209
|
+
>
|
|
210
|
+
<Text type="secondary" style={{ fontSize: 14 }}>
|
|
211
|
+
{t('status.waitingRetry')}
|
|
212
|
+
</Text>
|
|
213
|
+
<div
|
|
214
|
+
style={{
|
|
215
|
+
fontSize: 24,
|
|
216
|
+
fontWeight: 600,
|
|
217
|
+
lineHeight: 1.3,
|
|
218
|
+
color: '#fa8c16',
|
|
219
|
+
}}
|
|
220
|
+
>
|
|
221
|
+
{overview.waitingRetry ?? 0}
|
|
222
|
+
</div>
|
|
223
|
+
</Card>
|
|
224
|
+
</Col>
|
|
201
225
|
</Row>
|
|
202
226
|
);
|
|
203
227
|
}
|
|
@@ -19,8 +19,7 @@ import {
|
|
|
19
19
|
PlusOutlined,
|
|
20
20
|
ReloadOutlined,
|
|
21
21
|
} from '@ant-design/icons';
|
|
22
|
-
import {
|
|
23
|
-
import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
|
|
22
|
+
import { SEARCH_CARD_PROPS } from 'constants/layout';
|
|
24
23
|
import { ConnectionModal } from './ConnectionModal';
|
|
25
24
|
import type { IntegrationConnection } from './connection.types';
|
|
26
25
|
import { deleteConnection, fetchConnections } from './connectionsApi';
|
|
@@ -186,11 +185,24 @@ export default function ConnectionsPage() {
|
|
|
186
185
|
];
|
|
187
186
|
|
|
188
187
|
return (
|
|
189
|
-
<div className="workflow-page-stack"
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
188
|
+
<div className="workflow-page-stack">
|
|
189
|
+
{/* Search Card */}
|
|
190
|
+
<Card {...SEARCH_CARD_PROPS}>
|
|
191
|
+
<div
|
|
192
|
+
style={{
|
|
193
|
+
display: 'flex',
|
|
194
|
+
justifyContent: 'space-between',
|
|
195
|
+
alignItems: 'center',
|
|
196
|
+
flexWrap: 'wrap',
|
|
197
|
+
gap: 8,
|
|
198
|
+
}}
|
|
199
|
+
>
|
|
200
|
+
<Input.Search
|
|
201
|
+
allowClear
|
|
202
|
+
placeholder={t('connection.search')}
|
|
203
|
+
onSearch={setQuery}
|
|
204
|
+
style={{ width: 300 }}
|
|
205
|
+
/>
|
|
194
206
|
<Space>
|
|
195
207
|
<Button icon={<ReloadOutlined />} onClick={load}>
|
|
196
208
|
{t('connection.refresh')}
|
|
@@ -203,17 +215,7 @@ export default function ConnectionsPage() {
|
|
|
203
215
|
{t('connection.new')}
|
|
204
216
|
</Button>
|
|
205
217
|
</Space>
|
|
206
|
-
|
|
207
|
-
/>
|
|
208
|
-
|
|
209
|
-
{/* Search Card */}
|
|
210
|
-
<Card {...SEARCH_CARD_PROPS}>
|
|
211
|
-
<Input.Search
|
|
212
|
-
allowClear
|
|
213
|
-
placeholder={t('connection.search')}
|
|
214
|
-
onSearch={setQuery}
|
|
215
|
-
style={{ width: 300 }}
|
|
216
|
-
/>
|
|
218
|
+
</div>
|
|
217
219
|
</Card>
|
|
218
220
|
|
|
219
221
|
{/* Content Card */}
|
package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx
CHANGED
|
@@ -288,6 +288,7 @@ export default function WorkflowListPage() {
|
|
|
288
288
|
const runs = record.runs || {
|
|
289
289
|
pending: 0,
|
|
290
290
|
running: 0,
|
|
291
|
+
waiting_retry: 0,
|
|
291
292
|
completed: 0,
|
|
292
293
|
failed: 0,
|
|
293
294
|
cancelled: 0,
|
|
@@ -316,6 +317,12 @@ export default function WorkflowListPage() {
|
|
|
316
317
|
label={t('list.running')}
|
|
317
318
|
onClick={() => go('RUNNING')}
|
|
318
319
|
/>
|
|
320
|
+
<RunDot
|
|
321
|
+
count={runs.waiting_retry ?? 0}
|
|
322
|
+
color="#fa8c16"
|
|
323
|
+
label={t('list.waitingRetry')}
|
|
324
|
+
onClick={() => go('WAITING_RETRY')}
|
|
325
|
+
/>
|
|
319
326
|
<RunDot
|
|
320
327
|
count={runs.failed}
|
|
321
328
|
color="#ff4d4f"
|