@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.
Files changed (50) hide show
  1. package/.env.example +6 -0
  2. package/dist/client/2a8332e23037d42f.js +10 -0
  3. package/dist/client/3b0762a72796b5f8.js +10 -0
  4. package/dist/client/9e124936e3877c66.js +10 -0
  5. package/dist/client/components/ExecutionStatus.d.ts +2 -3
  6. package/dist/client/index.js +1 -1
  7. package/dist/client/schemas/executions.d.ts +29 -7
  8. package/dist/client/variable.d.ts +1 -1
  9. package/dist/common/collections/executions.d.ts +29 -7
  10. package/dist/common/collections/executions.js +9 -3
  11. package/dist/common/collections/flow_nodes.d.ts +21 -0
  12. package/dist/common/collections/flow_nodes.js +6 -0
  13. package/dist/common/collections/userWorkflowTasks.d.ts +13 -0
  14. package/dist/common/collections/userWorkflowTasks.js +6 -0
  15. package/dist/common/collections/workflowCategories.d.ts +21 -0
  16. package/dist/common/collections/workflowCategories.js +6 -0
  17. package/dist/common/collections/workflows.d.ts +42 -0
  18. package/dist/common/collections/workflows.js +6 -0
  19. package/dist/externalVersion.js +11 -11
  20. package/dist/locale/zh-CN.json +4 -2
  21. package/dist/node_modules/cron-parser/package.json +1 -1
  22. package/dist/node_modules/lru-cache/package.json +1 -1
  23. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  24. package/dist/server/Dispatcher.d.ts +47 -1
  25. package/dist/server/Dispatcher.js +368 -1
  26. package/dist/server/Plugin.d.ts +4 -24
  27. package/dist/server/Plugin.js +22 -323
  28. package/dist/server/Processor.d.ts +4 -4
  29. package/dist/server/Processor.js +62 -18
  30. package/dist/server/actions/executions.js +2 -2
  31. package/dist/server/actions/nodes.js +12 -2
  32. package/dist/server/index.d.ts +2 -1
  33. package/dist/server/index.js +0 -2
  34. package/dist/server/instructions/ConditionInstruction.js +1 -2
  35. package/dist/server/instructions/EndInstruction.js +1 -1
  36. package/dist/server/instructions/index.d.ts +1 -1
  37. package/dist/server/logicCalculate.d.ts +1 -1
  38. package/dist/server/logicCalculate.js +40 -4
  39. package/dist/server/migrations/20250820145214-mobile-tasks-uid.d.ts +21 -0
  40. package/dist/server/migrations/20250820145214-mobile-tasks-uid.js +58 -0
  41. package/dist/server/migrations/20250826154821-execution-dispatched.d.ts +21 -0
  42. package/dist/server/migrations/20250826154821-execution-dispatched.js +64 -0
  43. package/dist/server/triggers/CollectionTrigger.d.ts +1 -1
  44. package/dist/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.d.ts +5 -5
  45. package/dist/server/triggers/ScheduleTrigger/DateFieldScheduleTrigger.js +33 -13
  46. package/dist/server/types/Execution.d.ts +1 -0
  47. package/package.json +3 -5
  48. package/dist/client/256475f279fb46d1.js +0 -10
  49. package/dist/client/69d4f948046f2ad2.js +0 -10
  50. package/dist/client/98ae71d4cff2436b.js +0 -10
@@ -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, EventOptions } from './Plugin';
17
+ export { default } from './Plugin';
17
18
  export * from './types';
@@ -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 = await processor.saveJob(job);
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
- await processor.saveJob({
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 '../Plugin';
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<import("@nocobase/database").Model<any, any>[]>;
36
- getRecordNextTime(workflow: WorkflowModel, record: any, nextSecond?: boolean): any;
37
- schedule(workflow: WorkflowModel, record: any, nextTime: any, toggle?: boolean, options?: {}): Promise<void>;
38
- trigger(workflow: WorkflowModel, record: any, nextTime: any, { transaction }?: Transactionable): Promise<void>;
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 = 1e3 }, now) {
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 = 1e3 } = on;
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.fn)(
193
- "MOD",
194
- (0, import_database.literal)(
195
- `${Math.round(timestamp / 1e3)} - ${tsFn(db.sequelize.getQueryInterface().quoteIdentifiers(field))}`
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
- return !endTime || endTime >= startTime && endTime < timestamp + range ? startTime : null;
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
- const nextRepeatTime = (startTime - timestamp) % repeat + repeat;
266
- if (nextRepeatTime > range) {
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 < timestamp + nextRepeatTime) {
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);
@@ -15,6 +15,7 @@ export default class ExecutionModel extends Model {
15
15
  title: string;
16
16
  context: any;
17
17
  status: number;
18
+ dispatched: boolean;
18
19
  createdAt: Date;
19
20
  updatedAt: Date;
20
21
  key: string;
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.1",
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": "e0597219574e23bbf15b57848cb9b0fb4953634f",
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)})})()}}}}}]);