@nocobase/plugin-workflow 2.0.0-alpha.3 → 2.0.0-alpha.30
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/.env.example +6 -0
- package/dist/client/248e211bb2d99aee.js +10 -0
- package/dist/client/RemoveNodeContext.d.ts +11 -0
- package/dist/client/e7c028a099537ab1.js +10 -0
- package/dist/client/flows/triggerWorkflows.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/nodes/condition.d.ts +0 -3
- package/dist/client/schemas/executions.d.ts +1 -1
- package/dist/common/collections/executions.d.ts +1 -1
- package/dist/common/collections/executions.js +13 -1
- package/dist/externalVersion.js +11 -11
- package/dist/locale/zh-CN.json +14 -3
- package/dist/node_modules/cron-parser/package.json +1 -1
- package/dist/node_modules/lru-cache/package.json +1 -1
- package/dist/node_modules/nodejs-snowflake/package.json +1 -1
- package/dist/server/Dispatcher.d.ts +2 -2
- package/dist/server/Dispatcher.js +16 -12
- package/dist/server/Plugin.js +11 -4
- package/dist/server/actions/nodes.js +87 -23
- package/package.json +2 -2
- package/dist/client/4985975bcaea35eb.js +0 -10
- package/dist/client/91bf4b18d5aad6a7.js +0 -10
|
@@ -115,9 +115,9 @@ var executions_default = {
|
|
|
115
115
|
name: "output"
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
|
-
interface: "createdAt",
|
|
119
118
|
type: "datetime",
|
|
120
119
|
name: "createdAt",
|
|
120
|
+
interface: "createdAt",
|
|
121
121
|
uiSchema: {
|
|
122
122
|
type: "datetime",
|
|
123
123
|
title: `{{t("Triggered at", { ns: "${import_constants.NAMESPACE}" })}}`,
|
|
@@ -125,6 +125,18 @@ var executions_default = {
|
|
|
125
125
|
"x-component-props": {},
|
|
126
126
|
"x-read-pretty": true
|
|
127
127
|
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: "boolean",
|
|
131
|
+
name: "manually",
|
|
132
|
+
interface: "checkbox",
|
|
133
|
+
uiSchema: {
|
|
134
|
+
type: "boolean",
|
|
135
|
+
title: `{{t("Triggered manually", { ns: "${import_constants.NAMESPACE}" })}}`,
|
|
136
|
+
"x-component": "Checkbox",
|
|
137
|
+
"x-component-props": {},
|
|
138
|
+
"x-read-pretty": true
|
|
139
|
+
}
|
|
128
140
|
}
|
|
129
141
|
],
|
|
130
142
|
indexes: [{ fields: ["dispatched", "id"] }]
|
package/dist/externalVersion.js
CHANGED
|
@@ -11,8 +11,8 @@ module.exports = {
|
|
|
11
11
|
"react": "18.2.0",
|
|
12
12
|
"@formily/core": "2.3.7",
|
|
13
13
|
"@formily/react": "2.3.7",
|
|
14
|
-
"@nocobase/client": "2.0.0-alpha.
|
|
15
|
-
"@nocobase/utils": "2.0.0-alpha.
|
|
14
|
+
"@nocobase/client": "2.0.0-alpha.30",
|
|
15
|
+
"@nocobase/utils": "2.0.0-alpha.30",
|
|
16
16
|
"antd": "5.24.2",
|
|
17
17
|
"@ant-design/icons": "5.6.1",
|
|
18
18
|
"react-router-dom": "6.30.1",
|
|
@@ -20,17 +20,17 @@ module.exports = {
|
|
|
20
20
|
"lodash": "4.17.21",
|
|
21
21
|
"@dnd-kit/core": "6.1.0",
|
|
22
22
|
"@formily/shared": "2.3.7",
|
|
23
|
-
"@nocobase/plugin-mobile": "2.0.0-alpha.
|
|
23
|
+
"@nocobase/plugin-mobile": "2.0.0-alpha.30",
|
|
24
24
|
"sequelize": "6.35.2",
|
|
25
|
-
"@nocobase/database": "2.0.0-alpha.
|
|
26
|
-
"@nocobase/server": "2.0.0-alpha.
|
|
27
|
-
"@nocobase/data-source-manager": "2.0.0-alpha.
|
|
28
|
-
"@nocobase/logger": "2.0.0-alpha.
|
|
29
|
-
"@nocobase/evaluators": "2.0.0-alpha.
|
|
25
|
+
"@nocobase/database": "2.0.0-alpha.30",
|
|
26
|
+
"@nocobase/server": "2.0.0-alpha.30",
|
|
27
|
+
"@nocobase/data-source-manager": "2.0.0-alpha.30",
|
|
28
|
+
"@nocobase/logger": "2.0.0-alpha.30",
|
|
29
|
+
"@nocobase/evaluators": "2.0.0-alpha.30",
|
|
30
30
|
"@formily/antd-v5": "1.2.3",
|
|
31
31
|
"@formily/reactive": "2.3.7",
|
|
32
|
-
"@nocobase/actions": "2.0.0-alpha.
|
|
32
|
+
"@nocobase/actions": "2.0.0-alpha.30",
|
|
33
33
|
"dayjs": "1.11.13",
|
|
34
|
-
"@nocobase/plugin-workflow-test": "2.0.0-alpha.
|
|
35
|
-
"@nocobase/test": "2.0.0-alpha.
|
|
34
|
+
"@nocobase/plugin-workflow-test": "2.0.0-alpha.30",
|
|
35
|
+
"@nocobase/test": "2.0.0-alpha.30"
|
|
36
36
|
};
|
package/dist/locale/zh-CN.json
CHANGED
|
@@ -179,16 +179,19 @@
|
|
|
179
179
|
"Calculation result": "计算结果",
|
|
180
180
|
"True": "真",
|
|
181
181
|
"False": "假",
|
|
182
|
-
"
|
|
182
|
+
"Concat": "连接",
|
|
183
183
|
"Condition": "条件判断",
|
|
184
184
|
"Based on boolean result of the calculation to determine whether to \"continue\" or \"exit\" the process, or continue on different branches of \"yes\" and \"no\".":
|
|
185
185
|
"基于计算结果的真假来决定“继续”或“退出”流程,或者在“是”与“否”的分支上分别继续。",
|
|
186
186
|
"Mode": "模式",
|
|
187
|
+
"Yes": "是",
|
|
188
|
+
"No": "否",
|
|
187
189
|
"Continue when \"Yes\"": "“是”则继续",
|
|
188
190
|
"Branch into \"Yes\" and \"No\"": "“是”和“否”分别继续",
|
|
189
191
|
"Condition expression": "条件表达式",
|
|
190
|
-
"Inside of \"
|
|
191
|
-
"
|
|
192
|
+
"Inside of \"{{branchName}}\" branch": "“{{branchName}}”分支内",
|
|
193
|
+
"\"{{branchName}}\" branch": "“{{branchName}}”分支",
|
|
194
|
+
"Branch {{index}}": "分支 {{index}}",
|
|
192
195
|
"Create record": "新增数据",
|
|
193
196
|
"Add new record to a collection. You can use variables from upstream nodes to assign values to fields.":
|
|
194
197
|
"向一个数据表中添加新的数据。可以使用上游节点里的变量为字段赋值。",
|
|
@@ -235,7 +238,10 @@
|
|
|
235
238
|
"Succeeded": "成功",
|
|
236
239
|
"Test run": "测试执行",
|
|
237
240
|
"Test run will do the actual data manipulating or API calling, please use with caution.": "测试执行会进行实际的数据操作或 API 调用,请谨慎使用。",
|
|
241
|
+
"Replace variables": "替换变量",
|
|
238
242
|
"No variable": "无变量",
|
|
243
|
+
"Result": "结果",
|
|
244
|
+
"Log": "日志",
|
|
239
245
|
|
|
240
246
|
"Add node": "添加节点",
|
|
241
247
|
"Move all downstream nodes to": "将所有下游节点移至",
|
|
@@ -246,6 +252,11 @@
|
|
|
246
252
|
"New version enabled": "已启用新版本",
|
|
247
253
|
"Workflow is not exists": "工作流不存在",
|
|
248
254
|
|
|
255
|
+
"Delete node": "删除节点",
|
|
256
|
+
"Branch to keep": "保留分支",
|
|
257
|
+
"Delete all": "删除全部",
|
|
258
|
+
"Keep": "保留",
|
|
259
|
+
|
|
249
260
|
"Select users": "选择用户",
|
|
250
261
|
"Query users": "查询用户",
|
|
251
262
|
"Add": "添加",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"cron-parser","version":"4.4.0","description":"Node.js library for parsing crontab instructions","main":"lib/parser.js","types":"index.d.ts","typesVersions":{"<4.1":{"*":["types/ts3/*"]}},"directories":{"test":"test"},"scripts":{"test:tsd":"tsd","test:unit":"TZ=UTC tap ./test/*.js","test:cover":"TZ=UTC tap --coverage-report=html ./test/*.js","lint":"eslint .","lint:fix":"eslint --fix .","test":"npm run lint && npm run test:unit && npm run test:tsd"},"repository":{"type":"git","url":"https://github.com/harrisiirak/cron-parser.git"},"keywords":["cron","crontab","parser"],"author":"Harri Siirak","contributors":["Nicholas Clawson","Daniel Prentis <daniel@salsitasoft.com>","Renault John Lecoultre","Richard Astbury <richard.astbury@gmail.com>","Meaglin Wasabi <Meaglin.wasabi@gmail.com>","Mike Kusold <hello@mikekusold.com>","Alex Kit <alex.kit@atmajs.com>","Santiago Gimeno <santiago.gimeno@gmail.com>","Daniel <darc.tec@gmail.com>","Christian Steininger <christian.steininger.cs@gmail.com>","Mykola Piskovyi <m.piskovyi@gmail.com>","Brian Vaughn <brian.david.vaughn@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Yasuhiroki <yasuhiroki.duck@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Brendan Warkentin <faazshift@gmail.com>","Charlie Fish <fishcharlie.code@gmail.com>","Ian Graves <ian+diskimage@iangrav.es>","Andy Thompson <me@andytson.com>","Regev Brody <regevbr@gmail.com>"],"license":"MIT","dependencies":{"luxon":"^1.28.0"},"devDependencies":{"eslint":"^8.2.0","sinon":"^10.0.0","tap":"^16.0.1","tsd":"^0.19.0"},"engines":{"node":">=0.8"},"browser":{"fs":false},"tap":{"check-coverage":false},"tsd":{"directory":"test","compilerOptions":{"lib":["es2017","dom"]}},"_lastModified":"2025-
|
|
1
|
+
{"name":"cron-parser","version":"4.4.0","description":"Node.js library for parsing crontab instructions","main":"lib/parser.js","types":"index.d.ts","typesVersions":{"<4.1":{"*":["types/ts3/*"]}},"directories":{"test":"test"},"scripts":{"test:tsd":"tsd","test:unit":"TZ=UTC tap ./test/*.js","test:cover":"TZ=UTC tap --coverage-report=html ./test/*.js","lint":"eslint .","lint:fix":"eslint --fix .","test":"npm run lint && npm run test:unit && npm run test:tsd"},"repository":{"type":"git","url":"https://github.com/harrisiirak/cron-parser.git"},"keywords":["cron","crontab","parser"],"author":"Harri Siirak","contributors":["Nicholas Clawson","Daniel Prentis <daniel@salsitasoft.com>","Renault John Lecoultre","Richard Astbury <richard.astbury@gmail.com>","Meaglin Wasabi <Meaglin.wasabi@gmail.com>","Mike Kusold <hello@mikekusold.com>","Alex Kit <alex.kit@atmajs.com>","Santiago Gimeno <santiago.gimeno@gmail.com>","Daniel <darc.tec@gmail.com>","Christian Steininger <christian.steininger.cs@gmail.com>","Mykola Piskovyi <m.piskovyi@gmail.com>","Brian Vaughn <brian.david.vaughn@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Yasuhiroki <yasuhiroki.duck@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Brendan Warkentin <faazshift@gmail.com>","Charlie Fish <fishcharlie.code@gmail.com>","Ian Graves <ian+diskimage@iangrav.es>","Andy Thompson <me@andytson.com>","Regev Brody <regevbr@gmail.com>"],"license":"MIT","dependencies":{"luxon":"^1.28.0"},"devDependencies":{"eslint":"^8.2.0","sinon":"^10.0.0","tap":"^16.0.1","tsd":"^0.19.0"},"engines":{"node":">=0.8"},"browser":{"fs":false},"tap":{"check-coverage":false},"tsd":{"directory":"test","compilerOptions":{"lib":["es2017","dom"]}},"_lastModified":"2025-11-02T10:58:43.001Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"lru-cache","description":"A cache object that deletes the least-recently-used items.","version":"8.0.5","author":"Isaac Z. Schlueter <i@izs.me>","keywords":["mru","lru","cache"],"sideEffects":false,"scripts":{"build":"npm run prepare","preprepare":"rm -rf dist","prepare":"tsc -p tsconfig.json && tsc -p tsconfig-esm.json","postprepare":"bash fixup.sh","pretest":"npm run prepare","presnap":"npm run prepare","test":"c8 tap","snap":"c8 tap","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","format":"prettier --write .","typedoc":"typedoc --tsconfig tsconfig-esm.json ./src/*.ts","benchmark-results-typedoc":"bash scripts/benchmark-results-typedoc.sh","prebenchmark":"npm run prepare","benchmark":"make -C benchmark","preprofile":"npm run prepare","profile":"make -C benchmark profile"},"main":"./dist/cjs/index-cjs.js","module":"./dist/mjs/index.js","types":"./dist/mjs/index.d.ts","exports":{"./min":{"import":{"types":"./dist/mjs/index.d.ts","default":"./dist/mjs/index.min.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.min.js"}},".":{"import":{"types":"./dist/mjs/index.d.ts","default":"./dist/mjs/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index-cjs.js"}}},"repository":"git://github.com/isaacs/node-lru-cache.git","devDependencies":{"@size-limit/preset-small-lib":"^7.0.8","@types/node":"^17.0.31","@types/tap":"^15.0.6","benchmark":"^2.1.4","c8":"^7.11.2","clock-mock":"^1.0.6","esbuild":"^0.17.11","eslint-config-prettier":"^8.5.0","marked":"^4.2.12","mkdirp":"^2.1.5","prettier":"^2.6.2","size-limit":"^7.0.8","tap":"^16.3.4","ts-node":"^10.7.0","tslib":"^2.4.0","typedoc":"^0.23.24","typescript":"^4.6.4"},"license":"ISC","files":["dist"],"engines":{"node":">=16.14"},"prettier":{"semi":false,"printWidth":70,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"tap":{"coverage":false,"node-arg":["--expose-gc","--no-warnings","--loader","ts-node/esm"],"ts":false},"size-limit":[{"path":"./dist/mjs/index.js"}],"_lastModified":"2025-
|
|
1
|
+
{"name":"lru-cache","description":"A cache object that deletes the least-recently-used items.","version":"8.0.5","author":"Isaac Z. Schlueter <i@izs.me>","keywords":["mru","lru","cache"],"sideEffects":false,"scripts":{"build":"npm run prepare","preprepare":"rm -rf dist","prepare":"tsc -p tsconfig.json && tsc -p tsconfig-esm.json","postprepare":"bash fixup.sh","pretest":"npm run prepare","presnap":"npm run prepare","test":"c8 tap","snap":"c8 tap","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","format":"prettier --write .","typedoc":"typedoc --tsconfig tsconfig-esm.json ./src/*.ts","benchmark-results-typedoc":"bash scripts/benchmark-results-typedoc.sh","prebenchmark":"npm run prepare","benchmark":"make -C benchmark","preprofile":"npm run prepare","profile":"make -C benchmark profile"},"main":"./dist/cjs/index-cjs.js","module":"./dist/mjs/index.js","types":"./dist/mjs/index.d.ts","exports":{"./min":{"import":{"types":"./dist/mjs/index.d.ts","default":"./dist/mjs/index.min.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.min.js"}},".":{"import":{"types":"./dist/mjs/index.d.ts","default":"./dist/mjs/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index-cjs.js"}}},"repository":"git://github.com/isaacs/node-lru-cache.git","devDependencies":{"@size-limit/preset-small-lib":"^7.0.8","@types/node":"^17.0.31","@types/tap":"^15.0.6","benchmark":"^2.1.4","c8":"^7.11.2","clock-mock":"^1.0.6","esbuild":"^0.17.11","eslint-config-prettier":"^8.5.0","marked":"^4.2.12","mkdirp":"^2.1.5","prettier":"^2.6.2","size-limit":"^7.0.8","tap":"^16.3.4","ts-node":"^10.7.0","tslib":"^2.4.0","typedoc":"^0.23.24","typescript":"^4.6.4"},"license":"ISC","files":["dist"],"engines":{"node":">=16.14"},"prettier":{"semi":false,"printWidth":70,"tabWidth":2,"useTabs":false,"singleQuote":true,"jsxSingleQuote":false,"bracketSameLine":true,"arrowParens":"avoid","endOfLine":"lf"},"tap":{"coverage":false,"node-arg":["--expose-gc","--no-warnings","--loader","ts-node/esm"],"ts":false},"size-limit":[{"path":"./dist/mjs/index.js"}],"_lastModified":"2025-11-02T10:58:42.632Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"nodejs-snowflake","collaborators":["Utkarsh Srivastava <utkarsh@sagacious.dev>"],"description":"Generate time sortable 64 bits unique ids for distributed systems (inspired from twitter snowflake)","version":"2.0.1","license":"Apache 2.0","repository":{"type":"git","url":"https://github.com/utkarsh-pro/nodejs-snowflake.git"},"files":["nodejs_snowflake_bg.wasm","nodejs_snowflake.js","nodejs_snowflake.d.ts"],"main":"nodejs_snowflake.js","types":"nodejs_snowflake.d.ts","_lastModified":"2025-
|
|
1
|
+
{"name":"nodejs-snowflake","collaborators":["Utkarsh Srivastava <utkarsh@sagacious.dev>"],"description":"Generate time sortable 64 bits unique ids for distributed systems (inspired from twitter snowflake)","version":"2.0.1","license":"Apache 2.0","repository":{"type":"git","url":"https://github.com/utkarsh-pro/nodejs-snowflake.git"},"files":["nodejs_snowflake_bg.wasm","nodejs_snowflake.js","nodejs_snowflake.d.ts"],"main":"nodejs_snowflake.js","types":"nodejs_snowflake.d.ts","_lastModified":"2025-11-02T10:58:42.412Z"}
|
|
@@ -14,7 +14,7 @@ import type PluginWorkflowServer from './Plugin';
|
|
|
14
14
|
type Pending = {
|
|
15
15
|
execution: ExecutionModel;
|
|
16
16
|
job?: JobModel;
|
|
17
|
-
|
|
17
|
+
loaded?: boolean;
|
|
18
18
|
};
|
|
19
19
|
export type EventOptions = {
|
|
20
20
|
eventKey?: string;
|
|
@@ -38,7 +38,7 @@ export default class Dispatcher {
|
|
|
38
38
|
constructor(plugin: PluginWorkflowServer);
|
|
39
39
|
readonly onQueueExecution: QueueEventOptions['process'];
|
|
40
40
|
setReady(ready: boolean): void;
|
|
41
|
-
|
|
41
|
+
private serving;
|
|
42
42
|
getEventsCount(): number;
|
|
43
43
|
trigger(workflow: WorkflowModel, context: object, options?: EventOptions): void | Promise<Processor | null>;
|
|
44
44
|
resume(job: any): Promise<void>;
|
|
@@ -62,8 +62,8 @@ class Dispatcher {
|
|
|
62
62
|
setReady(ready) {
|
|
63
63
|
this.ready = ready;
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
return this.
|
|
65
|
+
serving() {
|
|
66
|
+
return this.plugin.app.serving(WORKER_JOB_WORKFLOW_PROCESS);
|
|
67
67
|
}
|
|
68
68
|
getEventsCount() {
|
|
69
69
|
return this.eventsCount;
|
|
@@ -112,14 +112,14 @@ class Dispatcher {
|
|
|
112
112
|
execution = await job.getExecution();
|
|
113
113
|
}
|
|
114
114
|
this.plugin.getLogger(execution.workflowId).info(`execution (${execution.id}) resuming from job (${job.id}) added to pending list`);
|
|
115
|
-
this.run({ execution, job,
|
|
115
|
+
this.run({ execution, job, loaded: true });
|
|
116
116
|
}
|
|
117
117
|
async start(execution) {
|
|
118
118
|
if (execution.status) {
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
121
|
this.plugin.getLogger(execution.workflowId).info(`starting deferred execution (${execution.id})`);
|
|
122
|
-
this.run({ execution,
|
|
122
|
+
this.run({ execution, loaded: true });
|
|
123
123
|
}
|
|
124
124
|
async beforeStop() {
|
|
125
125
|
this.ready = false;
|
|
@@ -135,10 +135,6 @@ class Dispatcher {
|
|
|
135
135
|
this.plugin.getLogger("dispatcher").warn(`app is not ready, new dispatching will be ignored`);
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
|
-
if (!this.plugin.app.serving(WORKER_JOB_WORKFLOW_PROCESS)) {
|
|
139
|
-
this.plugin.getLogger("dispatcher").warn(`${WORKER_JOB_WORKFLOW_PROCESS} is not serving, new dispatching will be ignored`);
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
138
|
if (this.executing) {
|
|
143
139
|
this.plugin.getLogger("dispatcher").warn(`workflow executing is not finished, new dispatching will be ignored`);
|
|
144
140
|
return;
|
|
@@ -151,12 +147,16 @@ class Dispatcher {
|
|
|
151
147
|
let execution = null;
|
|
152
148
|
if (this.pending.length) {
|
|
153
149
|
const pending = this.pending.shift();
|
|
154
|
-
execution = pending.
|
|
150
|
+
execution = pending.loaded ? pending.execution : await this.acquirePendingExecution(pending.execution);
|
|
155
151
|
if (execution) {
|
|
156
152
|
next = [execution, pending.job];
|
|
157
153
|
this.plugin.getLogger(next[0].workflowId).info(`pending execution (${next[0].id}) ready to process`);
|
|
158
154
|
}
|
|
159
155
|
} else {
|
|
156
|
+
if (!this.serving()) {
|
|
157
|
+
this.plugin.getLogger("dispatcher").warn(`${WORKER_JOB_WORKFLOW_PROCESS} is not serving on this instance, new dispatching will be ignored`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
160
|
execution = await this.acquireQueueingExecution();
|
|
161
161
|
if (execution) {
|
|
162
162
|
next = [execution];
|
|
@@ -237,7 +237,9 @@ class Dispatcher {
|
|
|
237
237
|
key: workflow.key,
|
|
238
238
|
eventKey: options.eventKey ?? (0, import_crypto.randomUUID)(),
|
|
239
239
|
stack: options.stack,
|
|
240
|
-
dispatched: deferred ?? false
|
|
240
|
+
dispatched: deferred ?? false,
|
|
241
|
+
status: deferred ? import_constants.EXECUTION_STATUS.STARTED : import_constants.EXECUTION_STATUS.QUEUEING,
|
|
242
|
+
manually: options.manually
|
|
241
243
|
},
|
|
242
244
|
{ transaction }
|
|
243
245
|
);
|
|
@@ -283,11 +285,13 @@ class Dispatcher {
|
|
|
283
285
|
try {
|
|
284
286
|
const execution = await this.createExecution(...event);
|
|
285
287
|
if (!(execution == null ? void 0 : execution.dispatched)) {
|
|
286
|
-
if (!this.executing && !this.pending.length) {
|
|
288
|
+
if (this.serving() && !this.executing && !this.pending.length) {
|
|
287
289
|
logger.info(`local pending list is empty, adding execution (${execution.id}) to pending list`);
|
|
288
290
|
this.pending.push({ execution });
|
|
289
291
|
} else {
|
|
290
|
-
logger.info(
|
|
292
|
+
logger.info(
|
|
293
|
+
`instance is not serving as worker or local pending list is not empty, sending execution (${execution.id}) to queue`
|
|
294
|
+
);
|
|
291
295
|
if (this.ready) {
|
|
292
296
|
this.plugin.app.backgroundJobManager.publish(`${this.plugin.name}.pendingExecution`, {
|
|
293
297
|
executionId: execution.id
|
package/dist/server/Plugin.js
CHANGED
|
@@ -138,7 +138,6 @@ class PluginWorkflowServer extends import_server.Plugin {
|
|
|
138
138
|
// * add all hooks for enabled workflows
|
|
139
139
|
// * add hooks for create/update[enabled]/delete workflow to add/remove specific hooks
|
|
140
140
|
onAfterStart = async () => {
|
|
141
|
-
this.dispatcher.setReady(true);
|
|
142
141
|
const collection = this.db.getCollection("workflows");
|
|
143
142
|
const workflows = await collection.repository.find({
|
|
144
143
|
appends: ["versionStats"]
|
|
@@ -165,11 +164,12 @@ class PluginWorkflowServer extends import_server.Plugin {
|
|
|
165
164
|
this.app.logger.info("workflow:dispatch");
|
|
166
165
|
this.dispatcher.dispatch();
|
|
167
166
|
});
|
|
167
|
+
this.dispatcher.setReady(true);
|
|
168
168
|
this.getLogger("dispatcher").info("(starting) check for queueing executions");
|
|
169
169
|
this.dispatcher.dispatch();
|
|
170
|
-
this.dispatcher.setReady(true);
|
|
171
170
|
};
|
|
172
171
|
onBeforeStop = async () => {
|
|
172
|
+
this.dispatcher.setReady(false);
|
|
173
173
|
this.app.logger.info(`stopping workflow plugin before app (${this.app.name}) shutdown...`);
|
|
174
174
|
for (const workflow of this.enabledCache.values()) {
|
|
175
175
|
this.toggle(workflow, false, { silent: true });
|
|
@@ -208,7 +208,7 @@ class PluginWorkflowServer extends import_server.Plugin {
|
|
|
208
208
|
getLogger(workflowId = "dispatcher") {
|
|
209
209
|
const now = /* @__PURE__ */ new Date();
|
|
210
210
|
const date = `${now.getFullYear()}-${`0${now.getMonth() + 1}`.slice(-2)}-${`0${now.getDate()}`.slice(-2)}`;
|
|
211
|
-
const key = `${date}-${workflowId}
|
|
211
|
+
const key = `${date}-${workflowId}`;
|
|
212
212
|
if (this.loggerCache.has(key)) {
|
|
213
213
|
return this.loggerCache.get(key);
|
|
214
214
|
}
|
|
@@ -297,7 +297,14 @@ class PluginWorkflowServer extends import_server.Plugin {
|
|
|
297
297
|
max: 20,
|
|
298
298
|
updateAgeOnGet: true,
|
|
299
299
|
dispose(logger) {
|
|
300
|
-
logger
|
|
300
|
+
const cachedLogger = logger;
|
|
301
|
+
if (!cachedLogger) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
cachedLogger.silent = true;
|
|
305
|
+
if (typeof cachedLogger.close === "function") {
|
|
306
|
+
cachedLogger.close();
|
|
307
|
+
}
|
|
301
308
|
}
|
|
302
309
|
});
|
|
303
310
|
this.meter = this.app.telemetry.metric.getMeter();
|
|
@@ -49,12 +49,22 @@ async function create(context, next) {
|
|
|
49
49
|
const { db } = context;
|
|
50
50
|
const repository = import_actions.utils.getRepositoryFromParams(context);
|
|
51
51
|
const { whitelist, blacklist, updateAssociationValues, values, associatedIndex: workflowId } = context.action.params;
|
|
52
|
+
const workflowPlugin = context.app.pm.get(import__.default);
|
|
52
53
|
context.body = await db.sequelize.transaction(async (transaction) => {
|
|
53
|
-
const workflow = await repository.getSourceModel(transaction);
|
|
54
|
-
workflow.versionStats
|
|
54
|
+
const workflow = workflowPlugin.enabledCache.get(Number.parseInt(workflowId, 10)) || await repository.getSourceModel(transaction);
|
|
55
|
+
if (!workflow.versionStats) {
|
|
56
|
+
workflow.versionStats = await workflow.getVersionStats({ transaction });
|
|
57
|
+
}
|
|
55
58
|
if (workflow.versionStats.executed > 0) {
|
|
56
59
|
context.throw(400, "Node could not be created in executed workflow");
|
|
57
60
|
}
|
|
61
|
+
const NODES_LIMIT = process.env.WORKFLOW_NODES_LIMIT ? parseInt(process.env.WORKFLOW_NODES_LIMIT, 10) : null;
|
|
62
|
+
if (NODES_LIMIT) {
|
|
63
|
+
const nodesCount = await workflow.countNodes({ transaction });
|
|
64
|
+
if (nodesCount >= NODES_LIMIT) {
|
|
65
|
+
context.throw(400, `The number of nodes in a workflow cannot exceed ${NODES_LIMIT}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
58
68
|
const instance = await repository.create({
|
|
59
69
|
values,
|
|
60
70
|
whitelist,
|
|
@@ -136,38 +146,32 @@ function searchBranchDownstreams(nodes, from) {
|
|
|
136
146
|
}
|
|
137
147
|
return result;
|
|
138
148
|
}
|
|
149
|
+
function findBranchTail(branchHead) {
|
|
150
|
+
let tail = branchHead;
|
|
151
|
+
while (tail.downstream) {
|
|
152
|
+
tail = tail.downstream;
|
|
153
|
+
}
|
|
154
|
+
return tail;
|
|
155
|
+
}
|
|
139
156
|
async function destroy(context, next) {
|
|
140
157
|
const { db } = context;
|
|
141
158
|
const repository = import_actions.utils.getRepositoryFromParams(context);
|
|
142
|
-
const { filterByTk } = context.action.params;
|
|
143
|
-
const
|
|
159
|
+
const { filterByTk, keepBranch } = context.action.params;
|
|
160
|
+
const keepBranchIndex = keepBranch == null || keepBranch === "" ? null : Number.parseInt(keepBranch, 10);
|
|
161
|
+
const fields = ["id", "upstreamId", "downstreamId", "branchIndex", "key"];
|
|
144
162
|
const instance = await repository.findOne({
|
|
145
163
|
filterByTk,
|
|
146
164
|
fields: [...fields, "workflowId"],
|
|
147
165
|
appends: ["upstream", "downstream", "workflow.versionStats.executed"]
|
|
148
166
|
});
|
|
167
|
+
if (!instance) {
|
|
168
|
+
context.throw(404, "Node not found");
|
|
169
|
+
}
|
|
149
170
|
if (instance.workflow.versionStats.executed > 0) {
|
|
150
171
|
context.throw(400, "Nodes in executed workflow could not be deleted");
|
|
151
172
|
}
|
|
152
173
|
await db.sequelize.transaction(async (transaction) => {
|
|
153
174
|
const { upstream, downstream } = instance.get();
|
|
154
|
-
if (upstream && upstream.downstreamId === instance.id) {
|
|
155
|
-
await upstream.update(
|
|
156
|
-
{
|
|
157
|
-
downstreamId: instance.downstreamId
|
|
158
|
-
},
|
|
159
|
-
{ transaction }
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
if (downstream) {
|
|
163
|
-
await downstream.update(
|
|
164
|
-
{
|
|
165
|
-
upstreamId: instance.upstreamId,
|
|
166
|
-
branchIndex: instance.branchIndex
|
|
167
|
-
},
|
|
168
|
-
{ transaction }
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
175
|
const nodes = await repository.find({
|
|
172
176
|
filter: {
|
|
173
177
|
workflowId: instance.workflowId
|
|
@@ -187,9 +191,69 @@ async function destroy(context, next) {
|
|
|
187
191
|
item.downstream = nodesMap.get(item.downstreamId);
|
|
188
192
|
}
|
|
189
193
|
});
|
|
190
|
-
const
|
|
194
|
+
const keepBranchHead = keepBranchIndex != null ? nodes.find((item) => item.upstreamId === instance.id && item.branchIndex == keepBranchIndex) : null;
|
|
195
|
+
if (keepBranchIndex != null && !keepBranchHead) {
|
|
196
|
+
context.throw(400, `Branch ${keepBranchIndex} not found`);
|
|
197
|
+
}
|
|
198
|
+
const keepBranchNodes = keepBranchHead ? searchBranchDownstreams(nodes, keepBranchHead) : [];
|
|
199
|
+
const keepBranchNodeIds = new Set(keepBranchNodes.map((item) => item.id));
|
|
200
|
+
const branchNodes = instance ? searchBranchNodes(nodes, instance) : [];
|
|
201
|
+
const branchNodesToDelete = keepBranchHead ? branchNodes.filter((item) => !keepBranchNodeIds.has(item.id)) : branchNodes;
|
|
202
|
+
if (keepBranchHead) {
|
|
203
|
+
if (upstream && upstream.downstreamId === instance.id) {
|
|
204
|
+
await upstream.update(
|
|
205
|
+
{
|
|
206
|
+
downstreamId: keepBranchHead.id
|
|
207
|
+
},
|
|
208
|
+
{ transaction }
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
await keepBranchHead.update(
|
|
212
|
+
{
|
|
213
|
+
upstreamId: instance.upstreamId,
|
|
214
|
+
branchIndex: instance.branchIndex
|
|
215
|
+
},
|
|
216
|
+
{ transaction }
|
|
217
|
+
);
|
|
218
|
+
if (downstream) {
|
|
219
|
+
const branchTail = findBranchTail(keepBranchHead);
|
|
220
|
+
await branchTail.update(
|
|
221
|
+
{
|
|
222
|
+
downstreamId: instance.downstreamId
|
|
223
|
+
},
|
|
224
|
+
{ transaction }
|
|
225
|
+
);
|
|
226
|
+
branchTail.downstreamId = instance.downstreamId;
|
|
227
|
+
branchTail.downstream = downstream;
|
|
228
|
+
await downstream.update(
|
|
229
|
+
{
|
|
230
|
+
upstreamId: branchTail.id,
|
|
231
|
+
branchIndex: null
|
|
232
|
+
},
|
|
233
|
+
{ transaction }
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
} else {
|
|
237
|
+
if (upstream && upstream.downstreamId === instance.id) {
|
|
238
|
+
await upstream.update(
|
|
239
|
+
{
|
|
240
|
+
downstreamId: instance.downstreamId
|
|
241
|
+
},
|
|
242
|
+
{ transaction }
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
if (downstream) {
|
|
246
|
+
await downstream.update(
|
|
247
|
+
{
|
|
248
|
+
upstreamId: instance.upstreamId,
|
|
249
|
+
branchIndex: instance.branchIndex
|
|
250
|
+
},
|
|
251
|
+
{ transaction }
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
191
255
|
await repository.destroy({
|
|
192
|
-
filterByTk: [instance.id, ...
|
|
256
|
+
filterByTk: [instance.id, ...branchNodesToDelete.map((item) => item.id)],
|
|
193
257
|
transaction
|
|
194
258
|
});
|
|
195
259
|
});
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"displayName.zh-CN": "工作流",
|
|
5
5
|
"description": "A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.",
|
|
6
6
|
"description.zh-CN": "一个强大的 BPM 工具,为业务自动化提供基础支持,并且可任意扩展更多的触发器和节点。",
|
|
7
|
-
"version": "2.0.0-alpha.
|
|
7
|
+
"version": "2.0.0-alpha.30",
|
|
8
8
|
"license": "AGPL-3.0",
|
|
9
9
|
"main": "./dist/server/index.js",
|
|
10
10
|
"homepage": "https://docs.nocobase.com/handbook/workflow",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@nocobase/test": "2.x",
|
|
46
46
|
"@nocobase/utils": "2.x"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "cdac55c9cdf0dbdbe57a21815f323b975792bfc0",
|
|
49
49
|
"keywords": [
|
|
50
50
|
"Workflow"
|
|
51
51
|
]
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file is part of the NocoBase (R) project.
|
|
3
|
-
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
-
* Authors: NocoBase Team.
|
|
5
|
-
*
|
|
6
|
-
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
-
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
"use strict";(self.webpackChunk_nocobase_plugin_workflow=self.webpackChunk_nocobase_plugin_workflow||[]).push([["771"],{144:function(e,t,r){r.d(t,{g:function(){return g}});var n=r(2721),o=r(8156),a=r.n(o);let l=(0,o.createContext)(null),i={didCatch:!1,error:null};class c extends o.Component{constructor(e){super(e),this.resetErrorBoundary=this.resetErrorBoundary.bind(this),this.state=i}static getDerivedStateFromError(e){return{didCatch:!0,error:e}}resetErrorBoundary(){let{error:e}=this.state;if(null!==e){for(var t,r,n=arguments.length,o=Array(n),a=0;a<n;a++)o[a]=arguments[a];null==(t=(r=this.props).onReset)||t.call(r,{args:o,reason:"imperative-api"}),this.setState(i)}}componentDidCatch(e,t){var r,n;null==(r=(n=this.props).onError)||r.call(n,e,t)}componentDidUpdate(e,t){let{didCatch:r}=this.state,{resetKeys:n}=this.props;if(r&&null!==t.error&&function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return e.length!==t.length||e.some((e,r)=>!Object.is(e,t[r]))}(e.resetKeys,n)){var o,a;null==(o=(a=this.props).onReset)||o.call(a,{next:n,prev:e.resetKeys,reason:"keys"}),this.setState(i)}}render(){let{children:e,fallbackRender:t,FallbackComponent:r,fallback:n}=this.props,{didCatch:a,error:i}=this.state,c=e;if(a){let e={error:i,resetErrorBoundary:this.resetErrorBoundary};if((0,o.isValidElement)(n))c=n;else if("function"==typeof t)c=t(e);else if(r)c=(0,o.createElement)(r,e);else throw i}return(0,o.createElement)(l.Provider,{value:{didCatch:a,error:i,resetErrorBoundary:this.resetErrorBoundary}},c)}}var s=r(3772),u=r(2415),d=r(8551),m=r(5329),f=r(4477),p=r(2495),y=r(8562);function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function b(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function E(){var e=b(["\n margin-top: 0 !important;\n "]);return E=function(){return e},e}function h(){var e=b(["\n margin-bottom: 1em;\n "]);return h=function(){return e},e}function w(){var e=b(["\n margin-top: 0 !important;\n "]);return w=function(){return e},e}function g(e){var t,r=e.entry,o=(0,m.Z)().styles,l=(0,y.RY)(),i=(t=a().useState(100),function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],l=!0,i=!1;try{for(o=o.call(e);!(l=(r=o.next()).done)&&(a.push(r.value),a.length!==t);l=!0);}catch(e){i=!0,n=e}finally{try{l||null==o.return||o.return()}finally{if(i)throw n}}return a}}(t,2)||function(e,t){if(e){if("string"==typeof e)return v(e,2);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return v(e,t)}}(t,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),b=i[0],g=i[1];return a().createElement("div",{className:"workflow-canvas-wrapper"},a().createElement(c,{FallbackComponent:s.ErrorFallback,onError:console.error},a().createElement(p.E1,null,a().createElement("div",{className:"workflow-canvas",style:{zoom:b/100}},a().createElement("div",{className:(0,s.cx)(o.branchBlockClass,(0,s.css)(E()))},a().createElement("div",{className:o.branchClass},l?a().createElement(n.Alert,{type:"warning",message:(0,d.KQ)("Executed workflow cannot be modified. Could be copied to a new version to modify."),showIcon:!0,className:(0,s.css)(h())}):null,a().createElement(f.Gk,null),a().createElement("div",{className:(0,s.cx)(o.branchBlockClass,(0,s.css)(w()))},a().createElement(u.I,{entry:r})),a().createElement("div",{className:o.terminalClass},(0,d.KQ)("End"))))))),a().createElement("div",{className:"workflow-canvas-zoomer"},a().createElement(n.Slider,{vertical:!0,reverse:!0,defaultValue:100,step:10,min:10,value:b,onChange:g})))}},2378:function(e,t,r){r.r(t),r.d(t,{ExecutionPage:function(){return N}});var n=r(3772),o=r(8156),a=r.n(o),l=r(6128),i=r(2721),c=r(7584),s=r(482),u=r(3238),d=r(9130),m=r(144),f=r(118),p=r(1682),y=r(8398),v=r(8551),b=r(5329),E=r(9315),h=r(467);function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function g(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function k(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function x(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],l=!0,i=!1;try{for(o=o.call(e);!(l=(r=o.next()).done)&&(a.push(r.value),!t||a.length!==t);l=!0);}catch(e){i=!0,n=e}finally{try{l||null==o.return||o.return()}finally{if(i)throw n}}return a}}(e,t)||S(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e){return function(e){if(Array.isArray(e))return w(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||S(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e,t){if(e){if("string"==typeof e)return w(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return w(e,t)}}function j(e){var t,r,o=(0,y.G2)().viewJob,l=(0,n.useRequest)({resource:"jobs",action:"get",params:{filterByTk:o.id}}),c=l.data;if(l.loading)return a().createElement(i.Spin,null);var s=(0,h.get)(c,"data.result");return a().createElement(n.Input.JSON,(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){g(e,t,r[t])})}return e}({},e),r=r={value:s,disabled:!0},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))}function C(){var e=(0,n.usePlugin)(d.default).instructions,t=(0,n.useCompile)(),r=(0,y.G2)(),o=r.viewJob,l=r.setViewJob,c=(0,b.Z)().styles,s=(null!=o?o:{}).node,u=void 0===s?{}:s,m=e.get(u.type);return a().createElement(n.ActionContextProvider,{value:{visible:!!o,setVisible:l}},a().createElement(n.SchemaComponent,{components:{JobResult:j},schema:{type:"void",properties:g({},"".concat(null==o?void 0:o.id,"-").concat(null==o?void 0:o.updatedAt,"-modal"),{type:"void","x-decorator":"Form","x-decorator-props":{initialValue:o},"x-component":"Action.Modal",title:a().createElement("div",{className:c.nodeTitleClass},a().createElement(i.Tag,null,t(null==m?void 0:m.title)),a().createElement("strong",null,u.title),a().createElement("span",{className:"workflow-node-id"},"#",u.id)),properties:{status:{type:"number",title:'{{t("Status", { ns: "'.concat(v.A7,'" })}}'),"x-decorator":"FormItem","x-component":"Select",enum:p.Vh,"x-read-pretty":!0},updatedAt:{type:"string",title:'{{t("Executed at", { ns: "'.concat(v.A7,'" })}}'),"x-decorator":"FormItem","x-component":"DatePicker","x-component-props":{showTime:!0},"x-read-pretty":!0},result:{type:"object",title:'{{t("Node result", { ns: "'.concat(v.A7,'" })}}'),"x-decorator":"FormItem","x-component":"JobResult","x-component-props":{className:c.nodeJobResultClass,autoSize:{minRows:4,maxRows:32}}}}})}}))}function A(e){var t=(0,y.G2)().execution,r=(0,n.useAPIClient)(),u=(0,l.useNavigate)(),d=(0,b.Z)().styles,m=x((0,o.useState)([]),2),v=m[0],h=m[1],w=x((0,o.useState)([]),2),g=w[0],k=w[1];(0,o.useEffect)(function(){t&&r.resource("executions").list({filter:{key:t.key,id:{$lt:t.id}},sort:"-createdAt",pageSize:10,fields:["id","status","createdAt"]}).then(function(e){h(e.data.data)}).catch(function(){})},[t.id]),(0,o.useEffect)(function(){t&&r.resource("executions").list({filter:{key:t.key,id:{$gt:t.id}},sort:"createdAt",pageSize:10,fields:["id","status","createdAt"]}).then(function(e){k(e.data.data.reverse())}).catch(function(){})},[t.id]);var S=(0,o.useCallback)(function(e){var r=e.key;r!=t.id&&u((0,E.s_)(r))},[t.id]);return t?a().createElement(i.Dropdown,{menu:{onClick:S,defaultSelectedKeys:["".concat(t.id)],className:(0,n.cx)(d.dropdownClass,d.executionsDropdownRowClass),items:O(g).concat([t],O(v)).map(function(e){return{key:e.id,label:a().createElement(a().Fragment,null,a().createElement("span",{className:"id"},"#".concat(e.id)),a().createElement("time",null,(0,c.str2moment)(e.createdAt).format("YYYY-MM-DD HH:mm:ss"))),icon:a().createElement("span",null,a().createElement(f.Y,{statusMap:p.uy,status:e.status}))}})}},a().createElement(i.Space,null,a().createElement("strong",null,"#".concat(t.id)),a().createElement(s.DownOutlined,null))):null}function P(){var e,t=(0,u.useTranslation)().t,r=(0,n.useCompile)(),d=(0,n.useResourceActionContext)(),f=d.data,b=d.loading,h=d.refresh,w=(0,n.useDocumentTitle)().setTitle,g=x((0,o.useState)(null),2),O=g[0],S=g[1],j=(0,n.useApp)(),P=(0,n.useAPIClient)();(0,o.useEffect)(function(){var e,t=(null!=(e=null==f?void 0:f.data)?e:{}).workflow;null==w||w("".concat((null==t?void 0:t.title)?"".concat(t.title," - "):"").concat((0,v.KQ)("Execution history")))},[null==f?void 0:f.data,w]);var N=(0,o.useCallback)(function(){i.Modal.confirm({title:(0,v.KQ)("Cancel the execution"),icon:a().createElement(s.ExclamationCircleFilled,null),content:(0,v.KQ)("Are you sure you want to cancel the execution?"),onOk:function(){P.resource("executions").cancel({filterByTk:null==f?void 0:f.data.id}).then(function(){i.message.success(t("Operation succeeded")),h()}).catch(function(e){console.error(e.data.error)})}})},[null==f?void 0:f.data]);if(!(null==f?void 0:f.data))return b?a().createElement(i.Spin,null):a().createElement(i.Result,{status:"404",title:"Not found"});var I=null!=(e=null==f?void 0:f.data)?e:{},D=I.jobs,T=I.workflow,R=void 0===T?{}:T,B=R.nodes,K=void 0===B?[]:B,M=(R.revisions,k(I.workflow,["nodes","revisions"])),Y=k(I,["jobs","workflow"]);(0,E.Yc)(K),function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=new Map;e.forEach(function(e){e.jobs=[],r.set(e.id,e)}),t.forEach(function(e){var t=r.get(e.nodeId);t.jobs.push(e),e.node={id:t.id,key:t.key,title:t.title,type:t.type}}),e.forEach(function(e){e.jobs=e.jobs.sort(function(e,t){return e.id-t.id})})}(K,void 0===D?[]:D);var F=K.find(function(e){return!e.upstream}),J=p.uy[Y.status];return a().createElement(y.iT.Provider,{value:{workflow:M.type?M:null,nodes:K,execution:Y,viewJob:O,setViewJob:S}},a().createElement("div",{className:"workflow-toolbar"},a().createElement("header",null,a().createElement(i.Breadcrumb,{items:[{title:a().createElement(l.Link,{to:j.pluginSettingsManager.getRoutePath("workflow")},(0,v.KQ)("Workflow"))},{title:a().createElement(i.Tooltip,{title:"Key: ".concat(M.key)},a().createElement(l.Link,{to:(0,E.SI)(M.id)},M.title))},{title:a().createElement(A,null)}]})),a().createElement("aside",null,a().createElement(i.Tag,{color:J.color},r(J.label)),Y.status?null:a().createElement(i.Tooltip,{title:(0,v.KQ)("Cancel the execution")},a().createElement(i.Button,{type:"link",danger:!0,onClick:N,shape:"circle",size:"small",icon:a().createElement(s.StopOutlined,null)})),a().createElement("time",null,(0,c.str2moment)(Y.updatedAt).format("YYYY-MM-DD HH:mm:ss")))),a().createElement(m.g,{entry:F}),a().createElement(C,null))}var N=function(){var e,t,r,o=(0,l.useParams)(),i=(0,b.Z)().styles;return a().createElement("div",{className:(0,n.cx)(i.workflowPageClass)},a().createElement(n.SchemaComponent,{schema:{type:"void",properties:(e={},t="execution_".concat(o.id),r={type:"void","x-decorator":"ResourceActionProvider","x-decorator-props":{collection:{name:"executions",fields:[]},resourceName:"executions",request:{resource:"executions",action:"get",params:{filter:o,appends:["jobs","workflow","workflow.nodes","workflow.versionStats","workflow.stats"],except:["jobs.result","workflow.options"]}}},"x-component":"ExecutionCanvas"},t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e)},components:{ExecutionCanvas:P}}))}}}]);
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file is part of the NocoBase (R) project.
|
|
3
|
-
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
-
* Authors: NocoBase Team.
|
|
5
|
-
*
|
|
6
|
-
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
-
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
"use strict";(self.webpackChunk_nocobase_plugin_workflow=self.webpackChunk_nocobase_plugin_workflow||[]).push([["626"],{144:function(e,t,r){r.d(t,{g:function(){return k}});var n=r(2721),o=r(8156),a=r.n(o);let l=(0,o.createContext)(null),i={didCatch:!1,error:null};class c extends o.Component{constructor(e){super(e),this.resetErrorBoundary=this.resetErrorBoundary.bind(this),this.state=i}static getDerivedStateFromError(e){return{didCatch:!0,error:e}}resetErrorBoundary(){let{error:e}=this.state;if(null!==e){for(var t,r,n=arguments.length,o=Array(n),a=0;a<n;a++)o[a]=arguments[a];null==(t=(r=this.props).onReset)||t.call(r,{args:o,reason:"imperative-api"}),this.setState(i)}}componentDidCatch(e,t){var r,n;null==(r=(n=this.props).onError)||r.call(n,e,t)}componentDidUpdate(e,t){let{didCatch:r}=this.state,{resetKeys:n}=this.props;if(r&&null!==t.error&&function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return e.length!==t.length||e.some((e,r)=>!Object.is(e,t[r]))}(e.resetKeys,n)){var o,a;null==(o=(a=this.props).onReset)||o.call(a,{next:n,prev:e.resetKeys,reason:"keys"}),this.setState(i)}}render(){let{children:e,fallbackRender:t,FallbackComponent:r,fallback:n}=this.props,{didCatch:a,error:i}=this.state,c=e;if(a){let e={error:i,resetErrorBoundary:this.resetErrorBoundary};if((0,o.isValidElement)(n))c=n;else if("function"==typeof t)c=t(e);else if(r)c=(0,o.createElement)(r,e);else throw i}return(0,o.createElement)(l.Provider,{value:{didCatch:a,error:i,resetErrorBoundary:this.resetErrorBoundary}},c)}}var s=r(3772),u=r(2415),d=r(8551),f=r(5329),p=r(4477),m=r(2495),v=r(8562);function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function b(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function h(){var e=b(["\n margin-top: 0 !important;\n "]);return h=function(){return e},e}function w(){var e=b(["\n margin-bottom: 1em;\n "]);return w=function(){return e},e}function g(){var e=b(["\n margin-top: 0 !important;\n "]);return g=function(){return e},e}function k(e){var t,r=e.entry,o=(0,f.Z)().styles,l=(0,v.RY)(),i=(t=a().useState(100),function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],l=!0,i=!1;try{for(o=o.call(e);!(l=(r=o.next()).done)&&(a.push(r.value),a.length!==t);l=!0);}catch(e){i=!0,n=e}finally{try{l||null==o.return||o.return()}finally{if(i)throw n}}return a}}(t,2)||function(e,t){if(e){if("string"==typeof e)return y(e,2);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return y(e,t)}}(t,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),b=i[0],k=i[1];return a().createElement("div",{className:"workflow-canvas-wrapper"},a().createElement(c,{FallbackComponent:s.ErrorFallback,onError:console.error},a().createElement(m.E1,null,a().createElement("div",{className:"workflow-canvas",style:{zoom:b/100}},a().createElement("div",{className:(0,s.cx)(o.branchBlockClass,(0,s.css)(h()))},a().createElement("div",{className:o.branchClass},l?a().createElement(n.Alert,{type:"warning",message:(0,d.KQ)("Executed workflow cannot be modified. Could be copied to a new version to modify."),showIcon:!0,className:(0,s.css)(w())}):null,a().createElement(p.Gk,null),a().createElement("div",{className:(0,s.cx)(o.branchBlockClass,(0,s.css)(g()))},a().createElement(u.I,{entry:r})),a().createElement("div",{className:o.terminalClass},(0,d.KQ)("End"))))))),a().createElement("div",{className:"workflow-canvas-zoomer"},a().createElement(n.Slider,{vertical:!0,reverse:!0,defaultValue:100,step:10,min:10,value:b,onChange:k})))}},6443:function(e,t,r){r.r(t),r.d(t,{WorkflowPage:function(){return M}});var n=r(3772),o=r(8156),a=r.n(o),l=r(6128),i=r(5329),c=r(3238),s=r(2721),u=r(482),d=r(3505),f=r(7584),p=r(144),m=r(4665),v=r(1113),y=r(8398),b=r(8551),h=r(1685),w=r(9315),g=r(8303),k=r(1600),E=r(4477),x=r(1682),A=r(7032),C=r(8562);function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function S(e,t,r,n,o,a,l){try{var i=e[a](l),c=i.value}catch(e){r(e);return}i.done?t(c):Promise.resolve(c).then(n,o)}function P(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var a=e.apply(t,r);function l(e){S(a,n,o,l,i,"next",e)}function i(e){S(a,n,o,l,i,"throw",e)}l(void 0)})}}function j(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function T(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function R(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function K(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],l=!0,i=!1;try{for(o=o.call(e);!(l=(r=o.next()).done)&&(a.push(r.value),!t||a.length!==t);l=!0);}catch(e){i=!0,n=e}finally{try{l||null==o.return||o.return()}finally{if(i)throw n}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return O(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return O(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function N(e,t){var r,n,o,a,l={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var c=[a,i];if(r)throw TypeError("Generator is already executing.");for(;l;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return l.label++,{value:c[1],done:!1};case 5:l.label++,n=c[1],c=[0];continue;case 7:c=l.ops.pop(),l.trys.pop();continue;default:if(!(o=(o=l.trys).length>0&&o[o.length-1])&&(6===c[0]||2===c[0])){l=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){l.label=c[1];break}if(6===c[0]&&l.label<o[1]){l.label=o[1],o=c;break}if(o&&l.label<o[2]){l.label=o[2],l.ops.push(c);break}o[2]&&l.ops.pop(),l.trys.pop();continue}c=t.call(e,l)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}function B(){var e,t,r=(e=["\n margin-bottom: 1em;\n "],t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}})));return B=function(){return r},r}function F(e){var t,r=e.request,o=(e.filter,R(e,["request","filter"])),l=(0,y.G2)().workflow,i=T(j({},o),{request:T(j({},r),{params:T(j({},null==r?void 0:r.params),{filter:T(j({},null==r||null==(t=r.params)?void 0:t.filter),{key:l.key})})})});return a().createElement(n.ResourceActionProvider,i)}function Q(e){var t=e.data,r=e.option,o=(0,n.useCompile)()(r.label);return a().createElement(c.Trans,{ns:b.A7,values:{statusText:o}},"Workflow executed, the result status is ",a().createElement(s.Tag,{color:r.color},"{{statusText}}"),a().createElement(l.Link,{to:"/admin/workflow/executions/".concat(t.id)},"View the execution"))}function D(){var e=(0,y.G2)().workflow,t=(0,d.useForm)(),r=(0,n.useResourceContext)().resource,o=(0,n.useActionContext)(),l=(0,n.useNavigateNoUpdate)(),i=s.App.useApp().message,c=(0,C.RY)();return{run:function(){return P(function(){var n,s,u,d;return N(this,function(f){switch(f.label){case 0:return s=(n=t.values).autoRevision,u=R(n,["autoRevision"]),[4,t.submit()];case 1:return f.sent(),[4,r.execute(j({filterByTk:e.id,values:u},!c&&s?{autoRevision:1}:{}))];case 2:var p,m,v,y;return d=f.sent().data.data,t.reset(),o.setFormValueChanged(!1),o.setVisible(!1),null==i||i.open((m=(p=d.execution).id,v=p.status,(y=x.uy[v])?{type:"info",content:a().createElement(Q,{data:{id:m},option:y})}:null)),d.newVersionId&&l("/admin/workflow/workflows/".concat(d.newVersionId)),[2]}})})()}}}function I(e){var t=e.children,r=(0,d.useField)(),n=(0,y.G2)().workflow,o=(0,E.cC)(),l=o.validate(n.config),i="";switch(!0){case!l:i=(0,b.KQ)("The trigger is not configured correctly, please check the trigger configuration.");break;case!o.triggerFieldset:i=(0,b.KQ)("This type of trigger has not been supported to be executed manually.")}return r.setPattern(i?"disabled":"editable"),i?a().createElement(s.Tooltip,{title:i},t):t}function V(){var e,t=(0,y.G2)().workflow,r=(0,C.RY)(),o=(0,E.cC)();return a().createElement(y.zQ.Provider,{value:t},a().createElement(A.XA.Provider,{value:!0},a().createElement(n.SchemaComponent,{components:j({Alert:s.Alert,Fieldset:g.p,ActionDisabledProvider:I},o.components),scope:j({useCancelAction:n.useCancelAction,useExecuteConfirmAction:D},o.scope),schema:{name:"trigger-modal-".concat(t.type,"-").concat(t.id),type:"void","x-decorator":"ActionDisabledProvider","x-component":"Action","x-component-props":{openSize:"small"},title:"{{t('Execute manually', { ns: \"".concat(b.A7,'" })}}'),properties:{drawer:{type:"void","x-decorator":"FormV2","x-component":"Action.Modal",title:"{{t('Execute manually', { ns: \"".concat(b.A7,'" })}}'),properties:T(j(T(j({},Object.keys(null!=(e=o.triggerFieldset)?e:{}).length?{alert:{type:"void","x-component":"Alert","x-component-props":{message:"{{t('Trigger variables need to be filled for executing.', { ns: \"".concat(b.A7,'" })}}'),className:(0,n.css)(B())}}}:{description:{type:"void","x-component":"p","x-content":"{{t('This will perform all the actions configured in the workflow. Are you sure you want to continue?', { ns: \"".concat(b.A7,'" })}}')}}),{fieldset:{type:"void","x-decorator":"FormItem","x-component":"Fieldset",title:"{{t('Trigger variables', { ns: \"".concat(b.A7,'" })}}'),properties:o.triggerFieldset}}),r?{}:{autoRevision:{type:"boolean","x-decorator":"FormItem","x-component":"Checkbox","x-content":"{{t('Automatically create a new version after execution', { ns: \"".concat(b.A7,'" })}}'),default:!0}}),{footer:{type:"void","x-component":"Action.Modal.Footer",properties:{cancel:{type:"void",title:"{{t('Cancel')}}","x-component":"Action","x-component-props":{useAction:"{{useCancelAction}}"}},submit:{type:"void",title:"{{t('Confirm')}}","x-component":"Action","x-component-props":{type:"primary",useAction:"{{useExecuteConfirmAction}}"}}}}})}}}})))}function z(){var e=(0,y.G2)(),t=e.workflow,r=e.revisions,i=K((0,o.useState)(!1),2),d=i[0],f=i[1],p=(0,l.useNavigate)(),g=(0,c.useTranslation)().t,E=s.App.useApp().modal,A=(0,n.useApp)(),O=(0,n.useResourceContext)().resource,S=s.App.useApp().message;(0,C.RY)();var j=(0,C.U3)(),T=(0,o.useCallback)(P(function(){var e;return N(this,function(r){switch(r.label){case 0:return[4,O.revision({filterByTk:t.id,filter:{key:t.key}})];case 1:return e=r.sent().data.data,S.success(g("Operation succeeded")),p("/admin/workflow/workflows/".concat(e.id)),[2]}})}),[O,t.id,t.key,S,g,p]),R=(0,o.useCallback)(P(function(){var e;return N(this,function(n){return e=t.current?(0,b.KQ)("This is a main version, delete it will cause the whole workflow to be deleted (including all other revisions)."):(0,b.KQ)("Current version will be deleted (without affecting other versions)."),E.confirm({title:g("Are you sure you want to delete it?"),content:e,onOk:function(){return P(function(){var e;return N(this,function(n){switch(n.label){case 0:return[4,O.destroy({filterByTk:t.id})];case 1:return n.sent(),S.success(g("Operation succeeded")),p(t.current?A.pluginSettingsManager.getRoutePath("workflow"):(0,w.SI)(null==(e=r.find(function(e){return e.current}))?void 0:e.id)),[2]}})})()}}),[2]})}),[t,E,g,O,S,p,A.pluginSettingsManager,r]),B=(0,o.useCallback)(function(e){switch(e.key){case"history":f(!0);return;case"revision":return T();case"delete":return R()}},[R,T]);return a().createElement(a().Fragment,null,a().createElement(s.Dropdown,{menu:{items:[{key:"key",label:"Key: ".concat(t.key),disabled:!0},{type:"divider"},{role:"button","aria-label":"history",key:"history",label:(0,b.KQ)("Execution history"),disabled:!j},{role:"button","aria-label":"revision",key:"revision",label:(0,b.KQ)("Copy to new version")},{type:"divider"},{role:"button","aria-label":"delete",danger:!0,key:"delete",label:g("Delete")}],onClick:B}},a().createElement(s.Button,{"aria-label":"more",type:"text",icon:a().createElement(u.EllipsisOutlined,null)})),a().createElement(n.ActionContextProvider,{value:{visible:d,setVisible:f}},a().createElement(n.SchemaComponent,{schema:h.V,components:{ExecutionResourceProvider:F,ExecutionLink:v.a,ExecutionStatusColumn:m.rV},scope:{useRefreshActionProps:k.X,ExecutionStatusOptions:x.C6}})))}function G(){var e,t,r,c,d=(0,l.useNavigate)(),m=(0,n.useApp)(),v=(0,n.useResourceActionContext)(),h=v.data,g=v.refresh,k=v.loading,E=(0,n.useResourceContext)().resource,x=(0,n.useDocumentTitle)().setTitle,A=(0,i.Z)().styles,C=K((0,o.useState)(null!=(r=null==h||null==(t=h.data)?void 0:t.enabled)&&r),2),O=C[0],S=C[1],j=K((0,o.useState)(!1),2),T=j[0],B=j[1],F=null!=(c=null==h?void 0:h.data)?c:{},Q=F.nodes,D=void 0===Q?[]:Q,I=F.revisions,G=void 0===I?[]:I,M=R(F,["nodes","revisions"]);(0,w.Yc)(D),(0,o.useEffect)(function(){var e,t=null!=(e=null==h?void 0:h.data)?e:{},r=t.title,n=t.enabled;null==x||x("".concat((0,b.KQ)("Workflow")).concat(r?": ".concat(r):"")),S(n)},[null==h?void 0:h.data,x]);var _=(0,o.useCallback)(function(e){var t=e.key;t!=M.id&&d((0,w.SI)(t))},[M.id,d]),W=(0,o.useCallback)((e=P(function(e){return N(this,function(t){switch(t.label){case 0:return B(!0),[4,E.update({filterByTk:M.id,values:{enabled:e}})];case 1:return t.sent(),B(!1),S(e),[2]}})}),function(t){return e.apply(this,arguments)}),[E,M.id]);if(!(null==h?void 0:h.data))return k?a().createElement(s.Spin,null):a().createElement(s.Result,{status:"404",title:"Not found",extra:a().createElement(s.Button,{onClick:function(){return d(-1)}},(0,b.KQ)("Go back"))});var U=D.find(function(e){return!e.upstream});return a().createElement(y.iT.Provider,{value:{workflow:M,revisions:G,nodes:D,refresh:g}},a().createElement("div",{className:"workflow-toolbar"},a().createElement("header",null,a().createElement(s.Breadcrumb,{items:[{title:a().createElement(l.Link,{to:m.pluginSettingsManager.getRoutePath("workflow")},(0,b.KQ)("Workflow"))},{title:a().createElement(s.Tooltip,{title:"Key: ".concat(M.key)},a().createElement("strong",null,M.title))}]}),M.sync?a().createElement(s.Tag,{color:"orange"},(0,b.KQ)("Synchronously")):a().createElement(s.Tag,{color:"cyan"},(0,b.KQ)("Asynchronously"))),a().createElement("aside",null,a().createElement(V,null),a().createElement(s.Dropdown,{className:"workflow-versions",trigger:["click"],menu:{onClick:_,defaultSelectedKeys:["".concat(M.id)],className:(0,n.cx)(A.dropdownClass,A.workflowVersionDropdownClass),items:G.sort(function(e,t){return t.id-e.id}).map(function(e,t){return{role:"button","aria-label":"version-".concat(t),key:"".concat(e.id),icon:e.current?a().createElement(u.RightOutlined,null):null,className:(0,n.cx)({executed:e.versionStats.executed>0,unexecuted:0==e.versionStats.executed,enabled:e.enabled}),label:a().createElement(a().Fragment,null,a().createElement("strong",null,"#".concat(e.id)),a().createElement("time",null,(0,f.dayjs)(e.createdAt).fromNow()))}})}},a().createElement(s.Button,{type:"text","aria-label":"version"},a().createElement("label",null,(0,b.KQ)("Version")),a().createElement("span",null,(null==M?void 0:M.id)?"#".concat(M.id):null),a().createElement(u.DownOutlined,null))),a().createElement(s.Switch,{checked:O,onChange:W,checkedChildren:(0,b.KQ)("On"),unCheckedChildren:(0,b.KQ)("Off"),loading:T}),a().createElement(z,null))),a().createElement(p.g,{entry:U}))}var M=function(){var e,t,r,o=(0,l.useParams)(),c=(0,i.Z)().styles;return a().createElement("div",{className:(0,n.cx)(c.workflowPageClass)},a().createElement(n.SchemaComponent,{schema:{type:"void",properties:(e={},t="provider_".concat(o.id),r={type:"void","x-decorator":"ResourceActionProvider","x-decorator-props":{collection:{name:"workflows",fields:[]},resourceName:"workflows",request:{resource:"workflows",action:"get",params:{filter:{id:o.id},appends:["nodes","revisions.id","revisions.createdAt","revisions.current","revisions.stats.executed","revisions.versionStats.executed","revisions.enabled","stats.executed","versionStats.executed"]}}},"x-component":"WorkflowCanvas"},t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e)},components:{WorkflowCanvas:G}}))}}}]);
|