@qwickapps/cms 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +45 -0
- package/README.md +203 -0
- package/dist/admin/components/AccordionItemRowLabel.d.ts +20 -0
- package/dist/admin/components/AccordionItemRowLabel.d.ts.map +1 -0
- package/dist/admin/components/AccordionItemRowLabel.js +47 -0
- package/dist/admin/components/AccordionItemRowLabel.js.map +1 -0
- package/dist/admin/components/BlockRowLabel.d.ts +19 -0
- package/dist/admin/components/BlockRowLabel.d.ts.map +1 -0
- package/dist/admin/components/BlockRowLabel.js +52 -0
- package/dist/admin/components/BlockRowLabel.js.map +1 -0
- package/dist/admin/components/ButtonRowLabel.d.ts +23 -0
- package/dist/admin/components/ButtonRowLabel.d.ts.map +1 -0
- package/dist/admin/components/ButtonRowLabel.js +63 -0
- package/dist/admin/components/ButtonRowLabel.js.map +1 -0
- package/dist/admin/components/CardRowLabel.d.ts +23 -0
- package/dist/admin/components/CardRowLabel.d.ts.map +1 -0
- package/dist/admin/components/CardRowLabel.js +59 -0
- package/dist/admin/components/CardRowLabel.js.map +1 -0
- package/dist/admin/components/ContentPreview.d.ts +12 -0
- package/dist/admin/components/ContentPreview.d.ts.map +1 -0
- package/dist/admin/components/ContentPreview.js +95 -0
- package/dist/admin/components/ContentPreview.js.map +1 -0
- package/dist/admin/components/Dashboard.d.ts +13 -0
- package/dist/admin/components/Dashboard.d.ts.map +1 -0
- package/dist/admin/components/Dashboard.js +7 -0
- package/dist/admin/components/Dashboard.js.map +1 -0
- package/dist/admin/components/DashboardContent.d.ts +11 -0
- package/dist/admin/components/DashboardContent.d.ts.map +1 -0
- package/dist/admin/components/DashboardContent.js +129 -0
- package/dist/admin/components/DashboardContent.js.map +1 -0
- package/dist/admin/components/FormFieldRowLabel.d.ts +21 -0
- package/dist/admin/components/FormFieldRowLabel.d.ts.map +1 -0
- package/dist/admin/components/FormFieldRowLabel.js +47 -0
- package/dist/admin/components/FormFieldRowLabel.js.map +1 -0
- package/dist/admin/components/Icon.d.ts +10 -0
- package/dist/admin/components/Icon.d.ts.map +1 -0
- package/dist/admin/components/Icon.js +16 -0
- package/dist/admin/components/Icon.js.map +1 -0
- package/dist/admin/components/Logo.d.ts +10 -0
- package/dist/admin/components/Logo.d.ts.map +1 -0
- package/dist/admin/components/Logo.js +16 -0
- package/dist/admin/components/Logo.js.map +1 -0
- package/dist/admin/components/NavigationItemRowLabel.d.ts +21 -0
- package/dist/admin/components/NavigationItemRowLabel.d.ts.map +1 -0
- package/dist/admin/components/NavigationItemRowLabel.js +43 -0
- package/dist/admin/components/NavigationItemRowLabel.js.map +1 -0
- package/dist/admin/components/NavigationSubItemRowLabel.d.ts +19 -0
- package/dist/admin/components/NavigationSubItemRowLabel.d.ts.map +1 -0
- package/dist/admin/components/NavigationSubItemRowLabel.js +32 -0
- package/dist/admin/components/NavigationSubItemRowLabel.js.map +1 -0
- package/dist/admin/components/PagesListHeader.d.ts +13 -0
- package/dist/admin/components/PagesListHeader.d.ts.map +1 -0
- package/dist/admin/components/PagesListHeader.js +48 -0
- package/dist/admin/components/PagesListHeader.js.map +1 -0
- package/dist/admin/components/ProductsListHeader.d.ts +13 -0
- package/dist/admin/components/ProductsListHeader.d.ts.map +1 -0
- package/dist/admin/components/ProductsListHeader.js +55 -0
- package/dist/admin/components/ProductsListHeader.js.map +1 -0
- package/dist/admin/components/styles/CollectionListHeader.css +161 -0
- package/dist/admin/components/styles/ContentPreview.css +416 -0
- package/dist/admin/components/styles/Dashboard.css +338 -0
- package/dist/admin/fields/ColorInput.d.ts +13 -0
- package/dist/admin/fields/ColorInput.d.ts.map +1 -0
- package/dist/admin/fields/ColorInput.js +201 -0
- package/dist/admin/fields/ColorInput.js.map +1 -0
- package/dist/admin/fields/index.d.ts +9 -0
- package/dist/admin/fields/index.d.ts.map +1 -0
- package/dist/admin/fields/index.js +9 -0
- package/dist/admin/fields/index.js.map +1 -0
- package/dist/admin/index.d.ts +24 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +30 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/blocks/ContentBlocks.d.ts +75 -0
- package/dist/blocks/ContentBlocks.d.ts.map +1 -0
- package/dist/blocks/ContentBlocks.js +1241 -0
- package/dist/blocks/ContentBlocks.js.map +1 -0
- package/dist/blocks/index.d.ts +2 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +3 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/client/PayloadAPIClient.d.ts +65 -0
- package/dist/client/PayloadAPIClient.d.ts.map +1 -0
- package/dist/client/PayloadAPIClient.js +167 -0
- package/dist/client/PayloadAPIClient.js.map +1 -0
- package/dist/collections/Automations.d.ts +12 -0
- package/dist/collections/Automations.d.ts.map +1 -0
- package/dist/collections/Automations.js +741 -0
- package/dist/collections/Automations.js.map +1 -0
- package/dist/collections/Features.d.ts +3 -0
- package/dist/collections/Features.d.ts.map +1 -0
- package/dist/collections/Features.js +69 -0
- package/dist/collections/Features.js.map +1 -0
- package/dist/collections/Footer.d.ts +11 -0
- package/dist/collections/Footer.d.ts.map +1 -0
- package/dist/collections/Footer.js +130 -0
- package/dist/collections/Footer.js.map +1 -0
- package/dist/collections/FormSubmissions.d.ts +3 -0
- package/dist/collections/FormSubmissions.d.ts.map +1 -0
- package/dist/collections/FormSubmissions.js +119 -0
- package/dist/collections/FormSubmissions.js.map +1 -0
- package/dist/collections/Forms.d.ts +16 -0
- package/dist/collections/Forms.d.ts.map +1 -0
- package/dist/collections/Forms.js +308 -0
- package/dist/collections/Forms.js.map +1 -0
- package/dist/collections/HeroBlocks.d.ts +3 -0
- package/dist/collections/HeroBlocks.d.ts.map +1 -0
- package/dist/collections/HeroBlocks.js +115 -0
- package/dist/collections/HeroBlocks.js.map +1 -0
- package/dist/collections/Media.d.ts +3 -0
- package/dist/collections/Media.d.ts.map +1 -0
- package/dist/collections/Media.js +26 -0
- package/dist/collections/Media.js.map +1 -0
- package/dist/collections/Navigation.d.ts +3 -0
- package/dist/collections/Navigation.d.ts.map +1 -0
- package/dist/collections/Navigation.js +106 -0
- package/dist/collections/Navigation.js.map +1 -0
- package/dist/collections/Pages.d.ts +3 -0
- package/dist/collections/Pages.d.ts.map +1 -0
- package/dist/collections/Pages.js +94 -0
- package/dist/collections/Pages.js.map +1 -0
- package/dist/collections/Posts.d.ts +3 -0
- package/dist/collections/Posts.d.ts.map +1 -0
- package/dist/collections/Posts.js +134 -0
- package/dist/collections/Posts.js.map +1 -0
- package/dist/collections/Products.d.ts +3 -0
- package/dist/collections/Products.d.ts.map +1 -0
- package/dist/collections/Products.js +264 -0
- package/dist/collections/Products.js.map +1 -0
- package/dist/collections/Users.d.ts +3 -0
- package/dist/collections/Users.d.ts.map +1 -0
- package/dist/collections/Users.js +53 -0
- package/dist/collections/Users.js.map +1 -0
- package/dist/collections/hooks/index.d.ts +9 -0
- package/dist/collections/hooks/index.d.ts.map +1 -0
- package/dist/collections/hooks/index.js +9 -0
- package/dist/collections/hooks/index.js.map +1 -0
- package/dist/collections/hooks/loggingHooks.d.ts +45 -0
- package/dist/collections/hooks/loggingHooks.d.ts.map +1 -0
- package/dist/collections/hooks/loggingHooks.js +109 -0
- package/dist/collections/hooks/loggingHooks.js.map +1 -0
- package/dist/collections/index.d.ts +14 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +16 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/globals/AdvancedSettings.d.ts +8 -0
- package/dist/globals/AdvancedSettings.d.ts.map +1 -0
- package/dist/globals/AdvancedSettings.js +157 -0
- package/dist/globals/AdvancedSettings.js.map +1 -0
- package/dist/globals/Integrations.d.ts +8 -0
- package/dist/globals/Integrations.d.ts.map +1 -0
- package/dist/globals/Integrations.js +270 -0
- package/dist/globals/Integrations.js.map +1 -0
- package/dist/globals/SiteSettings.d.ts +8 -0
- package/dist/globals/SiteSettings.d.ts.map +1 -0
- package/dist/globals/SiteSettings.js +258 -0
- package/dist/globals/SiteSettings.js.map +1 -0
- package/dist/globals/ThemeSettings.d.ts +11 -0
- package/dist/globals/ThemeSettings.d.ts.map +1 -0
- package/dist/globals/ThemeSettings.js +92 -0
- package/dist/globals/ThemeSettings.js.map +1 -0
- package/dist/globals/index.d.ts +5 -0
- package/dist/globals/index.d.ts.map +1 -0
- package/dist/globals/index.js +6 -0
- package/dist/globals/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +73 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +190 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/nextjs/BlockRenderer.d.ts +227 -0
- package/dist/nextjs/BlockRenderer.d.ts.map +1 -0
- package/dist/nextjs/BlockRenderer.js +358 -0
- package/dist/nextjs/BlockRenderer.js.map +1 -0
- package/dist/nextjs/ClientHomePage.d.ts +6 -0
- package/dist/nextjs/ClientHomePage.d.ts.map +1 -0
- package/dist/nextjs/ClientHomePage.js +17 -0
- package/dist/nextjs/ClientHomePage.js.map +1 -0
- package/dist/nextjs/ClientSideQwickApp.d.ts +23 -0
- package/dist/nextjs/ClientSideQwickApp.d.ts.map +1 -0
- package/dist/nextjs/ClientSideQwickApp.js +50 -0
- package/dist/nextjs/ClientSideQwickApp.js.map +1 -0
- package/dist/nextjs/DynamicQwickApp.d.ts +9 -0
- package/dist/nextjs/DynamicQwickApp.d.ts.map +1 -0
- package/dist/nextjs/DynamicQwickApp.js +19 -0
- package/dist/nextjs/DynamicQwickApp.js.map +1 -0
- package/dist/nextjs/FooterFromSettings.d.ts +6 -0
- package/dist/nextjs/FooterFromSettings.d.ts.map +1 -0
- package/dist/nextjs/FooterFromSettings.js +72 -0
- package/dist/nextjs/FooterFromSettings.js.map +1 -0
- package/dist/nextjs/FormBlockComponent.d.ts +25 -0
- package/dist/nextjs/FormBlockComponent.d.ts.map +1 -0
- package/dist/nextjs/FormBlockComponent.js +110 -0
- package/dist/nextjs/FormBlockComponent.js.map +1 -0
- package/dist/nextjs/HomePageContent.d.ts +6 -0
- package/dist/nextjs/HomePageContent.d.ts.map +1 -0
- package/dist/nextjs/HomePageContent.js +50 -0
- package/dist/nextjs/HomePageContent.js.map +1 -0
- package/dist/nextjs/LivePreviewClient.d.ts +40 -0
- package/dist/nextjs/LivePreviewClient.d.ts.map +1 -0
- package/dist/nextjs/LivePreviewClient.js +35 -0
- package/dist/nextjs/LivePreviewClient.js.map +1 -0
- package/dist/nextjs/RefreshRouteOnSave.d.ts +31 -0
- package/dist/nextjs/RefreshRouteOnSave.d.ts.map +1 -0
- package/dist/nextjs/RefreshRouteOnSave.js +59 -0
- package/dist/nextjs/RefreshRouteOnSave.js.map +1 -0
- package/dist/nextjs/ScriptsInjector.d.ts +2 -0
- package/dist/nextjs/ScriptsInjector.d.ts.map +1 -0
- package/dist/nextjs/ScriptsInjector.js +73 -0
- package/dist/nextjs/ScriptsInjector.js.map +1 -0
- package/dist/nextjs/ServerQwickApp.d.ts +13 -0
- package/dist/nextjs/ServerQwickApp.d.ts.map +1 -0
- package/dist/nextjs/ServerQwickApp.js +159 -0
- package/dist/nextjs/ServerQwickApp.js.map +1 -0
- package/dist/nextjs/SettingsProvider.d.ts +110 -0
- package/dist/nextjs/SettingsProvider.d.ts.map +1 -0
- package/dist/nextjs/SettingsProvider.js +107 -0
- package/dist/nextjs/SettingsProvider.js.map +1 -0
- package/dist/nextjs/SiteLogo.d.ts +35 -0
- package/dist/nextjs/SiteLogo.d.ts.map +1 -0
- package/dist/nextjs/SiteLogo.js +105 -0
- package/dist/nextjs/SiteLogo.js.map +1 -0
- package/dist/nextjs/framework.d.ts +19 -0
- package/dist/nextjs/framework.d.ts.map +1 -0
- package/dist/nextjs/framework.js +35 -0
- package/dist/nextjs/framework.js.map +1 -0
- package/dist/nextjs/index.d.ts +38 -0
- package/dist/nextjs/index.d.ts.map +1 -0
- package/dist/nextjs/index.js +47 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/nextjs/metadata.d.ts +20 -0
- package/dist/nextjs/metadata.d.ts.map +1 -0
- package/dist/nextjs/metadata.js +107 -0
- package/dist/nextjs/metadata.js.map +1 -0
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/qwickapps-plugin.d.ts +78 -0
- package/dist/plugins/qwickapps-plugin.d.ts.map +1 -0
- package/dist/plugins/qwickapps-plugin.js +154 -0
- package/dist/plugins/qwickapps-plugin.js.map +1 -0
- package/dist/providers/PayloadDataProvider.d.ts +72 -0
- package/dist/providers/PayloadDataProvider.d.ts.map +1 -0
- package/dist/providers/PayloadDataProvider.js +222 -0
- package/dist/providers/PayloadDataProvider.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/styles/admin-theme.css +352 -0
- package/package.json +104 -0
|
@@ -0,0 +1,741 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automations Collection
|
|
3
|
+
*
|
|
4
|
+
* Stores automation definitions for the QwickApps automation framework.
|
|
5
|
+
* Each automation defines a trigger (event that starts the automation) and
|
|
6
|
+
* a series of actions to execute when triggered.
|
|
7
|
+
*
|
|
8
|
+
* Copyright (c) 2025 QwickApps.com. All rights reserved.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Payload Hook Trigger Configuration Fields
|
|
12
|
+
* Shown when trigger type is 'payload-hook'
|
|
13
|
+
*/
|
|
14
|
+
const payloadHookFields = [
|
|
15
|
+
{
|
|
16
|
+
name: 'collection',
|
|
17
|
+
type: 'select',
|
|
18
|
+
required: true,
|
|
19
|
+
options: [
|
|
20
|
+
{ label: 'Pages', value: 'pages' },
|
|
21
|
+
{ label: 'Posts', value: 'posts' },
|
|
22
|
+
{ label: 'Media', value: 'media' },
|
|
23
|
+
{ label: 'Users', value: 'users' },
|
|
24
|
+
{ label: 'Forms', value: 'forms' },
|
|
25
|
+
{ label: 'Form Submissions', value: 'form-submissions' },
|
|
26
|
+
{ label: 'Products', value: 'products' },
|
|
27
|
+
{ label: 'Navigation', value: 'navigation' },
|
|
28
|
+
{ label: 'Footer', value: 'footer' },
|
|
29
|
+
],
|
|
30
|
+
admin: {
|
|
31
|
+
description: 'Which collection should trigger this automation?',
|
|
32
|
+
condition: (data) => data?.trigger?.type === 'payload-hook',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'event',
|
|
37
|
+
type: 'select',
|
|
38
|
+
required: true,
|
|
39
|
+
options: [
|
|
40
|
+
{ label: 'After Create', value: 'afterCreate' },
|
|
41
|
+
{ label: 'After Update', value: 'afterUpdate' },
|
|
42
|
+
{ label: 'After Delete', value: 'afterDelete' },
|
|
43
|
+
{ label: 'Before Create', value: 'beforeCreate' },
|
|
44
|
+
{ label: 'Before Update', value: 'beforeUpdate' },
|
|
45
|
+
{ label: 'Before Delete', value: 'beforeDelete' },
|
|
46
|
+
],
|
|
47
|
+
admin: {
|
|
48
|
+
description: 'Which event should trigger this automation?',
|
|
49
|
+
condition: (data) => data?.trigger?.type === 'payload-hook',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Schedule Trigger Configuration Fields
|
|
55
|
+
* Shown when trigger type is 'schedule'
|
|
56
|
+
*/
|
|
57
|
+
const scheduleFields = [
|
|
58
|
+
{
|
|
59
|
+
name: 'scheduleType',
|
|
60
|
+
type: 'select',
|
|
61
|
+
required: true,
|
|
62
|
+
options: [
|
|
63
|
+
{ label: 'Every Hour', value: 'hourly' },
|
|
64
|
+
{ label: 'Every Day', value: 'daily' },
|
|
65
|
+
{ label: 'Every Week', value: 'weekly' },
|
|
66
|
+
{ label: 'Every Month', value: 'monthly' },
|
|
67
|
+
{ label: 'Custom (Cron)', value: 'custom' },
|
|
68
|
+
],
|
|
69
|
+
admin: {
|
|
70
|
+
description: 'How often should this automation run?',
|
|
71
|
+
condition: (data) => data?.trigger?.type === 'schedule',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'scheduleTime',
|
|
76
|
+
type: 'text',
|
|
77
|
+
admin: {
|
|
78
|
+
description: 'Time to run (e.g., "09:00" for 9 AM)',
|
|
79
|
+
placeholder: '09:00',
|
|
80
|
+
condition: (data) => data?.trigger?.type === 'schedule' &&
|
|
81
|
+
['daily', 'weekly', 'monthly'].includes(data?.trigger?.scheduleType),
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'scheduleDayOfWeek',
|
|
86
|
+
type: 'select',
|
|
87
|
+
options: [
|
|
88
|
+
{ label: 'Monday', value: '1' },
|
|
89
|
+
{ label: 'Tuesday', value: '2' },
|
|
90
|
+
{ label: 'Wednesday', value: '3' },
|
|
91
|
+
{ label: 'Thursday', value: '4' },
|
|
92
|
+
{ label: 'Friday', value: '5' },
|
|
93
|
+
{ label: 'Saturday', value: '6' },
|
|
94
|
+
{ label: 'Sunday', value: '0' },
|
|
95
|
+
],
|
|
96
|
+
admin: {
|
|
97
|
+
description: 'Day of the week to run',
|
|
98
|
+
condition: (data) => data?.trigger?.type === 'schedule' && data?.trigger?.scheduleType === 'weekly',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'scheduleDayOfMonth',
|
|
103
|
+
type: 'number',
|
|
104
|
+
min: 1,
|
|
105
|
+
max: 31,
|
|
106
|
+
admin: {
|
|
107
|
+
description: 'Day of the month to run (1-31)',
|
|
108
|
+
condition: (data) => data?.trigger?.type === 'schedule' && data?.trigger?.scheduleType === 'monthly',
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'cronExpression',
|
|
113
|
+
type: 'text',
|
|
114
|
+
admin: {
|
|
115
|
+
description: 'Custom cron expression (e.g., "0 9 * * 1-5" for weekdays at 9 AM)',
|
|
116
|
+
placeholder: '0 9 * * *',
|
|
117
|
+
condition: (data) => data?.trigger?.type === 'schedule' && data?.trigger?.scheduleType === 'custom',
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
/**
|
|
122
|
+
* Webhook Trigger Configuration Fields
|
|
123
|
+
* Shown when trigger type is 'webhook'
|
|
124
|
+
*/
|
|
125
|
+
const webhookTriggerFields = [
|
|
126
|
+
{
|
|
127
|
+
name: 'webhookPath',
|
|
128
|
+
type: 'text',
|
|
129
|
+
required: true,
|
|
130
|
+
admin: {
|
|
131
|
+
description: 'URL path for the webhook endpoint (will be: /api/webhooks/automations/{path})',
|
|
132
|
+
placeholder: 'my-webhook',
|
|
133
|
+
condition: (data) => data?.trigger?.type === 'webhook',
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'webhookMethod',
|
|
138
|
+
type: 'select',
|
|
139
|
+
defaultValue: 'POST',
|
|
140
|
+
options: [
|
|
141
|
+
{ label: 'POST', value: 'POST' },
|
|
142
|
+
{ label: 'GET', value: 'GET' },
|
|
143
|
+
],
|
|
144
|
+
admin: {
|
|
145
|
+
description: 'HTTP method for the webhook',
|
|
146
|
+
condition: (data) => data?.trigger?.type === 'webhook',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: 'webhookSecret',
|
|
151
|
+
type: 'text',
|
|
152
|
+
admin: {
|
|
153
|
+
description: 'Optional secret for webhook authentication (will be checked in X-Webhook-Secret header)',
|
|
154
|
+
condition: (data) => data?.trigger?.type === 'webhook',
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
/**
|
|
159
|
+
* Send Email Action Configuration Fields
|
|
160
|
+
*/
|
|
161
|
+
const sendEmailFields = [
|
|
162
|
+
{
|
|
163
|
+
name: 'emailTo',
|
|
164
|
+
type: 'text',
|
|
165
|
+
required: true,
|
|
166
|
+
admin: {
|
|
167
|
+
description: 'Recipient email. For form submissions use {{data.formData.email}} or {{data.submitterEmail}}',
|
|
168
|
+
placeholder: 'recipient@example.com or {{data.formData.email}}',
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'emailSubject',
|
|
173
|
+
type: 'text',
|
|
174
|
+
required: true,
|
|
175
|
+
admin: {
|
|
176
|
+
description: 'Email subject line. Use {{data.fieldName}} for dynamic values',
|
|
177
|
+
placeholder: 'New submission from {{data.formData.name}}',
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'emailBody',
|
|
182
|
+
type: 'textarea',
|
|
183
|
+
required: true,
|
|
184
|
+
admin: {
|
|
185
|
+
description: 'Email body content. For form submissions, fields are under {{data.formData.X}}',
|
|
186
|
+
placeholder: 'Hello,\n\nYou have a new submission:\n\nName: {{data.formData.name}}\nEmail: {{data.formData.email}}\nMessage: {{data.formData.message}}',
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: 'emailFrom',
|
|
191
|
+
type: 'text',
|
|
192
|
+
admin: {
|
|
193
|
+
description: 'Sender email (leave empty to use default)',
|
|
194
|
+
placeholder: 'noreply@example.com',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'emailReplyTo',
|
|
199
|
+
type: 'text',
|
|
200
|
+
admin: {
|
|
201
|
+
description: 'Reply-to email address',
|
|
202
|
+
placeholder: '{{data.email}}',
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
];
|
|
206
|
+
/**
|
|
207
|
+
* Webhook Action Configuration Fields
|
|
208
|
+
*/
|
|
209
|
+
const webhookActionFields = [
|
|
210
|
+
{
|
|
211
|
+
name: 'webhookUrl',
|
|
212
|
+
type: 'text',
|
|
213
|
+
required: true,
|
|
214
|
+
admin: {
|
|
215
|
+
description: 'URL to send the webhook request to',
|
|
216
|
+
placeholder: 'https://api.example.com/webhook',
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: 'webhookActionMethod',
|
|
221
|
+
type: 'select',
|
|
222
|
+
defaultValue: 'POST',
|
|
223
|
+
options: [
|
|
224
|
+
{ label: 'POST', value: 'POST' },
|
|
225
|
+
{ label: 'PUT', value: 'PUT' },
|
|
226
|
+
{ label: 'PATCH', value: 'PATCH' },
|
|
227
|
+
{ label: 'GET', value: 'GET' },
|
|
228
|
+
{ label: 'DELETE', value: 'DELETE' },
|
|
229
|
+
],
|
|
230
|
+
admin: {
|
|
231
|
+
description: 'HTTP method for the request',
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
name: 'webhookHeaders',
|
|
236
|
+
type: 'array',
|
|
237
|
+
admin: {
|
|
238
|
+
description: 'Custom headers to include in the request',
|
|
239
|
+
},
|
|
240
|
+
fields: [
|
|
241
|
+
{
|
|
242
|
+
name: 'key',
|
|
243
|
+
type: 'text',
|
|
244
|
+
required: true,
|
|
245
|
+
admin: {
|
|
246
|
+
placeholder: 'Authorization',
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
name: 'value',
|
|
251
|
+
type: 'text',
|
|
252
|
+
required: true,
|
|
253
|
+
admin: {
|
|
254
|
+
placeholder: 'Bearer {{env.API_KEY}}',
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: 'webhookPayloadTemplate',
|
|
261
|
+
type: 'textarea',
|
|
262
|
+
admin: {
|
|
263
|
+
description: 'JSON payload template (leave empty to send trigger data as-is)',
|
|
264
|
+
placeholder: '{\n "event": "{{trigger.event}}",\n "data": {{json data}}\n}',
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
];
|
|
268
|
+
/**
|
|
269
|
+
* Rules Engine Action Configuration Fields
|
|
270
|
+
*/
|
|
271
|
+
const rulesEngineFields = [
|
|
272
|
+
{
|
|
273
|
+
name: 'rules',
|
|
274
|
+
type: 'array',
|
|
275
|
+
admin: {
|
|
276
|
+
description: 'Define rules to evaluate. If any rule passes, the configured actions will run.',
|
|
277
|
+
},
|
|
278
|
+
fields: [
|
|
279
|
+
{
|
|
280
|
+
name: 'ruleName',
|
|
281
|
+
type: 'text',
|
|
282
|
+
required: true,
|
|
283
|
+
admin: {
|
|
284
|
+
description: 'Name for this rule',
|
|
285
|
+
placeholder: 'High value order',
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
name: 'conditions',
|
|
290
|
+
type: 'array',
|
|
291
|
+
required: true,
|
|
292
|
+
minRows: 1,
|
|
293
|
+
admin: {
|
|
294
|
+
description: 'Conditions that must ALL be true for this rule to pass',
|
|
295
|
+
},
|
|
296
|
+
fields: [
|
|
297
|
+
{
|
|
298
|
+
name: 'field',
|
|
299
|
+
type: 'text',
|
|
300
|
+
required: true,
|
|
301
|
+
admin: {
|
|
302
|
+
description: 'Field path to check (e.g., "data.amount" or "data.status")',
|
|
303
|
+
placeholder: 'data.amount',
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: 'operator',
|
|
308
|
+
type: 'select',
|
|
309
|
+
required: true,
|
|
310
|
+
options: [
|
|
311
|
+
{ label: 'Equals', value: 'equal' },
|
|
312
|
+
{ label: 'Not Equals', value: 'notEqual' },
|
|
313
|
+
{ label: 'Greater Than', value: 'greaterThan' },
|
|
314
|
+
{ label: 'Greater Than or Equal', value: 'greaterThanInclusive' },
|
|
315
|
+
{ label: 'Less Than', value: 'lessThan' },
|
|
316
|
+
{ label: 'Less Than or Equal', value: 'lessThanInclusive' },
|
|
317
|
+
{ label: 'Contains', value: 'contains' },
|
|
318
|
+
{ label: 'Does Not Contain', value: 'doesNotContain' },
|
|
319
|
+
{ label: 'In List', value: 'in' },
|
|
320
|
+
{ label: 'Not In List', value: 'notIn' },
|
|
321
|
+
],
|
|
322
|
+
admin: {
|
|
323
|
+
description: 'Comparison operator',
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'value',
|
|
328
|
+
type: 'text',
|
|
329
|
+
required: true,
|
|
330
|
+
admin: {
|
|
331
|
+
description: 'Value to compare against',
|
|
332
|
+
placeholder: '100',
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
],
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
name: 'ruleActions',
|
|
339
|
+
type: 'array',
|
|
340
|
+
admin: {
|
|
341
|
+
description: 'Actions to run if this rule passes (in addition to main actions)',
|
|
342
|
+
},
|
|
343
|
+
fields: [
|
|
344
|
+
{
|
|
345
|
+
name: 'setFact',
|
|
346
|
+
type: 'text',
|
|
347
|
+
admin: {
|
|
348
|
+
description: 'Set a fact/variable for subsequent rules',
|
|
349
|
+
placeholder: 'isHighValue',
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: 'setFactValue',
|
|
354
|
+
type: 'text',
|
|
355
|
+
admin: {
|
|
356
|
+
description: 'Value to set',
|
|
357
|
+
placeholder: 'true',
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
],
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
},
|
|
364
|
+
];
|
|
365
|
+
/**
|
|
366
|
+
* Maps collection slugs to human-readable names
|
|
367
|
+
*/
|
|
368
|
+
const collectionLabels = {
|
|
369
|
+
pages: 'page',
|
|
370
|
+
posts: 'post',
|
|
371
|
+
media: 'media item',
|
|
372
|
+
users: 'user',
|
|
373
|
+
forms: 'form',
|
|
374
|
+
'form-submissions': 'form submission',
|
|
375
|
+
products: 'product',
|
|
376
|
+
navigation: 'navigation',
|
|
377
|
+
footer: 'footer',
|
|
378
|
+
};
|
|
379
|
+
/**
|
|
380
|
+
* Maps event types to human-readable descriptions
|
|
381
|
+
*/
|
|
382
|
+
const eventLabels = {
|
|
383
|
+
afterCreate: 'After new',
|
|
384
|
+
afterUpdate: 'After',
|
|
385
|
+
afterDelete: 'After',
|
|
386
|
+
beforeCreate: 'Before new',
|
|
387
|
+
beforeUpdate: 'Before',
|
|
388
|
+
beforeDelete: 'Before',
|
|
389
|
+
};
|
|
390
|
+
/**
|
|
391
|
+
* Maps event types to action verbs
|
|
392
|
+
*/
|
|
393
|
+
const eventVerbs = {
|
|
394
|
+
afterCreate: 'is created',
|
|
395
|
+
afterUpdate: 'is updated',
|
|
396
|
+
afterDelete: 'is deleted',
|
|
397
|
+
beforeCreate: 'is created',
|
|
398
|
+
beforeUpdate: 'is updated',
|
|
399
|
+
beforeDelete: 'is deleted',
|
|
400
|
+
};
|
|
401
|
+
/**
|
|
402
|
+
* Generate human-readable trigger description
|
|
403
|
+
*/
|
|
404
|
+
function generateTriggerDescription(trigger) {
|
|
405
|
+
if (!trigger?.type)
|
|
406
|
+
return 'Not configured';
|
|
407
|
+
switch (trigger.type) {
|
|
408
|
+
case 'payload-hook': {
|
|
409
|
+
const collection = trigger.collection || 'record';
|
|
410
|
+
const event = trigger.event || 'afterCreate';
|
|
411
|
+
const label = collectionLabels[collection] || collection;
|
|
412
|
+
const prefix = eventLabels[event] || 'When';
|
|
413
|
+
const verb = eventVerbs[event] || 'changes';
|
|
414
|
+
return `${prefix} ${label} ${verb}`;
|
|
415
|
+
}
|
|
416
|
+
case 'schedule': {
|
|
417
|
+
const scheduleType = trigger.scheduleType || 'daily';
|
|
418
|
+
const scheduleLabels = {
|
|
419
|
+
hourly: 'Every hour',
|
|
420
|
+
daily: 'Every day',
|
|
421
|
+
weekly: 'Every week',
|
|
422
|
+
monthly: 'Every month',
|
|
423
|
+
custom: 'Custom schedule',
|
|
424
|
+
};
|
|
425
|
+
return scheduleLabels[scheduleType] || 'On schedule';
|
|
426
|
+
}
|
|
427
|
+
case 'webhook':
|
|
428
|
+
return `Webhook: ${trigger.webhookPath || 'custom'}`;
|
|
429
|
+
case 'manual':
|
|
430
|
+
return 'Manual trigger';
|
|
431
|
+
default:
|
|
432
|
+
return trigger.type;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
export const Automations = {
|
|
436
|
+
slug: 'automations',
|
|
437
|
+
admin: {
|
|
438
|
+
useAsTitle: 'name',
|
|
439
|
+
defaultColumns: ['name', 'triggerDescription', 'enabled', 'updatedAt'],
|
|
440
|
+
group: 'System',
|
|
441
|
+
description: 'Create automated workflows triggered by events, schedules, or webhooks',
|
|
442
|
+
},
|
|
443
|
+
access: {
|
|
444
|
+
read: () => true,
|
|
445
|
+
create: () => true,
|
|
446
|
+
update: () => true,
|
|
447
|
+
delete: () => true,
|
|
448
|
+
},
|
|
449
|
+
hooks: {
|
|
450
|
+
afterRead: [
|
|
451
|
+
({ doc }) => {
|
|
452
|
+
if (doc) {
|
|
453
|
+
doc.triggerDescription = generateTriggerDescription(doc.trigger);
|
|
454
|
+
}
|
|
455
|
+
return doc;
|
|
456
|
+
},
|
|
457
|
+
],
|
|
458
|
+
},
|
|
459
|
+
fields: [
|
|
460
|
+
// Virtual field for list view (computed via afterRead hook)
|
|
461
|
+
{
|
|
462
|
+
name: 'triggerDescription',
|
|
463
|
+
type: 'text',
|
|
464
|
+
admin: {
|
|
465
|
+
readOnly: true,
|
|
466
|
+
hidden: true, // Hide from edit form, only show in list view
|
|
467
|
+
},
|
|
468
|
+
hooks: {
|
|
469
|
+
beforeChange: [
|
|
470
|
+
() => undefined, // Prevent storing in DB
|
|
471
|
+
],
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
// Basic Info
|
|
475
|
+
{
|
|
476
|
+
type: 'row',
|
|
477
|
+
fields: [
|
|
478
|
+
{
|
|
479
|
+
name: 'name',
|
|
480
|
+
type: 'text',
|
|
481
|
+
required: true,
|
|
482
|
+
admin: {
|
|
483
|
+
width: '70%',
|
|
484
|
+
description: 'Give your automation a descriptive name',
|
|
485
|
+
placeholder: 'Send welcome email to new users',
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
name: 'enabled',
|
|
490
|
+
type: 'checkbox',
|
|
491
|
+
defaultValue: true,
|
|
492
|
+
admin: {
|
|
493
|
+
width: '30%',
|
|
494
|
+
description: 'Enable/disable',
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
],
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
name: 'description',
|
|
501
|
+
type: 'textarea',
|
|
502
|
+
admin: {
|
|
503
|
+
description: 'Describe what this automation does (optional)',
|
|
504
|
+
placeholder: 'This automation sends a welcome email whenever a new user registers...',
|
|
505
|
+
},
|
|
506
|
+
},
|
|
507
|
+
// Trigger Configuration
|
|
508
|
+
{
|
|
509
|
+
type: 'collapsible',
|
|
510
|
+
label: 'When to Run (Trigger)',
|
|
511
|
+
admin: {
|
|
512
|
+
initCollapsed: false,
|
|
513
|
+
},
|
|
514
|
+
fields: [
|
|
515
|
+
{
|
|
516
|
+
name: 'trigger',
|
|
517
|
+
type: 'group',
|
|
518
|
+
fields: [
|
|
519
|
+
{
|
|
520
|
+
name: 'type',
|
|
521
|
+
type: 'select',
|
|
522
|
+
required: true,
|
|
523
|
+
defaultValue: 'payload-hook',
|
|
524
|
+
options: [
|
|
525
|
+
{
|
|
526
|
+
label: 'When a record is created/updated/deleted',
|
|
527
|
+
value: 'payload-hook',
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
label: 'On a schedule (daily, weekly, etc.)',
|
|
531
|
+
value: 'schedule',
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
label: 'When a webhook is received',
|
|
535
|
+
value: 'webhook',
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
label: 'Manual trigger only',
|
|
539
|
+
value: 'manual',
|
|
540
|
+
},
|
|
541
|
+
],
|
|
542
|
+
admin: {
|
|
543
|
+
description: 'What should trigger this automation?',
|
|
544
|
+
},
|
|
545
|
+
},
|
|
546
|
+
// Payload Hook fields
|
|
547
|
+
...payloadHookFields,
|
|
548
|
+
// Schedule fields
|
|
549
|
+
...scheduleFields,
|
|
550
|
+
// Webhook trigger fields
|
|
551
|
+
...webhookTriggerFields,
|
|
552
|
+
],
|
|
553
|
+
},
|
|
554
|
+
],
|
|
555
|
+
},
|
|
556
|
+
// Actions Configuration
|
|
557
|
+
{
|
|
558
|
+
type: 'collapsible',
|
|
559
|
+
label: 'What to Do (Actions)',
|
|
560
|
+
admin: {
|
|
561
|
+
initCollapsed: false,
|
|
562
|
+
},
|
|
563
|
+
fields: [
|
|
564
|
+
{
|
|
565
|
+
name: 'actions',
|
|
566
|
+
type: 'array',
|
|
567
|
+
required: true,
|
|
568
|
+
minRows: 1,
|
|
569
|
+
labels: {
|
|
570
|
+
singular: 'Action',
|
|
571
|
+
plural: 'Actions',
|
|
572
|
+
},
|
|
573
|
+
admin: {
|
|
574
|
+
description: 'Define what happens when this automation runs. Actions execute in order.',
|
|
575
|
+
initCollapsed: false,
|
|
576
|
+
},
|
|
577
|
+
fields: [
|
|
578
|
+
{
|
|
579
|
+
name: 'actionName',
|
|
580
|
+
type: 'text',
|
|
581
|
+
admin: {
|
|
582
|
+
description: 'Name for this action (optional, helps identify in logs)',
|
|
583
|
+
placeholder: 'Send notification email',
|
|
584
|
+
},
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
name: 'type',
|
|
588
|
+
type: 'select',
|
|
589
|
+
required: true,
|
|
590
|
+
defaultValue: 'send-email',
|
|
591
|
+
options: [
|
|
592
|
+
{
|
|
593
|
+
label: 'Send Email',
|
|
594
|
+
value: 'send-email',
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
label: 'Call External Webhook',
|
|
598
|
+
value: 'webhook',
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
label: 'Evaluate Rules (Conditional Logic)',
|
|
602
|
+
value: 'rules-engine',
|
|
603
|
+
},
|
|
604
|
+
],
|
|
605
|
+
admin: {
|
|
606
|
+
description: 'What type of action is this?',
|
|
607
|
+
},
|
|
608
|
+
},
|
|
609
|
+
// Send Email Configuration
|
|
610
|
+
{
|
|
611
|
+
type: 'group',
|
|
612
|
+
name: 'emailConfig',
|
|
613
|
+
label: 'Email Settings',
|
|
614
|
+
admin: {
|
|
615
|
+
condition: (_data, siblingData) => siblingData?.type === 'send-email',
|
|
616
|
+
},
|
|
617
|
+
fields: sendEmailFields,
|
|
618
|
+
},
|
|
619
|
+
// Webhook Action Configuration
|
|
620
|
+
{
|
|
621
|
+
type: 'group',
|
|
622
|
+
name: 'webhookConfig',
|
|
623
|
+
label: 'Webhook Settings',
|
|
624
|
+
admin: {
|
|
625
|
+
condition: (_data, siblingData) => siblingData?.type === 'webhook',
|
|
626
|
+
},
|
|
627
|
+
fields: webhookActionFields,
|
|
628
|
+
},
|
|
629
|
+
// Rules Engine Configuration
|
|
630
|
+
{
|
|
631
|
+
type: 'group',
|
|
632
|
+
name: 'rulesConfig',
|
|
633
|
+
label: 'Rules Configuration',
|
|
634
|
+
admin: {
|
|
635
|
+
condition: (_data, siblingData) => siblingData?.type === 'rules-engine',
|
|
636
|
+
},
|
|
637
|
+
fields: rulesEngineFields,
|
|
638
|
+
},
|
|
639
|
+
// Conditional execution
|
|
640
|
+
{
|
|
641
|
+
type: 'collapsible',
|
|
642
|
+
label: 'Conditional Execution (Advanced)',
|
|
643
|
+
admin: {
|
|
644
|
+
initCollapsed: true,
|
|
645
|
+
},
|
|
646
|
+
fields: [
|
|
647
|
+
{
|
|
648
|
+
name: 'skipIf',
|
|
649
|
+
type: 'group',
|
|
650
|
+
admin: {
|
|
651
|
+
description: 'Skip this action if a condition is met',
|
|
652
|
+
},
|
|
653
|
+
fields: [
|
|
654
|
+
{
|
|
655
|
+
name: 'enabled',
|
|
656
|
+
type: 'checkbox',
|
|
657
|
+
defaultValue: false,
|
|
658
|
+
admin: {
|
|
659
|
+
description: 'Enable conditional skip',
|
|
660
|
+
},
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
name: 'field',
|
|
664
|
+
type: 'text',
|
|
665
|
+
admin: {
|
|
666
|
+
description: 'Field to check (e.g., "data.status")',
|
|
667
|
+
placeholder: 'data.status',
|
|
668
|
+
condition: (_data, siblingData) => siblingData?.enabled,
|
|
669
|
+
},
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
name: 'operator',
|
|
673
|
+
type: 'select',
|
|
674
|
+
options: [
|
|
675
|
+
{ label: 'Equals', value: 'equals' },
|
|
676
|
+
{ label: 'Not Equals', value: 'notEquals' },
|
|
677
|
+
{ label: 'Is Empty', value: 'isEmpty' },
|
|
678
|
+
{ label: 'Is Not Empty', value: 'isNotEmpty' },
|
|
679
|
+
],
|
|
680
|
+
admin: {
|
|
681
|
+
condition: (_data, siblingData) => siblingData?.enabled,
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
name: 'value',
|
|
686
|
+
type: 'text',
|
|
687
|
+
admin: {
|
|
688
|
+
description: 'Value to compare',
|
|
689
|
+
condition: (_data, siblingData) => siblingData?.enabled &&
|
|
690
|
+
['equals', 'notEquals'].includes(siblingData?.operator),
|
|
691
|
+
},
|
|
692
|
+
},
|
|
693
|
+
],
|
|
694
|
+
},
|
|
695
|
+
],
|
|
696
|
+
},
|
|
697
|
+
],
|
|
698
|
+
},
|
|
699
|
+
],
|
|
700
|
+
},
|
|
701
|
+
// Execution Settings
|
|
702
|
+
{
|
|
703
|
+
type: 'collapsible',
|
|
704
|
+
label: 'Advanced Settings',
|
|
705
|
+
admin: {
|
|
706
|
+
initCollapsed: true,
|
|
707
|
+
},
|
|
708
|
+
fields: [
|
|
709
|
+
{
|
|
710
|
+
name: 'retryOnFailure',
|
|
711
|
+
type: 'checkbox',
|
|
712
|
+
defaultValue: false,
|
|
713
|
+
admin: {
|
|
714
|
+
description: 'Retry failed actions automatically',
|
|
715
|
+
},
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
name: 'maxRetries',
|
|
719
|
+
type: 'number',
|
|
720
|
+
defaultValue: 3,
|
|
721
|
+
min: 1,
|
|
722
|
+
max: 10,
|
|
723
|
+
admin: {
|
|
724
|
+
description: 'Maximum number of retry attempts',
|
|
725
|
+
condition: (data) => data?.retryOnFailure,
|
|
726
|
+
},
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
name: 'logExecutions',
|
|
730
|
+
type: 'checkbox',
|
|
731
|
+
defaultValue: true,
|
|
732
|
+
admin: {
|
|
733
|
+
description: 'Log execution history for debugging',
|
|
734
|
+
},
|
|
735
|
+
},
|
|
736
|
+
],
|
|
737
|
+
},
|
|
738
|
+
],
|
|
739
|
+
timestamps: true,
|
|
740
|
+
};
|
|
741
|
+
//# sourceMappingURL=Automations.js.map
|