@nocobase/plugin-workflow 2.1.0-beta.36 → 2.1.0-beta.38

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 (71) hide show
  1. package/dist/client/618.19af7f84261c815d.js +10 -0
  2. package/dist/client/964.ffbf5b47ed12bbdc.js +10 -0
  3. package/dist/client/Branch.d.ts +7 -3
  4. package/dist/client/BranchContext.d.ts +18 -0
  5. package/dist/client/components/TimeoutInput.d.ts +11 -0
  6. package/dist/client/constants.d.ts +13 -0
  7. package/dist/client/index.js +1 -1
  8. package/dist/client/nodes/index.d.ts +2 -0
  9. package/dist/client/schemas/executions.d.ts +42 -0
  10. package/dist/client/utils.d.ts +17 -0
  11. package/dist/common/collections/executions.d.ts +42 -0
  12. package/dist/common/collections/executions.js +50 -1
  13. package/dist/common/collections/workflows.d.ts +6 -2
  14. package/dist/common/collections/workflows.js +3 -1
  15. package/dist/common/constants.d.ts +5 -0
  16. package/dist/common/constants.js +7 -0
  17. package/dist/externalVersion.js +12 -12
  18. package/dist/locale/de-DE.json +4 -0
  19. package/dist/locale/en-US.json +7 -0
  20. package/dist/locale/es-ES.json +4 -0
  21. package/dist/locale/fr-FR.json +4 -0
  22. package/dist/locale/hu-HU.json +7 -3
  23. package/dist/locale/id-ID.json +4 -0
  24. package/dist/locale/it-IT.json +4 -0
  25. package/dist/locale/ja-JP.json +5 -1
  26. package/dist/locale/ko-KR.json +4 -0
  27. package/dist/locale/nl-NL.json +7 -3
  28. package/dist/locale/pt-BR.json +4 -0
  29. package/dist/locale/ru-RU.json +4 -0
  30. package/dist/locale/tr-TR.json +4 -0
  31. package/dist/locale/uk-UA.json +7 -3
  32. package/dist/locale/vi-VN.json +7 -3
  33. package/dist/locale/zh-CN.json +8 -0
  34. package/dist/locale/zh-TW.json +7 -3
  35. package/dist/node_modules/cron-parser/package.json +1 -1
  36. package/dist/node_modules/joi/package.json +1 -1
  37. package/dist/node_modules/lru-cache/package.json +1 -1
  38. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  39. package/dist/server/Dispatcher.d.ts +9 -7
  40. package/dist/server/Dispatcher.js +190 -122
  41. package/dist/server/ExecutionTimeoutManager.d.ts +45 -0
  42. package/dist/server/ExecutionTimeoutManager.js +312 -0
  43. package/dist/server/Plugin.d.ts +12 -0
  44. package/dist/server/Plugin.js +21 -1
  45. package/dist/server/Processor.d.ts +65 -9
  46. package/dist/server/Processor.js +285 -33
  47. package/dist/server/RunningExecutionRegistry.d.ts +18 -0
  48. package/dist/server/RunningExecutionRegistry.js +48 -0
  49. package/dist/server/actions/executions.d.ts +4 -3
  50. package/dist/server/actions/executions.js +42 -21
  51. package/dist/server/actions/jobs.d.ts +2 -1
  52. package/dist/server/actions/jobs.js +28 -1
  53. package/dist/server/constants.d.ts +2 -0
  54. package/dist/server/constants.js +3 -0
  55. package/dist/server/index.d.ts +2 -0
  56. package/dist/server/index.js +2 -0
  57. package/dist/server/instructions/index.d.ts +10 -3
  58. package/dist/server/migrations/20260501120000-workflow-timeout.d.ts +13 -0
  59. package/dist/server/migrations/20260501120000-workflow-timeout.js +63 -0
  60. package/dist/server/timeout-errors.d.ts +13 -0
  61. package/dist/server/timeout-errors.js +47 -0
  62. package/dist/server/types/Execution.d.ts +6 -0
  63. package/dist/server/types/Job.d.ts +3 -3
  64. package/dist/server/types/Workflow.d.ts +6 -1
  65. package/dist/server/utils.d.ts +11 -1
  66. package/dist/server/utils.js +92 -5
  67. package/dist/swagger/index.d.ts +22 -0
  68. package/dist/swagger/index.js +22 -0
  69. package/package.json +2 -2
  70. package/dist/client/261.7722d7400942730e.js +0 -10
  71. package/dist/client/964.6251d37b35710747.js +0 -10
@@ -6,6 +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 { EXECUTION_REASON } from '../common/constants';
9
10
  export declare const EXECUTION_STATUS: {
10
11
  readonly QUEUEING: any;
11
12
  readonly STARTED: 0;
@@ -17,6 +18,7 @@ export declare const EXECUTION_STATUS: {
17
18
  readonly REJECTED: -5;
18
19
  readonly RETRY_NEEDED: -6;
19
20
  };
21
+ export { EXECUTION_REASON };
20
22
  export declare const JOB_STATUS: {
21
23
  readonly PENDING: 0;
22
24
  readonly RESOLVED: 1;
@@ -26,10 +26,12 @@ var __copyProps = (to, from, except, desc) => {
26
26
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
27
  var constants_exports = {};
28
28
  __export(constants_exports, {
29
+ EXECUTION_REASON: () => import_constants.EXECUTION_REASON,
29
30
  EXECUTION_STATUS: () => EXECUTION_STATUS,
30
31
  JOB_STATUS: () => JOB_STATUS
31
32
  });
32
33
  module.exports = __toCommonJS(constants_exports);
34
+ var import_constants = require("../common/constants");
33
35
  const EXECUTION_STATUS = {
34
36
  QUEUEING: null,
35
37
  STARTED: 0,
@@ -53,6 +55,7 @@ const JOB_STATUS = {
53
55
  };
54
56
  // Annotate the CommonJS export names for ESM import in node:
55
57
  0 && (module.exports = {
58
+ EXECUTION_REASON,
56
59
  EXECUTION_STATUS,
57
60
  JOB_STATUS
58
61
  });
@@ -11,8 +11,10 @@ export * from './constants';
11
11
  export * from './instructions';
12
12
  export * from './functions';
13
13
  export * from './logicCalculate';
14
+ export * from './timeout-errors';
14
15
  export { Trigger } from './triggers';
15
16
  export type { EventOptions } from './Dispatcher';
16
17
  export { default as Processor } from './Processor';
18
+ export type { BackgroundAbortHandle, ProcessorOptions } from './Processor';
17
19
  export { default } from './Plugin';
18
20
  export * from './types';
@@ -47,6 +47,7 @@ __reExport(server_exports, require("./constants"), module.exports);
47
47
  __reExport(server_exports, require("./instructions"), module.exports);
48
48
  __reExport(server_exports, require("./functions"), module.exports);
49
49
  __reExport(server_exports, require("./logicCalculate"), module.exports);
50
+ __reExport(server_exports, require("./timeout-errors"), module.exports);
50
51
  var import_triggers = require("./triggers");
51
52
  var import_Processor = __toESM(require("./Processor"));
52
53
  var import_Plugin = __toESM(require("./Plugin"));
@@ -60,5 +61,6 @@ __reExport(server_exports, require("./types"), module.exports);
60
61
  ...require("./instructions"),
61
62
  ...require("./functions"),
62
63
  ...require("./logicCalculate"),
64
+ ...require("./timeout-errors"),
63
65
  ...require("./types")
64
66
  });
@@ -14,6 +14,7 @@ import type { FlowNodeModel, WorkflowModel } from '../types';
14
14
  export interface IJob {
15
15
  status: number;
16
16
  result?: unknown;
17
+ log?: string;
17
18
  [key: string]: unknown;
18
19
  }
19
20
  /**
@@ -24,8 +25,11 @@ export interface IJob {
24
25
  * 2. `null` | Promise<null>: processor will do exit process.
25
26
  * 3. `void` | Promise<void>: processor will do nothing, and terminate the current execution without any action.
26
27
  */
27
- export type InstructionResult = IJob | Promise<IJob> | Promise<void> | Promise<null> | null | void;
28
- export type Runner = (node: FlowNodeModel, input: any, processor: Processor) => InstructionResult;
28
+ export type InstructionResult = IJob | null | void;
29
+ export type Runner = (node: FlowNodeModel, input: any, processor: Processor, options?: {
30
+ rerun?: true;
31
+ signal?: AbortSignal;
32
+ }) => InstructionResult | Promise<InstructionResult>;
29
33
  export type InstructionInterface = {
30
34
  run: Runner;
31
35
  resume?: Runner;
@@ -42,6 +46,9 @@ export declare abstract class Instruction implements InstructionInterface {
42
46
  configSchema?: Joi.ObjectSchema;
43
47
  constructor(workflow: Plugin);
44
48
  validateConfig(config: Record<string, any>): Record<string, string> | null;
45
- abstract run(node: FlowNodeModel, input: any, processor: Processor): InstructionResult;
49
+ abstract run(node: FlowNodeModel, input: any, processor: Processor, options?: {
50
+ rerun?: true;
51
+ signal?: AbortSignal;
52
+ }): InstructionResult | Promise<InstructionResult>;
46
53
  }
47
54
  export default Instruction;
@@ -0,0 +1,13 @@
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
+ import { Migration } from '@nocobase/server';
10
+ export default class extends Migration {
11
+ appVersion: string;
12
+ up(): Promise<void>;
13
+ }
@@ -0,0 +1,63 @@
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 workflow_timeout_exports = {};
28
+ __export(workflow_timeout_exports, {
29
+ default: () => workflow_timeout_default
30
+ });
31
+ module.exports = __toCommonJS(workflow_timeout_exports);
32
+ var import_server = require("@nocobase/server");
33
+ class workflow_timeout_default extends import_server.Migration {
34
+ appVersion = "<2.1.0-beta.26";
35
+ async up() {
36
+ const { db } = this.context;
37
+ const executionCollection = db.getCollection("executions");
38
+ const tableInfo = executionCollection.getTableNameWithSchema();
39
+ const statusColumn = executionCollection.getField("status").columnName();
40
+ const expiresAtColumn = executionCollection.getField("expiresAt").columnName();
41
+ const parentExecutionIdColumn = executionCollection.getField("parentExecutionId").columnName();
42
+ await db.sequelize.transaction(async (transaction) => {
43
+ const tableExists = await this.queryInterface.tableExists(tableInfo, { transaction });
44
+ if (!tableExists) {
45
+ return;
46
+ }
47
+ const indexes = await this.queryInterface.showIndex(tableInfo, { transaction });
48
+ const indexNames = new Set(indexes.map((index) => index.name));
49
+ if (!indexNames.has("executions_status_expires_at")) {
50
+ await this.queryInterface.addIndex(tableInfo, [statusColumn, expiresAtColumn], {
51
+ name: "executions_status_expires_at",
52
+ transaction
53
+ });
54
+ }
55
+ if (!indexNames.has("executions_parent_execution_status")) {
56
+ await this.queryInterface.addIndex(tableInfo, [parentExecutionIdColumn, statusColumn], {
57
+ name: "executions_parent_execution_status",
58
+ transaction
59
+ });
60
+ }
61
+ });
62
+ }
63
+ }
@@ -0,0 +1,13 @@
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
+ export declare class WorkflowTimeoutError extends Error {
10
+ code: string;
11
+ constructor(message?: string);
12
+ }
13
+ export declare function isWorkflowTimeoutError(error: any): boolean;
@@ -0,0 +1,47 @@
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 timeout_errors_exports = {};
28
+ __export(timeout_errors_exports, {
29
+ WorkflowTimeoutError: () => WorkflowTimeoutError,
30
+ isWorkflowTimeoutError: () => isWorkflowTimeoutError
31
+ });
32
+ module.exports = __toCommonJS(timeout_errors_exports);
33
+ class WorkflowTimeoutError extends Error {
34
+ code = "WORKFLOW_TIMEOUT";
35
+ constructor(message = "Workflow execution timed out") {
36
+ super(message);
37
+ this.name = "WorkflowTimeoutError";
38
+ }
39
+ }
40
+ function isWorkflowTimeoutError(error) {
41
+ return error instanceof WorkflowTimeoutError || (error == null ? void 0 : error.name) === "WorkflowTimeoutError" || (error == null ? void 0 : error.code) === "WORKFLOW_TIMEOUT";
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ WorkflowTimeoutError,
46
+ isWorkflowTimeoutError
47
+ });
@@ -15,7 +15,13 @@ export default class ExecutionModel extends Model {
15
15
  title: string;
16
16
  context: any;
17
17
  status: number;
18
+ reason?: string | null;
18
19
  dispatched: boolean;
20
+ parentExecutionId?: number | null;
21
+ stack?: Array<number | string>;
22
+ startedAt?: Date | null;
23
+ expiresAt?: Date | null;
24
+ output?: any;
19
25
  createdAt: Date;
20
26
  updatedAt: Date;
21
27
  key: string;
@@ -11,12 +11,12 @@ import FlowNodeModel from './FlowNode';
11
11
  export default class JobModel extends Model {
12
12
  id: number;
13
13
  status: number;
14
- result: any;
15
- meta: any;
14
+ result?: any;
15
+ meta?: any;
16
16
  createdAt: Date;
17
17
  updatedAt: Date;
18
18
  upstreamId: number;
19
- upstream: JobModel;
19
+ upstream?: JobModel;
20
20
  nodeId: number;
21
21
  node?: FlowNodeModel;
22
22
  getNode: BelongsToGetAssociationMixin<FlowNodeModel>;
@@ -19,7 +19,12 @@ export default class WorkflowModel extends Model {
19
19
  description?: string;
20
20
  type: string;
21
21
  config: any;
22
- options: any;
22
+ options: {
23
+ timeout?: number;
24
+ stackLimit?: number;
25
+ deleteExecutionOnStatus?: number[];
26
+ [key: string]: any;
27
+ };
23
28
  sync: boolean;
24
29
  createdAt: Date;
25
30
  updatedAt: Date;
@@ -6,9 +6,17 @@
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
10
  import type { DataSourceManager } from '@nocobase/data-source-manager';
10
- import type { WorkflowModel } from './types';
11
+ import type PluginWorkflowServer from './Plugin';
12
+ import { EXECUTION_REASON } from './constants';
13
+ import type { ExecutionModel, WorkflowModel } from './types';
11
14
  import Processor from './Processor';
15
+ type AbortOptions = Transactionable & {
16
+ reason?: (typeof EXECUTION_REASON)[keyof typeof EXECUTION_REASON];
17
+ };
18
+ export declare function getExecutionLockKey(executionId: number | string): string;
19
+ export declare function isLockAcquireError(error: unknown): boolean;
12
20
  export declare function validateCollectionField(collection: string, dataSourceManager: DataSourceManager): Record<string, string> | null;
13
21
  export declare function getExecutionStatusName(status: number | null | undefined): string;
14
22
  export declare function getWorkflowExecutionLogMeta(workflow: WorkflowModel, processor?: Processor): {
@@ -23,4 +31,6 @@ export declare function getWorkflowExecutionLogMeta(workflow: WorkflowModel, pro
23
31
  lastJobId: number;
24
32
  lastJobStatus: number;
25
33
  };
34
+ export declare function abortExecution(plugin: PluginWorkflowServer, execution: ExecutionModel, options?: AbortOptions): Promise<boolean>;
26
35
  export declare function toJSON(data: any): any;
36
+ export {};
@@ -26,8 +26,11 @@ var __copyProps = (to, from, except, desc) => {
26
26
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
27
  var utils_exports = {};
28
28
  __export(utils_exports, {
29
+ abortExecution: () => abortExecution,
30
+ getExecutionLockKey: () => getExecutionLockKey,
29
31
  getExecutionStatusName: () => getExecutionStatusName,
30
32
  getWorkflowExecutionLogMeta: () => getWorkflowExecutionLogMeta,
33
+ isLockAcquireError: () => isLockAcquireError,
31
34
  toJSON: () => toJSON,
32
35
  validateCollectionField: () => validateCollectionField
33
36
  });
@@ -35,13 +38,23 @@ module.exports = __toCommonJS(utils_exports);
35
38
  var import_database = require("@nocobase/database");
36
39
  var import_data_source_manager = require("@nocobase/data-source-manager");
37
40
  var import_constants = require("./constants");
41
+ function getExecutionLockKey(executionId) {
42
+ return `workflow:execution:${executionId}`;
43
+ }
44
+ function isLockAcquireError(error) {
45
+ return error instanceof Error && error.constructor.name === "LockAcquireError";
46
+ }
47
+ function afterTransactionCommit(transaction, callback) {
48
+ if (typeof transaction.afterCommit === "function") {
49
+ transaction.afterCommit(callback);
50
+ return;
51
+ }
52
+ callback();
53
+ }
38
54
  function validateCollectionField(collection, dataSourceManager) {
39
55
  const [dataSourceName, collectionName] = (0, import_data_source_manager.parseCollectionName)(collection);
40
- if (collection.includes(":")) {
41
- const parts = collection.split(":");
42
- if (parts.length !== 2 || !parts[0] || !parts[1]) {
43
- return { collection: `"collection" must be in the format "dataSourceName:collectionName"` };
44
- }
56
+ if (!dataSourceName || !collectionName) {
57
+ return { collection: `"collection" must be in the format "dataSourceName:collectionName"` };
45
58
  }
46
59
  const dataSource = dataSourceManager.dataSources.get(dataSourceName);
47
60
  if (!dataSource) {
@@ -76,6 +89,77 @@ function getWorkflowExecutionLogMeta(workflow, processor) {
76
89
  lastJobStatus: (lastSavedJob == null ? void 0 : lastSavedJob.status) ?? null
77
90
  };
78
91
  }
92
+ async function abortExecution(plugin, execution, options = {}) {
93
+ const logger = plugin.getLogger(execution.workflowId);
94
+ const ownTransaction = !options.transaction;
95
+ const transaction = options.transaction ?? await plugin.useDataSourceTransaction("main", null, true);
96
+ const ExecutionRepo = plugin.db.getRepository("executions");
97
+ const JobRepo = plugin.db.getRepository("jobs");
98
+ try {
99
+ const lockedExecution = await ExecutionRepo.findOne({
100
+ filterByTk: execution.id,
101
+ transaction,
102
+ lock: transaction.LOCK.UPDATE
103
+ });
104
+ if (!lockedExecution || lockedExecution.status !== import_constants.EXECUTION_STATUS.STARTED) {
105
+ if (ownTransaction) {
106
+ await transaction.commit();
107
+ }
108
+ return false;
109
+ }
110
+ await lockedExecution.update(
111
+ {
112
+ status: import_constants.EXECUTION_STATUS.ABORTED,
113
+ ...options.reason ? {
114
+ reason: options.reason
115
+ } : {}
116
+ },
117
+ {
118
+ transaction
119
+ }
120
+ );
121
+ const updated = await JobRepo.update({
122
+ values: {
123
+ status: import_constants.JOB_STATUS.ABORTED
124
+ },
125
+ filter: {
126
+ executionId: execution.id,
127
+ status: import_constants.JOB_STATUS.PENDING
128
+ },
129
+ individualHooks: false,
130
+ transaction
131
+ });
132
+ const childExecutions = await plugin.db.getRepository("executions").find({
133
+ filter: {
134
+ parentExecutionId: execution.id,
135
+ status: import_constants.EXECUTION_STATUS.STARTED
136
+ },
137
+ transaction
138
+ });
139
+ for (const child of childExecutions) {
140
+ await abortExecution(plugin, child, { transaction, reason: import_constants.EXECUTION_REASON.PARENT_ABORTED });
141
+ }
142
+ afterTransactionCommit(transaction, () => {
143
+ execution.set("status", import_constants.EXECUTION_STATUS.ABORTED);
144
+ execution.set("reason", options.reason ?? null);
145
+ plugin.timeoutManager.clear(execution.id);
146
+ plugin.abortRunningExecution(execution.id, options.reason);
147
+ });
148
+ logger.info(`execution (${execution.id}) aborted`, {
149
+ workflowId: execution.workflowId,
150
+ pendingJobs: Array.isArray(updated) ? updated.length : updated
151
+ });
152
+ if (ownTransaction) {
153
+ await transaction.commit();
154
+ }
155
+ return true;
156
+ } catch (error) {
157
+ if (ownTransaction && !transaction.finished) {
158
+ await transaction.rollback();
159
+ }
160
+ throw error;
161
+ }
162
+ }
79
163
  function toJSON(data) {
80
164
  if (Array.isArray(data)) {
81
165
  return data.map(toJSON);
@@ -93,8 +177,11 @@ function toJSON(data) {
93
177
  }
94
178
  // Annotate the CommonJS export names for ESM import in node:
95
179
  0 && (module.exports = {
180
+ abortExecution,
181
+ getExecutionLockKey,
96
182
  getExecutionStatusName,
97
183
  getWorkflowExecutionLogMeta,
184
+ isLockAcquireError,
98
185
  toJSON,
99
186
  validateCollectionField
100
187
  });
@@ -1239,6 +1239,11 @@ declare const _default: {
1239
1239
  description: string;
1240
1240
  default: number;
1241
1241
  };
1242
+ timeout: {
1243
+ type: string;
1244
+ description: string;
1245
+ default: number;
1246
+ };
1242
1247
  };
1243
1248
  };
1244
1249
  categories: {
@@ -1386,6 +1391,23 @@ declare const _default: {
1386
1391
  type: string;
1387
1392
  description: string;
1388
1393
  };
1394
+ parentExecutionId: {
1395
+ type: string;
1396
+ nullable: boolean;
1397
+ description: string;
1398
+ };
1399
+ startedAt: {
1400
+ type: string;
1401
+ format: string;
1402
+ nullable: boolean;
1403
+ description: string;
1404
+ };
1405
+ expiresAt: {
1406
+ type: string;
1407
+ format: string;
1408
+ nullable: boolean;
1409
+ description: string;
1410
+ };
1389
1411
  jobs: {
1390
1412
  type: string;
1391
1413
  description: string;
@@ -1283,6 +1283,11 @@ var swagger_default = {
1283
1283
  type: "integer",
1284
1284
  description: "Maximum recursive trigger depth. Executions beyond this limit are skipped. Default: 1.",
1285
1285
  default: 1
1286
+ },
1287
+ timeout: {
1288
+ type: "integer",
1289
+ description: "Execution timeout in milliseconds. `0` means unlimited.",
1290
+ default: 0
1286
1291
  }
1287
1292
  }
1288
1293
  },
@@ -1440,6 +1445,23 @@ var swagger_default = {
1440
1445
  type: "object",
1441
1446
  description: "Output node results"
1442
1447
  },
1448
+ parentExecutionId: {
1449
+ type: "integer",
1450
+ nullable: true,
1451
+ description: "Direct parent execution ID when triggered by a subflow."
1452
+ },
1453
+ startedAt: {
1454
+ type: "string",
1455
+ format: "date-time",
1456
+ nullable: true,
1457
+ description: "Time when the execution really entered processor execution."
1458
+ },
1459
+ expiresAt: {
1460
+ type: "string",
1461
+ format: "date-time",
1462
+ nullable: true,
1463
+ description: "Execution timeout deadline. `null` means unlimited."
1464
+ },
1443
1465
  jobs: {
1444
1466
  type: "array",
1445
1467
  description: 'Node job results (included when `appends: ["jobs"]`)',
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description": "A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.",
7
7
  "description.zh-CN": "一个强大的 BPM 工具,为业务自动化提供基础支持,并且可任意扩展更多的触发器和节点。",
8
8
  "description.ru-RU": "Мощный инструмент BPM, обеспечивающий базовую поддержку автоматизации бизнес-процессов с возможностью неограниченного расширения триггеров и узлов.",
9
- "version": "2.1.0-beta.36",
9
+ "version": "2.1.0-beta.38",
10
10
  "license": "Apache-2.0",
11
11
  "main": "./dist/server/index.js",
12
12
  "homepage": "https://docs.nocobase.com/handbook/workflow",
@@ -49,7 +49,7 @@
49
49
  "@nocobase/test": "2.x",
50
50
  "@nocobase/utils": "2.x"
51
51
  },
52
- "gitHead": "397d45c744f6eb48b3a0cd785c87cbf1257c3513",
52
+ "gitHead": "d1c585108ff6e51c17b0b52bacb1a2d621d9c119",
53
53
  "keywords": [
54
54
  "Workflow"
55
55
  ]
@@ -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([["261"],{7924:function(e,t,r){r.r(t),r.d(t,{WorkflowPane:function(){return eb}});var o,n,i=r(9155),c=r.n(i),a=r(2059),l=r(9452),s=r(5230),u=r(3342),p=r(4421);function m(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),o.forEach(function(t){var o;o=r[t],t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o})}return e}function d(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}var f=function(e){var t,r=e.request,o=(e.filter,function(e,t){if(null==e)return{};var r,o,n,i={};if("u">typeof Reflect&&Reflect.ownKeys){for(n=0,r=Reflect.ownKeys(Object(e));n<r.length;n++)o=r[n],!(t.indexOf(o)>=0)&&Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o]);return i}if(i=function(e,t){if(null==e)return{};var r,o,n={},i=Object.getOwnPropertyNames(e);for(o=0;o<i.length;o++)r=i[o],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r]);return n}(e,t),Object.getOwnPropertySymbols)for(n=0,r=Object.getOwnPropertySymbols(e);n<r.length;n++)o=r[n],!(t.indexOf(o)>=0)&&Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o]);return i}(e,["request","filter"])),n=(0,u.useRecord)(),i=d(m({},o),{request:d(m({},r),{params:d(m({disableDefaultAppends:!0},null==r?void 0:r.params),{filter:d(m({},null==r||null==(t=r.params)?void 0:t.filter),{key:n.key})})})});return c().createElement(u.ResourceActionProvider,i)},y=r(5953),b=r(4442),v=r(6072),g=function(){var e=(0,y.useTranslation)().t,t=(0,u.useRecord)().id,r=(0,u.useActionContext)().setVisible,o=(0,u.useGetAriaLabelOfAction)("Configure").getAriaLabel;return c().createElement(b.Link,{"aria-label":o(),to:(0,v.Yz)(t),onClick:function(){return r(!1)}},e("Configure"))};function x(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,o=Array(t);r<t;r++)o[r]=e[r];return o}function h(e){var t,r,o,n=e.component,a=e.children,l=function(e,t){if(null==e)return{};var r,o,n,i={};if("u">typeof Reflect&&Reflect.ownKeys){for(n=0,r=Reflect.ownKeys(Object(e));n<r.length;n++)o=r[n],!(t.indexOf(o)>=0)&&Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o]);return i}if(i=function(e,t){if(null==e)return{};var r,o,n={},i=Object.getOwnPropertyNames(e);for(o=0;o<i.length;o++)r=i[o],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r]);return n}(e,t),Object.getOwnPropertySymbols)for(n=0,r=Object.getOwnPropertySymbols(e);n<r.length;n++)o=r[n],!(t.indexOf(o)>=0)&&Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o]);return i}(e,["component","children"]),p=function(e){if(Array.isArray(e))return e}(t=(0,i.useState)(!1))||function(e){var t,r,o=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var n=[],i=!0,c=!1;try{for(o=o.call(e);!(i=(t=o.next()).done)&&(n.push(t.value),2!==n.length);i=!0);}catch(e){c=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(c)throw r}}return n}}(t)||function(e){if(e){if("string"==typeof e)return x(e,2);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return x(e,2)}}(t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),m=p[0],d=p[1],f=(0,s.useFieldSchema)();return c().createElement(u.ActionContextProvider,{value:{visible:m,setVisible:d,fieldSchema:f}},c().createElement(void 0===n?"div":n,(r=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),o.forEach(function(t){var o;o=r[t],t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o})}return e}({},l),o=o={onClick:function(){d(!0)}},Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(o)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(o)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(o,e))}),r),a),c().createElement(u.SchemaComponent,{schema:f,onlyRenderProperties:!0}))}var O=r(3872),w=r(6481),C=r(7428),A=r(5827),S=r(2662);function P(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),o.forEach(function(t){var o;o=r[t],t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o})}return e}var j={title:{"x-component":"CollectionField","x-decorator":"FormItem"},type:{"x-decorator":"FormItem",title:'{{t("Trigger type", { ns: "'.concat(O.CU,'" })}}'),"x-component":"Select","x-component-props":{optionRender:"{{TriggerOptionRender}}",popupMatchSelectWidth:!0,listHeight:300},enum:"{{useTriggersOptions()}}",required:!0},sync:{type:"boolean",title:'{{ t("Execute mode", { ns: "'.concat(O.CU,'" }) }}'),description:'{{ t("Execute workflow asynchronously or synchronously based on trigger type, and could not be changed after created.", { ns: "'.concat(O.CU,'" }) }}'),"x-decorator":"FormItem","x-component":"SyncOptionSelect","x-component-props":{options:[{label:'{{ t("Asynchronously", { ns: "'.concat(O.CU,'" }) }}'),value:!1,tooltip:'{{ t("Will be executed in the background as a queued task.", { ns: "'.concat(O.CU,'" }) }}')},{label:'{{ t("Synchronously", { ns: "'.concat(O.CU,'" }) }}'),value:!0,tooltip:'{{ t("For user actions that require immediate feedback. Can not use asynchronous nodes in such mode, and it is not recommended to perform time-consuming operations under synchronous mode.", { ns: "'.concat(O.CU,'" }) }}')}]}},triggerPreset:{type:"void","x-component":"TriggerPresetFieldset"},enabled:{"x-component":"CollectionField","x-decorator":"FormItem"},description:{"x-component":"CollectionField","x-decorator":"FormItem"},categories:{type:"array",title:'{{ t("Category", { ns: "'.concat(O.CU,'" }) }}'),"x-decorator":"FormItem","x-component":"CollectionField","x-collection-field":"workflows.categories"},options:{type:"object","x-decorator":"FormItem","x-component":"Fieldset",properties:{deleteExecutionOnStatus:{type:"array",title:'{{ t("Auto delete history when execution is on end status", { ns: "'.concat(O.CU,'" }) }}'),"x-decorator":"FormItem","x-component":"Select","x-component-props":{multiple:!0,optionRender:S.Qg,tagRender:S.lP},enum:C.$A.filter(function(e){return!!e.value})},stackLimit:{type:"number",title:'{{ t("Maximum number of cycling triggers", { ns: "'.concat(O.CU,'" }) }}'),description:'{{ t("The triggers of same workflow by some node (create, update and sub-flow etc.) more than this number will be ignored. Large number may cause performance issues. Please use with caution.", { ns: "'.concat(O.CU,'" }) }}'),"x-decorator":"FormItem",default:1,"x-component":"InputNumber","x-component-props":{min:1,precision:0,className:"auto-width"}}}}},E={name:"workflow",type:"void",properties:{provider:{type:"void","x-decorator":"ResourceActionProvider","x-decorator-props":{collection:A.A,resourceName:"workflows",request:{resource:"workflows",action:"list",params:{filter:{current:!0},sort:["-createdAt"],except:["config"]}}},"x-component":"CategoryTabs",properties:{main:{type:"void","x-component":"CardItem",properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{filter:{type:"void",title:'{{ t("Filter") }}',default:{$and:[{title:{$includes:""}}]},"x-action":"filter","x-component":"Filter.Action","x-use-component-props":"useResourceFilterActionProps","x-component-props":{icon:"FilterOutlined",nonfilterable:["id","description","categories"]},"x-align":"left"},refresher:{type:"void",title:'{{ t("Refresh") }}',"x-component":"Action","x-use-component-props":"useRefreshActionProps","x-component-props":{icon:"ReloadOutlined"}},sync:{type:"void",title:'{{t("Sync", { ns: "'.concat(O.CU,'" })}}'),"x-decorator":"Tooltip","x-decorator-props":{title:'{{ t("Sync enabled status of all workflows from database", { ns: "'.concat(O.CU,'" }) }}')},"x-component":"Action","x-component-props":{icon:"SyncOutlined",useAction:"{{ useSyncAction }}"},"x-reactions":["{{useWorkflowSyncReaction}}"]},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?')}}"}}},create:{type:"void",title:'{{t("Add new")}}',"x-component":"Action","x-component-props":{type:"primary",icon:"PlusOutlined"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form","x-decorator-props":{initialValue:{current:!0}},title:'{{t("Add new")}}',properties:{title:j.title,type:j.type,triggerPreset:j.triggerPreset,sync:j.sync,categories:j.categories,description:j.description,options:j.options,footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{ t("Cancel") }}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{ t("Submit") }}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useCreateAction }}"}}}}}}}}}},table:{type:"array","x-component":"Table.Void","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox"},useDataSource:"{{cm.useDataSourceFromRAC }}"},properties:{title:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{ t("Title") }}',properties:{title:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},categories:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{ t("Category", { ns: "'.concat(O.CU,'" }) }}'),properties:{categories:{type:"array","x-component":"EnumerationField","x-component-props":{multiple:!0,fieldNames:{label:"title",value:"id",color:"color"}}}}},type:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{ t("Trigger type", { ns: "'.concat(O.CU,'" }) }}'),properties:{type:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},sync:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{ t("Execute mode", { ns: "'.concat(O.CU,'" }) }}'),properties:{sync:{type:"boolean","x-component":"CollectionField","x-read-pretty":!0}}},enabled:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{ t("Enabled", { ns: "'.concat(O.CU,'" }) }}'),properties:{enabled:{type:"boolean","x-component":"WorkflowEnabledSwitch",default:!1}}},"stats.executed":{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{ t("Executed", { ns: "'.concat(O.CU,'" }) }}'),properties:{"stats.executed":{type:"number","x-decorator":"OpenDrawer","x-decorator-props":{component:function(e){var t=(0,u.useCollectionRecordData)();return c().createElement("a",P({"aria-label":"executed-".concat(t.title)},e))}},"x-component":"InputNumber","x-read-pretty":!0,properties:{drawer:w.M}}}},actions:{type:"void",title:'{{ t("Actions") }}',"x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{configure:{type:"void","x-component":"WorkflowLink"},update:{type:"void",title:'{{ t("Edit") }}',"x-component":"Action.Link","x-component-props":{type:"primary"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form","x-decorator-props":{useValues:"{{ cm.useValuesFromRecord }}"},title:'{{ t("Edit") }}',properties:{title:j.title,type:(o=P({},j.type),n=n={"x-disabled":!0},Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(n)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(n)).forEach(function(e){Object.defineProperty(o,e,Object.getOwnPropertyDescriptor(n,e))}),o),sync:j.sync,categories:j.categories,description:j.description,options:j.options,footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{ t("Cancel") }}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{ t("Submit") }}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useUpdateAction }}"}}}}}}}},revision:{type:"void",title:'{{t("Duplicate", { ns: "'.concat(O.CU,'" })}}'),"x-component":"Action.Link","x-component-props":{openSize:"small"},properties:{modal:{type:"void",title:'{{t("Duplicate to new workflow", { ns: "'.concat(O.CU,'" })}}'),"x-decorator":"FormV2","x-component":"Action.Modal",properties:{title:{type:"string",title:'{{t("Title")}}',"x-decorator":"FormItem","x-component":"Input"},footer:{type:"void","x-component":"Action.Modal.Footer",properties:{submit:{type:"void",title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useRevisionAction }}"}},cancel:{type:"void",title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}}}}}}}},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 }}"}}}}}}}}}}}}}},k=r(5324),F=r(9603),T=r(512);function D(e){var t=e.data,r=t.label,o=t.color,n=t.options,i=(0,u.useCompile)();return c().createElement(a.Space,{direction:"vertical"},c().createElement(a.Tag,{color:o},i(r)),c().createElement(a.Typography.Text,{type:"secondary",style:{whiteSpace:"normal"}},i(n.description)))}var I=r(7375),R=r(6799),U=r(166),V=r(6773);function M(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,o=Array(t);r<t;r++)o[r]=e[r];return o}function N(e,t,r,o,n,i,c){try{var a=e[i](c),l=a.value}catch(e){r(e);return}a.done?t(l):Promise.resolve(l).then(o,n)}function q(e){return function(){var t=this,r=arguments;return new Promise(function(o,n){var i=e.apply(t,r);function c(e){N(i,o,n,c,a,"next",e)}function a(e){N(i,o,n,c,a,"throw",e)}c(void 0)})}}function L(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),o.forEach(function(t){var o;o=r[t],t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o})}return e}function B(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function W(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,o,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return M(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return M(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $(e,t){var r,o,n,i={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(c,"next",{value:l(0)}),a(c,"throw",{value:l(1)}),a(c,"return",{value:l(2)}),"function"==typeof Symbol&&a(c,Symbol.iterator,{value:function(){return this}}),c;function l(a){return function(l){var s=[a,l];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,s[0]&&(i=0)),i;)try{if(r=1,o&&(n=2&s[0]?o.return:s[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,s[1])).done)return n;switch(o=0,n&&(s=[2&s[0],n.value]),s[0]){case 0:case 1:n=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(n=(n=i.trys).length>0&&n[n.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1]<n[3])){i.label=s[1];break}if(6===s[0]&&i.label<n[1]){i.label=n[1],n=s;break}if(n&&i.label<n[2]){i.label=n[2],i.ops.push(s);break}n[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],o=0}finally{r=n=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}function z(){var e,t,r=(e=["\n .ant-tabs-nav-list > :first-child {\n border: none;\n }\n "],t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}})));return z=function(){return r},r}function K(e){var t=(0,R.useDraggable)({id:e.id,data:e.data}),r=t.attributes,o=t.listeners,n=t.setNodeRef;return c().createElement("div",L({ref:n},o,r),c().createElement("div",null,e.children))}function _(e){var t=(0,R.useDroppable)({id:e.id,data:e.data}),r=t.isOver,o=t.setNodeRef;return c().createElement("div",{ref:o,style:r?{color:"green"}:void 0},e.children)}var G=(0,s.observer)(function(e){var t=e.item;return c().createElement(_,{id:t.id.toString(),data:t},c().createElement("div",null,c().createElement(K,{id:t.id.toString(),data:t},c().createElement(H,{item:t}))))},{displayName:"TabTitle"}),H=function(e){var t=e.item,r=(0,y.useTranslation)().t,o=(0,u.useCompile)();return c().createElement(a.Space,null,c().createElement(a.Badge,{color:t.color}),r(o(t.title)))},Q=(0,s.observer)(function(e){var t=W((0,i.useState)(null),2),r=t[0],o=t[1],n=(0,i.useContext)(Y).refresh,a=(0,u.useAPIClient)(),l=(0,R.useSensor)(R.MouseSensor,{activationConstraint:{distance:10}}),s=(0,R.useSensors)(l);return c().createElement(R.DndContext,{sensors:s,onDragEnd:function(e){return q(function(){var t,r;return $(this,function(i){switch(i.label){case 0:if(t=e.active,r=e.over,setTimeout(function(){o(null)}),!(r&&r.id!==t.id))return[3,2];return[4,a.resource("workflowCategories").move({sourceId:t.id,targetId:r.id})];case 1:i.sent(),n(),i.label=2;case 2:return[2]}})})()},onDragStart:function(e){var t;o(null==(t=e.active)?void 0:t.data.current)}},e.children,c().createElement(R.DragOverlay,null,r?c().createElement("span",{style:{whiteSpace:"nowrap"}},c().createElement(H,{item:r})):null))},{displayName:"DndProvider"}),Y=(0,i.createContext)({});function J(e){var t=e.values,r=e.onEdit,o=e.onRemove,n=(0,u.useCompile)(),l=(0,i.useCallback)(function(e){switch(e.key){case"edit":r(t);break;case"delete":o(t.id)}},[r,o,t]);return c().createElement(a.Dropdown,{menu:{items:[{key:"edit",label:(0,O.vV)("Edit category")},{key:"delete",label:(0,O.vV)("Delete category")}],onClick:l}},c().createElement(I.MenuOutlined,{role:"button","aria-label":n(t.title),style:{padding:8,margin:"-8px"}}))}function X(){var e,t=(0,u.useResourceActionContext)(),r=t.run,o=t.setState,n=t.defaultRequest,p=W((0,i.useState)({tab:"all"}),2),m=p[0],d=p[1],f=W((0,i.useState)(m.tab),2),y=f[0],b=f[1],v=(0,u.useCompile)(),g=(0,u.useAPIClient)(),x=(0,s.useFieldSchema)(),h=a.App.useApp().modal,w=(0,u.useRequest)({resource:"workflowCategories",action:"list",params:{paginate:!1,sort:["sort"]}}),C=w.data,A=w.refresh,S=W((0,i.useState)(!1),2),P=S[0],j=S[1],E=(0,i.useMemo)(function(){return(0,l.createForm)()},[]),k=(0,i.useCallback)(function(e){j(!0);var t=(0,V.cloneDeep)(e);E.setValues(t)},[E]),F=(0,i.useCallback)(function(){j(!1),E.reset()},[E]),T=(0,i.useCallback)(function(e){h.confirm({title:v("{{t('Delete category')}}"),content:v("{{t('Are you sure you want to delete it?')}}"),onOk:function(){return q(function(){return $(this,function(t){switch(t.label){case 0:return[4,g.resource("workflowCategories").destroy({filter:{id:e}})];case 1:return t.sent(),e===+m.tab&&d({tab:"all"}),A(),r(),[2]}})})()}})},[m.tab]),D=(0,i.useMemo)(function(){if(!(null==C?void 0:C.data))return[];var e=C.data.sort(function(e,t){return e.sort-t.sort}).concat().map(function(e){return B(L({},e),{schema:x.properties.main})});return e.find(function(e){return"all"===e.id})||e.unshift({title:'{{t("All", { ns: "'.concat(O.CU,'" })}}'),id:"all",sort:0,closable:!1,schema:x.properties.main}),e.map(function(e){return{label:"all"!==e.id?c().createElement("div",{"data-no-dnd":"true"},c().createElement(G,{item:e})):v(e.title),key:String(e.id),closable:e.closable,closeIcon:c().createElement(J,{values:e,onEdit:k,onRemove:T}),children:c().createElement(a.Card,{variant:"borderless",style:{borderRadius:"0 0.5em 0.5em 0.5em"}},c().createElement(s.RecursionField,{name:y,schema:e.schema,onlyRenderProperties:!0}))}})},[v,null==C?void 0:C.data,y,k,T,x.properties.main]),I=(0,i.useCallback)(function(e){if(d({tab:e}),b((0,U.uid)()),"all"!==e){var t,i={$and:[null==n||null==(t=n.params)?void 0:t.filter,{"categories.id":e}]};r({filter:i}),null==o||o({categories:[+e],params:[{filter:i}]})}else r(),null==o||o({categories:[],params:[]})},[null==n||null==(e=n.params)?void 0:e.filter,r,o]);return((0,i.useEffect)(function(){"all"!==m.tab&&I(m.tab)},[m.tab,I]),C)?c().createElement(Y.Provider,{value:{refresh:A}},c().createElement(Q,null,c().createElement(a.Tabs,{addIcon:c().createElement(u.SchemaComponent,{components:{AddCategory:er},schema:{type:"void",properties:{addCategories:{type:"void",title:'{{ t("Add category", { ns: "'.concat(O.CU,'" }) }}'),"x-component":"AddCategory","x-component-props":{type:"primary"}}}}}),onChange:I,defaultActiveKey:m.tab||"all",type:"editable-card",destroyInactiveTabPane:!0,tabBarStyle:{marginBottom:"0px"},className:(0,u.css)(z()),items:D})),c().createElement(u.ActionContextProvider,{value:{visible:P,setVisible:F,openSize:"small"}},c().createElement(u.SchemaComponent,{scope:{useFormProviderProps:ee,useCancelAction:u.useCancelAction,useEditSubmit:Z},schema:{name:(0,U.uid)(),type:"void","x-decorator":"FormV2","x-decorator-props":{form:E},title:'{{ t("Edit category", { ns: "'.concat(O.CU,'" }) }}'),"x-component":"Action.Modal","x-component-props":{delay:0},properties:{title:{type:"string",title:'{{t("Title")}}',required:!0,"x-decorator":"FormItem","x-component":"Input"},color:{type:"string",title:'{{t("Color")}}',required:!1,"x-decorator":"FormItem","x-component":"ColorSelect"},footer:{type:"void","x-component":"Action.Modal.Footer",properties:{cancel:{title:'{{ t("Cancel") }}',"x-component":"Action","x-component-props":{useAction:"{{ useCancelAction }}"}},submit:{title:'{{ t("Submit") }}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useEditSubmit }}",style:{marginLeft:"8px"}}}}}}}}))):null}function Z(){var e=(0,s.useForm)(),t=(0,u.useActionContext)(),r=(0,u.useResourceActionContext)(),o=(0,i.useContext)(Y).refresh,n=(0,u.useAPIClient)();return{run:function(){return q(function(){var i;return $(this,function(c){switch(c.label){case 0:return[4,e.submit()];case 1:return c.sent(),[4,n.resource("workflowCategories").update({filterByTk:null==(i=e.values)?void 0:i.id,values:e.values})];case 2:return c.sent(),t.setVisible(!1),[4,e.reset()];case 3:return c.sent(),null==o||o(),null==r||r.refresh(),[2]}})})()}}}function ee(){return{form:(0,s.useForm)()}}function et(){var e=(0,s.useForm)(),t=(0,u.useActionContext)().setVisible,r=(0,i.useContext)(Y).refresh,o=(0,u.useAPIClient)();return{run:function(){return q(function(){var n;return $(this,function(i){switch(i.label){case 0:return[4,e.submit()];case 1:return i.sent(),n=(0,V.cloneDeep)(e.values),[4,o.resource("workflowCategories").create({values:n})];case 2:return i.sent(),t(!1),e.reset(),r(),[2]}})})()}}}function er(e){var t=W((0,i.useState)(!1),2),r=t[0],o=t[1],n=(0,y.useTranslation)().t,a=(0,i.useMemo)(function(){return(0,l.createForm)()},[]);return c().createElement(u.ActionContextProvider,{value:{visible:r,setVisible:o,openSize:"small"}},c().createElement("div",{onClick:function(){return o(!0)},title:n("Add category")},c().createElement(I.PlusOutlined,null)),c().createElement(u.SchemaComponent,{schema:{name:"modal",type:"void","x-decorator":"FormV2","x-decorator-props":{form:a},title:'{{ t("Add category") }}',"x-component":"Action.Modal","x-component-props":B(L({},e),{delay:0}),properties:{title:{type:"string",title:'{{t("Title")}}',required:!0,"x-decorator":"FormItem","x-component":"Input"},color:{type:"string",title:'{{t("Color")}}',required:!1,"x-decorator":"FormItem","x-component":"ColorSelect"},footer:{type:"void","x-component":"Action.Modal.Footer",properties:{cancel:{title:'{{ t("Cancel") }}',"x-component":"Action","x-component-props":{useAction:"{{ useCancelAction }}"}},submit:{title:'{{ t("Submit") }}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useCreateSubmit }}",style:{marginLeft:"8px"}}}}}}},scope:{useCancelAction:u.useCancelAction,useCreateSubmit:et}}))}function eo(e){var t=e.value,r=e.multiple,o=e.fieldNames,n=void 0===o?u.defaultFieldNames:o,i=(0,u.useCompile)();return(r?null!=t?t:[]:t?[t]:[]).map(function(e){return c().createElement(a.Tag,{key:e[n.value],color:e[n.color]},i(e[n.label]))})}var en=r(2815);function ei(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,o=Array(t);r<t;r++)o[r]=e[r];return o}function ec(e,t,r,o,n,i,c){try{var a=e[i](c),l=a.value}catch(e){r(e);return}a.done?t(l):Promise.resolve(l).then(o,n)}function ea(e){return function(){var t=this,r=arguments;return new Promise(function(o,n){var i=e.apply(t,r);function c(e){ec(i,o,n,c,a,"next",e)}function a(e){ec(i,o,n,c,a,"throw",e)}c(void 0)})}}function el(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,o,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i=[],c=!0,a=!1;try{for(n=n.call(e);!(c=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==n.return||n.return()}finally{if(a)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return ei(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return ei(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function es(e,t){var r,o,n,i={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]},c=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(c,"next",{value:l(0)}),a(c,"throw",{value:l(1)}),a(c,"return",{value:l(2)}),"function"==typeof Symbol&&a(c,Symbol.iterator,{value:function(){return this}}),c;function l(a){return function(l){var s=[a,l];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,s[0]&&(i=0)),i;)try{if(r=1,o&&(n=2&s[0]?o.return:s[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,s[1])).done)return n;switch(o=0,n&&(s=[2&s[0],n.value]),s[0]){case 0:case 1:n=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(n=(n=i.trys).length>0&&n[n.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1]<n[3])){i.label=s[1];break}if(6===s[0]&&i.label<n[1]){i.label=n[1],n=s;break}if(n&&i.label<n[2]){i.label=n[2],i.ops.push(s);break}n[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],o=0}finally{r=n=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}function eu(e){var t=(0,s.useField)(),r=(0,u.useRecord)(),o=(0,u.usePlugin)(k.default);return(0,s.useFormEffects)(function(e){(0,l.onFieldChange)("type",function(e){var n=r.id||!e.value;if(e.value){var i=o.triggers.get(e.value);null!=i.sync?(n=!0,t.setValue(i.sync)):t.setInitialValue(!1)}t.setPattern(n?"disabled":"editable")})}),(0,i.useEffect)(function(){if(r.id){t.setPattern("disabled");var n,i=o.triggers.get(r.type);null!=i.sync?t.setValue(i.sync):t.setInitialValue(null!=(n=e.value)&&n)}},[r.id,t,o.triggers,r.type,e.value]),c().createElement(F.$i,e)}function ep(e){var t=(0,u.useApp)();e.visible=!!((0,u.usePlugin)("multi-app-share-collection")||"main"!==t.name)}function em(){var e=a.App.useApp().message,t=(0,y.useTranslation)().t,r=(0,u.useResourceContext)().resource;return{run:function(){return ea(function(){return es(this,function(o){switch(o.label){case 0:return[4,r.sync()];case 1:return o.sent(),e.success(t("Operation succeeded")),[2]}})})()}}}function ed(){var e=a.App.useApp().message,t=(0,y.useTranslation)().t,r=(0,u.useResourceActionContext)().refresh,o=(0,u.useResourceContext)(),n=o.resource,i=o.targetKey,c=(0,u.useActionContext)().setVisible,l=(0,u.useRecord)()[i],p=(0,s.useForm)(),m=(0,s.useField)();return{run:function(){return ea(function(){return es(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,4,5]),[4,p.submit()];case 1:return o.sent(),m.data=m.data||{},m.data.loading=!0,[4,n.revision({filterByTk:l,values:p.values})];case 2:return o.sent(),e.success(t("Operation succeeded")),r(),c(!1),[3,5];case 3:return console.error(o.sent()),[3,5];case 4:return m.data&&(m.data.loading=!1),[7];case 5:return[2]}})})()}}}function ef(){var e=(0,u.usePlugin)(k.default),t=el((0,i.useState)(null),2),r=t[0],o=t[1],n=(0,s.useForm)();(0,s.useFormEffects)(function(){(0,l.onFieldValueChange)("type",function(e){var t;o(null!=(t=e.value)?t:null),n.clearFormGraph("config.*")})});var a=r?e.triggers.get(r):null;return(null==a?void 0:a.presetFieldset)?c().createElement(u.SchemaComponent,{key:r,components:a.components,scope:a.scope,schema:{type:"void",properties:{config:{type:"object","x-decorator":"FormItem",title:'{{t("Trigger configuration", { ns: "'.concat(O.CU,'" })}}'),"x-component":"Fieldset",properties:a.presetFieldset}}}}):null}function ey(){var e=a.App.useApp().message,t=(0,y.useTranslation)().t,r=(0,u.useRecord)(),o=(0,u.useResourceContext)().resource,n=(0,u.useResourceActionContext)().refresh,l=el((0,i.useState)(!1),2),s=l[0],p=l[1],m=(0,i.useCallback)(function(i){return ea(function(){return es(this,function(c){switch(c.label){case 0:if(!(null==r?void 0:r.id))return[2];p(!0),c.label=1;case 1:return c.trys.push([1,3,4,5]),[4,o.update({filterByTk:r.id,values:{enabled:i}})];case 2:return c.sent(),setTimeout(function(){return null==n?void 0:n()},0),[3,5];case 3:return console.error(c.sent()),e.error(t("Operation failed")),[3,5];case 4:return p(!1),[7];case 5:return[2]}})})()},[e,r,n,o,t]);return c().createElement(a.Switch,{checked:!!(null==r?void 0:r.enabled),size:"small",disabled:s||!(null==r?void 0:r.id),loading:s,onClick:function(e,t){var r;return null==t||null==(r=t.stopPropagation)?void 0:r.call(t)},onChange:m})}function eb(){var e,t,r=(0,i.useContext)(u.SchemaComponentContext),o=(0,u.usePlugin)(k.default).useTriggersOptions;return c().createElement(u.SchemaComponentContext.Provider,{value:(e=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},o=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),o.forEach(function(t){var o;o=r[t],t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o})}return e}({},r),t=t={designable:!1},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e)},c().createElement(u.SchemaComponent,{schema:E,components:{CollectionProvider:u.CollectionProvider,WorkflowLink:g,ExecutionResourceProvider:f,ExecutionLink:p.d,OpenDrawer:h,SyncOptionSelect:eu,ExecutionStatusColumn:S.t_,Tooltip:a.Tooltip,CategoryTabs:X,EnumerationField:eo,WorkflowEnabledSwitch:ey,TriggerPresetFieldset:ef},scope:{useTriggersOptions:o,useWorkflowSyncReaction:ep,useSyncAction:em,useResourceFilterActionProps:en.A,useRefreshActionProps:T.t,useRevisionAction:ed,TriggerOptionRender:D,ExecutionStatusOptions:C.$A}}))}}}]);