@nocobase/plugin-workflow 1.9.0-beta.1 → 1.9.0-beta.11
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/2a8332e23037d42f.js +10 -0
- package/dist/client/3b0762a72796b5f8.js +10 -0
- package/dist/client/9e124936e3877c66.js +10 -0
- package/dist/client/components/ExecutionStatus.d.ts +2 -3
- package/dist/client/index.js +1 -1
- package/dist/client/schemas/executions.d.ts +29 -7
- package/dist/client/variable.d.ts +1 -1
- package/dist/common/collections/executions.d.ts +29 -7
- package/dist/common/collections/executions.js +9 -3
- package/dist/common/collections/flow_nodes.d.ts +21 -0
- package/dist/common/collections/flow_nodes.js +6 -0
- package/dist/common/collections/userWorkflowTasks.d.ts +13 -0
- package/dist/common/collections/userWorkflowTasks.js +6 -0
- package/dist/common/collections/workflowCategories.d.ts +21 -0
- package/dist/common/collections/workflowCategories.js +6 -0
- package/dist/common/collections/workflows.d.ts +42 -0
- package/dist/common/collections/workflows.js +6 -0
- package/dist/externalVersion.js +11 -11
- package/dist/locale/zh-CN.json +4 -2
- 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 +47 -1
- package/dist/server/Dispatcher.js +368 -1
- package/dist/server/Plugin.d.ts +4 -24
- package/dist/server/Plugin.js +22 -323
- package/dist/server/Processor.d.ts +4 -4
- package/dist/server/Processor.js +62 -18
- package/dist/server/actions/executions.js +2 -2
- package/dist/server/actions/nodes.js +12 -2
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +0 -2
- package/dist/server/instructions/ConditionInstruction.js +1 -2
- package/dist/server/instructions/EndInstruction.js +1 -1
- package/dist/server/instructions/index.d.ts +1 -1
- package/dist/server/logicCalculate.d.ts +1 -1
- package/dist/server/logicCalculate.js +40 -4
- package/dist/server/migrations/20250820145214-mobile-tasks-uid.d.ts +21 -0
- package/dist/server/migrations/20250820145214-mobile-tasks-uid.js +58 -0
- package/dist/server/migrations/20250826154821-execution-dispatched.d.ts +21 -0
- package/dist/server/migrations/20250826154821-execution-dispatched.js +64 -0
- package/dist/server/triggers/CollectionTrigger.d.ts +1 -1
- package/dist/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.d.ts +5 -5
- package/dist/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.js +33 -13
- package/dist/server/types/Execution.d.ts +1 -0
- package/package.json +3 -5
- package/dist/client/256475f279fb46d1.js +0 -10
- package/dist/client/69d4f948046f2ad2.js +0 -10
- package/dist/client/98ae71d4cff2436b.js +0 -10
package/dist/server/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from './instructions';
|
|
|
12
12
|
export * from './functions';
|
|
13
13
|
export * from './logicCalculate';
|
|
14
14
|
export { Trigger } from './triggers';
|
|
15
|
+
export type { EventOptions } from './Dispatcher';
|
|
15
16
|
export { default as Processor } from './Processor';
|
|
16
|
-
export { default
|
|
17
|
+
export { default } from './Plugin';
|
|
17
18
|
export * from './types';
|
package/dist/server/index.js
CHANGED
|
@@ -37,7 +37,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
37
37
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
38
38
|
var server_exports = {};
|
|
39
39
|
__export(server_exports, {
|
|
40
|
-
EventOptions: () => import_Plugin.EventOptions,
|
|
41
40
|
Processor: () => import_Processor.default,
|
|
42
41
|
Trigger: () => import_triggers.Trigger,
|
|
43
42
|
default: () => import_Plugin.default
|
|
@@ -54,7 +53,6 @@ var import_Plugin = __toESM(require("./Plugin"));
|
|
|
54
53
|
__reExport(server_exports, require("./types"), module.exports);
|
|
55
54
|
// Annotate the CommonJS export names for ESM import in node:
|
|
56
55
|
0 && (module.exports = {
|
|
57
|
-
EventOptions,
|
|
58
56
|
Processor,
|
|
59
57
|
Trigger,
|
|
60
58
|
...require("./utils"),
|
|
@@ -73,9 +73,8 @@ class ConditionInstruction extends import__.Instruction {
|
|
|
73
73
|
if (!branchNode) {
|
|
74
74
|
return job;
|
|
75
75
|
}
|
|
76
|
-
const savedJob =
|
|
76
|
+
const savedJob = processor.saveJob(job);
|
|
77
77
|
await processor.run(branchNode, savedJob);
|
|
78
|
-
return null;
|
|
79
78
|
}
|
|
80
79
|
async resume(node, branchJob, processor) {
|
|
81
80
|
const job = processor.findBranchParentJob(branchJob, node);
|
|
@@ -44,7 +44,7 @@ var import_constants = require("../constants");
|
|
|
44
44
|
class EndInstruction_default extends import__.default {
|
|
45
45
|
async run(node, prevJob, processor) {
|
|
46
46
|
const { endStatus = import_constants.JOB_STATUS.RESOLVED } = node.config;
|
|
47
|
-
|
|
47
|
+
processor.saveJob({
|
|
48
48
|
status: endStatus,
|
|
49
49
|
nodeId: node.id,
|
|
50
50
|
nodeKey: node.key,
|
|
@@ -15,7 +15,7 @@ export interface IJob {
|
|
|
15
15
|
result?: unknown;
|
|
16
16
|
[key: string]: unknown;
|
|
17
17
|
}
|
|
18
|
-
export type InstructionResult = IJob | Promise<IJob> | null;
|
|
18
|
+
export type InstructionResult = IJob | Promise<IJob> | Promise<void> | null | void;
|
|
19
19
|
export type Runner = (node: FlowNodeModel, input: any, processor: Processor) => InstructionResult;
|
|
20
20
|
export type InstructionInterface = {
|
|
21
21
|
run: Runner;
|
|
@@ -19,6 +19,6 @@ type CalculationGroup = {
|
|
|
19
19
|
calculations?: Calculation[];
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
|
-
type Calculation = CalculationItem | CalculationGroup;
|
|
22
|
+
export type Calculation = CalculationItem | CalculationGroup;
|
|
23
23
|
export declare function logicCalculate(calculation?: Calculation): any;
|
|
24
24
|
export {};
|
|
@@ -33,21 +33,57 @@ module.exports = __toCommonJS(logicCalculate_exports);
|
|
|
33
33
|
var import_utils = require("@nocobase/utils");
|
|
34
34
|
const calculators = new import_utils.Registry();
|
|
35
35
|
function equal(a, b) {
|
|
36
|
+
if (a instanceof Date || b instanceof Date) {
|
|
37
|
+
if (typeof a === "boolean" || typeof b === "boolean" || a == null || b == null) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return new Date(a).getTime() === new Date(b).getTime();
|
|
41
|
+
}
|
|
36
42
|
return a == b;
|
|
37
43
|
}
|
|
38
44
|
function notEqual(a, b) {
|
|
45
|
+
if (a instanceof Date || b instanceof Date) {
|
|
46
|
+
if (typeof a === "boolean" || typeof b === "boolean" || a == null || b == null) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return new Date(a).getTime() !== new Date(b).getTime();
|
|
50
|
+
}
|
|
39
51
|
return a != b;
|
|
40
52
|
}
|
|
41
53
|
function gt(a, b) {
|
|
54
|
+
if (a instanceof Date || b instanceof Date) {
|
|
55
|
+
if (typeof a === "boolean" || typeof b === "boolean" || a == null || b == null) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return new Date(a).getTime() > new Date(b).getTime();
|
|
59
|
+
}
|
|
42
60
|
return a > b;
|
|
43
61
|
}
|
|
44
62
|
function gte(a, b) {
|
|
63
|
+
if (a instanceof Date || b instanceof Date) {
|
|
64
|
+
if (typeof a === "boolean" || typeof b === "boolean" || a == null || b == null) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return new Date(a).getTime() >= new Date(b).getTime();
|
|
68
|
+
}
|
|
45
69
|
return a >= b;
|
|
46
70
|
}
|
|
47
71
|
function lt(a, b) {
|
|
72
|
+
if (a instanceof Date || b instanceof Date) {
|
|
73
|
+
if (typeof a === "boolean" || typeof b === "boolean" || a == null || b == null) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return new Date(a).getTime() < new Date(b).getTime();
|
|
77
|
+
}
|
|
48
78
|
return a < b;
|
|
49
79
|
}
|
|
50
80
|
function lte(a, b) {
|
|
81
|
+
if (a instanceof Date || b instanceof Date) {
|
|
82
|
+
if (typeof a === "boolean" || typeof b === "boolean" || a == null || b == null) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return new Date(a).getTime() <= new Date(b).getTime();
|
|
86
|
+
}
|
|
51
87
|
return a <= b;
|
|
52
88
|
}
|
|
53
89
|
calculators.register("equal", equal);
|
|
@@ -69,16 +105,16 @@ function notIncludes(a, b) {
|
|
|
69
105
|
return !a.includes(b);
|
|
70
106
|
}
|
|
71
107
|
function startsWith(a, b) {
|
|
72
|
-
return a.startsWith(b);
|
|
108
|
+
return a.toString().startsWith(b.toString());
|
|
73
109
|
}
|
|
74
110
|
function notStartsWith(a, b) {
|
|
75
|
-
return !a.startsWith(b);
|
|
111
|
+
return !a.toString().startsWith(b.toString());
|
|
76
112
|
}
|
|
77
113
|
function endsWith(a, b) {
|
|
78
|
-
return a.endsWith(b);
|
|
114
|
+
return a.toString().endsWith(b.toString());
|
|
79
115
|
}
|
|
80
116
|
function notEndsWith(a, b) {
|
|
81
|
-
return !a.endsWith(b);
|
|
117
|
+
return !a.toString().endsWith(b.toString());
|
|
82
118
|
}
|
|
83
119
|
calculators.register("includes", includes);
|
|
84
120
|
calculators.register("notIncludes", notIncludes);
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
* This file is part of the NocoBase (R) project.
|
|
11
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
12
|
+
* Authors: NocoBase Team.
|
|
13
|
+
*
|
|
14
|
+
* This program is offered under a commercial license.
|
|
15
|
+
* For more information, see <https://www.nocobase.com/agreement>
|
|
16
|
+
*/
|
|
17
|
+
import { Migration } from '@nocobase/server';
|
|
18
|
+
export default class extends Migration {
|
|
19
|
+
appVersion: string;
|
|
20
|
+
up(): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var mobile_tasks_uid_exports = {};
|
|
28
|
+
__export(mobile_tasks_uid_exports, {
|
|
29
|
+
default: () => mobile_tasks_uid_default
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(mobile_tasks_uid_exports);
|
|
32
|
+
var import_server = require("@nocobase/server");
|
|
33
|
+
class mobile_tasks_uid_default extends import_server.Migration {
|
|
34
|
+
appVersion = "<1.9.0";
|
|
35
|
+
async up() {
|
|
36
|
+
const { db, app } = this.context;
|
|
37
|
+
const MobileRouteRepo = db.getRepository("mobileRoutes");
|
|
38
|
+
const route = await MobileRouteRepo.findOne({
|
|
39
|
+
filter: {
|
|
40
|
+
type: "page",
|
|
41
|
+
schemaUid: "workflow/tasks"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
if (!route) {
|
|
45
|
+
app.logger.debug(`no route found to be migrated.`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await route.update({
|
|
49
|
+
schemaUid: "workflow-tasks",
|
|
50
|
+
options: {
|
|
51
|
+
url: "/page/workflow-tasks",
|
|
52
|
+
schema: {
|
|
53
|
+
"x-component": "MobileTabBarWorkflowTasksItem"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
* This file is part of the NocoBase (R) project.
|
|
11
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
12
|
+
* Authors: NocoBase Team.
|
|
13
|
+
*
|
|
14
|
+
* This program is offered under a commercial license.
|
|
15
|
+
* For more information, see <https://www.nocobase.com/agreement>
|
|
16
|
+
*/
|
|
17
|
+
import { Migration } from '@nocobase/server';
|
|
18
|
+
export default class extends Migration {
|
|
19
|
+
appVersion: string;
|
|
20
|
+
up(): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
var execution_dispatched_exports = {};
|
|
28
|
+
__export(execution_dispatched_exports, {
|
|
29
|
+
default: () => execution_dispatched_default
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(execution_dispatched_exports);
|
|
32
|
+
var import_server = require("@nocobase/server");
|
|
33
|
+
var import_constants = require("../constants");
|
|
34
|
+
var import_sequelize = require("sequelize");
|
|
35
|
+
class execution_dispatched_default extends import_server.Migration {
|
|
36
|
+
appVersion = "<1.9.0";
|
|
37
|
+
async up() {
|
|
38
|
+
const { db, app } = this.context;
|
|
39
|
+
const ExecutionModel = db.getModel("executions");
|
|
40
|
+
await ExecutionModel.update(
|
|
41
|
+
{ dispatched: true },
|
|
42
|
+
{
|
|
43
|
+
where: {
|
|
44
|
+
status: [
|
|
45
|
+
import_constants.EXECUTION_STATUS.STARTED,
|
|
46
|
+
import_constants.EXECUTION_STATUS.RESOLVED,
|
|
47
|
+
import_constants.EXECUTION_STATUS.FAILED,
|
|
48
|
+
import_constants.EXECUTION_STATUS.ERROR,
|
|
49
|
+
import_constants.EXECUTION_STATUS.ABORTED,
|
|
50
|
+
import_constants.EXECUTION_STATUS.CANCELED,
|
|
51
|
+
import_constants.EXECUTION_STATUS.REJECTED,
|
|
52
|
+
import_constants.EXECUTION_STATUS.RETRY_NEEDED
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
await ExecutionModel.update(
|
|
58
|
+
{
|
|
59
|
+
dispatched: false
|
|
60
|
+
},
|
|
61
|
+
{ where: { status: { [import_sequelize.Op.is]: null } } }
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { Model } from '@nocobase/database';
|
|
10
10
|
import Trigger from '.';
|
|
11
11
|
import type { WorkflowModel } from '../types';
|
|
12
|
-
import type { EventOptions } from '../
|
|
12
|
+
import type { EventOptions } from '../Dispatcher';
|
|
13
13
|
export interface CollectionChangeTriggerConfig {
|
|
14
14
|
collection: string;
|
|
15
15
|
mode: number;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
-
import { Transactionable } from '@nocobase/database';
|
|
9
|
+
import { Model, Transactionable } from '@nocobase/database';
|
|
10
10
|
import type Plugin from '../../Plugin';
|
|
11
11
|
import type { WorkflowModel } from '../../types';
|
|
12
12
|
export type ScheduleOnField = {
|
|
@@ -32,10 +32,10 @@ export default class DateFieldScheduleTrigger {
|
|
|
32
32
|
constructor(workflow: Plugin);
|
|
33
33
|
reload(): void;
|
|
34
34
|
inspect(workflow: WorkflowModel): Promise<void>;
|
|
35
|
-
loadRecordsToSchedule({ id, config: { collection, limit, startsOn, repeat, endsOn }, stats }: WorkflowModel, currentDate: Date): Promise<
|
|
36
|
-
getRecordNextTime(workflow: WorkflowModel, record:
|
|
37
|
-
schedule(workflow: WorkflowModel, record:
|
|
38
|
-
trigger(workflow: WorkflowModel, record:
|
|
35
|
+
loadRecordsToSchedule({ id, config: { collection, limit, startsOn, repeat, endsOn }, stats }: WorkflowModel, currentDate: Date): Promise<Model<any, any>[]>;
|
|
36
|
+
getRecordNextTime(workflow: WorkflowModel, record: Model, nextSecond?: boolean): any;
|
|
37
|
+
schedule(workflow: WorkflowModel, record: Model, nextTime: number, toggle?: boolean, options?: {}): Promise<void>;
|
|
38
|
+
trigger(workflow: WorkflowModel, record: Model, nextTime: number, { transaction }?: Transactionable): Promise<void>;
|
|
39
39
|
on(workflow: WorkflowModel): void;
|
|
40
40
|
off(workflow: WorkflowModel): void;
|
|
41
41
|
execute(workflow: any, values: any, options: any): Promise<void | import("../..").Processor>;
|
|
@@ -45,7 +45,7 @@ var import_utils = require("./utils");
|
|
|
45
45
|
var import_data_source_manager = require("@nocobase/data-source-manager");
|
|
46
46
|
var import_lodash = require("lodash");
|
|
47
47
|
var import_utils2 = require("../../utils");
|
|
48
|
-
function getOnTimestampWithOffset({ field, offset = 0, unit =
|
|
48
|
+
function getOnTimestampWithOffset({ field, offset = 0, unit = 864e5 }, now) {
|
|
49
49
|
if (!field) {
|
|
50
50
|
return null;
|
|
51
51
|
}
|
|
@@ -62,7 +62,7 @@ function getDataOptionTime(record, on, dir = 1) {
|
|
|
62
62
|
return time ? time : null;
|
|
63
63
|
}
|
|
64
64
|
case "object": {
|
|
65
|
-
const { field, offset = 0, unit =
|
|
65
|
+
const { field, offset = 0, unit = 864e5 } = on;
|
|
66
66
|
if (!field || !record.get(field)) {
|
|
67
67
|
return null;
|
|
68
68
|
}
|
|
@@ -188,13 +188,14 @@ class DateFieldScheduleTrigger {
|
|
|
188
188
|
if (typeof repeat === "number") {
|
|
189
189
|
const tsFn = DialectTimestampFnMap[db.options.dialect];
|
|
190
190
|
if (repeat > range && tsFn) {
|
|
191
|
+
const offsetSeconds = Math.round((startsOn.offset || 0) * (startsOn.unit || 1e3) / 1e3);
|
|
192
|
+
const repeatSeconds = Math.round(repeat / 1e3);
|
|
193
|
+
const nowSeconds = Math.round(timestamp / 1e3);
|
|
191
194
|
const { field } = model.getAttributes()[startsOn.field];
|
|
192
|
-
const modExp = (0, import_database.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
),
|
|
197
|
-
Math.round(repeat / 1e3)
|
|
195
|
+
const modExp = (0, import_database.literal)(
|
|
196
|
+
`MOD(MOD(${tsFn(
|
|
197
|
+
db.sequelize.getQueryInterface().quoteIdentifiers(field)
|
|
198
|
+
)} + ${offsetSeconds} - ${nowSeconds}, ${repeatSeconds}) + ${repeatSeconds}, ${repeatSeconds})`
|
|
198
199
|
);
|
|
199
200
|
conditions.push((0, import_database.where)(modExp, { [import_database.Op.lt]: Math.round(range / 1e3) }));
|
|
200
201
|
}
|
|
@@ -241,6 +242,7 @@ class DateFieldScheduleTrigger {
|
|
|
241
242
|
if (limit && stats.executed >= limit) {
|
|
242
243
|
return null;
|
|
243
244
|
}
|
|
245
|
+
const logger = this.workflow.getLogger(workflow.id);
|
|
244
246
|
const range = this.cacheCycle;
|
|
245
247
|
const now = /* @__PURE__ */ new Date();
|
|
246
248
|
now.setMilliseconds(nextSecond ? 1e3 : 0);
|
|
@@ -249,37 +251,50 @@ class DateFieldScheduleTrigger {
|
|
|
249
251
|
const endTime = getDataOptionTime(record, endsOn);
|
|
250
252
|
let nextTime = null;
|
|
251
253
|
if (!startTime) {
|
|
254
|
+
logger.debug(`[Schedule on date field] getNextTime: startsOn not configured`);
|
|
252
255
|
return null;
|
|
253
256
|
}
|
|
254
257
|
if (startTime > timestamp + range) {
|
|
258
|
+
logger.debug(`[Schedule on date field] getNextTime: startsOn is out of caching window`);
|
|
255
259
|
return null;
|
|
256
260
|
}
|
|
257
261
|
if (startTime >= timestamp) {
|
|
258
|
-
|
|
262
|
+
if (!endTime || startTime <= endTime) {
|
|
263
|
+
return startTime;
|
|
264
|
+
}
|
|
265
|
+
logger.debug(`[Schedule on date field] getNextTime: endsOn is before startsOn or out of caching window`);
|
|
266
|
+
return null;
|
|
259
267
|
} else {
|
|
260
268
|
if (!repeat) {
|
|
269
|
+
logger.debug(
|
|
270
|
+
`[Schedule on date field] getNextTime: startsOn is before current time and repeat is not configured`
|
|
271
|
+
);
|
|
261
272
|
return null;
|
|
262
273
|
}
|
|
263
274
|
}
|
|
264
275
|
if (typeof repeat === "number") {
|
|
265
|
-
|
|
266
|
-
if (
|
|
276
|
+
nextTime = timestamp + repeat - (timestamp - startTime) % repeat;
|
|
277
|
+
if (nextTime - timestamp > range) {
|
|
278
|
+
logger.debug(`[Schedule on date field] getNextTime: nextTime (${nextTime}) is out of caching window`);
|
|
267
279
|
return null;
|
|
268
280
|
}
|
|
269
|
-
if (endTime && endTime <
|
|
281
|
+
if (endTime && endTime < nextTime) {
|
|
282
|
+
logger.debug(`[Schedule on date field] getNextTime: nextTime is after endsOn`);
|
|
270
283
|
return null;
|
|
271
284
|
}
|
|
272
|
-
nextTime = timestamp + nextRepeatTime;
|
|
273
285
|
} else if (typeof repeat === "string") {
|
|
274
286
|
nextTime = getCronNextTime(repeat, now);
|
|
275
287
|
if (nextTime - timestamp > range) {
|
|
288
|
+
logger.debug(`[Schedule on date field] getNextTime: nextTime (${nextTime}) is out of caching window`);
|
|
276
289
|
return null;
|
|
277
290
|
}
|
|
278
291
|
if (endTime && endTime < nextTime) {
|
|
292
|
+
logger.debug(`[Schedule on date field] getNextTime: nextTime is after endsOn`);
|
|
279
293
|
return null;
|
|
280
294
|
}
|
|
281
295
|
}
|
|
282
296
|
if (endTime && endTime <= timestamp) {
|
|
297
|
+
logger.debug(`[Schedule on date field] getNextTime: nextTime is after endsOn`);
|
|
283
298
|
return null;
|
|
284
299
|
}
|
|
285
300
|
return nextTime;
|
|
@@ -316,6 +331,10 @@ class DateFieldScheduleTrigger {
|
|
|
316
331
|
appends: workflow.config.appends,
|
|
317
332
|
transaction
|
|
318
333
|
});
|
|
334
|
+
if (!data) {
|
|
335
|
+
this.workflow.getLogger(workflow.id).warn(`[Schedule on date field] record (${recordPk}) not exists, will not trigger`);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
319
338
|
const eventKey = `${workflow.id}:${recordPk}@${nextTime}`;
|
|
320
339
|
this.cache.delete(eventKey);
|
|
321
340
|
const json = (0, import_utils2.toJSON)(data);
|
|
@@ -355,6 +374,7 @@ class DateFieldScheduleTrigger {
|
|
|
355
374
|
}
|
|
356
375
|
const listener = async (data, { transaction }) => {
|
|
357
376
|
const nextTime = this.getRecordNextTime(workflow, data);
|
|
377
|
+
this.workflow.getLogger().debug(`[Schedule on date field] record saved, nextTime: ${nextTime}`);
|
|
358
378
|
return this.schedule(workflow, data, nextTime, Boolean(nextTime), { transaction });
|
|
359
379
|
};
|
|
360
380
|
this.events.set(name, listener);
|
package/package.json
CHANGED
|
@@ -4,14 +4,11 @@
|
|
|
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": "1.9.0-beta.
|
|
7
|
+
"version": "1.9.0-beta.11",
|
|
8
8
|
"license": "AGPL-3.0",
|
|
9
9
|
"main": "./dist/server/index.js",
|
|
10
10
|
"homepage": "https://docs.nocobase.com/handbook/workflow",
|
|
11
11
|
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/workflow",
|
|
12
|
-
"dependencies": {
|
|
13
|
-
"@nocobase/plugin-workflow-test": "1.9.0-beta.1"
|
|
14
|
-
},
|
|
15
12
|
"devDependencies": {
|
|
16
13
|
"@ant-design/icons": "5.x",
|
|
17
14
|
"@formily/antd-v5": "1.x",
|
|
@@ -42,12 +39,13 @@
|
|
|
42
39
|
"@nocobase/plugin-error-handler": "1.x",
|
|
43
40
|
"@nocobase/plugin-mobile": "1.x",
|
|
44
41
|
"@nocobase/plugin-users": "1.x",
|
|
42
|
+
"@nocobase/plugin-workflow-test": "1.x",
|
|
45
43
|
"@nocobase/resourcer": "1.x",
|
|
46
44
|
"@nocobase/server": "1.x",
|
|
47
45
|
"@nocobase/test": "1.x",
|
|
48
46
|
"@nocobase/utils": "1.x"
|
|
49
47
|
},
|
|
50
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "373bc3f829a928bb3cd3dad327dedf3afe2ab407",
|
|
51
49
|
"keywords": [
|
|
52
50
|
"Workflow"
|
|
53
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([["610"],{7291: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(8490),d=r(2748),f=r(1784),p=r(7967),m=r(3540),v=r(7996);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})))}},2842:function(e,t,r){r.r(t),r.d(t,{WorkflowPage:function(){return G}});var n=r(3772),o=r(8156),a=r.n(o),l=r(6128),i=r(1784),c=r(3238),s=r(2721),u=r(482),d=r(3505),f=r(7584),p=r(7291),m=r(5352),v=r(6920),y=r(5680),b=r(2748),h=r(5519),w=r(5292),g=r(1113),k=r(5494),E=r(7967),x=r(3377),A=r(2072),C=r(7996);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){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 N(){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 N=function(){return r},r}function B(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 F(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 Q(){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 K(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(F,{data:{id:m},option:y})}:null)),d.newVersionId&&l("/admin/workflow/workflows/".concat(d.newVersionId)),[2]}})})()}}}function D(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 I(){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:D},o.components),scope:j({useCancelAction:n.useCancelAction,useExecuteConfirmAction:Q},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)(N())}}}:{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 V(){var e,t=(0,y.G2)(),r=t.workflow,i=t.revisions,d=(e=(0,o.useState)(!1),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),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,2)||function(e,t){if(e){if("string"==typeof e)return O(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 O(e,t)}}(e,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.")}()),f=d[0],p=d[1],g=(0,l.useNavigate)(),E=(0,c.useTranslation)().t,A=s.App.useApp().modal,S=(0,n.useApp)(),j=(0,n.useResourceContext)().resource,T=s.App.useApp().message;(0,C.RY)();var R=(0,C.U3)(),N=(0,o.useCallback)(P(function(){var e;return K(this,function(t){switch(t.label){case 0:return[4,j.revision({filterByTk:r.id,filter:{key:r.key}})];case 1:return e=t.sent().data.data,T.success(E("Operation succeeded")),g("/admin/workflow/workflows/".concat(e.id)),[2]}})}),[j,r.id,r.key,T,E,g]),F=(0,o.useCallback)(P(function(){var e;return K(this,function(t){return e=r.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)."),A.confirm({title:E("Are you sure you want to delete it?"),content:e,onOk:function(){return P(function(){var e;return K(this,function(t){switch(t.label){case 0:return[4,j.destroy({filterByTk:r.id})];case 1:return t.sent(),T.success(E("Operation succeeded")),g(r.current?S.pluginSettingsManager.getRoutePath("workflow"):(0,w.SI)(null==(e=i.find(function(e){return e.current}))?void 0:e.id)),[2]}})})()}}),[2]})}),[r,A,E,j,T,g,S.pluginSettingsManager,i]),Q=(0,o.useCallback)(function(e){switch(e.key){case"history":p(!0);return;case"revision":return N();case"delete":return F()}},[F,N]);return a().createElement(a().Fragment,null,a().createElement(s.Dropdown,{menu:{items:[{key:"key",label:"Key: ".concat(r.key),disabled:!0},{type:"divider"},{role:"button","aria-label":"history",key:"history",label:(0,b.KQ)("Execution history"),disabled:!R},{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:E("Delete")}],onClick:Q}},a().createElement(s.Button,{"aria-label":"more",type:"text",icon:a().createElement(u.EllipsisOutlined,null)})),a().createElement(n.ActionContextProvider,{value:{visible:f,setVisible:p}},a().createElement(n.SchemaComponent,{schema:h.V,components:{ExecutionResourceProvider:B,ExecutionLink:v.a,ExecutionStatusColumn:m.r},scope:{useRefreshActionProps:k.X,ExecutionStatusOptions:x.C6}})))}function z(){var e,t,r=(0,l.useNavigate)(),c=(0,n.useApp)(),d=(0,n.useResourceActionContext)(),m=d.data,v=d.refresh,h=d.loading,g=(0,n.useResourceContext)().resource,k=(0,n.useDocumentTitle)().setTitle,E=(0,i.Z)().styles,x=null!=(t=null==m?void 0:m.data)?t:{},A=x.nodes,C=void 0===A?[]:A,O=x.revisions,S=void 0===O?[]:O,j=R(x,["nodes","revisions"]);(0,w.Yc)(C),(0,o.useEffect)(function(){var e,t=(null!=(e=null==m?void 0:m.data)?e:{}).title;null==k||k("".concat((0,b.KQ)("Workflow")).concat(t?": ".concat(t):""))},[null==m?void 0:m.data,k]);var T=(0,o.useCallback)(function(e){var t=e.key;t!=j.id&&r((0,w.SI)(t))},[j.id,r]),N=(0,o.useCallback)((e=P(function(e){return K(this,function(t){switch(t.label){case 0:return[4,g.update({filterByTk:j.id,values:{enabled:e}})];case 1:return t.sent(),v(),[2]}})}),function(t){return e.apply(this,arguments)}),[g,j.id,v]);if(!(null==m?void 0:m.data))return h?a().createElement(s.Spin,null):a().createElement(s.Result,{status:"404",title:"Not found",extra:a().createElement(s.Button,{onClick:function(){return r(-1)}},(0,b.KQ)("Go back"))});var B=C.find(function(e){return!e.upstream});return a().createElement(y.iT.Provider,{value:{workflow:j,revisions:S,nodes:C,refresh:v}},a().createElement("div",{className:"workflow-toolbar"},a().createElement("header",null,a().createElement(s.Breadcrumb,{items:[{title:a().createElement(l.Link,{to:c.pluginSettingsManager.getRoutePath("workflow")},(0,b.KQ)("Workflow"))},{title:a().createElement(s.Tooltip,{title:"Key: ".concat(j.key)},a().createElement("strong",null,j.title))}]}),j.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(I,null),a().createElement(s.Dropdown,{className:"workflow-versions",trigger:["click"],menu:{onClick:T,defaultSelectedKeys:["".concat(j.id)],className:(0,n.cx)(E.dropdownClass,E.workflowVersionDropdownClass),items:S.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==j?void 0:j.id)?"#".concat(j.id):null),a().createElement(u.DownOutlined,null))),a().createElement(s.Switch,{checked:j.enabled,onChange:N,checkedChildren:(0,b.KQ)("On"),unCheckedChildren:(0,b.KQ)("Off")}),a().createElement(V,null))),a().createElement(p.g,{entry:B}))}var G=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:z}}))}}}]);
|
|
@@ -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([["158"],{6920:function(e,t,n){n.d(t,{a:function(){return a}});var o=n(8156),r=n.n(o),c=n(3238),i=n(6128),l=n(3772),u=n(5292),a=function(){var e=(0,c.useTranslation)().t,t=(0,l.useRecord)().id,n=(0,l.useActionContext)().setVisible;return r().createElement(i.Link,{to:(0,u.s_)(t),onClick:function(){return n(!1)}},e("View"))}},5352:function(e,t,n){n.d(t,{P:function(){return b},r:function(){return v}});var o=n(8156),r=n.n(o),c=n(2721),i=n(482),l=n(3238),u=n(3772),a=n(3377),s=n(2748);function p(){return(p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}function f(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},o=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),o.forEach(function(t){var o;o=n[t],t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o})}return e}function d(){var e,t,n=(e=["\n display: flex;\n "],t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}})));return d=function(){return n},n}function m(e){var t,n=(0,u.useCompile)()(e.label),o=(null!=(t=a.uy[e.value])?t:{}).color;return r().createElement(c.Tag,{color:o,closable:e.closable,onClose:e.onClose},n)}function y(e){var t=(0,u.useCompile)();return r().createElement(r().Fragment,null,r().createElement(m,e),e.description?r().createElement("span",null,t(e.description)):null)}function b(e){var t,n,o=p({},function(e){if(null==e)throw TypeError("Cannot destructure "+e);return e}(e)),i=o.multiple?"multiple":null;return r().createElement(c.Select,(t=f({role:"button","data-testid":"select-".concat(i||"single")},o),n=n={mode:i,optionLabelProp:"label",tagRender:m},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n.push.apply(n,o)}return n})(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}),t),a.C6.filter(function(e){return!!e.value&&e.value!==a.r9.ABORTED}).map(function(e){return r().createElement(c.Select.Option,f({key:e.value},e),r().createElement(y,e))}))}function v(e){var t=(0,l.useTranslation)().t,n=(0,u.useResourceActionContext)().refresh,a=(0,u.useResourceContext)().resource,p=(0,u.useRecord)(),f=(0,o.useCallback)(function(){c.Modal.confirm({title:(0,s.KQ)("Cancel the execution"),icon:r().createElement(i.ExclamationCircleFilled,null),content:(0,s.KQ)("Are you sure you want to cancel the execution?"),onOk:function(){a.cancel({filterByTk:p.id}).then(function(){c.message.success(t("Operation succeeded")),n()}).catch(function(e){console.error(e.data.error)})}})},[p]);return r().createElement("div",{className:(0,u.css)(d())},e.children,p.status?null:r().createElement(c.Tooltip,{title:(0,s.KQ)("Cancel the execution")},r().createElement(c.Button,{type:"link",danger:!0,onClick:f,shape:"circle",size:"small",icon:r().createElement(i.StopOutlined,null)})))}},5519:function(e,t,n){n.d(t,{V:function(){return b}});var o,r=n(8156),c=n.n(r),i=n(6128),l=n(3238),u=n(2721),a=n(3772),s=n(2297),p=n(3377),f=n(2748),d=n(5292);function m(e,t,n,o,r,c,i){try{var l=e[c](i),u=l.value}catch(e){n(e);return}l.done?t(u):Promise.resolve(u).then(o,r)}function y(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var b={type:"void",name:"executionHistoryDrawer",title:'{{t("Execution history", { ns: "'.concat(f.A7,'" })}}'),"x-component":"Action.Drawer",properties:{content:{type:"void","x-decorator":"ExecutionResourceProvider","x-decorator-props":{collection:s.Z,resourceName:"executions",request:{resource:"executions",action:"list",params:{appends:["workflow.id","workflow.title"],pageSize:20,sort:["-createdAt"],except:["context","output"],filter:{}}}},properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{refresher:{type:"void",title:'{{ t("Refresh") }}',"x-component":"Action","x-use-component-props":"useRefreshActionProps","x-component-props":{icon:"ReloadOutlined"}},delete:{type:"void",title:'{{t("Delete")}}',"x-component":"Action","x-component-props":{icon:"DeleteOutlined",useAction:"{{ cm.useBulkDestroyAction }}",confirm:{title:"{{t('Delete record')}}",content:"{{t('Are you sure you want to delete it?')}}"}}},clear:{type:"void",title:'{{t("Clear")}}',"x-component":"Action","x-component-props":{useAction:function(){var e=(0,l.useTranslation)().t,t=(0,a.useResourceActionContext)(),n=t.refresh,o=t.defaultRequest,r=(0,a.useResourceContext)().resource,c=(0,a.useActionContext)().setVisible;return{run:function(){var t;return(t=function(){var t;return function(e,t){var n,o,r,c,i={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return c={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function l(c){return function(l){var u=[c,l];if(n)throw TypeError("Generator is already executing.");for(;i;)try{if(n=1,o&&(r=2&u[0]?o.return:u[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,u[1])).done)return r;switch(o=0,r&&(u=[2&u[0],r.value]),u[0]){case 0:case 1:r=u;break;case 4:return i.label++,{value:u[1],done:!1};case 5:i.label++,o=u[1],u=[0];continue;case 7:u=i.ops.pop(),i.trys.pop();continue;default:if(!(r=(r=i.trys).length>0&&r[r.length-1])&&(6===u[0]||2===u[0])){i=0;continue}if(3===u[0]&&(!r||u[1]>r[0]&&u[1]<r[3])){i.label=u[1];break}if(6===u[0]&&i.label<r[1]){i.label=r[1],r=u;break}if(r&&i.label<r[2]){i.label=r[2],i.ops.push(u);break}r[2]&&i.ops.pop(),i.trys.pop();continue}u=t.call(e,i)}catch(e){u=[6,e],o=0}finally{n=r=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(i){switch(i.label){case 0:return[4,r.destroy({filter:null==(t=o.params)?void 0:t.filter})];case 1:return i.sent(),u.message.success(e("Operation succeeded")),n(),c(!1),[2]}})},function(){var e=this,n=arguments;return new Promise(function(o,r){var c=t.apply(e,n);function i(e){m(c,o,r,i,l,"next",e)}function l(e){m(c,o,r,i,l,"throw",e)}i(void 0)})})()}}},confirm:{title:'{{t("Clear all executions", { ns: "'.concat(f.A7,'" })}}'),content:'{{t("Clear executions will not reset executed count, and started executions will not be deleted, are you sure you want to delete them all?", { ns: "'.concat(f.A7,'" })}}')}}}}},table:{type:"void","x-component":"Table.Void","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox"},useDataSource:"{{ cm.useDataSourceFromRAC }}"},properties:{id:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{id:{type:"number","x-component":"CollectionField","x-read-pretty":!0}}},createdAt:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{createdAt:{type:"string","x-component":"CollectionField","x-component-props":{showTime:!0},"x-read-pretty":!0}}},workflowId:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{t("Version", { ns: "'.concat(f.A7,'" })}}'),properties:{workflowId:(y(o={type:"number"},"x-component",function(e){var t=e.value,n=(0,a.useActionContext)().setVisible;return c().createElement(i.Link,{to:(0,d.SI)(t),onClick:function(){return n(!1)}},"#".concat(t))}),y(o,"x-read-pretty",!0),o)}},status:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{t("Status", { ns: "'.concat(f.A7,'" })}}'),properties:{status:{type:"number","x-decorator":"ExecutionStatusColumn","x-component":"CollectionField","x-read-pretty":!0}}},actions:{type:"void",title:'{{ t("Actions") }}',"x-component":"Table.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{link:{type:"void","x-component":"ExecutionLink"},delete:{type:"void",title:'{{ t("Delete") }}',"x-component":"Action.Link","x-component-props":{confirm:{title:"{{t('Delete record')}}",content:"{{t('Are you sure you want to delete it?')}}"},useAction:"{{ cm.useDestroyActionAndRefreshCM }}"},"x-reactions":[{dependencies:["..status"],fulfill:{state:{visible:"{{ $deps[0] !== ".concat(p.r9.STARTED," }}")}}}]}}}}}}}}}}}},5494:function(e,t,n){n.d(t,{X:function(){return c}});var o=n(3772);function r(e,t,n,o,r,c,i){try{var l=e[c](i),u=l.value}catch(e){n(e);return}l.done?t(u):Promise.resolve(u).then(o,r)}function c(){var e=(0,o.useResourceActionContext)();return{onClick:function(){var t;return(t=function(){var t;return function(e,t){var n,o,r,c,i={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return c={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function l(c){return function(l){var u=[c,l];if(n)throw TypeError("Generator is already executing.");for(;i;)try{if(n=1,o&&(r=2&u[0]?o.return:u[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,u[1])).done)return r;switch(o=0,r&&(u=[2&u[0],r.value]),u[0]){case 0:case 1:r=u;break;case 4:return i.label++,{value:u[1],done:!1};case 5:i.label++,o=u[1],u=[0];continue;case 7:u=i.ops.pop(),i.trys.pop();continue;default:if(!(r=(r=i.trys).length>0&&r[r.length-1])&&(6===u[0]||2===u[0])){i=0;continue}if(3===u[0]&&(!r||u[1]>r[0]&&u[1]<r[3])){i.label=u[1];break}if(6===u[0]&&i.label<r[1]){i.label=r[1],r=u;break}if(r&&i.label<r[2]){i.label=r[2],i.ops.push(u);break}r[2]&&i.ops.pop(),i.trys.pop();continue}u=t.call(e,i)}catch(e){u=[6,e],o=0}finally{n=r=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(n){return null==e||null==(t=e.refresh)||t.call(e),[2]})},function(){var e=this,n=arguments;return new Promise(function(o,c){var i=t.apply(e,n);function l(e){r(i,o,c,l,u,"next",e)}function u(e){r(i,o,c,l,u,"throw",e)}l(void 0)})})()}}}}}]);
|