@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.
Files changed (259) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +203 -0
  3. package/dist/admin/components/AccordionItemRowLabel.d.ts +20 -0
  4. package/dist/admin/components/AccordionItemRowLabel.d.ts.map +1 -0
  5. package/dist/admin/components/AccordionItemRowLabel.js +47 -0
  6. package/dist/admin/components/AccordionItemRowLabel.js.map +1 -0
  7. package/dist/admin/components/BlockRowLabel.d.ts +19 -0
  8. package/dist/admin/components/BlockRowLabel.d.ts.map +1 -0
  9. package/dist/admin/components/BlockRowLabel.js +52 -0
  10. package/dist/admin/components/BlockRowLabel.js.map +1 -0
  11. package/dist/admin/components/ButtonRowLabel.d.ts +23 -0
  12. package/dist/admin/components/ButtonRowLabel.d.ts.map +1 -0
  13. package/dist/admin/components/ButtonRowLabel.js +63 -0
  14. package/dist/admin/components/ButtonRowLabel.js.map +1 -0
  15. package/dist/admin/components/CardRowLabel.d.ts +23 -0
  16. package/dist/admin/components/CardRowLabel.d.ts.map +1 -0
  17. package/dist/admin/components/CardRowLabel.js +59 -0
  18. package/dist/admin/components/CardRowLabel.js.map +1 -0
  19. package/dist/admin/components/ContentPreview.d.ts +12 -0
  20. package/dist/admin/components/ContentPreview.d.ts.map +1 -0
  21. package/dist/admin/components/ContentPreview.js +95 -0
  22. package/dist/admin/components/ContentPreview.js.map +1 -0
  23. package/dist/admin/components/Dashboard.d.ts +13 -0
  24. package/dist/admin/components/Dashboard.d.ts.map +1 -0
  25. package/dist/admin/components/Dashboard.js +7 -0
  26. package/dist/admin/components/Dashboard.js.map +1 -0
  27. package/dist/admin/components/DashboardContent.d.ts +11 -0
  28. package/dist/admin/components/DashboardContent.d.ts.map +1 -0
  29. package/dist/admin/components/DashboardContent.js +129 -0
  30. package/dist/admin/components/DashboardContent.js.map +1 -0
  31. package/dist/admin/components/FormFieldRowLabel.d.ts +21 -0
  32. package/dist/admin/components/FormFieldRowLabel.d.ts.map +1 -0
  33. package/dist/admin/components/FormFieldRowLabel.js +47 -0
  34. package/dist/admin/components/FormFieldRowLabel.js.map +1 -0
  35. package/dist/admin/components/Icon.d.ts +10 -0
  36. package/dist/admin/components/Icon.d.ts.map +1 -0
  37. package/dist/admin/components/Icon.js +16 -0
  38. package/dist/admin/components/Icon.js.map +1 -0
  39. package/dist/admin/components/Logo.d.ts +10 -0
  40. package/dist/admin/components/Logo.d.ts.map +1 -0
  41. package/dist/admin/components/Logo.js +16 -0
  42. package/dist/admin/components/Logo.js.map +1 -0
  43. package/dist/admin/components/NavigationItemRowLabel.d.ts +21 -0
  44. package/dist/admin/components/NavigationItemRowLabel.d.ts.map +1 -0
  45. package/dist/admin/components/NavigationItemRowLabel.js +43 -0
  46. package/dist/admin/components/NavigationItemRowLabel.js.map +1 -0
  47. package/dist/admin/components/NavigationSubItemRowLabel.d.ts +19 -0
  48. package/dist/admin/components/NavigationSubItemRowLabel.d.ts.map +1 -0
  49. package/dist/admin/components/NavigationSubItemRowLabel.js +32 -0
  50. package/dist/admin/components/NavigationSubItemRowLabel.js.map +1 -0
  51. package/dist/admin/components/PagesListHeader.d.ts +13 -0
  52. package/dist/admin/components/PagesListHeader.d.ts.map +1 -0
  53. package/dist/admin/components/PagesListHeader.js +48 -0
  54. package/dist/admin/components/PagesListHeader.js.map +1 -0
  55. package/dist/admin/components/ProductsListHeader.d.ts +13 -0
  56. package/dist/admin/components/ProductsListHeader.d.ts.map +1 -0
  57. package/dist/admin/components/ProductsListHeader.js +55 -0
  58. package/dist/admin/components/ProductsListHeader.js.map +1 -0
  59. package/dist/admin/components/styles/CollectionListHeader.css +161 -0
  60. package/dist/admin/components/styles/ContentPreview.css +416 -0
  61. package/dist/admin/components/styles/Dashboard.css +338 -0
  62. package/dist/admin/fields/ColorInput.d.ts +13 -0
  63. package/dist/admin/fields/ColorInput.d.ts.map +1 -0
  64. package/dist/admin/fields/ColorInput.js +201 -0
  65. package/dist/admin/fields/ColorInput.js.map +1 -0
  66. package/dist/admin/fields/index.d.ts +9 -0
  67. package/dist/admin/fields/index.d.ts.map +1 -0
  68. package/dist/admin/fields/index.js +9 -0
  69. package/dist/admin/fields/index.js.map +1 -0
  70. package/dist/admin/index.d.ts +24 -0
  71. package/dist/admin/index.d.ts.map +1 -0
  72. package/dist/admin/index.js +30 -0
  73. package/dist/admin/index.js.map +1 -0
  74. package/dist/blocks/ContentBlocks.d.ts +75 -0
  75. package/dist/blocks/ContentBlocks.d.ts.map +1 -0
  76. package/dist/blocks/ContentBlocks.js +1241 -0
  77. package/dist/blocks/ContentBlocks.js.map +1 -0
  78. package/dist/blocks/index.d.ts +2 -0
  79. package/dist/blocks/index.d.ts.map +1 -0
  80. package/dist/blocks/index.js +3 -0
  81. package/dist/blocks/index.js.map +1 -0
  82. package/dist/client/PayloadAPIClient.d.ts +65 -0
  83. package/dist/client/PayloadAPIClient.d.ts.map +1 -0
  84. package/dist/client/PayloadAPIClient.js +167 -0
  85. package/dist/client/PayloadAPIClient.js.map +1 -0
  86. package/dist/collections/Automations.d.ts +12 -0
  87. package/dist/collections/Automations.d.ts.map +1 -0
  88. package/dist/collections/Automations.js +741 -0
  89. package/dist/collections/Automations.js.map +1 -0
  90. package/dist/collections/Features.d.ts +3 -0
  91. package/dist/collections/Features.d.ts.map +1 -0
  92. package/dist/collections/Features.js +69 -0
  93. package/dist/collections/Features.js.map +1 -0
  94. package/dist/collections/Footer.d.ts +11 -0
  95. package/dist/collections/Footer.d.ts.map +1 -0
  96. package/dist/collections/Footer.js +130 -0
  97. package/dist/collections/Footer.js.map +1 -0
  98. package/dist/collections/FormSubmissions.d.ts +3 -0
  99. package/dist/collections/FormSubmissions.d.ts.map +1 -0
  100. package/dist/collections/FormSubmissions.js +119 -0
  101. package/dist/collections/FormSubmissions.js.map +1 -0
  102. package/dist/collections/Forms.d.ts +16 -0
  103. package/dist/collections/Forms.d.ts.map +1 -0
  104. package/dist/collections/Forms.js +308 -0
  105. package/dist/collections/Forms.js.map +1 -0
  106. package/dist/collections/HeroBlocks.d.ts +3 -0
  107. package/dist/collections/HeroBlocks.d.ts.map +1 -0
  108. package/dist/collections/HeroBlocks.js +115 -0
  109. package/dist/collections/HeroBlocks.js.map +1 -0
  110. package/dist/collections/Media.d.ts +3 -0
  111. package/dist/collections/Media.d.ts.map +1 -0
  112. package/dist/collections/Media.js +26 -0
  113. package/dist/collections/Media.js.map +1 -0
  114. package/dist/collections/Navigation.d.ts +3 -0
  115. package/dist/collections/Navigation.d.ts.map +1 -0
  116. package/dist/collections/Navigation.js +106 -0
  117. package/dist/collections/Navigation.js.map +1 -0
  118. package/dist/collections/Pages.d.ts +3 -0
  119. package/dist/collections/Pages.d.ts.map +1 -0
  120. package/dist/collections/Pages.js +94 -0
  121. package/dist/collections/Pages.js.map +1 -0
  122. package/dist/collections/Posts.d.ts +3 -0
  123. package/dist/collections/Posts.d.ts.map +1 -0
  124. package/dist/collections/Posts.js +134 -0
  125. package/dist/collections/Posts.js.map +1 -0
  126. package/dist/collections/Products.d.ts +3 -0
  127. package/dist/collections/Products.d.ts.map +1 -0
  128. package/dist/collections/Products.js +264 -0
  129. package/dist/collections/Products.js.map +1 -0
  130. package/dist/collections/Users.d.ts +3 -0
  131. package/dist/collections/Users.d.ts.map +1 -0
  132. package/dist/collections/Users.js +53 -0
  133. package/dist/collections/Users.js.map +1 -0
  134. package/dist/collections/hooks/index.d.ts +9 -0
  135. package/dist/collections/hooks/index.d.ts.map +1 -0
  136. package/dist/collections/hooks/index.js +9 -0
  137. package/dist/collections/hooks/index.js.map +1 -0
  138. package/dist/collections/hooks/loggingHooks.d.ts +45 -0
  139. package/dist/collections/hooks/loggingHooks.d.ts.map +1 -0
  140. package/dist/collections/hooks/loggingHooks.js +109 -0
  141. package/dist/collections/hooks/loggingHooks.js.map +1 -0
  142. package/dist/collections/index.d.ts +14 -0
  143. package/dist/collections/index.d.ts.map +1 -0
  144. package/dist/collections/index.js +16 -0
  145. package/dist/collections/index.js.map +1 -0
  146. package/dist/components/index.d.ts +2 -0
  147. package/dist/components/index.d.ts.map +1 -0
  148. package/dist/components/index.js +4 -0
  149. package/dist/components/index.js.map +1 -0
  150. package/dist/globals/AdvancedSettings.d.ts +8 -0
  151. package/dist/globals/AdvancedSettings.d.ts.map +1 -0
  152. package/dist/globals/AdvancedSettings.js +157 -0
  153. package/dist/globals/AdvancedSettings.js.map +1 -0
  154. package/dist/globals/Integrations.d.ts +8 -0
  155. package/dist/globals/Integrations.d.ts.map +1 -0
  156. package/dist/globals/Integrations.js +270 -0
  157. package/dist/globals/Integrations.js.map +1 -0
  158. package/dist/globals/SiteSettings.d.ts +8 -0
  159. package/dist/globals/SiteSettings.d.ts.map +1 -0
  160. package/dist/globals/SiteSettings.js +258 -0
  161. package/dist/globals/SiteSettings.js.map +1 -0
  162. package/dist/globals/ThemeSettings.d.ts +11 -0
  163. package/dist/globals/ThemeSettings.d.ts.map +1 -0
  164. package/dist/globals/ThemeSettings.js +92 -0
  165. package/dist/globals/ThemeSettings.js.map +1 -0
  166. package/dist/globals/index.d.ts +5 -0
  167. package/dist/globals/index.d.ts.map +1 -0
  168. package/dist/globals/index.js +6 -0
  169. package/dist/globals/index.js.map +1 -0
  170. package/dist/index.d.ts +9 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +14 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/logging/index.d.ts +73 -0
  175. package/dist/logging/index.d.ts.map +1 -0
  176. package/dist/logging/index.js +190 -0
  177. package/dist/logging/index.js.map +1 -0
  178. package/dist/nextjs/BlockRenderer.d.ts +227 -0
  179. package/dist/nextjs/BlockRenderer.d.ts.map +1 -0
  180. package/dist/nextjs/BlockRenderer.js +358 -0
  181. package/dist/nextjs/BlockRenderer.js.map +1 -0
  182. package/dist/nextjs/ClientHomePage.d.ts +6 -0
  183. package/dist/nextjs/ClientHomePage.d.ts.map +1 -0
  184. package/dist/nextjs/ClientHomePage.js +17 -0
  185. package/dist/nextjs/ClientHomePage.js.map +1 -0
  186. package/dist/nextjs/ClientSideQwickApp.d.ts +23 -0
  187. package/dist/nextjs/ClientSideQwickApp.d.ts.map +1 -0
  188. package/dist/nextjs/ClientSideQwickApp.js +50 -0
  189. package/dist/nextjs/ClientSideQwickApp.js.map +1 -0
  190. package/dist/nextjs/DynamicQwickApp.d.ts +9 -0
  191. package/dist/nextjs/DynamicQwickApp.d.ts.map +1 -0
  192. package/dist/nextjs/DynamicQwickApp.js +19 -0
  193. package/dist/nextjs/DynamicQwickApp.js.map +1 -0
  194. package/dist/nextjs/FooterFromSettings.d.ts +6 -0
  195. package/dist/nextjs/FooterFromSettings.d.ts.map +1 -0
  196. package/dist/nextjs/FooterFromSettings.js +72 -0
  197. package/dist/nextjs/FooterFromSettings.js.map +1 -0
  198. package/dist/nextjs/FormBlockComponent.d.ts +25 -0
  199. package/dist/nextjs/FormBlockComponent.d.ts.map +1 -0
  200. package/dist/nextjs/FormBlockComponent.js +110 -0
  201. package/dist/nextjs/FormBlockComponent.js.map +1 -0
  202. package/dist/nextjs/HomePageContent.d.ts +6 -0
  203. package/dist/nextjs/HomePageContent.d.ts.map +1 -0
  204. package/dist/nextjs/HomePageContent.js +50 -0
  205. package/dist/nextjs/HomePageContent.js.map +1 -0
  206. package/dist/nextjs/LivePreviewClient.d.ts +40 -0
  207. package/dist/nextjs/LivePreviewClient.d.ts.map +1 -0
  208. package/dist/nextjs/LivePreviewClient.js +35 -0
  209. package/dist/nextjs/LivePreviewClient.js.map +1 -0
  210. package/dist/nextjs/RefreshRouteOnSave.d.ts +31 -0
  211. package/dist/nextjs/RefreshRouteOnSave.d.ts.map +1 -0
  212. package/dist/nextjs/RefreshRouteOnSave.js +59 -0
  213. package/dist/nextjs/RefreshRouteOnSave.js.map +1 -0
  214. package/dist/nextjs/ScriptsInjector.d.ts +2 -0
  215. package/dist/nextjs/ScriptsInjector.d.ts.map +1 -0
  216. package/dist/nextjs/ScriptsInjector.js +73 -0
  217. package/dist/nextjs/ScriptsInjector.js.map +1 -0
  218. package/dist/nextjs/ServerQwickApp.d.ts +13 -0
  219. package/dist/nextjs/ServerQwickApp.d.ts.map +1 -0
  220. package/dist/nextjs/ServerQwickApp.js +159 -0
  221. package/dist/nextjs/ServerQwickApp.js.map +1 -0
  222. package/dist/nextjs/SettingsProvider.d.ts +110 -0
  223. package/dist/nextjs/SettingsProvider.d.ts.map +1 -0
  224. package/dist/nextjs/SettingsProvider.js +107 -0
  225. package/dist/nextjs/SettingsProvider.js.map +1 -0
  226. package/dist/nextjs/SiteLogo.d.ts +35 -0
  227. package/dist/nextjs/SiteLogo.d.ts.map +1 -0
  228. package/dist/nextjs/SiteLogo.js +105 -0
  229. package/dist/nextjs/SiteLogo.js.map +1 -0
  230. package/dist/nextjs/framework.d.ts +19 -0
  231. package/dist/nextjs/framework.d.ts.map +1 -0
  232. package/dist/nextjs/framework.js +35 -0
  233. package/dist/nextjs/framework.js.map +1 -0
  234. package/dist/nextjs/index.d.ts +38 -0
  235. package/dist/nextjs/index.d.ts.map +1 -0
  236. package/dist/nextjs/index.js +47 -0
  237. package/dist/nextjs/index.js.map +1 -0
  238. package/dist/nextjs/metadata.d.ts +20 -0
  239. package/dist/nextjs/metadata.d.ts.map +1 -0
  240. package/dist/nextjs/metadata.js +107 -0
  241. package/dist/nextjs/metadata.js.map +1 -0
  242. package/dist/plugins/index.d.ts +2 -0
  243. package/dist/plugins/index.d.ts.map +1 -0
  244. package/dist/plugins/index.js +3 -0
  245. package/dist/plugins/index.js.map +1 -0
  246. package/dist/plugins/qwickapps-plugin.d.ts +78 -0
  247. package/dist/plugins/qwickapps-plugin.d.ts.map +1 -0
  248. package/dist/plugins/qwickapps-plugin.js +154 -0
  249. package/dist/plugins/qwickapps-plugin.js.map +1 -0
  250. package/dist/providers/PayloadDataProvider.d.ts +72 -0
  251. package/dist/providers/PayloadDataProvider.d.ts.map +1 -0
  252. package/dist/providers/PayloadDataProvider.js +222 -0
  253. package/dist/providers/PayloadDataProvider.js.map +1 -0
  254. package/dist/providers/index.d.ts +2 -0
  255. package/dist/providers/index.d.ts.map +1 -0
  256. package/dist/providers/index.js +3 -0
  257. package/dist/providers/index.js.map +1 -0
  258. package/dist/styles/admin-theme.css +352 -0
  259. 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