@nextsparkjs/core 0.1.0-beta.92 → 0.1.0-beta.95

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 (346) hide show
  1. package/dist/components/dashboard/block-editor/array-field.d.ts.map +1 -1
  2. package/dist/components/dashboard/block-editor/array-field.js +55 -3
  3. package/dist/components/dashboard/block-editor/dynamic-form.d.ts.map +1 -1
  4. package/dist/components/dashboard/block-editor/dynamic-form.js +82 -2
  5. package/dist/components/dashboard/navigation/DynamicNavigation.d.ts.map +1 -1
  6. package/dist/components/dashboard/navigation/DynamicNavigation.js +7 -1
  7. package/dist/components/devtools/scheduled-actions/actions-table.d.ts +1 -0
  8. package/dist/components/devtools/scheduled-actions/actions-table.d.ts.map +1 -1
  9. package/dist/components/devtools/scheduled-actions/actions-table.js +182 -46
  10. package/dist/components/devtools/scheduled-actions/types.d.ts +1 -0
  11. package/dist/components/devtools/scheduled-actions/types.d.ts.map +1 -1
  12. package/dist/components/media/MediaCard.d.ts +23 -0
  13. package/dist/components/media/MediaCard.d.ts.map +1 -0
  14. package/dist/components/media/MediaCard.js +154 -0
  15. package/dist/components/media/MediaDetailPanel.d.ts +17 -0
  16. package/dist/components/media/MediaDetailPanel.d.ts.map +1 -0
  17. package/dist/components/media/MediaDetailPanel.js +331 -0
  18. package/dist/components/media/MediaGrid.d.ts +26 -0
  19. package/dist/components/media/MediaGrid.d.ts.map +1 -0
  20. package/dist/components/media/MediaGrid.js +77 -0
  21. package/dist/components/media/MediaLibrary.d.ts +20 -0
  22. package/dist/components/media/MediaLibrary.d.ts.map +1 -0
  23. package/dist/components/media/MediaLibrary.js +229 -0
  24. package/dist/components/media/MediaList.d.ts +24 -0
  25. package/dist/components/media/MediaList.d.ts.map +1 -0
  26. package/dist/components/media/MediaList.js +181 -0
  27. package/dist/components/media/MediaSelector.d.ts +19 -0
  28. package/dist/components/media/MediaSelector.d.ts.map +1 -0
  29. package/dist/components/media/MediaSelector.js +145 -0
  30. package/dist/components/media/MediaTagFilter.d.ts +16 -0
  31. package/dist/components/media/MediaTagFilter.d.ts.map +1 -0
  32. package/dist/components/media/MediaTagFilter.js +122 -0
  33. package/dist/components/media/MediaToolbar.d.ts +25 -0
  34. package/dist/components/media/MediaToolbar.d.ts.map +1 -0
  35. package/dist/components/media/MediaToolbar.js +136 -0
  36. package/dist/components/media/MediaUploadZone.d.ts +19 -0
  37. package/dist/components/media/MediaUploadZone.d.ts.map +1 -0
  38. package/dist/components/media/MediaUploadZone.js +248 -0
  39. package/dist/components/media/index.d.ts +15 -0
  40. package/dist/components/media/index.d.ts.map +1 -0
  41. package/dist/components/media/index.js +20 -0
  42. package/dist/contexts/TeamContext.js +1 -1
  43. package/dist/hooks/index.d.ts +2 -0
  44. package/dist/hooks/index.d.ts.map +1 -1
  45. package/dist/hooks/index.js +2 -0
  46. package/dist/hooks/useEnsureUserMetadata.d.ts +4 -0
  47. package/dist/hooks/useEnsureUserMetadata.d.ts.map +1 -1
  48. package/dist/hooks/useEnsureUserMetadata.js +85 -60
  49. package/dist/hooks/useEntityMutations.d.ts.map +1 -1
  50. package/dist/hooks/useEntityMutations.js +5 -9
  51. package/dist/hooks/useMedia.d.ts +56 -0
  52. package/dist/hooks/useMedia.d.ts.map +1 -0
  53. package/dist/hooks/useMedia.js +181 -0
  54. package/dist/hooks/useMediaUpload.d.ts +27 -0
  55. package/dist/hooks/useMediaUpload.d.ts.map +1 -0
  56. package/dist/hooks/useMediaUpload.js +36 -0
  57. package/dist/hooks/useUserSettings.d.ts +5 -4
  58. package/dist/hooks/useUserSettings.d.ts.map +1 -1
  59. package/dist/hooks/useUserSettings.js +42 -40
  60. package/dist/index.d.ts +1 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +2 -3
  63. package/dist/lib/api/auth/dual-auth.d.ts +6 -2
  64. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  65. package/dist/lib/api/auth/dual-auth.js +5 -9
  66. package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
  67. package/dist/lib/api/entity/generic-handler.js +3 -3
  68. package/dist/lib/auth.d.ts.map +1 -1
  69. package/dist/lib/auth.js +3 -2
  70. package/dist/lib/config/app.config.d.ts.map +1 -1
  71. package/dist/lib/config/app.config.js +37 -0
  72. package/dist/lib/config/config-sync.d.ts +1 -0
  73. package/dist/lib/config/config-sync.d.ts.map +1 -1
  74. package/dist/lib/config/config-sync.js +2 -0
  75. package/dist/lib/config/types.d.ts +29 -0
  76. package/dist/lib/config/types.d.ts.map +1 -1
  77. package/dist/lib/db.d.ts +10 -0
  78. package/dist/lib/db.d.ts.map +1 -1
  79. package/dist/lib/db.js +13 -1
  80. package/dist/lib/media/schemas.d.ts +39 -0
  81. package/dist/lib/media/schemas.d.ts.map +1 -0
  82. package/dist/lib/media/schemas.js +32 -0
  83. package/dist/lib/media/types.d.ts +69 -0
  84. package/dist/lib/media/types.d.ts.map +1 -0
  85. package/dist/lib/media/types.js +0 -0
  86. package/dist/lib/media/utils.d.ts +26 -0
  87. package/dist/lib/media/utils.d.ts.map +1 -0
  88. package/dist/lib/media/utils.js +33 -0
  89. package/dist/lib/rate-limit-redis.d.ts.map +1 -1
  90. package/dist/lib/rate-limit-redis.js +13 -4
  91. package/dist/lib/scheduled-actions/initializer.d.ts +6 -3
  92. package/dist/lib/scheduled-actions/initializer.d.ts.map +1 -1
  93. package/dist/lib/scheduled-actions/initializer.js +11 -6
  94. package/dist/lib/scheduled-actions/processor.d.ts +20 -4
  95. package/dist/lib/scheduled-actions/processor.d.ts.map +1 -1
  96. package/dist/lib/scheduled-actions/processor.js +128 -34
  97. package/dist/lib/scheduled-actions/registry.d.ts +3 -0
  98. package/dist/lib/scheduled-actions/registry.d.ts.map +1 -1
  99. package/dist/lib/scheduled-actions/registry.js +2 -1
  100. package/dist/lib/scheduled-actions/scheduler.d.ts +1 -1
  101. package/dist/lib/scheduled-actions/scheduler.d.ts.map +1 -1
  102. package/dist/lib/scheduled-actions/scheduler.js +76 -38
  103. package/dist/lib/scheduled-actions/types.d.ts +73 -0
  104. package/dist/lib/scheduled-actions/types.d.ts.map +1 -1
  105. package/dist/lib/selectors/core-selectors.d.ts +102 -0
  106. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  107. package/dist/lib/selectors/core-selectors.js +3 -1
  108. package/dist/lib/selectors/domains/block-editor.selectors.d.ts +8 -0
  109. package/dist/lib/selectors/domains/block-editor.selectors.d.ts.map +1 -1
  110. package/dist/lib/selectors/domains/block-editor.selectors.js +9 -0
  111. package/dist/lib/selectors/domains/devtools.selectors.d.ts +6 -0
  112. package/dist/lib/selectors/domains/devtools.selectors.d.ts.map +1 -1
  113. package/dist/lib/selectors/domains/devtools.selectors.js +6 -0
  114. package/dist/lib/selectors/domains/index.d.ts +1 -0
  115. package/dist/lib/selectors/domains/index.d.ts.map +1 -1
  116. package/dist/lib/selectors/domains/index.js +2 -0
  117. package/dist/lib/selectors/domains/media.selectors.d.ts +96 -0
  118. package/dist/lib/selectors/domains/media.selectors.d.ts.map +1 -0
  119. package/dist/lib/selectors/domains/media.selectors.js +103 -0
  120. package/dist/lib/selectors/selectors.d.ts +204 -0
  121. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  122. package/dist/lib/services/index.d.ts +2 -0
  123. package/dist/lib/services/index.d.ts.map +1 -1
  124. package/dist/lib/services/index.js +2 -0
  125. package/dist/lib/services/media.service.d.ts +158 -0
  126. package/dist/lib/services/media.service.d.ts.map +1 -0
  127. package/dist/lib/services/media.service.js +410 -0
  128. package/dist/messages/de/devtools.json +16 -0
  129. package/dist/messages/de/index.d.ts +16 -0
  130. package/dist/messages/de/index.d.ts.map +1 -1
  131. package/dist/messages/en/admin.json +4 -1
  132. package/dist/messages/en/devtools.json +16 -0
  133. package/dist/messages/en/index.d.ts +167 -0
  134. package/dist/messages/en/index.d.ts.map +1 -1
  135. package/dist/messages/en/index.js +2 -0
  136. package/dist/messages/en/index.ts +2 -0
  137. package/dist/messages/en/media.json +147 -0
  138. package/dist/messages/en/navigation.json +1 -0
  139. package/dist/messages/es/admin.json +4 -1
  140. package/dist/messages/es/devtools.json +16 -0
  141. package/dist/messages/es/index.d.ts +167 -0
  142. package/dist/messages/es/index.d.ts.map +1 -1
  143. package/dist/messages/es/index.js +2 -0
  144. package/dist/messages/es/index.ts +2 -0
  145. package/dist/messages/es/media.json +147 -0
  146. package/dist/messages/es/navigation.json +1 -0
  147. package/dist/messages/fr/devtools.json +16 -0
  148. package/dist/messages/fr/index.d.ts +16 -0
  149. package/dist/messages/fr/index.d.ts.map +1 -1
  150. package/dist/messages/it/devtools.json +16 -0
  151. package/dist/messages/it/index.d.ts +16 -0
  152. package/dist/messages/it/index.d.ts.map +1 -1
  153. package/dist/messages/pt/devtools.json +16 -0
  154. package/dist/messages/pt/index.d.ts +16 -0
  155. package/dist/messages/pt/index.d.ts.map +1 -1
  156. package/dist/migrations/017_scheduled_actions_table.sql +21 -0
  157. package/dist/migrations/021_media.sql +154 -0
  158. package/dist/migrations/090_sample_data.sql +53 -0
  159. package/dist/styles/classes.json +36 -3
  160. package/dist/styles/ui.css +1 -1
  161. package/dist/templates/app/api/devtools/config/entities/route.ts +18 -11
  162. package/dist/templates/app/api/devtools/config/theme/route.ts +5 -4
  163. package/dist/templates/app/api/devtools/tests/[...path]/route.ts +6 -5
  164. package/dist/templates/app/api/devtools/tests/route.ts +5 -4
  165. package/dist/templates/app/api/health/route.ts +6 -4
  166. package/dist/templates/app/api/internal/user-metadata/route.ts +3 -2
  167. package/dist/templates/app/api/superadmin/subscriptions/route.ts +5 -6
  168. package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +6 -7
  169. package/dist/templates/app/api/superadmin/teams/route.ts +5 -6
  170. package/dist/templates/app/api/superadmin/users/[userId]/route.ts +11 -16
  171. package/dist/templates/app/api/superadmin/users/route.ts +9 -10
  172. package/dist/templates/app/api/user/delete-account/route.ts +3 -2
  173. package/dist/templates/app/api/user/plan-flags/route.ts +11 -24
  174. package/dist/templates/app/api/user/profile/route.ts +7 -6
  175. package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +16 -18
  176. package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +17 -19
  177. package/dist/templates/app/api/v1/[entity]/[id]/route.ts +10 -12
  178. package/dist/templates/app/api/v1/[entity]/route.ts +9 -11
  179. package/dist/templates/app/api/v1/api-keys/[id]/route.ts +9 -8
  180. package/dist/templates/app/api/v1/api-keys/route.ts +7 -6
  181. package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +3 -2
  182. package/dist/templates/app/api/v1/billing/cancel/route.ts +15 -14
  183. package/dist/templates/app/api/v1/billing/change-plan/route.ts +10 -9
  184. package/dist/templates/app/api/v1/billing/check-action/route.ts +8 -7
  185. package/dist/templates/app/api/v1/billing/checkout/route.ts +10 -9
  186. package/dist/templates/app/api/v1/billing/plans/route.ts +5 -4
  187. package/dist/templates/app/api/v1/billing/portal/route.ts +9 -8
  188. package/dist/templates/app/api/v1/blocks/[slug]/route.ts +4 -3
  189. package/dist/templates/app/api/v1/blocks/route.ts +3 -2
  190. package/dist/templates/app/api/v1/blocks/validate/route.ts +5 -3
  191. package/dist/templates/app/api/v1/cron/process/route.ts +4 -6
  192. package/dist/templates/app/api/v1/devtools/blocks/route.ts +3 -2
  193. package/dist/templates/app/api/v1/devtools/docs/route.ts +3 -2
  194. package/dist/templates/app/api/v1/devtools/features/route.ts +3 -2
  195. package/dist/templates/app/api/v1/devtools/flows/route.ts +3 -2
  196. package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +125 -3
  197. package/dist/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +110 -0
  198. package/dist/templates/app/api/v1/devtools/testing/route.ts +3 -2
  199. package/dist/templates/app/api/v1/media/[id]/route.ts +144 -0
  200. package/dist/templates/app/api/v1/media/[id]/tags/route.ts +154 -0
  201. package/dist/templates/app/api/v1/media/check-duplicates/route.ts +56 -0
  202. package/dist/templates/app/api/v1/media/route.ts +56 -0
  203. package/dist/templates/app/api/v1/media/upload/route.ts +157 -33
  204. package/dist/templates/app/api/v1/media-tags/route.ts +65 -0
  205. package/dist/templates/app/api/v1/plugin/[...path]/route.ts +16 -15
  206. package/dist/templates/app/api/v1/plugin/route.ts +3 -2
  207. package/dist/templates/app/api/v1/post-categories/[id]/route.ts +10 -9
  208. package/dist/templates/app/api/v1/post-categories/route.ts +5 -4
  209. package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +3 -3
  210. package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +3 -3
  211. package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +3 -2
  212. package/dist/templates/app/api/v1/team-invitations/route.ts +3 -2
  213. package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +5 -4
  214. package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +3 -2
  215. package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +3 -2
  216. package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +5 -4
  217. package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +5 -5
  218. package/dist/templates/app/api/v1/teams/[teamId]/route.ts +31 -58
  219. package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +3 -2
  220. package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +5 -4
  221. package/dist/templates/app/api/v1/teams/route.ts +18 -17
  222. package/dist/templates/app/api/v1/teams/switch/route.ts +3 -2
  223. package/dist/templates/app/api/v1/theme/[...path]/route.ts +16 -15
  224. package/dist/templates/app/api/v1/theme/route.ts +3 -2
  225. package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +7 -6
  226. package/dist/templates/app/api/v1/users/[id]/route.ts +9 -8
  227. package/dist/templates/app/api/v1/users/route.ts +7 -6
  228. package/dist/templates/app/dashboard/(main)/media/page.tsx +607 -0
  229. package/dist/templates/contents/themes/starter/messages/de/dev.json +106 -0
  230. package/dist/templates/contents/themes/starter/messages/de/index.ts +2 -0
  231. package/dist/templates/contents/themes/starter/messages/en/dev.json +106 -0
  232. package/dist/templates/contents/themes/starter/messages/en/index.ts +2 -0
  233. package/dist/templates/contents/themes/starter/messages/es/dev.json +106 -0
  234. package/dist/templates/contents/themes/starter/messages/es/index.ts +2 -0
  235. package/dist/templates/contents/themes/starter/messages/fr/dev.json +106 -0
  236. package/dist/templates/contents/themes/starter/messages/fr/index.ts +2 -0
  237. package/dist/templates/contents/themes/starter/messages/it/dev.json +106 -0
  238. package/dist/templates/contents/themes/starter/messages/it/index.ts +2 -0
  239. package/dist/templates/contents/themes/starter/messages/pt/dev.json +106 -0
  240. package/dist/templates/contents/themes/starter/messages/pt/index.ts +2 -0
  241. package/dist/templates/contents/themes/starter/styles/globals.css +14 -0
  242. package/dist/templates/instrumentation.ts +33 -0
  243. package/dist/types/blocks.d.ts +1 -1
  244. package/dist/types/blocks.d.ts.map +1 -1
  245. package/migrations/017_scheduled_actions_table.sql +21 -0
  246. package/migrations/021_media.sql +154 -0
  247. package/migrations/090_sample_data.sql +53 -0
  248. package/package.json +16 -15
  249. package/scripts/build/registry/config.mjs +41 -0
  250. package/scripts/build/registry/discovery/templates.mjs +0 -1
  251. package/scripts/build/registry/generators/entity-registry.mjs +16 -6
  252. package/scripts/build/registry/generators/route-handlers.mjs +8 -2
  253. package/scripts/build/registry/generators/template-registry.mjs +16 -4
  254. package/scripts/build/registry/post-build/route-cleanup.mjs +0 -1
  255. package/scripts/build/registry/validate-env.test.mjs +92 -0
  256. package/scripts/build/registry.mjs +18 -1
  257. package/scripts/deploy/vercel-deploy.mjs +1 -1
  258. package/templates/app/api/devtools/config/entities/route.ts +18 -11
  259. package/templates/app/api/devtools/config/theme/route.ts +5 -4
  260. package/templates/app/api/devtools/tests/[...path]/route.ts +6 -5
  261. package/templates/app/api/devtools/tests/route.ts +5 -4
  262. package/templates/app/api/health/route.ts +6 -4
  263. package/templates/app/api/internal/user-metadata/route.ts +3 -2
  264. package/templates/app/api/superadmin/subscriptions/route.ts +5 -6
  265. package/templates/app/api/superadmin/teams/[teamId]/route.ts +6 -7
  266. package/templates/app/api/superadmin/teams/route.ts +5 -6
  267. package/templates/app/api/superadmin/users/[userId]/route.ts +11 -16
  268. package/templates/app/api/superadmin/users/route.ts +9 -10
  269. package/templates/app/api/user/delete-account/route.ts +3 -2
  270. package/templates/app/api/user/plan-flags/route.ts +11 -24
  271. package/templates/app/api/user/profile/route.ts +7 -6
  272. package/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +16 -18
  273. package/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +17 -19
  274. package/templates/app/api/v1/[entity]/[id]/route.ts +10 -12
  275. package/templates/app/api/v1/[entity]/route.ts +9 -11
  276. package/templates/app/api/v1/api-keys/[id]/route.ts +9 -8
  277. package/templates/app/api/v1/api-keys/route.ts +7 -6
  278. package/templates/app/api/v1/auth/signup-with-invite/route.ts +3 -2
  279. package/templates/app/api/v1/billing/cancel/route.ts +15 -14
  280. package/templates/app/api/v1/billing/change-plan/route.ts +10 -9
  281. package/templates/app/api/v1/billing/check-action/route.ts +8 -7
  282. package/templates/app/api/v1/billing/checkout/route.ts +10 -9
  283. package/templates/app/api/v1/billing/plans/route.ts +5 -4
  284. package/templates/app/api/v1/billing/portal/route.ts +9 -8
  285. package/templates/app/api/v1/blocks/[slug]/route.ts +4 -3
  286. package/templates/app/api/v1/blocks/route.ts +3 -2
  287. package/templates/app/api/v1/blocks/validate/route.ts +5 -3
  288. package/templates/app/api/v1/cron/process/route.ts +4 -6
  289. package/templates/app/api/v1/devtools/blocks/route.ts +3 -2
  290. package/templates/app/api/v1/devtools/docs/route.ts +3 -2
  291. package/templates/app/api/v1/devtools/features/route.ts +3 -2
  292. package/templates/app/api/v1/devtools/flows/route.ts +3 -2
  293. package/templates/app/api/v1/devtools/scheduled-actions/route.ts +125 -3
  294. package/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +110 -0
  295. package/templates/app/api/v1/devtools/testing/route.ts +3 -2
  296. package/templates/app/api/v1/media/[id]/route.ts +144 -0
  297. package/templates/app/api/v1/media/[id]/tags/route.ts +154 -0
  298. package/templates/app/api/v1/media/check-duplicates/route.ts +56 -0
  299. package/templates/app/api/v1/media/route.ts +56 -0
  300. package/templates/app/api/v1/media/upload/route.ts +157 -33
  301. package/templates/app/api/v1/media-tags/route.ts +65 -0
  302. package/templates/app/api/v1/plugin/[...path]/route.ts +16 -15
  303. package/templates/app/api/v1/plugin/route.ts +3 -2
  304. package/templates/app/api/v1/post-categories/[id]/route.ts +10 -9
  305. package/templates/app/api/v1/post-categories/route.ts +5 -4
  306. package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +3 -3
  307. package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +3 -3
  308. package/templates/app/api/v1/team-invitations/[token]/route.ts +3 -2
  309. package/templates/app/api/v1/team-invitations/route.ts +3 -2
  310. package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +5 -4
  311. package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +3 -2
  312. package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +3 -2
  313. package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +5 -4
  314. package/templates/app/api/v1/teams/[teamId]/members/route.ts +5 -5
  315. package/templates/app/api/v1/teams/[teamId]/route.ts +31 -58
  316. package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +3 -2
  317. package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +5 -4
  318. package/templates/app/api/v1/teams/route.ts +18 -17
  319. package/templates/app/api/v1/teams/switch/route.ts +3 -2
  320. package/templates/app/api/v1/theme/[...path]/route.ts +16 -15
  321. package/templates/app/api/v1/theme/route.ts +3 -2
  322. package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +7 -6
  323. package/templates/app/api/v1/users/[id]/route.ts +9 -8
  324. package/templates/app/api/v1/users/route.ts +7 -6
  325. package/templates/app/dashboard/(main)/media/page.tsx +607 -0
  326. package/templates/contents/themes/starter/messages/de/dev.json +106 -0
  327. package/templates/contents/themes/starter/messages/de/index.ts +2 -0
  328. package/templates/contents/themes/starter/messages/en/dev.json +106 -0
  329. package/templates/contents/themes/starter/messages/en/index.ts +2 -0
  330. package/templates/contents/themes/starter/messages/es/dev.json +106 -0
  331. package/templates/contents/themes/starter/messages/es/index.ts +2 -0
  332. package/templates/contents/themes/starter/messages/fr/dev.json +106 -0
  333. package/templates/contents/themes/starter/messages/fr/index.ts +2 -0
  334. package/templates/contents/themes/starter/messages/it/dev.json +106 -0
  335. package/templates/contents/themes/starter/messages/it/index.ts +2 -0
  336. package/templates/contents/themes/starter/messages/pt/dev.json +106 -0
  337. package/templates/contents/themes/starter/messages/pt/index.ts +2 -0
  338. package/templates/contents/themes/starter/styles/globals.css +14 -0
  339. package/templates/instrumentation.ts +33 -0
  340. package/dist/presets/plugin/.env.example.template +0 -19
  341. package/dist/presets/plugin/entities/.gitkeep +0 -18
  342. package/dist/presets/theme/blocks/.gitkeep +0 -17
  343. package/dist/presets/theme/public/brand/.gitkeep +0 -8
  344. package/dist/presets/theme/tests/cypress/.gitkeep +0 -10
  345. package/dist/templates/contents/plugins/starter/plugin/.env.example.template +0 -19
  346. package/templates/contents/plugins/starter/plugin/.env.example.template +0 -19
@@ -0,0 +1,410 @@
1
+ import { queryOneWithRLS, queryWithRLS, mutateWithRLS } from "../db.js";
2
+ class MediaService {
3
+ // ============================================
4
+ // QUERIES
5
+ // ============================================
6
+ /**
7
+ * Get media item by ID
8
+ *
9
+ * @param id - Media ID
10
+ * @param userId - User ID for RLS context
11
+ * @returns Media or null if not found
12
+ *
13
+ * @example
14
+ * const media = await MediaService.getById('media-123', 'user-456')
15
+ */
16
+ static async getById(id, userId) {
17
+ if (!(id == null ? void 0 : id.trim())) throw new Error("Media ID is required");
18
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
19
+ return queryOneWithRLS(
20
+ `SELECT * FROM "media" WHERE id = $1 AND status = 'active'`,
21
+ [id],
22
+ userId
23
+ );
24
+ }
25
+ /**
26
+ * List media with pagination, filtering, and search
27
+ *
28
+ * @param userId - User ID for RLS context
29
+ * @param options - List options (pagination, filtering, search, sort)
30
+ * @returns Paginated media list result
31
+ *
32
+ * @example
33
+ * const result = await MediaService.list('user-123', {
34
+ * limit: 20,
35
+ * offset: 0,
36
+ * type: 'image',
37
+ * search: 'logo',
38
+ * orderBy: 'createdAt',
39
+ * orderDir: 'desc'
40
+ * })
41
+ */
42
+ static async list(userId, options = {}) {
43
+ var _a;
44
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
45
+ const {
46
+ limit = 20,
47
+ offset = 0,
48
+ orderBy = "createdAt",
49
+ orderDir = "desc",
50
+ type = "all",
51
+ search,
52
+ status = "active",
53
+ tagIds,
54
+ tagSlugs
55
+ } = options;
56
+ const conditions = ["m.status = $1"];
57
+ const params = [status];
58
+ let paramIndex = 2;
59
+ if (type === "image") {
60
+ conditions.push(`m."mimeType" LIKE 'image/%'`);
61
+ } else if (type === "video") {
62
+ conditions.push(`m."mimeType" LIKE 'video/%'`);
63
+ }
64
+ if (search) {
65
+ conditions.push(`(
66
+ (m."searchVector" IS NOT NULL AND m."searchVector" @@ plainto_tsquery('english', $${paramIndex}))
67
+ OR lower(coalesce(m.title, '')) LIKE $${paramIndex + 1}
68
+ OR lower(m.filename) LIKE $${paramIndex + 1}
69
+ OR lower(coalesce(m.alt, '')) LIKE $${paramIndex + 1}
70
+ OR lower(coalesce(m.caption, '')) LIKE $${paramIndex + 1}
71
+ )`);
72
+ params.push(search);
73
+ params.push(`%${search.toLowerCase()}%`);
74
+ paramIndex += 2;
75
+ }
76
+ if (tagIds && tagIds.length > 0) {
77
+ conditions.push(`m.id IN (
78
+ SELECT etr."entityId" FROM "entity_taxonomy_relations" etr
79
+ WHERE etr."entityType" = 'media' AND etr."taxonomyId" = ANY($${paramIndex})
80
+ )`);
81
+ params.push(tagIds);
82
+ paramIndex++;
83
+ }
84
+ if (tagSlugs && tagSlugs.length > 0) {
85
+ conditions.push(`m.id IN (
86
+ SELECT etr."entityId" FROM "entity_taxonomy_relations" etr
87
+ JOIN "taxonomies" t ON t.id = etr."taxonomyId"
88
+ WHERE etr."entityType" = 'media' AND t.type = 'media_tag' AND t.slug = ANY($${paramIndex})
89
+ )`);
90
+ params.push(tagSlugs);
91
+ paramIndex++;
92
+ }
93
+ const whereClause = conditions.join(" AND ");
94
+ const validOrderBy = {
95
+ createdAt: 'm."createdAt"',
96
+ filename: "m.filename",
97
+ fileSize: 'm."fileSize"'
98
+ };
99
+ const orderColumn = validOrderBy[orderBy] || 'm."createdAt"';
100
+ const validDir = orderDir === "asc" ? "ASC" : "DESC";
101
+ const countResult = await queryWithRLS(
102
+ `SELECT COUNT(*)::text as count FROM "media" m WHERE ${whereClause}`,
103
+ params,
104
+ userId
105
+ );
106
+ const total = parseInt(((_a = countResult[0]) == null ? void 0 : _a.count) || "0", 10);
107
+ params.push(limit, offset);
108
+ const data = await queryWithRLS(
109
+ `SELECT m.* FROM "media" m
110
+ WHERE ${whereClause}
111
+ ORDER BY ${orderColumn} ${validDir}
112
+ LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,
113
+ params,
114
+ userId
115
+ );
116
+ return { data, total, limit, offset };
117
+ }
118
+ /**
119
+ * Find existing media by filename and fileSize (duplicate detection)
120
+ *
121
+ * @param userId - User ID for RLS context
122
+ * @param filename - Original filename
123
+ * @param fileSize - File size in bytes
124
+ * @returns Matching media items (same name+size = likely duplicate)
125
+ */
126
+ static async findDuplicates(userId, filename, fileSize) {
127
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
128
+ return queryWithRLS(
129
+ `SELECT * FROM "media"
130
+ WHERE filename = $1 AND "fileSize" = $2 AND status = 'active'
131
+ ORDER BY "createdAt" DESC
132
+ LIMIT 5`,
133
+ [filename, fileSize],
134
+ userId
135
+ );
136
+ }
137
+ // ============================================
138
+ // MUTATIONS
139
+ // ============================================
140
+ /**
141
+ * Create a new media record
142
+ *
143
+ * @param userId - User ID (uploader)
144
+ * @param teamId - Team ID for isolation
145
+ * @param data - Media data
146
+ * @returns Created media record
147
+ *
148
+ * @example
149
+ * const media = await MediaService.create('user-123', 'team-456', {
150
+ * url: 'https://example.com/image.jpg',
151
+ * filename: 'image.jpg',
152
+ * fileSize: 150000,
153
+ * mimeType: 'image/jpeg',
154
+ * width: 1920,
155
+ * height: 1080
156
+ * })
157
+ */
158
+ static async create(userId, teamId, data) {
159
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
160
+ if (!(teamId == null ? void 0 : teamId.trim())) throw new Error("Team ID is required");
161
+ const result = await mutateWithRLS(
162
+ `INSERT INTO "media" (
163
+ "userId", "teamId", url, filename, "fileSize", "mimeType",
164
+ width, height, title, alt, caption, status
165
+ ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, 'active')
166
+ RETURNING *`,
167
+ [
168
+ userId,
169
+ teamId,
170
+ data.url,
171
+ data.filename,
172
+ data.fileSize,
173
+ data.mimeType,
174
+ data.width ?? null,
175
+ data.height ?? null,
176
+ data.title ?? null,
177
+ data.alt ?? null,
178
+ data.caption ?? null
179
+ ],
180
+ userId
181
+ );
182
+ if (!result.rows[0]) throw new Error("Failed to create media record");
183
+ return result.rows[0];
184
+ }
185
+ /**
186
+ * Update media metadata (title, alt, caption - file properties are immutable)
187
+ *
188
+ * @param id - Media ID
189
+ * @param userId - User ID for RLS context
190
+ * @param data - Update data (alt, caption)
191
+ * @returns Updated media record
192
+ *
193
+ * @example
194
+ * const media = await MediaService.update('media-123', 'user-456', {
195
+ * alt: 'Company logo',
196
+ * caption: 'Our brand logo in high resolution'
197
+ * })
198
+ */
199
+ static async update(id, userId, data) {
200
+ if (!(id == null ? void 0 : id.trim())) throw new Error("Media ID is required");
201
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
202
+ const setClauses = [];
203
+ const params = [];
204
+ let paramIndex = 1;
205
+ if (data.title !== void 0) {
206
+ setClauses.push(`title = $${paramIndex++}`);
207
+ params.push(data.title);
208
+ }
209
+ if (data.alt !== void 0) {
210
+ setClauses.push(`alt = $${paramIndex++}`);
211
+ params.push(data.alt);
212
+ }
213
+ if (data.caption !== void 0) {
214
+ setClauses.push(`caption = $${paramIndex++}`);
215
+ params.push(data.caption);
216
+ }
217
+ if (setClauses.length === 0) throw new Error("No fields to update");
218
+ setClauses.push(`"updatedAt" = NOW()`);
219
+ params.push(id);
220
+ const result = await mutateWithRLS(
221
+ `UPDATE "media"
222
+ SET ${setClauses.join(", ")}
223
+ WHERE id = $${paramIndex} AND status = 'active'
224
+ RETURNING *`,
225
+ params,
226
+ userId
227
+ );
228
+ if (!result.rows[0]) throw new Error("Media not found or not authorized");
229
+ return result.rows[0];
230
+ }
231
+ /**
232
+ * Soft delete a media record (sets status to 'deleted')
233
+ *
234
+ * @param id - Media ID
235
+ * @param userId - User ID for RLS context
236
+ * @returns True if deleted successfully
237
+ *
238
+ * @example
239
+ * const deleted = await MediaService.softDelete('media-123', 'user-456')
240
+ */
241
+ static async softDelete(id, userId) {
242
+ if (!(id == null ? void 0 : id.trim())) throw new Error("Media ID is required");
243
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
244
+ const result = await mutateWithRLS(
245
+ `UPDATE "media" SET status = 'deleted', "updatedAt" = NOW()
246
+ WHERE id = $1 AND status = 'active'`,
247
+ [id],
248
+ userId
249
+ );
250
+ return result.rowCount > 0;
251
+ }
252
+ // ============================================
253
+ // TAG OPERATIONS
254
+ // ============================================
255
+ /**
256
+ * Get all media tags
257
+ *
258
+ * @param userId - User ID for RLS context
259
+ * @returns Array of media tags
260
+ */
261
+ static async getTags(userId) {
262
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
263
+ return queryWithRLS(
264
+ `SELECT id, type, slug, name, description, icon, color, "order", "isActive", "createdAt", "updatedAt"
265
+ FROM "taxonomies"
266
+ WHERE type = 'media_tag' AND "isActive" = true AND "deletedAt" IS NULL
267
+ ORDER BY "order" ASC, name ASC`,
268
+ [],
269
+ userId
270
+ );
271
+ }
272
+ /**
273
+ * Get tags for a specific media item
274
+ *
275
+ * @param mediaId - Media item ID
276
+ * @param userId - User ID for RLS context
277
+ * @returns Array of tags assigned to the media
278
+ */
279
+ static async getMediaTags(mediaId, userId) {
280
+ if (!(mediaId == null ? void 0 : mediaId.trim())) throw new Error("Media ID is required");
281
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
282
+ return queryWithRLS(
283
+ `SELECT t.id, t.type, t.slug, t.name, t.description, t.icon, t.color, t."order", t."isActive", t."createdAt", t."updatedAt"
284
+ FROM "taxonomies" t
285
+ JOIN "entity_taxonomy_relations" etr ON etr."taxonomyId" = t.id
286
+ WHERE etr."entityType" = 'media' AND etr."entityId" = $1
287
+ AND t."isActive" = true AND t."deletedAt" IS NULL
288
+ ORDER BY t."order" ASC, t.name ASC`,
289
+ [mediaId],
290
+ userId
291
+ );
292
+ }
293
+ /**
294
+ * Add a tag to a media item
295
+ *
296
+ * @param mediaId - Media item ID
297
+ * @param tagId - Tag taxonomy ID
298
+ * @param userId - User ID for RLS context
299
+ * @returns True if tag was added
300
+ */
301
+ static async addTag(mediaId, tagId, userId) {
302
+ if (!(mediaId == null ? void 0 : mediaId.trim())) throw new Error("Media ID is required");
303
+ if (!(tagId == null ? void 0 : tagId.trim())) throw new Error("Tag ID is required");
304
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
305
+ const result = await mutateWithRLS(
306
+ `INSERT INTO "entity_taxonomy_relations" ("entityType", "entityId", "taxonomyId")
307
+ VALUES ('media', $1, $2)
308
+ ON CONFLICT ("entityType", "entityId", "taxonomyId") DO NOTHING`,
309
+ [mediaId, tagId],
310
+ userId
311
+ );
312
+ return result.rowCount > 0;
313
+ }
314
+ /**
315
+ * Remove a tag from a media item
316
+ *
317
+ * @param mediaId - Media item ID
318
+ * @param tagId - Tag taxonomy ID
319
+ * @param userId - User ID for RLS context
320
+ * @returns True if tag was removed
321
+ */
322
+ static async removeTag(mediaId, tagId, userId) {
323
+ if (!(mediaId == null ? void 0 : mediaId.trim())) throw new Error("Media ID is required");
324
+ if (!(tagId == null ? void 0 : tagId.trim())) throw new Error("Tag ID is required");
325
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
326
+ const result = await mutateWithRLS(
327
+ `DELETE FROM "entity_taxonomy_relations"
328
+ WHERE "entityType" = 'media' AND "entityId" = $1 AND "taxonomyId" = $2`,
329
+ [mediaId, tagId],
330
+ userId
331
+ );
332
+ return result.rowCount > 0;
333
+ }
334
+ /**
335
+ * Set tags for a media item (replace all existing tags)
336
+ *
337
+ * @param mediaId - Media item ID
338
+ * @param tagIds - Array of tag taxonomy IDs
339
+ * @param userId - User ID for RLS context
340
+ */
341
+ static async setTags(mediaId, tagIds, userId) {
342
+ if (!(mediaId == null ? void 0 : mediaId.trim())) throw new Error("Media ID is required");
343
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
344
+ await mutateWithRLS(
345
+ `DELETE FROM "entity_taxonomy_relations"
346
+ WHERE "entityType" = 'media' AND "entityId" = $1`,
347
+ [mediaId],
348
+ userId
349
+ );
350
+ if (tagIds.length > 0) {
351
+ const values = tagIds.map((_, i) => `('media', $1, $${i + 2})`).join(", ");
352
+ await mutateWithRLS(
353
+ `INSERT INTO "entity_taxonomy_relations" ("entityType", "entityId", "taxonomyId")
354
+ VALUES ${values}
355
+ ON CONFLICT DO NOTHING`,
356
+ [mediaId, ...tagIds],
357
+ userId
358
+ );
359
+ }
360
+ }
361
+ /**
362
+ * Create a new media tag (taxonomy of type 'media_tag')
363
+ *
364
+ * @param name - Tag display name
365
+ * @param userId - User ID for RLS context
366
+ * @returns The created tag
367
+ */
368
+ static async createTag(name, userId) {
369
+ if (!(name == null ? void 0 : name.trim())) throw new Error("Tag name is required");
370
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
371
+ const slug = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
372
+ const result = await mutateWithRLS(
373
+ `INSERT INTO "taxonomies" (type, slug, name, "isActive")
374
+ VALUES ('media_tag', $1, $2, true)
375
+ ON CONFLICT (type, slug) DO UPDATE SET name = EXCLUDED.name
376
+ RETURNING id, slug, name, color, icon, "order", "isActive"`,
377
+ [slug, name.trim()],
378
+ userId
379
+ );
380
+ return result.rows[0];
381
+ }
382
+ /**
383
+ * Count media items
384
+ *
385
+ * @param userId - User ID for RLS context
386
+ * @param options - Count options (type filter, status filter)
387
+ * @returns Total count
388
+ *
389
+ * @example
390
+ * const imageCount = await MediaService.count('user-123', { type: 'image' })
391
+ */
392
+ static async count(userId, options = {}) {
393
+ var _a;
394
+ if (!(userId == null ? void 0 : userId.trim())) throw new Error("User ID is required");
395
+ const { type = "all", status = "active" } = options;
396
+ const conditions = ["status = $1"];
397
+ const params = [status];
398
+ if (type === "image") conditions.push(`"mimeType" LIKE 'image/%'`);
399
+ else if (type === "video") conditions.push(`"mimeType" LIKE 'video/%'`);
400
+ const result = await queryWithRLS(
401
+ `SELECT COUNT(*)::text as count FROM "media" WHERE ${conditions.join(" AND ")}`,
402
+ params,
403
+ userId
404
+ );
405
+ return parseInt(((_a = result[0]) == null ? void 0 : _a.count) || "0", 10);
406
+ }
407
+ }
408
+ export {
409
+ MediaService
410
+ };
@@ -278,6 +278,8 @@
278
278
  "loading": "Geplante Aktionen werden geladen...",
279
279
  "empty": "Keine geplanten Aktionen gefunden",
280
280
  "emptyDescription": "Geplante Aktionen werden hier angezeigt, wenn sie erstellt werden",
281
+ "failedNotification": "{count, plural, one {# Aktion ist fehlgeschlagen} other {# Aktionen sind fehlgeschlagen}} in den letzten 24 Stunden",
282
+ "viewFailed": "Fehlgeschlagene anzeigen",
281
283
  "filters": {
282
284
  "status": "Status",
283
285
  "allStatuses": "Alle Status",
@@ -289,12 +291,26 @@
289
291
  "table": {
290
292
  "type": "Typ",
291
293
  "status": "Status",
294
+ "attempts": "Versuche",
292
295
  "scheduledAt": "Geplant fuer",
296
+ "startedAt": "Gestartet",
297
+ "completedAt": "Abgeschlossen",
293
298
  "team": "Team",
294
299
  "payload": "Daten",
295
300
  "error": "Fehler",
301
+ "actions": "Aktionen",
296
302
  "noTeam": "Global"
297
303
  },
304
+ "retry": {
305
+ "button": "Wiederholen",
306
+ "success": "Aktion zur Wiederholung geplant",
307
+ "error": "Fehler beim Wiederholen der Aktion: {message}"
308
+ },
309
+ "run": {
310
+ "button": "Jetzt ausfuehren",
311
+ "success": "Aktion erfolgreich ausgefuehrt",
312
+ "error": "Fehler beim Ausfuehren der Aktion: {message}"
313
+ },
298
314
  "status": {
299
315
  "pending": "Ausstehend",
300
316
  "running": "Wird ausgefuehrt",
@@ -991,6 +991,8 @@ declare const _default: {
991
991
  loading: string;
992
992
  empty: string;
993
993
  emptyDescription: string;
994
+ failedNotification: string;
995
+ viewFailed: string;
994
996
  filters: {
995
997
  status: string;
996
998
  allStatuses: string;
@@ -1002,12 +1004,26 @@ declare const _default: {
1002
1004
  table: {
1003
1005
  type: string;
1004
1006
  status: string;
1007
+ attempts: string;
1005
1008
  scheduledAt: string;
1009
+ startedAt: string;
1010
+ completedAt: string;
1006
1011
  team: string;
1007
1012
  payload: string;
1008
1013
  error: string;
1014
+ actions: string;
1009
1015
  noTeam: string;
1010
1016
  };
1017
+ retry: {
1018
+ button: string;
1019
+ success: string;
1020
+ error: string;
1021
+ };
1022
+ run: {
1023
+ button: string;
1024
+ success: string;
1025
+ error: string;
1026
+ };
1011
1027
  status: {
1012
1028
  pending: string;
1013
1029
  running: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/de/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAoBU"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/de/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAoBU"}
@@ -171,7 +171,10 @@
171
171
  "emptyArray": "No items added yet",
172
172
  "itemNumber": "Item {number}",
173
173
  "addItem": "Add Item",
174
- "itemCount": "{current} of {max} items"
174
+ "itemCount": "{current} of {max} items",
175
+ "changeImage": "Change",
176
+ "removeImage": "Remove",
177
+ "browseMedia": "Click to upload or browse images"
175
178
  }
176
179
  },
177
180
  "builder": {
@@ -292,6 +292,8 @@
292
292
  "loading": "Loading scheduled actions...",
293
293
  "empty": "No scheduled actions found",
294
294
  "emptyDescription": "Scheduled actions will appear here when they are created",
295
+ "failedNotification": "{count, plural, one {# action has failed} other {# actions have failed}} in the last 24 hours",
296
+ "viewFailed": "View Failed",
295
297
  "filters": {
296
298
  "status": "Status",
297
299
  "allStatuses": "All Statuses",
@@ -303,12 +305,26 @@
303
305
  "table": {
304
306
  "type": "Type",
305
307
  "status": "Status",
308
+ "attempts": "Attempts",
306
309
  "scheduledAt": "Scheduled At",
310
+ "startedAt": "Started At",
311
+ "completedAt": "Completed At",
307
312
  "team": "Team",
308
313
  "payload": "Payload",
309
314
  "error": "Error",
315
+ "actions": "Actions",
310
316
  "noTeam": "Global"
311
317
  },
318
+ "retry": {
319
+ "button": "Retry",
320
+ "success": "Action scheduled for retry",
321
+ "error": "Failed to retry action: {message}"
322
+ },
323
+ "run": {
324
+ "button": "Run Now",
325
+ "success": "Action executed successfully",
326
+ "error": "Failed to run action: {message}"
327
+ },
312
328
  "status": {
313
329
  "pending": "Pending",
314
330
  "running": "Running",