@nocobase/plugin-workflow 2.2.0-beta.1 → 2.2.0-beta.3

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 (42) hide show
  1. package/dist/client/618.c91be3f6e4d73501.js +10 -0
  2. package/dist/client/{67.452743ce8ec30617.js → 67.61e70b8b777f8638.js} +1 -1
  3. package/dist/client/Branch.d.ts +1 -1
  4. package/dist/client/index.js +1 -1
  5. package/dist/client/style.d.ts +1 -0
  6. package/dist/client/triggers/collection.d.ts +29 -2
  7. package/dist/externalVersion.js +13 -12
  8. package/dist/locale/de-DE.json +1 -0
  9. package/dist/locale/en-US.json +4 -0
  10. package/dist/locale/es-ES.json +1 -0
  11. package/dist/locale/fr-FR.json +1 -0
  12. package/dist/locale/hu-HU.json +1 -0
  13. package/dist/locale/id-ID.json +1 -0
  14. package/dist/locale/it-IT.json +1 -0
  15. package/dist/locale/ja-JP.json +1 -0
  16. package/dist/locale/ko-KR.json +1 -0
  17. package/dist/locale/nl-NL.json +1 -0
  18. package/dist/locale/pt-BR.json +1 -0
  19. package/dist/locale/ru-RU.json +1 -0
  20. package/dist/locale/tr-TR.json +1 -0
  21. package/dist/locale/uk-UA.json +1 -0
  22. package/dist/locale/vi-VN.json +1 -0
  23. package/dist/locale/zh-CN.json +4 -0
  24. package/dist/locale/zh-TW.json +1 -0
  25. package/dist/node_modules/cron-parser/package.json +1 -1
  26. package/dist/node_modules/joi/package.json +1 -1
  27. package/dist/node_modules/lru-cache/package.json +1 -1
  28. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  29. package/dist/server/ExecutionTimeoutManager.js +2 -2
  30. package/dist/server/Processor.d.ts +16 -0
  31. package/dist/server/Processor.js +112 -0
  32. package/dist/server/actions/nodes.js +36 -1
  33. package/dist/server/index.d.ts +1 -1
  34. package/dist/server/instructions/CreateInstruction.js +6 -2
  35. package/dist/server/instructions/DestroyInstruction.js +2 -1
  36. package/dist/server/instructions/QueryInstruction.js +2 -1
  37. package/dist/server/instructions/UpdateInstruction.js +2 -1
  38. package/dist/server/triggers/CollectionTrigger.d.ts +5 -0
  39. package/dist/server/triggers/CollectionTrigger.js +26 -1
  40. package/dist/server/utils.js +19 -26
  41. package/package.json +2 -2
  42. package/dist/client/618.19af7f84261c815d.js +0 -10
@@ -78,6 +78,23 @@ function validateNode(context, workflow, values) {
78
78
  }
79
79
  }
80
80
  }
81
+ async function touchWorkflow(context, workflowId, transaction) {
82
+ var _a, _b;
83
+ const values = {
84
+ updatedAt: /* @__PURE__ */ new Date()
85
+ };
86
+ const currentUserId = (_b = (_a = context.state) == null ? void 0 : _a.currentUser) == null ? void 0 : _b.id;
87
+ if (currentUserId != null) {
88
+ values.updatedById = currentUserId;
89
+ }
90
+ await context.db.getCollection("workflows").model.update(values, {
91
+ where: {
92
+ id: workflowId
93
+ },
94
+ transaction,
95
+ hooks: false
96
+ });
97
+ }
81
98
  async function create(context, next) {
82
99
  const { db } = context;
83
100
  const repository = import_actions.utils.getRepositoryFromParams(context);
@@ -122,6 +139,7 @@ async function create(context, next) {
122
139
  await instance.setDownstream(previousHead, { transaction });
123
140
  instance.set("downstream", previousHead);
124
141
  }
142
+ await touchWorkflow(context, workflow.id, transaction);
125
143
  return instance;
126
144
  }
127
145
  const upstream = await instance.getUpstream({ transaction });
@@ -162,6 +180,7 @@ async function create(context, next) {
162
180
  }
163
181
  }
164
182
  instance.set("upstream", upstream);
183
+ await touchWorkflow(context, workflow.id, transaction);
165
184
  return instance;
166
185
  });
167
186
  await next();
@@ -233,6 +252,7 @@ async function duplicate(context, next) {
233
252
  await instance.setDownstream(previousHead, { transaction });
234
253
  instance.set("downstream", previousHead);
235
254
  }
255
+ await touchWorkflow(context, origin.workflowId, transaction);
236
256
  return instance;
237
257
  }
238
258
  const upstream = await instance.getUpstream({ transaction });
@@ -273,6 +293,7 @@ async function duplicate(context, next) {
273
293
  }
274
294
  }
275
295
  instance.set("upstream", upstream);
296
+ await touchWorkflow(context, origin.workflowId, transaction);
276
297
  return instance;
277
298
  });
278
299
  await next();
@@ -401,6 +422,7 @@ async function destroy(context, next) {
401
422
  filterByTk: [instance.id, ...branchNodesToDelete.map((item) => item.id)],
402
423
  transaction
403
424
  });
425
+ await touchWorkflow(context, instance.workflowId, transaction);
404
426
  });
405
427
  context.body = instance;
406
428
  await next();
@@ -431,6 +453,7 @@ async function destroyBranch(context, next) {
431
453
  }
432
454
  let deletedBranchHead = null;
433
455
  await db.sequelize.transaction(async (transaction) => {
456
+ let shouldTouchWorkflow = false;
434
457
  const nodes = await repository.find({
435
458
  filter: {
436
459
  workflowId: instance.workflowId
@@ -461,6 +484,7 @@ async function destroyBranch(context, next) {
461
484
  filterByTk: idsToDelete,
462
485
  transaction
463
486
  });
487
+ shouldTouchWorkflow = true;
464
488
  }
465
489
  }
466
490
  if (shift) {
@@ -475,6 +499,12 @@ async function destroyBranch(context, next) {
475
499
  )
476
500
  )
477
501
  );
502
+ if (headsToShift.length) {
503
+ shouldTouchWorkflow = true;
504
+ }
505
+ }
506
+ if (shouldTouchWorkflow) {
507
+ await touchWorkflow(context, instance.workflowId, transaction);
478
508
  }
479
509
  });
480
510
  context.body = deletedBranchHead;
@@ -579,6 +609,7 @@ async function move(context, next) {
579
609
  },
580
610
  { transaction }
581
611
  );
612
+ await touchWorkflow(context, instance.workflowId, transaction);
582
613
  return instance;
583
614
  }
584
615
  if (branchIndex == null) {
@@ -612,6 +643,7 @@ async function move(context, next) {
612
643
  },
613
644
  { transaction }
614
645
  );
646
+ await touchWorkflow(context, instance.workflowId, transaction);
615
647
  return instance;
616
648
  }
617
649
  const branchHead = await repository.findOne({
@@ -640,6 +672,7 @@ async function move(context, next) {
640
672
  },
641
673
  { transaction }
642
674
  );
675
+ await touchWorkflow(context, instance.workflowId, transaction);
643
676
  return instance;
644
677
  });
645
678
  await next();
@@ -660,7 +693,7 @@ async function update(context, next) {
660
693
  }
661
694
  const merged = Object.assign({}, instance.get(), values);
662
695
  validateNode(context, null, merged);
663
- return repository.update({
696
+ const result = await repository.update({
664
697
  filterByTk,
665
698
  values,
666
699
  whitelist,
@@ -670,6 +703,8 @@ async function update(context, next) {
670
703
  context,
671
704
  transaction
672
705
  });
706
+ await touchWorkflow(context, instance.workflowId, transaction);
707
+ return result;
673
708
  });
674
709
  await next();
675
710
  }
@@ -15,6 +15,6 @@ export * from './timeout-errors';
15
15
  export { Trigger } from './triggers';
16
16
  export type { EventOptions } from './Dispatcher';
17
17
  export { default as Processor } from './Processor';
18
- export type { BackgroundAbortHandle, ProcessorOptions } from './Processor';
18
+ export type { BackgroundAbortHandle, ProcessorOptions, ScopeTransaction } from './Processor';
19
19
  export { default } from './Plugin';
20
20
  export * from './types';
@@ -63,9 +63,13 @@ class CreateInstruction extends import__.Instruction {
63
63
  async run(node, input, processor) {
64
64
  const { collection, params: { appends = [], ...params } = {} } = node.config;
65
65
  const [dataSourceName, collectionName] = (0, import_data_source_manager.parseCollectionName)(collection);
66
- const { repository, filterTargetKey } = this.workflow.app.dataSourceManager.dataSources.get(dataSourceName).collectionManager.getCollection(collectionName);
66
+ const dataSource = this.workflow.app.dataSourceManager.dataSources.get(dataSourceName);
67
+ if (!dataSource) {
68
+ throw new Error(`Data source ${dataSourceName} not found`);
69
+ }
70
+ const { repository, filterTargetKey } = dataSource.collectionManager.getCollection(collectionName);
67
71
  const options = processor.getParsedValue(params, node.id);
68
- const transaction = this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction);
72
+ const transaction = processor.getScopeTransaction(node, dataSourceName) ?? this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction);
69
73
  const created = await repository.create({
70
74
  ...options,
71
75
  context: {
@@ -64,12 +64,13 @@ class DestroyInstruction extends import__.Instruction {
64
64
  const [dataSourceName, collectionName] = (0, import_data_source_manager.parseCollectionName)(collection);
65
65
  const { repository } = this.workflow.app.dataSourceManager.dataSources.get(dataSourceName).collectionManager.getCollection(collectionName);
66
66
  const options = processor.getParsedValue(params, node.id);
67
+ const transaction = processor.getScopeTransaction(node, dataSourceName) ?? this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction);
67
68
  const result = await repository.destroy({
68
69
  ...options,
69
70
  context: {
70
71
  stack: Array.from(new Set((processor.execution.stack ?? []).concat(processor.execution.id)))
71
72
  },
72
- transaction: this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction)
73
+ transaction
73
74
  });
74
75
  return {
75
76
  result,
@@ -78,6 +78,7 @@ class QueryInstruction extends import__.Instruction {
78
78
  return set;
79
79
  }, /* @__PURE__ */ new Set())
80
80
  ) : options.appends;
81
+ const transaction = processor.getScopeTransaction(node, dataSourceName) ?? this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction);
81
82
  const result = await (multiple ? repository.find : repository.findOne).call(repository, {
82
83
  ...options,
83
84
  ...import_actions.utils.pageArgsToLimitArgs(page ?? import_actions.DEFAULT_PAGE, pageSize ?? import_actions.DEFAULT_PER_PAGE),
@@ -86,7 +87,7 @@ class QueryInstruction extends import__.Instruction {
86
87
  return `${((_a = item.direction) == null ? void 0 : _a.toLowerCase()) === "desc" ? "-" : ""}${item.field}`;
87
88
  }),
88
89
  appends,
89
- transaction: this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction)
90
+ transaction
90
91
  });
91
92
  if (failOnEmpty && (multiple ? !result.length : !result)) {
92
93
  return {
@@ -66,12 +66,13 @@ class UpdateInstruction extends import__.Instruction {
66
66
  const [dataSourceName, collectionName] = (0, import_data_source_manager.parseCollectionName)(collection);
67
67
  const { repository } = this.workflow.app.dataSourceManager.dataSources.get(dataSourceName).collectionManager.getCollection(collectionName);
68
68
  const options = processor.getParsedValue(params, node.id);
69
+ const transaction = processor.getScopeTransaction(node, dataSourceName) ?? this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction);
69
70
  const result = await repository.update({
70
71
  ...options,
71
72
  context: {
72
73
  stack: Array.from(new Set((processor.execution.stack ?? []).concat(processor.execution.id)))
73
74
  },
74
- transaction: this.workflow.useDataSourceTransaction(dataSourceName, processor.transaction)
75
+ transaction
75
76
  });
76
77
  return {
77
78
  result: result.length ?? result,
@@ -15,6 +15,7 @@ import PluginWorkflowServer from '../Plugin';
15
15
  export interface CollectionChangeTriggerConfig {
16
16
  collection: string;
17
17
  mode: number;
18
+ rollbackOnFailure?: boolean;
18
19
  condition: any;
19
20
  }
20
21
  export default class CollectionTrigger extends Trigger {
@@ -24,6 +25,10 @@ export default class CollectionTrigger extends Trigger {
24
25
  events: Map<any, any>;
25
26
  constructor(workflow: PluginWorkflowServer);
26
27
  private static handler;
28
+ createRollbackOnFailureError(locale?: string): Error & {
29
+ status?: number;
30
+ code?: string;
31
+ };
27
32
  prepare(workflow: WorkflowModel, data: Model | Record<string, any> | string | number, options: any): Promise<{
28
33
  data: any;
29
34
  }>;
@@ -46,6 +46,7 @@ var import_database = require("@nocobase/database");
46
46
  var import_data_source_manager = require("@nocobase/data-source-manager");
47
47
  var import__ = __toESM(require("."));
48
48
  var import_utils2 = require("../utils");
49
+ var import_constants = require("../constants");
49
50
  const MODE_BITMAP = {
50
51
  CREATE: 1,
51
52
  UPDATE: 2,
@@ -96,6 +97,7 @@ class CollectionTrigger extends import__.default {
96
97
  otherwise: import_joi.default.forbidden()
97
98
  }),
98
99
  condition: import_joi.default.object(),
100
+ rollbackOnFailure: import_joi.default.boolean().optional(),
99
101
  appends: import_joi.default.when("mode", {
100
102
  is: (mode) => mode !== MODE_BITMAP.DESTROY,
101
103
  then: import_joi.default.array().items(import_joi.default.string()).optional(),
@@ -112,6 +114,7 @@ class CollectionTrigger extends import__.default {
112
114
  events = /* @__PURE__ */ new Map();
113
115
  // async function, should return promise
114
116
  static async handler(workflowId, eventType, data, options) {
117
+ var _a, _b;
115
118
  const workflow = this.workflow.enabledCache.get(workflowId);
116
119
  const { skipWorkflow = false, stack } = options.context ?? {};
117
120
  if (skipWorkflow) {
@@ -130,10 +133,25 @@ class CollectionTrigger extends import__.default {
130
133
  });
131
134
  return;
132
135
  }
133
- await this.workflow.trigger(workflow, ctx, {
136
+ const processor = await this.workflow.trigger(workflow, ctx, {
134
137
  transaction,
135
138
  stack
136
139
  });
140
+ const execution = processor ? processor.execution : null;
141
+ const lastSavedJob = processor ? processor.lastSavedJob : null;
142
+ if (workflow.config.rollbackOnFailure && (!execution || execution.status < import_constants.EXECUTION_STATUS.STARTED)) {
143
+ this.workflow.getLogger(workflow.id).error("[CollectionTrigger] source operation rolled back because sync workflow failed", {
144
+ workflowId: workflow.id,
145
+ workflowKey: workflow.key,
146
+ workflowTitle: workflow.title,
147
+ executionId: execution == null ? void 0 : execution.id,
148
+ executionStatus: execution == null ? void 0 : execution.status,
149
+ lastJobId: lastSavedJob == null ? void 0 : lastSavedJob.id,
150
+ lastJobStatus: lastSavedJob == null ? void 0 : lastSavedJob.status,
151
+ lastJobResult: lastSavedJob == null ? void 0 : lastSavedJob.result
152
+ });
153
+ throw this.createRollbackOnFailureError((_b = (_a = options.context) == null ? void 0 : _a.getCurrentLocale) == null ? void 0 : _b.call(_a));
154
+ }
137
155
  } else {
138
156
  if (transaction) {
139
157
  transaction.afterCommit(() => {
@@ -144,6 +162,13 @@ class CollectionTrigger extends import__.default {
144
162
  }
145
163
  }
146
164
  }
165
+ createRollbackOnFailureError(locale) {
166
+ const message = this.workflow.t("System process failed, please contact administrator.", locale ? { lng: locale } : {}).toString();
167
+ const error = new Error(message);
168
+ error.status = 422;
169
+ error.code = "WORKFLOW_ROLLBACK_ON_FAILURE";
170
+ return error;
171
+ }
147
172
  async prepare(workflow, data, options) {
148
173
  const { condition, changed, mode, appends } = workflow.config;
149
174
  const [dataSourceName, collectionName] = (0, import_data_source_manager.parseCollectionName)(workflow.config.collection);
@@ -95,33 +95,30 @@ async function abortExecution(plugin, execution, options = {}) {
95
95
  const ExecutionRepo = plugin.db.getRepository("executions");
96
96
  const JobRepo = plugin.db.getRepository("jobs");
97
97
  try {
98
+ if (!transaction) {
99
+ return plugin.db.sequelize.transaction(
100
+ (transaction2) => abortExecution(plugin, execution, {
101
+ ...options,
102
+ transaction: transaction2
103
+ })
104
+ );
105
+ }
98
106
  const abortValues = {
99
107
  status: import_constants.EXECUTION_STATUS.ABORTED,
100
108
  ...options.reason ? {
101
109
  reason: options.reason
102
110
  } : {}
103
111
  };
104
- if (transaction) {
105
- const lockedExecution = await ExecutionRepo.findOne({
106
- filterByTk: execution.id,
107
- transaction,
108
- lock: transaction.LOCK.UPDATE
109
- });
110
- if (!lockedExecution || lockedExecution.status !== import_constants.EXECUTION_STATUS.STARTED) {
111
- return false;
112
- }
113
- await lockedExecution.update(abortValues, { transaction });
114
- } else {
115
- const [affected] = await ExecutionRepo.model.update(abortValues, {
116
- where: {
117
- id: execution.id,
118
- status: import_constants.EXECUTION_STATUS.STARTED
119
- },
120
- individualHooks: true
121
- });
122
- if (!affected) {
123
- return false;
124
- }
112
+ const [affected] = await ExecutionRepo.model.update(abortValues, {
113
+ where: {
114
+ id: execution.id,
115
+ status: import_constants.EXECUTION_STATUS.STARTED
116
+ },
117
+ individualHooks: true,
118
+ transaction
119
+ });
120
+ if (!affected) {
121
+ return false;
125
122
  }
126
123
  const updated = await JobRepo.update({
127
124
  values: {
@@ -150,11 +147,7 @@ async function abortExecution(plugin, execution, options = {}) {
150
147
  plugin.timeoutManager.clear(execution.id);
151
148
  plugin.abortRunningExecution(execution.id, options.reason);
152
149
  };
153
- if (transaction) {
154
- afterTransactionCommit(transaction, updateLocalState);
155
- } else {
156
- updateLocalState();
157
- }
150
+ afterTransactionCommit(transaction, updateLocalState);
158
151
  logger.info(`execution (${execution.id}) aborted`, {
159
152
  workflowId: execution.workflowId,
160
153
  pendingJobs: Array.isArray(updated) ? updated.length : updated
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.2.0-beta.1",
9
+ "version": "2.2.0-beta.3",
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": "f82fa9d0c3aa8e00e53dd94e404a312483b4866b",
52
+ "gitHead": "7b16bb2cfd427c110c6671252138cd85155723c5",
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([["618"],{5705:function(e,t,r){r.r(t),r.d(t,{WorkflowPane:function(){return eO}});var n,o,i=r(9155),c=r.n(i),a=r(2059),l=r(9452),u=r(5230),s=r(3342),p=r(4421);function m(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 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,n=(e.filter,function(e,t){if(null==e)return{};var r,n,o,i={};if("u">typeof Reflect&&Reflect.ownKeys){for(o=0,r=Reflect.ownKeys(Object(e));o<r.length;o++)n=r[o],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n]);return i}if(i=function(e,t){if(null==e)return{};var r,n,o={},i=Object.getOwnPropertyNames(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r]);return o}(e,t),Object.getOwnPropertySymbols)for(o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)n=r[o],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n]);return i}(e,["request","filter"])),o=(0,s.useRecord)(),i=d(m({},n),{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:o.key})})})});return c().createElement(s.ResourceActionProvider,i)},y=r(5953),b=r(4442),v=r(6072),g=function(){var e=(0,y.useTranslation)().t,t=(0,s.useRecord)().id,r=(0,s.useActionContext)().setVisible,n=(0,s.useGetAriaLabelOfAction)("Configure").getAriaLabel;return c().createElement(b.Link,{"aria-label":n(),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,n=Array(t);r<t;r++)n[r]=e[r];return n}function h(e){var t,r,n,o=e.component,a=e.children,l=function(e,t){if(null==e)return{};var r,n,o,i={};if("u">typeof Reflect&&Reflect.ownKeys){for(o=0,r=Reflect.ownKeys(Object(e));o<r.length;o++)n=r[o],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n]);return i}if(i=function(e,t){if(null==e)return{};var r,n,o={},i=Object.getOwnPropertyNames(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r]);return o}(e,t),Object.getOwnPropertySymbols)for(o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)n=r[o],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n]);return i}(e,["component","children"]),p=function(e){if(Array.isArray(e))return e}(t=(0,i.useState)(!1))||function(e){var t,r,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o=[],i=!0,c=!1;try{for(n=n.call(e);!(i=(t=n.next()).done)&&(o.push(t.value),2!==o.length);i=!0);}catch(e){c=!0,r=e}finally{try{i||null==n.return||n.return()}finally{if(c)throw r}}return o}}(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,u.useFieldSchema)();return c().createElement(s.ActionContextProvider,{value:{visible:m,setVisible:d,fieldSchema:f}},c().createElement(void 0===o?"div":o,(r=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){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}({},l),n=n={onClick:function(){d(!0)}},Object.getOwnPropertyDescriptors?Object.defineProperties(r,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(r,e,Object.getOwnPropertyDescriptor(n,e))}),r),a),c().createElement(s.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]:{},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}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",title:'{{ t("Advance options", { ns: "'.concat(O.CU,'" }) }}'),"x-component":"Fieldset",properties:{timeout:{type:"number",title:'{{ t("Timeout settings", { ns: "'.concat(O.CU,'" }) }}'),description:'{{ t("0 means unlimited. If you set any other value and the execution is still not completed when the timeout is reached, the execution plan will be terminated and the remaining nodes will not be executed. Time spent in queue is not counted; timing starts only after it first enters a processor.", { ns: "'.concat(O.CU,'" }) }}'),"x-decorator":"FormItem","x-component":"TimeoutInput",default:0},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"}},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})}}}},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,s.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:(n=P({},j.type),o=o={"x-disabled":!0},Object.getOwnPropertyDescriptors?Object.defineProperties(n,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(n,e,Object.getOwnPropertyDescriptor(o,e))}),n),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,n=t.color,o=t.options,i=(0,s.useCompile)();return c().createElement(a.Space,{direction:"vertical"},c().createElement(a.Tag,{color:n},i(r)),c().createElement(a.Typography.Text,{type:"secondary",style:{whiteSpace:"normal"}},i(o.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,n=Array(t);r<t;r++)n[r]=e[r];return n}function N(e,t,r,n,o,i,c){try{var a=e[i](c),l=a.value}catch(e){r(e);return}a.done?t(l):Promise.resolve(l).then(n,o)}function q(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var i=e.apply(t,r);function c(e){N(i,n,o,c,a,"next",e)}function a(e){N(i,n,o,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]:{},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 $(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 B(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,o=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],c=!0,a=!1;try{for(o=o.call(e);!(c=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);c=!0);}catch(e){a=!0,n=e}finally{try{c||null==o.return||o.return()}finally{if(a)throw n}}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 W(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[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 u=[a,l];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,u[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&u[0]?n.return:u[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,u[1])).done)return o;switch(n=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return i.label++,{value:u[1],done:!1};case 5:i.label++,n=u[1],u=[0];continue;case 7:u=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){i=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){i.label=u[1];break}if(6===u[0]&&i.label<o[1]){i.label=o[1],o=u;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(u);break}o[2]&&i.ops.pop(),i.trys.pop();continue}u=t.call(e,i)}catch(e){u=[6,e],n=0}finally{r=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[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,n=t.listeners,o=t.setNodeRef;return c().createElement("div",L({ref:o},n,r),c().createElement("div",null,e.children))}function _(e){var t=(0,R.useDroppable)({id:e.id,data:e.data}),r=t.isOver,n=t.setNodeRef;return c().createElement("div",{ref:n,style:r?{color:"green"}:void 0},e.children)}var G=(0,u.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,n=(0,s.useCompile)();return c().createElement(a.Space,null,c().createElement(a.Badge,{color:t.color}),r(n(t.title)))},Q=(0,u.observer)(function(e){var t=B((0,i.useState)(null),2),r=t[0],n=t[1],o=(0,i.useContext)(Y).refresh,a=(0,s.useAPIClient)(),l=(0,R.useSensor)(R.MouseSensor,{activationConstraint:{distance:10}}),u=(0,R.useSensors)(l);return c().createElement(R.DndContext,{sensors:u,onDragEnd:function(e){return q(function(){var t,r;return W(this,function(i){switch(i.label){case 0:if(t=e.active,r=e.over,setTimeout(function(){n(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(),o(),i.label=2;case 2:return[2]}})})()},onDragStart:function(e){var t;n(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,n=e.onRemove,o=(0,s.useCompile)(),l=(0,i.useCallback)(function(e){switch(e.key){case"edit":r(t);break;case"delete":n(t.id)}},[r,n,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":o(t.title),style:{padding:8,margin:"-8px"}}))}function X(){var e,t=(0,s.useResourceActionContext)(),r=t.run,n=t.setState,o=t.defaultRequest,p=B((0,i.useState)({tab:"all"}),2),m=p[0],d=p[1],f=B((0,i.useState)(m.tab),2),y=f[0],b=f[1],v=(0,s.useCompile)(),g=(0,s.useAPIClient)(),x=(0,u.useFieldSchema)(),h=a.App.useApp().modal,w=(0,s.useRequest)({resource:"workflowCategories",action:"list",params:{paginate:!1,sort:["sort"]}}),C=w.data,A=w.refresh,S=B((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 W(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 $(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(u.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==o||null==(t=o.params)?void 0:t.filter,{"categories.id":e}]};r({filter:i}),null==n||n({categories:[+e],params:[{filter:i}]})}else r(),null==n||n({categories:[],params:[]})},[null==o||null==(e=o.params)?void 0:e.filter,r,n]);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(s.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,s.css)(z()),items:D})),c().createElement(s.ActionContextProvider,{value:{visible:P,setVisible:F,openSize:"small"}},c().createElement(s.SchemaComponent,{scope:{useFormProviderProps:ee,useCancelAction:s.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,u.useForm)(),t=(0,s.useActionContext)(),r=(0,s.useResourceActionContext)(),n=(0,i.useContext)(Y).refresh,o=(0,s.useAPIClient)();return{run:function(){return q(function(){var i;return W(this,function(c){switch(c.label){case 0:return[4,e.submit()];case 1:return c.sent(),[4,o.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==n||n(),null==r||r.refresh(),[2]}})})()}}}function ee(){return{form:(0,u.useForm)()}}function et(){var e=(0,u.useForm)(),t=(0,s.useActionContext)().setVisible,r=(0,i.useContext)(Y).refresh,n=(0,s.useAPIClient)();return{run:function(){return q(function(){var o;return W(this,function(i){switch(i.label){case 0:return[4,e.submit()];case 1:return i.sent(),o=(0,V.cloneDeep)(e.values),[4,n.resource("workflowCategories").create({values:o})];case 2:return i.sent(),t(!1),e.reset(),r(),[2]}})})()}}}function er(e){var t=B((0,i.useState)(!1),2),r=t[0],n=t[1],o=(0,y.useTranslation)().t,a=(0,i.useMemo)(function(){return(0,l.createForm)()},[]);return c().createElement(s.ActionContextProvider,{value:{visible:r,setVisible:n,openSize:"small"}},c().createElement("div",{onClick:function(){return n(!0)},title:o("Add category")},c().createElement(I.PlusOutlined,null)),c().createElement(s.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":$(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:s.useCancelAction,useCreateSubmit:et}}))}function en(e){var t=e.value,r=e.multiple,n=e.fieldNames,o=void 0===n?s.defaultFieldNames:n,i=(0,s.useCompile)();return(r?null!=t?t:[]:t?[t]:[]).map(function(e){return c().createElement(a.Tag,{key:e[o.value],color:e[o.color]},i(e[o.label]))})}var eo=r(2815);function ei(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}var ec=[{value:1e3,label:"Seconds"},{value:6e4,label:"Minutes"},{value:36e5,label:"Hours"},{value:864e5,label:"Days"}];function ea(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:15552e6;return Math.min(Math.max(e,0),t)}function el(e){var t,r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:6e4;return e&&null!=(t=null==(r=ec.findLast(function(t){return e%t.value==0}))?void 0:r.value)?t:n}var eu=(0,u.connect)(function(e){var t,r,n=ea(Number(null!=(r=e.value)?r:0)),o=function(e){if(Array.isArray(e))return e}(t=c().useState(function(){return el(n)}))||function(e){var t,r,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o=[],i=!0,c=!1;try{for(n=n.call(e);!(i=(t=n.next()).done)&&(o.push(t.value),2!==o.length);i=!0);}catch(e){c=!0,r=e}finally{try{i||null==n.return||n.return()}finally{if(c)throw r}}return o}}(t)||function(e){if(e){if("string"==typeof e)return ei(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 ei(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.")}(),i=o[0],l=o[1];c().useEffect(function(){0!==n&&l(function(e){return el(n,e)})},[n]);var u=0===n?0:n/i,s=15552e6/i;return c().createElement(a.Space.Compact,null,c().createElement(a.InputNumber,{min:0,max:s,precision:0,value:u,onChange:function(t){var r;return null==(r=e.onChange)?void 0:r.call(e,ea(Number(t)||0,s)*i)},className:"auto-width"}),c().createElement(a.Select,{value:i,options:ec.map(function(e){var t,r;return t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){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}({},e),r=r={label:(0,O.vV)(e.label)},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t.push.apply(t,r)}return t})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t}),onChange:function(t){var r,n,o=ea(Number(null!=(r=e.value)?r:0)),c=0===o?0:o/i;l(t),null==(n=e.onChange)||n.call(e,ea(c*t))},className:"auto-width"}))},(0,u.mapProps)(function(e){return e}),(0,u.mapReadPretty)(function(e){var t,r=Number(null!=(t=e.value)?t:0);if(0===r)return c().createElement(c().Fragment,null,(0,O.vV)("Unlimited"));var n=el(r),o=ec.find(function(e){return e.value===n});return c().createElement(c().Fragment,null,r/n," ",o?(0,O.vV)(o.label):"")}));function es(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 ep(e,t,r,n,o,i,c){try{var a=e[i](c),l=a.value}catch(e){r(e);return}a.done?t(l):Promise.resolve(l).then(n,o)}function em(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var i=e.apply(t,r);function c(e){ep(i,n,o,c,a,"next",e)}function a(e){ep(i,n,o,c,a,"throw",e)}c(void 0)})}}function ed(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,o=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],c=!0,a=!1;try{for(o=o.call(e);!(c=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);c=!0);}catch(e){a=!0,n=e}finally{try{c||null==o.return||o.return()}finally{if(a)throw n}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return es(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 es(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 ef(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[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 u=[a,l];if(r)throw TypeError("Generator is already executing.");for(;c&&(c=0,u[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&u[0]?n.return:u[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,u[1])).done)return o;switch(n=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return i.label++,{value:u[1],done:!1};case 5:i.label++,n=u[1],u=[0];continue;case 7:u=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){i=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){i.label=u[1];break}if(6===u[0]&&i.label<o[1]){i.label=o[1],o=u;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(u);break}o[2]&&i.ops.pop(),i.trys.pop();continue}u=t.call(e,i)}catch(e){u=[6,e],n=0}finally{r=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function ey(e){var t=(0,u.useField)(),r=(0,s.useRecord)(),n=(0,s.usePlugin)(k.default);return(0,u.useFormEffects)(function(e){(0,l.onFieldChange)("type",function(e){var o=r.id||!e.value;if(e.value){var i=n.triggers.get(e.value);null!=i.sync?(o=!0,t.setValue(i.sync)):t.setInitialValue(!1)}t.setPattern(o?"disabled":"editable")})}),(0,i.useEffect)(function(){if(r.id){t.setPattern("disabled");var o,i=n.triggers.get(r.type);null!=i.sync?t.setValue(i.sync):t.setInitialValue(null!=(o=e.value)&&o)}},[r.id,t,n.triggers,r.type,e.value]),c().createElement(F.$i,e)}function eb(e){var t=(0,s.useApp)();e.visible=!!((0,s.usePlugin)("multi-app-share-collection")||"main"!==t.name)}function ev(){var e=a.App.useApp().message,t=(0,y.useTranslation)().t,r=(0,s.useResourceContext)().resource;return{run:function(){return em(function(){return ef(this,function(n){switch(n.label){case 0:return[4,r.sync()];case 1:return n.sent(),e.success(t("Operation succeeded")),[2]}})})()}}}function eg(){var e=a.App.useApp().message,t=(0,y.useTranslation)().t,r=(0,s.useResourceActionContext)().refresh,n=(0,s.useResourceContext)(),o=n.resource,i=n.targetKey,c=(0,s.useActionContext)().setVisible,l=(0,s.useRecord)()[i],p=(0,u.useForm)(),m=(0,u.useField)();return{run:function(){return em(function(){return ef(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,4,5]),[4,p.submit()];case 1:return n.sent(),m.data=m.data||{},m.data.loading=!0,[4,o.revision({filterByTk:l,values:p.values})];case 2:return n.sent(),e.success(t("Operation succeeded")),r(),c(!1),[3,5];case 3:return console.error(n.sent()),[3,5];case 4:return m.data&&(m.data.loading=!1),[7];case 5:return[2]}})})()}}}function ex(){var e=(0,s.usePlugin)(k.default),t=ed((0,i.useState)(null),2),r=t[0],n=t[1],o=(0,u.useForm)();(0,u.useFormEffects)(function(){(0,l.onFieldValueChange)("type",function(e){var t;n(null!=(t=e.value)?t:null),o.clearFormGraph("config.*")})});var a=r?e.triggers.get(r):null;return(null==a?void 0:a.presetFieldset)?c().createElement(s.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 eh(){var e=a.App.useApp().message,t=(0,y.useTranslation)().t,r=(0,s.useRecord)(),n=(0,s.useResourceContext)().resource,o=(0,s.useResourceActionContext)().refresh,l=ed((0,i.useState)(!1),2),u=l[0],p=l[1],m=(0,i.useCallback)(function(i){return em(function(){return ef(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,n.update({filterByTk:r.id,values:{enabled:i}})];case 2:return c.sent(),setTimeout(function(){return null==o?void 0:o()},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,o,n,t]);return c().createElement(a.Switch,{checked:!!(null==r?void 0:r.enabled),size:"small",disabled:u||!(null==r?void 0:r.id),loading:u,onClick:function(e,t){var r;return null==t||null==(r=t.stopPropagation)?void 0:r.call(t)},onChange:m})}function eO(){var e,t,r=(0,i.useContext)(s.SchemaComponentContext),n=(0,s.usePlugin)(k.default).useTriggersOptions;return c().createElement(s.SchemaComponentContext.Provider,{value:(e=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){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}({},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(s.SchemaComponent,{schema:E,components:{CollectionProvider:s.CollectionProvider,WorkflowLink:g,ExecutionResourceProvider:f,ExecutionLink:p.d,OpenDrawer:h,SyncOptionSelect:ey,ExecutionStatusColumn:S.t_,Tooltip:a.Tooltip,CategoryTabs:X,EnumerationField:en,WorkflowEnabledSwitch:eh,TriggerPresetFieldset:ex,TimeoutInput:eu},scope:{useTriggersOptions:n,useWorkflowSyncReaction:eb,useSyncAction:ev,useResourceFilterActionProps:eo.A,useRefreshActionProps:T.t,useRevisionAction:eg,TriggerOptionRender:D,ExecutionStatusOptions:C.$A}}))}}}]);