@tachybase/plugin-workflow-test 0.23.8

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 (55) hide show
  1. package/.turbo/turbo-build.log +14 -0
  2. package/LICENSE +201 -0
  3. package/client.d.ts +2 -0
  4. package/client.js +1 -0
  5. package/dist/client/index.d.ts +3 -0
  6. package/dist/client/index.js +1 -0
  7. package/dist/e2e/e2eCollectionModel.d.ts +2830 -0
  8. package/dist/e2e/e2eCollectionModel.js +4264 -0
  9. package/dist/e2e/e2ePageObjectModel.d.ts +309 -0
  10. package/dist/e2e/e2ePageObjectModel.js +627 -0
  11. package/dist/e2e/e2eUtils.d.ts +42 -0
  12. package/dist/e2e/e2eUtils.js +399 -0
  13. package/dist/e2e/index.d.ts +4 -0
  14. package/dist/e2e/index.js +43 -0
  15. package/dist/externalVersion.js +10 -0
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.js +39 -0
  18. package/dist/server/collections/categories.d.ts +3 -0
  19. package/dist/server/collections/categories.js +35 -0
  20. package/dist/server/collections/comments.d.ts +3 -0
  21. package/dist/server/collections/comments.js +44 -0
  22. package/dist/server/collections/posts.d.ts +3 -0
  23. package/dist/server/collections/posts.js +60 -0
  24. package/dist/server/collections/replies.d.ts +8 -0
  25. package/dist/server/collections/replies.js +31 -0
  26. package/dist/server/collections/tags.d.ts +3 -0
  27. package/dist/server/collections/tags.js +35 -0
  28. package/dist/server/functions.d.ts +4 -0
  29. package/dist/server/functions.js +25 -0
  30. package/dist/server/index.d.ts +10 -0
  31. package/dist/server/index.js +102 -0
  32. package/dist/server/instructions.d.ts +41 -0
  33. package/dist/server/instructions.js +82 -0
  34. package/dist/server/triggers.d.ts +20 -0
  35. package/dist/server/triggers.js +49 -0
  36. package/e2e.d.ts +2 -0
  37. package/e2e.js +1 -0
  38. package/package.json +24 -0
  39. package/server.d.ts +2 -0
  40. package/server.js +1 -0
  41. package/src/client/index.ts +3 -0
  42. package/src/e2e/e2eCollectionModel.ts +4251 -0
  43. package/src/e2e/e2ePageObjectModel.ts +647 -0
  44. package/src/e2e/e2eUtils.ts +950 -0
  45. package/src/e2e/index.ts +4 -0
  46. package/src/index.ts +2 -0
  47. package/src/server/collections/categories.ts +15 -0
  48. package/src/server/collections/comments.ts +24 -0
  49. package/src/server/collections/posts.ts +40 -0
  50. package/src/server/collections/replies.ts +9 -0
  51. package/src/server/collections/tags.ts +15 -0
  52. package/src/server/functions.ts +3 -0
  53. package/src/server/index.ts +84 -0
  54. package/src/server/instructions.ts +67 -0
  55. package/src/server/triggers.ts +19 -0
@@ -0,0 +1,647 @@
1
+ import { Locator, Page } from '@tachybase/test/e2e';
2
+
3
+ export class CreateWorkFlow {
4
+ readonly page: Page;
5
+ name: Locator;
6
+ triggerType: Locator;
7
+ description: Locator;
8
+ autoDeleteHistory: Locator;
9
+ submitButton: Locator;
10
+ cancelButton: Locator;
11
+ constructor(page: Page) {
12
+ this.page = page;
13
+ this.name = page.getByLabel('block-item-CollectionField-workflows-Name').getByRole('textbox');
14
+ this.triggerType = page.getByTestId('select-single');
15
+ this.description = page.getByTestId('description-item').getByRole('textbox');
16
+ this.autoDeleteHistory = page.getByTestId('select-multiple');
17
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
18
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
19
+ }
20
+ }
21
+
22
+ export class EditWorkFlow {
23
+ readonly page: Page;
24
+ name: Locator;
25
+ statusIsOn: Locator;
26
+ statusIisOff: Locator;
27
+ description: Locator;
28
+ autoDeleteHistory: Locator;
29
+ submitButton: Locator;
30
+ cancelButton: Locator;
31
+ constructor(page: Page, workFlowName: string) {
32
+ this.page = page;
33
+ this.name = page.getByLabel('block-item-CollectionField-workflows-Name').getByRole('textbox');
34
+ this.statusIsOn = page.getByLabel('On', { exact: true });
35
+ this.statusIisOff = page.getByLabel('Off');
36
+ this.description = page.getByTestId('description-item').getByRole('textbox');
37
+ this.autoDeleteHistory = page
38
+ .getByTestId('deleteExecutionOnStatus-item')
39
+ .getByTestId('antd-select')
40
+ .locator('div')
41
+ .nth(1);
42
+ this.submitButton = page.getByLabel(`action-Action-Submit-workflows-${workFlowName}`);
43
+ this.cancelButton = page.getByLabel(`action-Action-Cancel-workflows-${workFlowName}`);
44
+ }
45
+ }
46
+
47
+ export class WorkflowManagement {
48
+ readonly page: Page;
49
+ addNewButton: Locator;
50
+ deleteButton: Locator;
51
+ filterButton: Locator;
52
+ constructor(page: Page) {
53
+ this.page = page;
54
+ this.addNewButton = page.getByLabel('action-Action-Add new-workflows');
55
+ this.deleteButton = page.getByLabel('action-Action-Delete-workflows');
56
+ this.filterButton = page.getByLabel('action-Filter.Action-Filter-filter-workflows');
57
+ }
58
+ }
59
+
60
+ export class WorkflowListRecords {
61
+ readonly page: Page;
62
+ executionCountPopup: Locator;
63
+ configureAction: Locator;
64
+ editAction: Locator;
65
+ duplicateAction: Locator;
66
+ deleteAction: Locator;
67
+ constructor(page: Page, workFlowName: string) {
68
+ this.page = page;
69
+ this.executionCountPopup = page.getByLabel(`executed-${workFlowName}`);
70
+ this.configureAction = page.getByLabel(`action-WorkflowLink-Configure-workflows-${workFlowName}`);
71
+ this.editAction = page.getByLabel(`action-Action.Link-Edit-workflows-${workFlowName}`);
72
+ this.duplicateAction = page.getByLabel(`action-Action.Link-Duplicate-workflows-${workFlowName}`);
73
+ this.deleteAction = page.getByLabel(`action-Action.Link-Delete-workflows-${workFlowName}`);
74
+ }
75
+ }
76
+
77
+ export class ApprovalTriggerNode {
78
+ readonly page: Page;
79
+ node: Locator;
80
+ nodeTitle: Locator;
81
+ nodeConfigure: Locator;
82
+ collectionDropDown: Locator;
83
+ dataBlocksInitiationRadio: Locator;
84
+ dataBlocksAndGlobalApprovalBlocksInitiationRadio: Locator;
85
+ allowedToBeWithdrawnCheckbox: Locator;
86
+ goToconfigureButton: Locator;
87
+ addBlockButton: Locator;
88
+ addApplyFormMenu: Locator;
89
+ configureFieldsButton: Locator;
90
+ configureActionsButton: Locator;
91
+ saveDraftSwitch: Locator;
92
+ submitButton: Locator;
93
+ cancelButton: Locator;
94
+ addNodeButton: Locator;
95
+ constructor(page: Page, triggerName: string, collectionName: string) {
96
+ this.page = page;
97
+ this.node = page.getByText('TriggeraConfigure');
98
+ this.nodeTitle = page.locator('textarea').filter({ hasText: triggerName });
99
+ this.nodeConfigure = page.getByRole('button', { name: 'Configure' });
100
+ this.collectionDropDown = page
101
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
102
+ .locator('.ant-select-selection-search-input');
103
+ this.dataBlocksInitiationRadio = page.getByLabel('Initiate and approve in data blocks only');
104
+ this.dataBlocksAndGlobalApprovalBlocksInitiationRadio = page.getByLabel(
105
+ 'Initiate and approve in both data blocks and global approval blocks',
106
+ );
107
+ this.allowedToBeWithdrawnCheckbox = page.getByLabel('Allowed to be withdrawn');
108
+ this.goToconfigureButton = page.getByRole('button', { name: 'Go to configure' });
109
+ this.addBlockButton = page.getByLabel(`schema-initializer-Grid-ApprovalApplyAddBlockButton-${collectionName}`);
110
+ this.addApplyFormMenu = page.getByRole('menuitem', { name: 'Apply form' });
111
+ this.configureFieldsButton = page.getByLabel(`schema-initializer-Grid-form:configureFields-${collectionName}`);
112
+ this.configureActionsButton = page.getByLabel(
113
+ `schema-initializer-ActionBar-ApprovalApplyAddActionButton-${collectionName}`,
114
+ );
115
+ this.saveDraftSwitch = page.getByRole('menuitem', { name: 'Save draft' }).getByRole('switch');
116
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
117
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
118
+ this.addNodeButton = this.addNodeButton = page.getByLabel('add-button', { exact: true });
119
+ }
120
+ }
121
+
122
+ export class ApprovalPassthroughModeNode {
123
+ readonly page: Page;
124
+ node: Locator;
125
+ nodeTitle: Locator;
126
+ nodeConfigure: Locator;
127
+ addAssigneesButton: Locator;
128
+ assigneesDropDown: Locator;
129
+ OrRadio: Locator;
130
+ AndRadio: Locator;
131
+ votingRadio: Locator;
132
+ parallellyRadio: Locator;
133
+ sequentiallyRadio: Locator;
134
+ goToconfigureButton: Locator;
135
+ addBlockButton: Locator;
136
+ addDetailsMenu: Locator;
137
+ detailsConfigureFieldsButton: Locator;
138
+ addActionsMenu: Locator;
139
+ actionsConfigureFieldsButton: Locator;
140
+ actionsConfigureActionsButton: Locator;
141
+ addApproveButton: Locator;
142
+ addRejectButton: Locator;
143
+ addReturnButton: Locator;
144
+ addNodeResult: Locator;
145
+ submitButton: Locator;
146
+ cancelButton: Locator;
147
+ addNodeButton: Locator;
148
+ constructor(page: Page, nodeName: string, collectionName: string) {
149
+ this.page = page;
150
+ this.node = page.getByLabel(`Approval-${nodeName}`, { exact: true });
151
+ this.nodeTitle = page.getByLabel(`Approval-${nodeName}`, { exact: true }).getByRole('textbox');
152
+ this.nodeConfigure = page
153
+ .getByLabel(`Approval-${nodeName}`, { exact: true })
154
+ .getByRole('button', { name: 'Configure' });
155
+ this.addAssigneesButton = page.getByRole('button', { name: 'plus Add assignee' });
156
+ this.assigneesDropDown = page.getByTestId('select-single');
157
+ this.OrRadio = page.getByLabel('Or', { exact: true });
158
+ this.AndRadio = page.getByLabel('And', { exact: true });
159
+ this.votingRadio = page.getByLabel('Voting', { exact: true });
160
+ this.parallellyRadio = page.getByLabel('Parallelly', { exact: true });
161
+ this.sequentiallyRadio = page.getByLabel('Sequentially', { exact: true });
162
+ this.goToconfigureButton = page.getByRole('button', { name: 'Go to configure' });
163
+ this.addBlockButton = page.getByLabel('schema-initializer-Grid-ApprovalProcessAddBlockButton-workflows');
164
+ this.addDetailsMenu = page.getByRole('menuitem', { name: 'Details' });
165
+ this.detailsConfigureFieldsButton = page.getByLabel(
166
+ `schema-initializer-Grid-ReadPrettyFormItemInitializers-${collectionName}`,
167
+ );
168
+ this.addActionsMenu = page.getByRole('menuitem', { name: 'Actions' }).getByRole('switch');
169
+ this.actionsConfigureFieldsButton = page.getByLabel('schema-initializer-Grid-FormItemInitializers-approvalRecords');
170
+ this.actionsConfigureActionsButton = page.getByLabel(
171
+ 'schema-initializer-ActionBar-ApprovalProcessAddActionButton-approvalRecords',
172
+ );
173
+ this.addApproveButton = page.getByRole('menuitem', { name: 'Approve' }).getByRole('switch');
174
+ this.addRejectButton = page.getByRole('menuitem', { name: 'Reject' }).getByRole('switch');
175
+ this.addReturnButton = page.getByRole('menuitem', { name: 'Return' }).getByRole('switch');
176
+ this.addNodeResult = page.getByRole('menuitem', { name: 'Node result right' });
177
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
178
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
179
+ this.addNodeButton = page.getByLabel(`add-button-calculation-${nodeName}`, { exact: true });
180
+ }
181
+ }
182
+
183
+ export class ScheduleTriggerNode {
184
+ readonly page: Page;
185
+ node: Locator;
186
+ nodeTitle: Locator;
187
+ nodeConfigure: Locator;
188
+ customTimeTriggerOptions: Locator;
189
+ startTimeEntryBox: Locator;
190
+ RrpeatModeDropdown: Locator;
191
+
192
+ dataTableTimeFieldOptions: Locator;
193
+ collectionDropDown: Locator;
194
+ startTimeDropdown: Locator;
195
+ submitButton: Locator;
196
+ cancelButton: Locator;
197
+ addNodeButton: Locator;
198
+ constructor(page: Page, triggerName: string, collectionName: string) {
199
+ this.page = page;
200
+ this.node = page.getByText('TriggeraConfigure');
201
+ this.nodeTitle = page.locator('textarea').filter({ hasText: triggerName });
202
+ this.nodeConfigure = page.getByRole('button', { name: 'Configure' });
203
+ this.customTimeTriggerOptions = page.getByLabel('Based on certain date');
204
+ this.startTimeEntryBox = page.getByPlaceholder('Select date');
205
+ this.RrpeatModeDropdown = page.getByLabel('block-item-RepeatField-workflows-Repeat mode');
206
+
207
+ this.dataTableTimeFieldOptions = page.getByLabel('Based on date field of collection');
208
+ this.collectionDropDown = page
209
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
210
+ .locator('.ant-select-selection-search-input');
211
+ this.startTimeDropdown = page.getByLabel('block-item-OnField-workflows-Starts on');
212
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
213
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
214
+ this.addNodeButton = page.getByLabel('add-button', { exact: true });
215
+ }
216
+ }
217
+
218
+ export class CollectionTriggerNode {
219
+ readonly page: Page;
220
+ node: Locator;
221
+ nodeTitle: Locator;
222
+ nodeConfigure: Locator;
223
+ collectionDropDown: Locator;
224
+ triggerOnDropdown: Locator;
225
+ submitButton: Locator;
226
+ cancelButton: Locator;
227
+ addNodeButton: Locator;
228
+ constructor(page: Page, triggerName: string, collectionName: string) {
229
+ this.page = page;
230
+ this.node = page.getByLabel(`Trigger-${triggerName}`);
231
+ this.nodeTitle = page.getByLabel(`Trigger-${triggerName}`).getByRole('textbox');
232
+ this.nodeConfigure = page.getByLabel(`Trigger-${triggerName}`).getByRole('button', { name: 'Configure' });
233
+ // this.collectionDropDown = page.getByRole('button', { name: 'Select collection' });
234
+ this.collectionDropDown = page
235
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
236
+ .locator('.ant-select-selection-search-input');
237
+ this.triggerOnDropdown = page
238
+ .getByLabel('block-item-Select-workflows-Trigger on')
239
+ .getByRole('button', { name: 'Trigger on' });
240
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
241
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
242
+ this.addNodeButton = page.getByLabel('add-button', { exact: true });
243
+ }
244
+ }
245
+
246
+ export class FormEventTriggerNode {
247
+ readonly page: Page;
248
+ node: Locator;
249
+ nodeTitle: Locator;
250
+ nodeConfigure: Locator;
251
+ collectionDropDown: Locator;
252
+ relationalDataDropdown: Locator;
253
+ submitButton: Locator;
254
+ cancelButton: Locator;
255
+ addNodeButton: Locator;
256
+ constructor(page: Page, triggerName: string, collectionName: string) {
257
+ this.page = page;
258
+ this.node = page.getByLabel(`Trigger-${triggerName}`);
259
+ this.nodeTitle = page.getByLabel(`Trigger-${triggerName}`).getByRole('textbox');
260
+ this.nodeConfigure = page.getByLabel(`Trigger-${triggerName}`).getByRole('button', { name: 'Configure' });
261
+ this.collectionDropDown = page
262
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
263
+ .locator('.ant-select-selection-search-input');
264
+ this.relationalDataDropdown = page.getByTestId('select-field-Preload associations');
265
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
266
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
267
+ this.addNodeButton = page.getByLabel('add-button', { exact: true });
268
+ }
269
+ }
270
+
271
+ export class ClculationNode {
272
+ readonly page: Page;
273
+ node: Locator;
274
+ nodeTitle: Locator;
275
+ nodeConfigure: Locator;
276
+ mathCalculationEngine: Locator;
277
+ formulaCalculationEngine: Locator;
278
+ calculationExpression: Locator;
279
+ submitButton: Locator;
280
+ cancelButton: Locator;
281
+ addNodeButton: Locator;
282
+ constructor(page: Page, nodeName: string) {
283
+ this.page = page;
284
+ this.node = page.getByLabel(`Calculation-${nodeName}`, { exact: true });
285
+ this.nodeTitle = page.getByLabel(`Calculation-${nodeName}`, { exact: true }).getByRole('textbox');
286
+ this.nodeConfigure = page
287
+ .getByLabel(`Calculation-${nodeName}`, { exact: true })
288
+ .getByRole('button', { name: 'Configure' });
289
+ this.mathCalculationEngine = page.getByLabel('Math.js');
290
+ this.formulaCalculationEngine = page.getByLabel('Formula.js');
291
+ this.calculationExpression = page.getByLabel('textbox');
292
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
293
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
294
+ this.addNodeButton = page.getByLabel(`add-button-calculation-${nodeName}`, { exact: true });
295
+ }
296
+ }
297
+
298
+ export class QueryRecordNode {
299
+ readonly page: Page;
300
+ node: Locator;
301
+ nodeTitle: Locator;
302
+ nodeConfigure: Locator;
303
+ collectionDropDown: Locator;
304
+ allowMultipleDataBoxesForResults: Locator;
305
+ addSortFieldsButton: Locator;
306
+ pageNumberEditBox: Locator;
307
+ pageNumberVariableButton: Locator;
308
+ pageSizeEditBox: Locator;
309
+ exitProcessOptionsBoxWithEmptyResult: Locator;
310
+ submitButton: Locator;
311
+ cancelButton: Locator;
312
+ addNodeButton: Locator;
313
+ constructor(page: Page, nodeName: string) {
314
+ this.page = page;
315
+ this.node = page.getByLabel(`Query record-${nodeName}`, { exact: true });
316
+ this.nodeTitle = page.getByLabel(`Query record-${nodeName}`, { exact: true }).getByRole('textbox');
317
+ this.nodeConfigure = page
318
+ .getByLabel(`Query record-${nodeName}`, { exact: true })
319
+ .getByRole('button', { name: 'Configure' });
320
+ this.collectionDropDown = page
321
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
322
+ .locator('.ant-select-selection-search-input');
323
+ this.allowMultipleDataBoxesForResults = page.getByLabel('Allow multiple records as');
324
+ this.addSortFieldsButton = page.getByRole('button', { name: 'plus Add sort field' });
325
+ this.pageNumberEditBox = page.getByLabel('variable-constant');
326
+ this.pageNumberVariableButton = page.getByLabel('variable-button');
327
+ this.pageSizeEditBox = page.getByLabel('block-item-InputNumber-workflows-Page size').getByRole('spinbutton');
328
+ this.exitProcessOptionsBoxWithEmptyResult = page.getByLabel('Exit when query result is null');
329
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
330
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
331
+ this.addNodeButton = page.getByLabel(`add-button-query-${nodeName}`, { exact: true });
332
+ }
333
+ }
334
+
335
+ export class CreateRecordNode {
336
+ readonly page: Page;
337
+ node: Locator;
338
+ nodeTitle: Locator;
339
+ nodeConfigure: Locator;
340
+ collectionDropDown: Locator;
341
+ addFieldsButton: Locator;
342
+ submitButton: Locator;
343
+ cancelButton: Locator;
344
+ addNodeButton: Locator;
345
+ constructor(page: Page, nodeName: string) {
346
+ this.page = page;
347
+ this.node = page.getByLabel(`Create record-${nodeName}`, { exact: true });
348
+ this.nodeTitle = page.getByLabel(`Create record-${nodeName}`, { exact: true }).getByRole('textbox');
349
+ this.nodeConfigure = page
350
+ .getByLabel(`Create record-${nodeName}`, { exact: true })
351
+ .getByRole('button', { name: 'Configure' });
352
+ this.collectionDropDown = page
353
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
354
+ .locator('.ant-select-selection-search-input');
355
+ this.addFieldsButton = page.getByRole('button', { name: 'plus Add field' });
356
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
357
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
358
+ this.addNodeButton = page.getByLabel(`add-button-create-${nodeName}`, { exact: true });
359
+ }
360
+ }
361
+
362
+ export class UpdateRecordNode {
363
+ readonly page: Page;
364
+ node: Locator;
365
+ nodeTitle: Locator;
366
+ nodeConfigure: Locator;
367
+ collectionDropDown: Locator;
368
+ batchUpdateModeRadio: Locator;
369
+ articleByArticleUpdateModeRadio: Locator;
370
+ addFieldsButton: Locator;
371
+ submitButton: Locator;
372
+ cancelButton: Locator;
373
+ addNodeButton: Locator;
374
+ constructor(page: Page, nodeName: string) {
375
+ this.page = page;
376
+ this.node = page.getByLabel(`Update record-${nodeName}`, { exact: true });
377
+ this.nodeTitle = page.getByLabel(`Update record-${nodeName}`, { exact: true }).getByRole('textbox');
378
+ this.nodeConfigure = page
379
+ .getByLabel(`Update record-${nodeName}`, { exact: true })
380
+ .getByRole('button', { name: 'Configure' });
381
+ this.collectionDropDown = page
382
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
383
+ .locator('.ant-select-selection-search-input');
384
+ this.batchUpdateModeRadio = page
385
+ .getByLabel('block-item-IndividualHooksRadioWithTooltip-workflows-Update mode')
386
+ .getByLabel('Update in a batch');
387
+ this.articleByArticleUpdateModeRadio = page
388
+ .getByLabel('block-item-IndividualHooksRadioWithTooltip-workflows-Update mode')
389
+ .getByLabel('Update one by one');
390
+ this.addFieldsButton = page.getByRole('button', { name: 'plus Add field' });
391
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
392
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
393
+ this.addNodeButton = page.getByLabel(`add-button-update-${nodeName}`, { exact: true });
394
+ }
395
+ }
396
+
397
+ export class DeleteRecordNode {
398
+ readonly page: Page;
399
+ node: Locator;
400
+ nodeTitle: Locator;
401
+ nodeConfigure: Locator;
402
+ collectionDropDown: Locator;
403
+ submitButton: Locator;
404
+ cancelButton: Locator;
405
+ addNodeButton: Locator;
406
+ constructor(page: Page, nodeName: string) {
407
+ this.page = page;
408
+ this.node = page.getByLabel(`Delete record-${nodeName}`, { exact: true });
409
+ this.nodeTitle = page.getByLabel(`Delete record-${nodeName}`, { exact: true }).getByRole('textbox');
410
+ this.nodeConfigure = page
411
+ .getByLabel(`Delete record-${nodeName}`, { exact: true })
412
+ .getByRole('button', { name: 'Configure' });
413
+ this.collectionDropDown = page
414
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
415
+ .locator('.ant-select-selection-search-input');
416
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
417
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
418
+ this.addNodeButton = page.getByLabel(`add-button-delete-${nodeName}`, { exact: true });
419
+ }
420
+ }
421
+
422
+ export class AggregateNode {
423
+ readonly page: Page;
424
+ node: Locator;
425
+ nodeTitle: Locator;
426
+ nodeConfigure: Locator;
427
+ countRadio: Locator;
428
+ sumRadio: Locator;
429
+ avgRadio: Locator;
430
+ maxRadio: Locator;
431
+ minRadio: Locator;
432
+ dataTableDataRadio: Locator;
433
+ linkedDataTableDataRadio: Locator;
434
+ collectionDropDown: Locator;
435
+ aggregatedFieldDropDown: Locator;
436
+ distinctCheckBox: Locator;
437
+ submitButton: Locator;
438
+ cancelButton: Locator;
439
+ addNodeButton: Locator;
440
+ constructor(page: Page, nodeName: string) {
441
+ this.page = page;
442
+ this.node = page.getByLabel(`Aggregate-${nodeName}`, { exact: true });
443
+ this.nodeTitle = page.getByLabel(`Aggregate-${nodeName}`, { exact: true }).getByRole('textbox');
444
+ this.nodeConfigure = page
445
+ .getByLabel(`Aggregate-${nodeName}`, { exact: true })
446
+ .getByRole('button', { name: 'Configure' });
447
+ this.countRadio = page.getByLabel('COUNT');
448
+ this.sumRadio = page.getByLabel('SUM', { exact: true });
449
+ this.avgRadio = page.getByLabel('AVG', { exact: true });
450
+ this.maxRadio = page.getByLabel('MAX', { exact: true });
451
+ this.minRadio = page.getByLabel('MIN', { exact: true });
452
+ this.dataTableDataRadio = page.getByLabel('Data of collection');
453
+ this.linkedDataTableDataRadio = page.getByLabel('Data of associated collection');
454
+ this.collectionDropDown = page
455
+ .getByLabel('block-item-DataSourceCollectionCascader-workflows-Data of collection')
456
+ .locator('.ant-select-selection-search-input');
457
+ this.aggregatedFieldDropDown = page
458
+ .getByLabel('block-item-FieldsSelect-workflows-Field to aggregate')
459
+ .locator('.ant-select-selection-search-input');
460
+ this.distinctCheckBox = page
461
+ .getByLabel('block-item-Checkbox-workflows-Distinct')
462
+ .locator('input.ant-checkbox-input[type="checkbox"]');
463
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
464
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
465
+ this.addNodeButton = page.getByLabel(`add-button-aggregate-${nodeName}`, { exact: true });
466
+ }
467
+ }
468
+
469
+ export class ManualNode {
470
+ readonly page: Page;
471
+ node: Locator;
472
+ nodeTitle: Locator;
473
+ nodeConfigure: Locator;
474
+ assigneesDropDown: Locator;
475
+ configureUserInterfaceButton: Locator;
476
+ addBlockButton: Locator;
477
+ triggerDataMenu: Locator;
478
+ nodeDataMenu: Locator;
479
+ customFormMenu: Locator;
480
+ createRecordFormMenu: Locator;
481
+ updateRecordFormMenu: Locator;
482
+ submitButton: Locator;
483
+ cancelButton: Locator;
484
+ addNodeButton: Locator;
485
+ constructor(page: Page, nodeName: string) {
486
+ this.page = page;
487
+ this.node = page.getByLabel(`Manual-${nodeName}`, { exact: true });
488
+ this.nodeTitle = page.getByLabel(`Manual-${nodeName}`, { exact: true }).getByRole('textbox');
489
+ this.nodeConfigure = page
490
+ .getByLabel(`Manual-${nodeName}`, { exact: true })
491
+ .getByRole('button', { name: 'Configure' });
492
+ this.assigneesDropDown = page.getByTestId('select-single');
493
+ this.configureUserInterfaceButton = page.getByRole('button', { name: 'Configure user interface' });
494
+ this.addBlockButton = page.getByLabel(
495
+ 'schema-initializer-Grid-workflowManual:popup:configureUserInterface:addBlock-workflows',
496
+ );
497
+ this.triggerDataMenu = page.getByRole('menuitem', { name: 'Trigger data' });
498
+ this.nodeDataMenu = page.getByRole('menuitem', { name: 'Node result right' });
499
+ this.customFormMenu = page.getByRole('menuitem', { name: 'Custom form' });
500
+ this.createRecordFormMenu = page.getByRole('menuitem', { name: 'Create record form right' });
501
+ this.updateRecordFormMenu = page.getByRole('menuitem', { name: 'Update record form right' });
502
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
503
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
504
+ this.addNodeButton = page.getByLabel(`add-button-manual-${nodeName}`, { exact: true });
505
+ }
506
+ }
507
+
508
+ export class ConditionYesNode {
509
+ readonly page: Page;
510
+ node: Locator;
511
+ nodeTitle: Locator;
512
+ nodeConfigure: Locator;
513
+ basicRadio: Locator;
514
+ mathRadio: Locator;
515
+ formulaRadio: Locator;
516
+ conditionExpressionEditBox: Locator;
517
+ submitButton: Locator;
518
+ cancelButton: Locator;
519
+ addNodeButton: Locator;
520
+ constructor(page: Page, nodeName: string) {
521
+ this.page = page;
522
+ this.node = page.getByLabel(`Condition-${nodeName}`, { exact: true });
523
+ this.nodeTitle = page.getByLabel(`Condition-${nodeName}`, { exact: true }).getByRole('textbox');
524
+ this.nodeConfigure = page
525
+ .getByLabel(`Condition-${nodeName}`, { exact: true })
526
+ .getByRole('button', { name: 'Configure' });
527
+ this.conditionExpressionEditBox = page.getByLabel('textbox');
528
+ // await page.getByLabel('variable-constant').first().click();
529
+ // await page.getByLabel('variable-button').first().click();
530
+ // await page.getByLabel('select-operator-calc').first().click();
531
+ // await page.getByRole('option', { name: '=' }).click();
532
+ // await page.getByLabel('variable-constant').nth(1).click();
533
+ // await page.getByLabel('variable-button').nth(1).click();
534
+ this.basicRadio = page.getByLabel('Basic');
535
+ this.mathRadio = page.getByLabel('Math.js');
536
+ this.formulaRadio = page.getByLabel('Formula.js');
537
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
538
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
539
+ this.addNodeButton = page.getByLabel(`add-button-condition-${nodeName}`, { exact: true });
540
+ }
541
+ }
542
+
543
+ export class ConditionBranchNode {
544
+ readonly page: Page;
545
+ node: Locator;
546
+ nodeTitle: Locator;
547
+ nodeConfigure: Locator;
548
+ basicRadio: Locator;
549
+ mathRadio: Locator;
550
+ formulaRadio: Locator;
551
+ conditionExpressionEditBox: Locator;
552
+ submitButton: Locator;
553
+ cancelButton: Locator;
554
+ addNoBranchNode: Locator;
555
+ addYesBranchNode: Locator;
556
+ addNodeButton: Locator;
557
+ constructor(page: Page, nodeName: string) {
558
+ this.page = page;
559
+ this.node = page.getByLabel(`Condition-${nodeName}`, { exact: true });
560
+ this.nodeTitle = page.getByLabel(`Condition-${nodeName}`, { exact: true }).getByRole('textbox');
561
+ this.nodeConfigure = page
562
+ .getByLabel(`Condition-${nodeName}`, { exact: true })
563
+ .getByRole('button', { name: 'Configure' });
564
+ this.conditionExpressionEditBox = page.getByLabel('textbox');
565
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
566
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
567
+ this.addNodeButton = page.getByLabel(`add-button-condition-${nodeName}`, { exact: true });
568
+ this.basicRadio = page.getByLabel('Basic');
569
+ this.mathRadio = page.getByLabel('Math.js');
570
+ this.formulaRadio = page.getByLabel('Formula.js');
571
+ this.addNoBranchNode = page.getByLabel(`add-button-condition-${nodeName}-0`);
572
+ this.addYesBranchNode = page.getByLabel(`add-button-condition-${nodeName}-1`);
573
+ }
574
+ }
575
+
576
+ export class SQLNode {
577
+ readonly page: Page;
578
+ node: Locator;
579
+ nodeTitle: Locator;
580
+ nodeConfigure: Locator;
581
+ sqlEditBox: Locator;
582
+ submitButton: Locator;
583
+ cancelButton: Locator;
584
+ addNodeButton: Locator;
585
+ constructor(page: Page, nodeName: string) {
586
+ this.page = page;
587
+ this.node = page.getByLabel(`SQL action-${nodeName}`, { exact: true });
588
+ this.nodeTitle = page.getByLabel(`SQL action-${nodeName}`, { exact: true }).getByRole('textbox');
589
+ this.nodeConfigure = page
590
+ .getByLabel(`SQL action-${nodeName}`, { exact: true })
591
+ .getByRole('button', { name: 'Configure' });
592
+ this.sqlEditBox = page.getByLabel('block-item-WorkflowVariableRawTextArea-workflows-SQL').getByRole('textbox');
593
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
594
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
595
+ this.addNodeButton = page.getByLabel(`add-button-sql-${nodeName}`, { exact: true });
596
+ }
597
+ }
598
+
599
+ export class ParallelBranchNode {
600
+ readonly page: Page;
601
+ node: Locator;
602
+ nodeTitle: Locator;
603
+ nodeConfigure: Locator;
604
+ addBranchButton: Locator;
605
+ allSucceededRadio: Locator;
606
+ anySucceededRadio: Locator;
607
+ anySucceededOrFailedRadio: Locator;
608
+ submitButton: Locator;
609
+ cancelButton: Locator;
610
+ addNodeButton: Locator;
611
+ constructor(page: Page, nodeName: string) {
612
+ this.page = page;
613
+ this.node = page.getByLabel(`Parallel branch-${nodeName}`, { exact: true });
614
+ this.nodeTitle = page.locator('textarea').filter({ hasText: nodeName });
615
+ this.nodeConfigure = page.getByLabel(`Parallel branch-${nodeName}`).getByRole('button', { name: 'Configure' });
616
+ this.addBranchButton = page.getByLabel(`add-button-parallel-${nodeName}-add-branch`, { exact: true });
617
+ this.allSucceededRadio = page.getByLabel('All succeeded', { exact: true });
618
+ this.anySucceededRadio = page.getByLabel('Any succeeded', { exact: true });
619
+ this.anySucceededOrFailedRadio = page.getByLabel('Any succeeded or failed', { exact: true });
620
+ this.submitButton = page.getByLabel('action-Action-Submit-workflows');
621
+ this.cancelButton = page.getByLabel('action-Action-Cancel-workflows');
622
+ this.addNodeButton = page.getByLabel(`add-button-parallel-${nodeName}`, { exact: true });
623
+ }
624
+ }
625
+
626
+ export default module.exports = {
627
+ CreateWorkFlow,
628
+ EditWorkFlow,
629
+ WorkflowManagement,
630
+ WorkflowListRecords,
631
+ ApprovalTriggerNode,
632
+ ApprovalPassthroughModeNode,
633
+ ScheduleTriggerNode,
634
+ CollectionTriggerNode,
635
+ FormEventTriggerNode,
636
+ ClculationNode,
637
+ QueryRecordNode,
638
+ CreateRecordNode,
639
+ UpdateRecordNode,
640
+ DeleteRecordNode,
641
+ AggregateNode,
642
+ ManualNode,
643
+ ConditionYesNode,
644
+ ConditionBranchNode,
645
+ SQLNode,
646
+ ParallelBranchNode,
647
+ };