@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.
- package/dist/components/dashboard/block-editor/array-field.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/array-field.js +55 -3
- package/dist/components/dashboard/block-editor/dynamic-form.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/dynamic-form.js +82 -2
- package/dist/components/dashboard/navigation/DynamicNavigation.d.ts.map +1 -1
- package/dist/components/dashboard/navigation/DynamicNavigation.js +7 -1
- package/dist/components/devtools/scheduled-actions/actions-table.d.ts +1 -0
- package/dist/components/devtools/scheduled-actions/actions-table.d.ts.map +1 -1
- package/dist/components/devtools/scheduled-actions/actions-table.js +182 -46
- package/dist/components/devtools/scheduled-actions/types.d.ts +1 -0
- package/dist/components/devtools/scheduled-actions/types.d.ts.map +1 -1
- package/dist/components/media/MediaCard.d.ts +23 -0
- package/dist/components/media/MediaCard.d.ts.map +1 -0
- package/dist/components/media/MediaCard.js +154 -0
- package/dist/components/media/MediaDetailPanel.d.ts +17 -0
- package/dist/components/media/MediaDetailPanel.d.ts.map +1 -0
- package/dist/components/media/MediaDetailPanel.js +331 -0
- package/dist/components/media/MediaGrid.d.ts +26 -0
- package/dist/components/media/MediaGrid.d.ts.map +1 -0
- package/dist/components/media/MediaGrid.js +77 -0
- package/dist/components/media/MediaLibrary.d.ts +20 -0
- package/dist/components/media/MediaLibrary.d.ts.map +1 -0
- package/dist/components/media/MediaLibrary.js +229 -0
- package/dist/components/media/MediaList.d.ts +24 -0
- package/dist/components/media/MediaList.d.ts.map +1 -0
- package/dist/components/media/MediaList.js +181 -0
- package/dist/components/media/MediaSelector.d.ts +19 -0
- package/dist/components/media/MediaSelector.d.ts.map +1 -0
- package/dist/components/media/MediaSelector.js +145 -0
- package/dist/components/media/MediaTagFilter.d.ts +16 -0
- package/dist/components/media/MediaTagFilter.d.ts.map +1 -0
- package/dist/components/media/MediaTagFilter.js +122 -0
- package/dist/components/media/MediaToolbar.d.ts +25 -0
- package/dist/components/media/MediaToolbar.d.ts.map +1 -0
- package/dist/components/media/MediaToolbar.js +136 -0
- package/dist/components/media/MediaUploadZone.d.ts +19 -0
- package/dist/components/media/MediaUploadZone.d.ts.map +1 -0
- package/dist/components/media/MediaUploadZone.js +248 -0
- package/dist/components/media/index.d.ts +15 -0
- package/dist/components/media/index.d.ts.map +1 -0
- package/dist/components/media/index.js +20 -0
- package/dist/contexts/TeamContext.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useEnsureUserMetadata.d.ts +4 -0
- package/dist/hooks/useEnsureUserMetadata.d.ts.map +1 -1
- package/dist/hooks/useEnsureUserMetadata.js +85 -60
- package/dist/hooks/useEntityMutations.d.ts.map +1 -1
- package/dist/hooks/useEntityMutations.js +5 -9
- package/dist/hooks/useMedia.d.ts +56 -0
- package/dist/hooks/useMedia.d.ts.map +1 -0
- package/dist/hooks/useMedia.js +181 -0
- package/dist/hooks/useMediaUpload.d.ts +27 -0
- package/dist/hooks/useMediaUpload.d.ts.map +1 -0
- package/dist/hooks/useMediaUpload.js +36 -0
- package/dist/hooks/useUserSettings.d.ts +5 -4
- package/dist/hooks/useUserSettings.d.ts.map +1 -1
- package/dist/hooks/useUserSettings.js +42 -40
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/lib/api/auth/dual-auth.d.ts +6 -2
- package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
- package/dist/lib/api/auth/dual-auth.js +5 -9
- package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
- package/dist/lib/api/entity/generic-handler.js +3 -3
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +3 -2
- package/dist/lib/config/app.config.d.ts.map +1 -1
- package/dist/lib/config/app.config.js +37 -0
- package/dist/lib/config/config-sync.d.ts +1 -0
- package/dist/lib/config/config-sync.d.ts.map +1 -1
- package/dist/lib/config/config-sync.js +2 -0
- package/dist/lib/config/types.d.ts +29 -0
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/db.d.ts +10 -0
- package/dist/lib/db.d.ts.map +1 -1
- package/dist/lib/db.js +13 -1
- package/dist/lib/media/schemas.d.ts +39 -0
- package/dist/lib/media/schemas.d.ts.map +1 -0
- package/dist/lib/media/schemas.js +32 -0
- package/dist/lib/media/types.d.ts +69 -0
- package/dist/lib/media/types.d.ts.map +1 -0
- package/dist/lib/media/types.js +0 -0
- package/dist/lib/media/utils.d.ts +26 -0
- package/dist/lib/media/utils.d.ts.map +1 -0
- package/dist/lib/media/utils.js +33 -0
- package/dist/lib/rate-limit-redis.d.ts.map +1 -1
- package/dist/lib/rate-limit-redis.js +13 -4
- package/dist/lib/scheduled-actions/initializer.d.ts +6 -3
- package/dist/lib/scheduled-actions/initializer.d.ts.map +1 -1
- package/dist/lib/scheduled-actions/initializer.js +11 -6
- package/dist/lib/scheduled-actions/processor.d.ts +20 -4
- package/dist/lib/scheduled-actions/processor.d.ts.map +1 -1
- package/dist/lib/scheduled-actions/processor.js +128 -34
- package/dist/lib/scheduled-actions/registry.d.ts +3 -0
- package/dist/lib/scheduled-actions/registry.d.ts.map +1 -1
- package/dist/lib/scheduled-actions/registry.js +2 -1
- package/dist/lib/scheduled-actions/scheduler.d.ts +1 -1
- package/dist/lib/scheduled-actions/scheduler.d.ts.map +1 -1
- package/dist/lib/scheduled-actions/scheduler.js +76 -38
- package/dist/lib/scheduled-actions/types.d.ts +73 -0
- package/dist/lib/scheduled-actions/types.d.ts.map +1 -1
- package/dist/lib/selectors/core-selectors.d.ts +102 -0
- package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
- package/dist/lib/selectors/core-selectors.js +3 -1
- package/dist/lib/selectors/domains/block-editor.selectors.d.ts +8 -0
- package/dist/lib/selectors/domains/block-editor.selectors.d.ts.map +1 -1
- package/dist/lib/selectors/domains/block-editor.selectors.js +9 -0
- package/dist/lib/selectors/domains/devtools.selectors.d.ts +6 -0
- package/dist/lib/selectors/domains/devtools.selectors.d.ts.map +1 -1
- package/dist/lib/selectors/domains/devtools.selectors.js +6 -0
- package/dist/lib/selectors/domains/index.d.ts +1 -0
- package/dist/lib/selectors/domains/index.d.ts.map +1 -1
- package/dist/lib/selectors/domains/index.js +2 -0
- package/dist/lib/selectors/domains/media.selectors.d.ts +96 -0
- package/dist/lib/selectors/domains/media.selectors.d.ts.map +1 -0
- package/dist/lib/selectors/domains/media.selectors.js +103 -0
- package/dist/lib/selectors/selectors.d.ts +204 -0
- package/dist/lib/selectors/selectors.d.ts.map +1 -1
- package/dist/lib/services/index.d.ts +2 -0
- package/dist/lib/services/index.d.ts.map +1 -1
- package/dist/lib/services/index.js +2 -0
- package/dist/lib/services/media.service.d.ts +158 -0
- package/dist/lib/services/media.service.d.ts.map +1 -0
- package/dist/lib/services/media.service.js +410 -0
- package/dist/messages/de/devtools.json +16 -0
- package/dist/messages/de/index.d.ts +16 -0
- package/dist/messages/de/index.d.ts.map +1 -1
- package/dist/messages/en/admin.json +4 -1
- package/dist/messages/en/devtools.json +16 -0
- package/dist/messages/en/index.d.ts +167 -0
- package/dist/messages/en/index.d.ts.map +1 -1
- package/dist/messages/en/index.js +2 -0
- package/dist/messages/en/index.ts +2 -0
- package/dist/messages/en/media.json +147 -0
- package/dist/messages/en/navigation.json +1 -0
- package/dist/messages/es/admin.json +4 -1
- package/dist/messages/es/devtools.json +16 -0
- package/dist/messages/es/index.d.ts +167 -0
- package/dist/messages/es/index.d.ts.map +1 -1
- package/dist/messages/es/index.js +2 -0
- package/dist/messages/es/index.ts +2 -0
- package/dist/messages/es/media.json +147 -0
- package/dist/messages/es/navigation.json +1 -0
- package/dist/messages/fr/devtools.json +16 -0
- package/dist/messages/fr/index.d.ts +16 -0
- package/dist/messages/fr/index.d.ts.map +1 -1
- package/dist/messages/it/devtools.json +16 -0
- package/dist/messages/it/index.d.ts +16 -0
- package/dist/messages/it/index.d.ts.map +1 -1
- package/dist/messages/pt/devtools.json +16 -0
- package/dist/messages/pt/index.d.ts +16 -0
- package/dist/messages/pt/index.d.ts.map +1 -1
- package/dist/migrations/017_scheduled_actions_table.sql +21 -0
- package/dist/migrations/021_media.sql +154 -0
- package/dist/migrations/090_sample_data.sql +53 -0
- package/dist/styles/classes.json +36 -3
- package/dist/styles/ui.css +1 -1
- package/dist/templates/app/api/devtools/config/entities/route.ts +18 -11
- package/dist/templates/app/api/devtools/config/theme/route.ts +5 -4
- package/dist/templates/app/api/devtools/tests/[...path]/route.ts +6 -5
- package/dist/templates/app/api/devtools/tests/route.ts +5 -4
- package/dist/templates/app/api/health/route.ts +6 -4
- package/dist/templates/app/api/internal/user-metadata/route.ts +3 -2
- package/dist/templates/app/api/superadmin/subscriptions/route.ts +5 -6
- package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +6 -7
- package/dist/templates/app/api/superadmin/teams/route.ts +5 -6
- package/dist/templates/app/api/superadmin/users/[userId]/route.ts +11 -16
- package/dist/templates/app/api/superadmin/users/route.ts +9 -10
- package/dist/templates/app/api/user/delete-account/route.ts +3 -2
- package/dist/templates/app/api/user/plan-flags/route.ts +11 -24
- package/dist/templates/app/api/user/profile/route.ts +7 -6
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +16 -18
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +17 -19
- package/dist/templates/app/api/v1/[entity]/[id]/route.ts +10 -12
- package/dist/templates/app/api/v1/[entity]/route.ts +9 -11
- package/dist/templates/app/api/v1/api-keys/[id]/route.ts +9 -8
- package/dist/templates/app/api/v1/api-keys/route.ts +7 -6
- package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +3 -2
- package/dist/templates/app/api/v1/billing/cancel/route.ts +15 -14
- package/dist/templates/app/api/v1/billing/change-plan/route.ts +10 -9
- package/dist/templates/app/api/v1/billing/check-action/route.ts +8 -7
- package/dist/templates/app/api/v1/billing/checkout/route.ts +10 -9
- package/dist/templates/app/api/v1/billing/plans/route.ts +5 -4
- package/dist/templates/app/api/v1/billing/portal/route.ts +9 -8
- package/dist/templates/app/api/v1/blocks/[slug]/route.ts +4 -3
- package/dist/templates/app/api/v1/blocks/route.ts +3 -2
- package/dist/templates/app/api/v1/blocks/validate/route.ts +5 -3
- package/dist/templates/app/api/v1/cron/process/route.ts +4 -6
- package/dist/templates/app/api/v1/devtools/blocks/route.ts +3 -2
- package/dist/templates/app/api/v1/devtools/docs/route.ts +3 -2
- package/dist/templates/app/api/v1/devtools/features/route.ts +3 -2
- package/dist/templates/app/api/v1/devtools/flows/route.ts +3 -2
- package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +125 -3
- package/dist/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +110 -0
- package/dist/templates/app/api/v1/devtools/testing/route.ts +3 -2
- package/dist/templates/app/api/v1/media/[id]/route.ts +144 -0
- package/dist/templates/app/api/v1/media/[id]/tags/route.ts +154 -0
- package/dist/templates/app/api/v1/media/check-duplicates/route.ts +56 -0
- package/dist/templates/app/api/v1/media/route.ts +56 -0
- package/dist/templates/app/api/v1/media/upload/route.ts +157 -33
- package/dist/templates/app/api/v1/media-tags/route.ts +65 -0
- package/dist/templates/app/api/v1/plugin/[...path]/route.ts +16 -15
- package/dist/templates/app/api/v1/plugin/route.ts +3 -2
- package/dist/templates/app/api/v1/post-categories/[id]/route.ts +10 -9
- package/dist/templates/app/api/v1/post-categories/route.ts +5 -4
- package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +3 -3
- package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +3 -3
- package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +3 -2
- package/dist/templates/app/api/v1/team-invitations/route.ts +3 -2
- package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +5 -4
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +3 -2
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +3 -2
- package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +5 -4
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +5 -5
- package/dist/templates/app/api/v1/teams/[teamId]/route.ts +31 -58
- package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +3 -2
- package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +5 -4
- package/dist/templates/app/api/v1/teams/route.ts +18 -17
- package/dist/templates/app/api/v1/teams/switch/route.ts +3 -2
- package/dist/templates/app/api/v1/theme/[...path]/route.ts +16 -15
- package/dist/templates/app/api/v1/theme/route.ts +3 -2
- package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +7 -6
- package/dist/templates/app/api/v1/users/[id]/route.ts +9 -8
- package/dist/templates/app/api/v1/users/route.ts +7 -6
- package/dist/templates/app/dashboard/(main)/media/page.tsx +607 -0
- package/dist/templates/contents/themes/starter/messages/de/dev.json +106 -0
- package/dist/templates/contents/themes/starter/messages/de/index.ts +2 -0
- package/dist/templates/contents/themes/starter/messages/en/dev.json +106 -0
- package/dist/templates/contents/themes/starter/messages/en/index.ts +2 -0
- package/dist/templates/contents/themes/starter/messages/es/dev.json +106 -0
- package/dist/templates/contents/themes/starter/messages/es/index.ts +2 -0
- package/dist/templates/contents/themes/starter/messages/fr/dev.json +106 -0
- package/dist/templates/contents/themes/starter/messages/fr/index.ts +2 -0
- package/dist/templates/contents/themes/starter/messages/it/dev.json +106 -0
- package/dist/templates/contents/themes/starter/messages/it/index.ts +2 -0
- package/dist/templates/contents/themes/starter/messages/pt/dev.json +106 -0
- package/dist/templates/contents/themes/starter/messages/pt/index.ts +2 -0
- package/dist/templates/contents/themes/starter/styles/globals.css +14 -0
- package/dist/templates/instrumentation.ts +33 -0
- package/dist/types/blocks.d.ts +1 -1
- package/dist/types/blocks.d.ts.map +1 -1
- package/migrations/017_scheduled_actions_table.sql +21 -0
- package/migrations/021_media.sql +154 -0
- package/migrations/090_sample_data.sql +53 -0
- package/package.json +16 -15
- package/scripts/build/registry/config.mjs +41 -0
- package/scripts/build/registry/discovery/templates.mjs +0 -1
- package/scripts/build/registry/generators/entity-registry.mjs +16 -6
- package/scripts/build/registry/generators/route-handlers.mjs +8 -2
- package/scripts/build/registry/generators/template-registry.mjs +16 -4
- package/scripts/build/registry/post-build/route-cleanup.mjs +0 -1
- package/scripts/build/registry/validate-env.test.mjs +92 -0
- package/scripts/build/registry.mjs +18 -1
- package/scripts/deploy/vercel-deploy.mjs +1 -1
- package/templates/app/api/devtools/config/entities/route.ts +18 -11
- package/templates/app/api/devtools/config/theme/route.ts +5 -4
- package/templates/app/api/devtools/tests/[...path]/route.ts +6 -5
- package/templates/app/api/devtools/tests/route.ts +5 -4
- package/templates/app/api/health/route.ts +6 -4
- package/templates/app/api/internal/user-metadata/route.ts +3 -2
- package/templates/app/api/superadmin/subscriptions/route.ts +5 -6
- package/templates/app/api/superadmin/teams/[teamId]/route.ts +6 -7
- package/templates/app/api/superadmin/teams/route.ts +5 -6
- package/templates/app/api/superadmin/users/[userId]/route.ts +11 -16
- package/templates/app/api/superadmin/users/route.ts +9 -10
- package/templates/app/api/user/delete-account/route.ts +3 -2
- package/templates/app/api/user/plan-flags/route.ts +11 -24
- package/templates/app/api/user/profile/route.ts +7 -6
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +16 -18
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +17 -19
- package/templates/app/api/v1/[entity]/[id]/route.ts +10 -12
- package/templates/app/api/v1/[entity]/route.ts +9 -11
- package/templates/app/api/v1/api-keys/[id]/route.ts +9 -8
- package/templates/app/api/v1/api-keys/route.ts +7 -6
- package/templates/app/api/v1/auth/signup-with-invite/route.ts +3 -2
- package/templates/app/api/v1/billing/cancel/route.ts +15 -14
- package/templates/app/api/v1/billing/change-plan/route.ts +10 -9
- package/templates/app/api/v1/billing/check-action/route.ts +8 -7
- package/templates/app/api/v1/billing/checkout/route.ts +10 -9
- package/templates/app/api/v1/billing/plans/route.ts +5 -4
- package/templates/app/api/v1/billing/portal/route.ts +9 -8
- package/templates/app/api/v1/blocks/[slug]/route.ts +4 -3
- package/templates/app/api/v1/blocks/route.ts +3 -2
- package/templates/app/api/v1/blocks/validate/route.ts +5 -3
- package/templates/app/api/v1/cron/process/route.ts +4 -6
- package/templates/app/api/v1/devtools/blocks/route.ts +3 -2
- package/templates/app/api/v1/devtools/docs/route.ts +3 -2
- package/templates/app/api/v1/devtools/features/route.ts +3 -2
- package/templates/app/api/v1/devtools/flows/route.ts +3 -2
- package/templates/app/api/v1/devtools/scheduled-actions/route.ts +125 -3
- package/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +110 -0
- package/templates/app/api/v1/devtools/testing/route.ts +3 -2
- package/templates/app/api/v1/media/[id]/route.ts +144 -0
- package/templates/app/api/v1/media/[id]/tags/route.ts +154 -0
- package/templates/app/api/v1/media/check-duplicates/route.ts +56 -0
- package/templates/app/api/v1/media/route.ts +56 -0
- package/templates/app/api/v1/media/upload/route.ts +157 -33
- package/templates/app/api/v1/media-tags/route.ts +65 -0
- package/templates/app/api/v1/plugin/[...path]/route.ts +16 -15
- package/templates/app/api/v1/plugin/route.ts +3 -2
- package/templates/app/api/v1/post-categories/[id]/route.ts +10 -9
- package/templates/app/api/v1/post-categories/route.ts +5 -4
- package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +3 -3
- package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +3 -3
- package/templates/app/api/v1/team-invitations/[token]/route.ts +3 -2
- package/templates/app/api/v1/team-invitations/route.ts +3 -2
- package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +5 -4
- package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +3 -2
- package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +3 -2
- package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +5 -4
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +5 -5
- package/templates/app/api/v1/teams/[teamId]/route.ts +31 -58
- package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +3 -2
- package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +5 -4
- package/templates/app/api/v1/teams/route.ts +18 -17
- package/templates/app/api/v1/teams/switch/route.ts +3 -2
- package/templates/app/api/v1/theme/[...path]/route.ts +16 -15
- package/templates/app/api/v1/theme/route.ts +3 -2
- package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +7 -6
- package/templates/app/api/v1/users/[id]/route.ts +9 -8
- package/templates/app/api/v1/users/route.ts +7 -6
- package/templates/app/dashboard/(main)/media/page.tsx +607 -0
- package/templates/contents/themes/starter/messages/de/dev.json +106 -0
- package/templates/contents/themes/starter/messages/de/index.ts +2 -0
- package/templates/contents/themes/starter/messages/en/dev.json +106 -0
- package/templates/contents/themes/starter/messages/en/index.ts +2 -0
- package/templates/contents/themes/starter/messages/es/dev.json +106 -0
- package/templates/contents/themes/starter/messages/es/index.ts +2 -0
- package/templates/contents/themes/starter/messages/fr/dev.json +106 -0
- package/templates/contents/themes/starter/messages/fr/index.ts +2 -0
- package/templates/contents/themes/starter/messages/it/dev.json +106 -0
- package/templates/contents/themes/starter/messages/it/index.ts +2 -0
- package/templates/contents/themes/starter/messages/pt/dev.json +106 -0
- package/templates/contents/themes/starter/messages/pt/index.ts +2 -0
- package/templates/contents/themes/starter/styles/globals.css +14 -0
- package/templates/instrumentation.ts +33 -0
- package/dist/presets/plugin/.env.example.template +0 -19
- package/dist/presets/plugin/entities/.gitkeep +0 -18
- package/dist/presets/theme/blocks/.gitkeep +0 -17
- package/dist/presets/theme/public/brand/.gitkeep +0 -8
- package/dist/presets/theme/tests/cypress/.gitkeep +0 -10
- package/dist/templates/contents/plugins/starter/plugin/.env.example.template +0 -19
- 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":"
|
|
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",
|