@open-mercato/core 0.4.2-canary-da2b080494 → 0.4.2-canary-19703ca707
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/generated/entities/notification/index.js +57 -0
- package/dist/generated/entities/notification/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +5 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/api_docs/frontend/docs/api/page.js +3 -2
- package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +4 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +2 -0
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/auth/api/admin/nav.js +4 -3
- package/dist/modules/auth/api/admin/nav.js.map +2 -2
- package/dist/modules/auth/api/login.js +25 -6
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/profile/route.js +157 -0
- package/dist/modules/auth/api/profile/route.js.map +7 -0
- package/dist/modules/auth/api/reset/confirm.js +25 -2
- package/dist/modules/auth/api/reset/confirm.js.map +2 -2
- package/dist/modules/auth/api/reset.js +23 -0
- package/dist/modules/auth/api/reset.js.map +2 -2
- package/dist/modules/auth/api/sidebar/preferences/route.js +14 -9
- package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +4 -2
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/auth/profile/page.js +141 -0
- package/dist/modules/auth/backend/auth/profile/page.js.map +7 -0
- package/dist/modules/auth/backend/auth/profile/page.meta.js +13 -0
- package/dist/modules/auth/backend/auth/profile/page.meta.js.map +7 -0
- package/dist/modules/auth/backend/roles/[id]/edit/page.js +4 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -3
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.js +18 -3
- package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +15 -2
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +3 -3
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +25 -11
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/commands/users.js +59 -2
- package/dist/modules/auth/commands/users.js.map +2 -2
- package/dist/modules/auth/data/validators.js +6 -3
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/frontend/login.js +85 -1
- package/dist/modules/auth/frontend/login.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +20 -10
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/setup-app.js +42 -8
- package/dist/modules/auth/lib/setup-app.js.map +2 -2
- package/dist/modules/auth/notifications.js +112 -0
- package/dist/modules/auth/notifications.js.map +7 -0
- package/dist/modules/auth/services/authService.js +24 -3
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/business_rules/api/execute/route.js +7 -1
- package/dist/modules/business_rules/api/execute/route.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +4 -0
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -0
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/cli.js +2 -1
- package/dist/modules/business_rules/cli.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +33 -3
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/business_rules/notifications.js +28 -0
- package/dist/modules/business_rules/notifications.js.map +7 -0
- package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +37 -0
- package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +7 -0
- package/dist/modules/catalog/components/PriceKindSettings.js +2 -0
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +2 -0
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/notifications.js +28 -0
- package/dist/modules/catalog/notifications.js.map +7 -0
- package/dist/modules/catalog/subscribers/low-stock-notification.js +38 -0
- package/dist/modules/catalog/subscribers/low-stock-notification.js.map +7 -0
- package/dist/modules/configs/cli.js +6 -0
- package/dist/modules/configs/cli.js.map +2 -2
- package/dist/modules/configs/components/CachePanel.js +4 -4
- package/dist/modules/configs/components/CachePanel.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +48 -1
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +18 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -0
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +2 -0
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +3 -0
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +3 -0
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +3 -0
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +31 -0
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/notifications.js +48 -0
- package/dist/modules/customers/notifications.js.map +7 -0
- package/dist/modules/dashboards/cli.js +44 -5
- package/dist/modules/dashboards/cli.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +16 -11
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
- package/dist/modules/dashboards/lib/role-widgets.js +58 -0
- package/dist/modules/dashboards/lib/role-widgets.js.map +7 -0
- package/dist/modules/dashboards/services/widgetDataService.js +139 -3
- package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryTable.js +2 -0
- package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
- package/dist/modules/directory/api/get/tenants/lookup.js +68 -0
- package/dist/modules/directory/api/get/tenants/lookup.js.map +7 -0
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
- package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
- package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
- package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/notifications/acl.js +11 -0
- package/dist/modules/notifications/acl.js.map +7 -0
- package/dist/modules/notifications/api/[id]/action/route.js +74 -0
- package/dist/modules/notifications/api/[id]/action/route.js.map +7 -0
- package/dist/modules/notifications/api/[id]/dismiss/route.js +15 -0
- package/dist/modules/notifications/api/[id]/dismiss/route.js.map +7 -0
- package/dist/modules/notifications/api/[id]/read/route.js +15 -0
- package/dist/modules/notifications/api/[id]/read/route.js.map +7 -0
- package/dist/modules/notifications/api/[id]/restore/route.js +53 -0
- package/dist/modules/notifications/api/[id]/restore/route.js.map +7 -0
- package/dist/modules/notifications/api/batch/route.js +17 -0
- package/dist/modules/notifications/api/batch/route.js.map +7 -0
- package/dist/modules/notifications/api/feature/route.js +17 -0
- package/dist/modules/notifications/api/feature/route.js.map +7 -0
- package/dist/modules/notifications/api/mark-all-read/route.js +35 -0
- package/dist/modules/notifications/api/mark-all-read/route.js.map +7 -0
- package/dist/modules/notifications/api/openapi.js +76 -0
- package/dist/modules/notifications/api/openapi.js.map +7 -0
- package/dist/modules/notifications/api/role/route.js +17 -0
- package/dist/modules/notifications/api/role/route.js.map +7 -0
- package/dist/modules/notifications/api/route.js +85 -0
- package/dist/modules/notifications/api/route.js.map +7 -0
- package/dist/modules/notifications/api/settings/route.js +155 -0
- package/dist/modules/notifications/api/settings/route.js.map +7 -0
- package/dist/modules/notifications/api/unread-count/route.js +38 -0
- package/dist/modules/notifications/api/unread-count/route.js.map +7 -0
- package/dist/modules/notifications/backend/config/notifications/page.js +10 -0
- package/dist/modules/notifications/backend/config/notifications/page.js.map +7 -0
- package/dist/modules/notifications/backend/config/notifications/page.meta.js +24 -0
- package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +7 -0
- package/dist/modules/notifications/cli.js +16 -0
- package/dist/modules/notifications/cli.js.map +7 -0
- package/dist/modules/notifications/data/entities.js +112 -0
- package/dist/modules/notifications/data/entities.js.map +7 -0
- package/dist/modules/notifications/data/validators.js +98 -0
- package/dist/modules/notifications/data/validators.js.map +7 -0
- package/dist/modules/notifications/di.js +13 -0
- package/dist/modules/notifications/di.js.map +7 -0
- package/dist/modules/notifications/emails/NotificationEmail.js +58 -0
- package/dist/modules/notifications/emails/NotificationEmail.js.map +7 -0
- package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +44 -0
- package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +7 -0
- package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +220 -0
- package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +7 -0
- package/dist/modules/notifications/index.js +14 -0
- package/dist/modules/notifications/index.js.map +7 -0
- package/dist/modules/notifications/lib/deliveryConfig.js +107 -0
- package/dist/modules/notifications/lib/deliveryConfig.js.map +7 -0
- package/dist/modules/notifications/lib/deliveryStrategies.js +14 -0
- package/dist/modules/notifications/lib/deliveryStrategies.js.map +7 -0
- package/dist/modules/notifications/lib/events.js +12 -0
- package/dist/modules/notifications/lib/events.js.map +7 -0
- package/dist/modules/notifications/lib/notificationBuilder.js +66 -0
- package/dist/modules/notifications/lib/notificationBuilder.js.map +7 -0
- package/dist/modules/notifications/lib/notificationFactory.js +54 -0
- package/dist/modules/notifications/lib/notificationFactory.js.map +7 -0
- package/dist/modules/notifications/lib/notificationMapper.js +34 -0
- package/dist/modules/notifications/lib/notificationMapper.js.map +7 -0
- package/dist/modules/notifications/lib/notificationRecipients.js +35 -0
- package/dist/modules/notifications/lib/notificationRecipients.js.map +7 -0
- package/dist/modules/notifications/lib/notificationService.js +279 -0
- package/dist/modules/notifications/lib/notificationService.js.map +7 -0
- package/dist/modules/notifications/lib/routeHelpers.js +101 -0
- package/dist/modules/notifications/lib/routeHelpers.js.map +7 -0
- package/dist/modules/notifications/lib/safeHref.js +24 -0
- package/dist/modules/notifications/lib/safeHref.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260123000001.js +70 -0
- package/dist/modules/notifications/migrations/Migration20260123000001.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260126150000.js +37 -0
- package/dist/modules/notifications/migrations/Migration20260126150000.js.map +7 -0
- package/dist/modules/notifications/subscribers/deliver-notification.js +165 -0
- package/dist/modules/notifications/subscribers/deliver-notification.js.map +7 -0
- package/dist/modules/notifications/workers/create-notification.worker.js +70 -0
- package/dist/modules/notifications/workers/create-notification.worker.js.map +7 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +7 -1
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +2 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +2 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +53 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/commands/payments.js +26 -0
- package/dist/modules/sales/commands/payments.js.map +2 -2
- package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
- package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
- package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +2 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +2 -0
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +2 -1
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +2 -0
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/notifications.client.js +51 -0
- package/dist/modules/sales/notifications.client.js.map +7 -0
- package/dist/modules/sales/notifications.js +88 -0
- package/dist/modules/sales/notifications.js.map +7 -0
- package/dist/modules/sales/subscribers/quote-expiring-notification.js +38 -0
- package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +7 -0
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +137 -0
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +7 -0
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +137 -0
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +7 -0
- package/dist/modules/sales/widgets/notifications/index.js +7 -0
- package/dist/modules/sales/widgets/notifications/index.js.map +7 -0
- package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +60 -0
- package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +7 -0
- package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/commands/leave-requests.js +79 -0
- package/dist/modules/staff/commands/leave-requests.js.map +2 -2
- package/dist/modules/staff/notifications.js +75 -0
- package/dist/modules/staff/notifications.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +5 -0
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -0
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -0
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/cli.js +12 -12
- package/dist/modules/workflows/cli.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +14 -6
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/dist/modules/workflows/notifications.js +28 -0
- package/dist/modules/workflows/notifications.js.map +7 -0
- package/dist/modules/workflows/subscribers/task-assigned-notification.js +38 -0
- package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +7 -0
- package/generated/entities/notification/index.ts +27 -0
- package/generated/entities.ids.generated.ts +5 -1
- package/generated/entity-fields-registry.ts +2 -0
- package/package.json +2 -2
- package/src/modules/api_docs/frontend/docs/api/page.tsx +3 -2
- package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
- package/src/modules/attachments/components/AttachmentLibrary.tsx +4 -0
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +2 -0
- package/src/modules/auth/README.md +1 -1
- package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
- package/src/modules/auth/api/__tests__/login.test.ts +2 -0
- package/src/modules/auth/api/admin/nav.ts +10 -6
- package/src/modules/auth/api/login.ts +26 -7
- package/src/modules/auth/api/profile/route.ts +163 -0
- package/src/modules/auth/api/reset/confirm.ts +25 -2
- package/src/modules/auth/api/reset.ts +23 -0
- package/src/modules/auth/api/sidebar/preferences/route.ts +21 -12
- package/src/modules/auth/api/users/route.ts +5 -2
- package/src/modules/auth/backend/auth/profile/page.meta.ts +9 -0
- package/src/modules/auth/backend/auth/profile/page.tsx +174 -0
- package/src/modules/auth/backend/roles/[id]/edit/page.tsx +4 -1
- package/src/modules/auth/backend/roles/page.tsx +3 -3
- package/src/modules/auth/backend/users/[id]/edit/page.tsx +22 -3
- package/src/modules/auth/backend/users/create/page.tsx +19 -2
- package/src/modules/auth/backend/users/page.tsx +3 -3
- package/src/modules/auth/cli.ts +38 -11
- package/src/modules/auth/commands/users.ts +73 -2
- package/src/modules/auth/data/validators.ts +6 -2
- package/src/modules/auth/frontend/login.tsx +106 -2
- package/src/modules/auth/frontend/reset/[token]/page.tsx +24 -11
- package/src/modules/auth/i18n/de.json +48 -1
- package/src/modules/auth/i18n/en.json +48 -1
- package/src/modules/auth/i18n/es.json +48 -1
- package/src/modules/auth/i18n/pl.json +48 -1
- package/src/modules/auth/lib/setup-app.ts +58 -9
- package/src/modules/auth/notifications.ts +109 -0
- package/src/modules/auth/services/authService.ts +27 -4
- package/src/modules/business_rules/api/execute/route.ts +8 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -0
- package/src/modules/business_rules/backend/sets/page.tsx +3 -0
- package/src/modules/business_rules/cli.ts +2 -1
- package/src/modules/business_rules/i18n/en.json +3 -1
- package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +51 -0
- package/src/modules/business_rules/lib/rule-engine.ts +57 -3
- package/src/modules/business_rules/notifications.ts +25 -0
- package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +50 -0
- package/src/modules/catalog/components/PriceKindSettings.tsx +2 -0
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +2 -0
- package/src/modules/catalog/i18n/en.json +3 -1
- package/src/modules/catalog/notifications.ts +25 -0
- package/src/modules/catalog/subscribers/low-stock-notification.ts +52 -0
- package/src/modules/configs/cli.ts +6 -0
- package/src/modules/configs/components/CachePanel.tsx +4 -4
- package/src/modules/configs/i18n/en.json +12 -2
- package/src/modules/configs/i18n/pl.json +12 -2
- package/src/modules/configs/lib/system-status.ts +48 -1
- package/src/modules/configs/lib/system-status.types.ts +1 -0
- package/src/modules/configs/lib/upgrade-actions.ts +18 -0
- package/src/modules/currencies/backend/currencies/page.tsx +3 -0
- package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -0
- package/src/modules/customers/backend/customers/companies/page.tsx +3 -0
- package/src/modules/customers/backend/customers/deals/page.tsx +3 -0
- package/src/modules/customers/backend/customers/people/page.tsx +3 -0
- package/src/modules/customers/commands/deals.ts +39 -0
- package/src/modules/customers/components/CustomerTodosTable.tsx +1 -0
- package/src/modules/customers/i18n/en.json +5 -1
- package/src/modules/customers/notifications.ts +44 -0
- package/src/modules/dashboards/cli.ts +55 -5
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +22 -11
- package/src/modules/dashboards/lib/role-widgets.ts +80 -0
- package/src/modules/dashboards/services/widgetDataService.ts +164 -4
- package/src/modules/dictionaries/components/DictionaryTable.tsx +2 -0
- package/src/modules/directory/api/get/tenants/lookup.ts +73 -0
- package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
- package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
- package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
- package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +3 -4
- package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
- package/src/modules/notifications/__tests__/deliver-notification.test.ts +195 -0
- package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +19 -0
- package/src/modules/notifications/__tests__/notificationService.test.ts +208 -0
- package/src/modules/notifications/acl.ts +7 -0
- package/src/modules/notifications/api/[id]/action/route.ts +75 -0
- package/src/modules/notifications/api/[id]/dismiss/route.ts +12 -0
- package/src/modules/notifications/api/[id]/read/route.ts +12 -0
- package/src/modules/notifications/api/[id]/restore/route.ts +53 -0
- package/src/modules/notifications/api/batch/route.ts +14 -0
- package/src/modules/notifications/api/feature/route.ts +14 -0
- package/src/modules/notifications/api/mark-all-read/route.ts +34 -0
- package/src/modules/notifications/api/openapi.ts +76 -0
- package/src/modules/notifications/api/role/route.ts +14 -0
- package/src/modules/notifications/api/route.ts +92 -0
- package/src/modules/notifications/api/settings/route.ts +157 -0
- package/src/modules/notifications/api/unread-count/route.ts +38 -0
- package/src/modules/notifications/backend/config/notifications/page.meta.ts +22 -0
- package/src/modules/notifications/backend/config/notifications/page.tsx +12 -0
- package/src/modules/notifications/cli.ts +18 -0
- package/src/modules/notifications/data/entities.ts +99 -0
- package/src/modules/notifications/data/validators.ts +115 -0
- package/src/modules/notifications/di.ts +11 -0
- package/src/modules/notifications/emails/NotificationEmail.tsx +98 -0
- package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +42 -0
- package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +233 -0
- package/src/modules/notifications/i18n/de.json +50 -0
- package/src/modules/notifications/i18n/en.json +50 -0
- package/src/modules/notifications/i18n/es.json +50 -0
- package/src/modules/notifications/i18n/pl.json +50 -0
- package/src/modules/notifications/index.ts +12 -0
- package/src/modules/notifications/lib/deliveryConfig.ts +153 -0
- package/src/modules/notifications/lib/deliveryStrategies.ts +50 -0
- package/src/modules/notifications/lib/events.ts +48 -0
- package/src/modules/notifications/lib/notificationBuilder.ts +121 -0
- package/src/modules/notifications/lib/notificationFactory.ts +76 -0
- package/src/modules/notifications/lib/notificationMapper.ts +33 -0
- package/src/modules/notifications/lib/notificationRecipients.ts +83 -0
- package/src/modules/notifications/lib/notificationService.ts +414 -0
- package/src/modules/notifications/lib/routeHelpers.ts +151 -0
- package/src/modules/notifications/lib/safeHref.ts +29 -0
- package/src/modules/notifications/migrations/.snapshot-open-mercato.json +300 -0
- package/src/modules/notifications/migrations/Migration20260123000001.ts +73 -0
- package/src/modules/notifications/migrations/Migration20260126150000.ts +39 -0
- package/src/modules/notifications/subscribers/deliver-notification.ts +204 -0
- package/src/modules/notifications/workers/create-notification.worker.ts +122 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
- package/src/modules/query_index/components/QueryIndexesTable.tsx +8 -2
- package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
- package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +2 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +2 -0
- package/src/modules/sales/commands/documents.ts +65 -0
- package/src/modules/sales/commands/payments.ts +33 -0
- package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
- package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
- package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +2 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +2 -0
- package/src/modules/sales/components/documents/PaymentsSection.tsx +2 -1
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +2 -0
- package/src/modules/sales/i18n/de.json +20 -0
- package/src/modules/sales/i18n/en.json +25 -1
- package/src/modules/sales/i18n/es.json +20 -0
- package/src/modules/sales/i18n/pl.json +20 -0
- package/src/modules/sales/notifications.client.ts +65 -0
- package/src/modules/sales/notifications.ts +82 -0
- package/src/modules/sales/subscribers/quote-expiring-notification.ts +53 -0
- package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +156 -0
- package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +156 -0
- package/src/modules/sales/widgets/notifications/index.ts +2 -0
- package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +81 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
- package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
- package/src/modules/staff/commands/leave-requests.ts +94 -0
- package/src/modules/staff/i18n/de.json +4 -0
- package/src/modules/staff/i18n/en.json +9 -1
- package/src/modules/staff/i18n/es.json +4 -0
- package/src/modules/staff/i18n/pl.json +4 -0
- package/src/modules/staff/notifications.ts +71 -0
- package/src/modules/workflows/backend/definitions/page.tsx +5 -0
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/cli.ts +12 -12
- package/src/modules/workflows/i18n/en.json +3 -1
- package/src/modules/workflows/lib/transition-handler.ts +18 -6
- package/src/modules/workflows/notifications.ts +25 -0
- package/src/modules/workflows/subscribers/task-assigned-notification.ts +53 -0
|
@@ -21,6 +21,9 @@ import {
|
|
|
21
21
|
} from '../data/validators'
|
|
22
22
|
import { ensureOrganizationScope, ensureTenantScope, extractUndoPayload, requireTeamMember } from './shared'
|
|
23
23
|
import { E } from '#generated/entities.ids.generated'
|
|
24
|
+
import { resolveNotificationService } from '../../notifications/lib/notificationService'
|
|
25
|
+
import { buildFeatureNotificationFromType, buildNotificationFromType } from '../../notifications/lib/notificationBuilder'
|
|
26
|
+
import { notificationTypes } from '../notifications'
|
|
24
27
|
|
|
25
28
|
const leaveRequestCrudIndexer: CrudIndexerConfig<StaffLeaveRequest> = {
|
|
26
29
|
entityType: E.staff.staff_leave_request,
|
|
@@ -258,6 +261,36 @@ const createLeaveRequestCommand: CommandHandler<StaffLeaveRequestCreateInput, {
|
|
|
258
261
|
indexer: leaveRequestCrudIndexer,
|
|
259
262
|
})
|
|
260
263
|
|
|
264
|
+
// Create notification for users who can approve/reject leave requests
|
|
265
|
+
try {
|
|
266
|
+
const notificationService = resolveNotificationService(ctx.container)
|
|
267
|
+
const typeDef = notificationTypes.find((type) => type.type === 'staff.leave_request.pending')
|
|
268
|
+
if (typeDef) {
|
|
269
|
+
const memberName = member.displayName || 'Team member'
|
|
270
|
+
const startDateStr = request.startDate.toLocaleDateString()
|
|
271
|
+
const endDateStr = request.endDate.toLocaleDateString()
|
|
272
|
+
|
|
273
|
+
const notificationInput = buildFeatureNotificationFromType(typeDef, {
|
|
274
|
+
requiredFeature: 'staff.leave_requests.manage',
|
|
275
|
+
bodyVariables: {
|
|
276
|
+
memberName,
|
|
277
|
+
startDate: startDateStr,
|
|
278
|
+
endDate: endDateStr,
|
|
279
|
+
},
|
|
280
|
+
sourceEntityType: 'staff:leave_request',
|
|
281
|
+
sourceEntityId: request.id,
|
|
282
|
+
linkHref: `/backend/staff/leave-requests/${request.id}`,
|
|
283
|
+
})
|
|
284
|
+
|
|
285
|
+
await notificationService.createForFeature(notificationInput, {
|
|
286
|
+
tenantId: request.tenantId,
|
|
287
|
+
organizationId: request.organizationId,
|
|
288
|
+
})
|
|
289
|
+
}
|
|
290
|
+
} catch {
|
|
291
|
+
// Notification creation is non-critical, don't fail the command
|
|
292
|
+
}
|
|
293
|
+
|
|
261
294
|
return { requestId: request.id }
|
|
262
295
|
},
|
|
263
296
|
captureAfter: async (_input, result, ctx) => {
|
|
@@ -575,6 +608,36 @@ const acceptLeaveRequestCommand: CommandHandler<StaffLeaveRequestDecisionInput,
|
|
|
575
608
|
ruleIds: createdRuleIds,
|
|
576
609
|
})
|
|
577
610
|
|
|
611
|
+
// Send notification to the requester
|
|
612
|
+
if (request.submittedByUserId) {
|
|
613
|
+
try {
|
|
614
|
+
const notificationService = resolveNotificationService(ctx.container)
|
|
615
|
+
const typeDef = notificationTypes.find((type) => type.type === 'staff.leave_request.approved')
|
|
616
|
+
if (typeDef) {
|
|
617
|
+
const startDateStr = request.startDate.toLocaleDateString()
|
|
618
|
+
const endDateStr = request.endDate.toLocaleDateString()
|
|
619
|
+
|
|
620
|
+
const notificationInput = buildNotificationFromType(typeDef, {
|
|
621
|
+
recipientUserId: request.submittedByUserId,
|
|
622
|
+
bodyVariables: {
|
|
623
|
+
startDate: startDateStr,
|
|
624
|
+
endDate: endDateStr,
|
|
625
|
+
},
|
|
626
|
+
sourceEntityType: 'staff:leave_request',
|
|
627
|
+
sourceEntityId: request.id,
|
|
628
|
+
linkHref: `/backend/staff/leave-requests/${request.id}`,
|
|
629
|
+
})
|
|
630
|
+
|
|
631
|
+
await notificationService.create(notificationInput, {
|
|
632
|
+
tenantId: request.tenantId,
|
|
633
|
+
organizationId: request.organizationId,
|
|
634
|
+
})
|
|
635
|
+
}
|
|
636
|
+
} catch {
|
|
637
|
+
// Notification creation is non-critical, don't fail the command
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
578
641
|
return { requestId: request.id, ruleIds: createdRuleIds }
|
|
579
642
|
},
|
|
580
643
|
buildLog: async ({ result, ctx, snapshots }) => {
|
|
@@ -696,6 +759,37 @@ const rejectLeaveRequestCommand: CommandHandler<StaffLeaveRequestDecisionInput,
|
|
|
696
759
|
indexer: leaveRequestCrudIndexer,
|
|
697
760
|
})
|
|
698
761
|
|
|
762
|
+
// Send notification to the requester
|
|
763
|
+
if (request.submittedByUserId) {
|
|
764
|
+
try {
|
|
765
|
+
const notificationService = resolveNotificationService(ctx.container)
|
|
766
|
+
const typeDef = notificationTypes.find((type) => type.type === 'staff.leave_request.rejected')
|
|
767
|
+
if (typeDef) {
|
|
768
|
+
const startDateStr = request.startDate.toLocaleDateString()
|
|
769
|
+
const endDateStr = request.endDate.toLocaleDateString()
|
|
770
|
+
|
|
771
|
+
const notificationInput = buildNotificationFromType(typeDef, {
|
|
772
|
+
recipientUserId: request.submittedByUserId,
|
|
773
|
+
bodyVariables: {
|
|
774
|
+
startDate: startDateStr,
|
|
775
|
+
endDate: endDateStr,
|
|
776
|
+
reason: request.decisionComment ?? '',
|
|
777
|
+
},
|
|
778
|
+
sourceEntityType: 'staff:leave_request',
|
|
779
|
+
sourceEntityId: request.id,
|
|
780
|
+
linkHref: `/backend/staff/leave-requests/${request.id}`,
|
|
781
|
+
})
|
|
782
|
+
|
|
783
|
+
await notificationService.create(notificationInput, {
|
|
784
|
+
tenantId: request.tenantId,
|
|
785
|
+
organizationId: request.organizationId,
|
|
786
|
+
})
|
|
787
|
+
}
|
|
788
|
+
} catch {
|
|
789
|
+
// Notification creation is non-critical, don't fail the command
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
699
793
|
return { requestId: request.id }
|
|
700
794
|
},
|
|
701
795
|
async prepare(rawInput, ctx) {
|
|
@@ -797,6 +797,10 @@
|
|
|
797
797
|
"staff.teams.tabs.details": "Details",
|
|
798
798
|
"staff.teams.tabs.label": "Teamabschnitte",
|
|
799
799
|
"staff.teams.tabs.members": "Teammitglieder",
|
|
800
|
+
"staff.notifications.leaveRequest.pending.title": "Urlaubsantrag ausstehend",
|
|
801
|
+
"staff.notifications.leaveRequest.pending.body": "{memberName} hat Urlaub vom {startDate} bis {endDate} beantragt",
|
|
802
|
+
"staff.notifications.leaveRequest.actions.approve": "Genehmigen",
|
|
803
|
+
"staff.notifications.leaveRequest.actions.reject": "Ablehnen",
|
|
800
804
|
"staff.leaveRequests.page.title": "Urlaubsantr\u00e4ge",
|
|
801
805
|
"staff.leaveRequests.page.description": "Urlaubsantr\u00e4ge des Teams pr\u00fcfen.",
|
|
802
806
|
"staff.leaveRequests.my.title": "Meine Urlaubsantr\u00e4ge",
|
|
@@ -797,6 +797,10 @@
|
|
|
797
797
|
"staff.teams.tabs.details": "Details",
|
|
798
798
|
"staff.teams.tabs.label": "Team sections",
|
|
799
799
|
"staff.teams.tabs.members": "Team members",
|
|
800
|
+
"staff.notifications.leaveRequest.pending.title": "Leave Request Pending",
|
|
801
|
+
"staff.notifications.leaveRequest.pending.body": "{memberName} has requested leave from {startDate} to {endDate}",
|
|
802
|
+
"staff.notifications.leaveRequest.actions.approve": "Approve",
|
|
803
|
+
"staff.notifications.leaveRequest.actions.reject": "Reject",
|
|
800
804
|
"staff.leaveRequests.page.title": "Leave requests",
|
|
801
805
|
"staff.leaveRequests.page.description": "Review leave requests from your team.",
|
|
802
806
|
"staff.leaveRequests.my.title": "My leave requests",
|
|
@@ -874,5 +878,9 @@
|
|
|
874
878
|
"staff.myAvailability.readOnly.body": "Use leave requests to request changes.",
|
|
875
879
|
"staff.teamMembers.self.createTitle": "Create my profile",
|
|
876
880
|
"staff.teamMembers.self.created": "Profile created.",
|
|
877
|
-
"staff.teamMembers.self.exists": "Team member profile already exists."
|
|
881
|
+
"staff.teamMembers.self.exists": "Team member profile already exists.",
|
|
882
|
+
"staff.notifications.leaveRequest.approved.title": "Leave Request Approved",
|
|
883
|
+
"staff.notifications.leaveRequest.approved.body": "Your leave request from {startDate} to {endDate} has been approved",
|
|
884
|
+
"staff.notifications.leaveRequest.rejected.title": "Leave Request Rejected",
|
|
885
|
+
"staff.notifications.leaveRequest.rejected.body": "Your leave request from {startDate} to {endDate} has been rejected{reason, select, other { - {reason}}}"
|
|
878
886
|
}
|
|
@@ -797,6 +797,10 @@
|
|
|
797
797
|
"staff.teams.tabs.details": "Detalles",
|
|
798
798
|
"staff.teams.tabs.label": "Secciones del equipo",
|
|
799
799
|
"staff.teams.tabs.members": "Miembros del equipo",
|
|
800
|
+
"staff.notifications.leaveRequest.pending.title": "Solicitud de ausencia pendiente",
|
|
801
|
+
"staff.notifications.leaveRequest.pending.body": "{memberName} ha solicitado ausencia del {startDate} al {endDate}",
|
|
802
|
+
"staff.notifications.leaveRequest.actions.approve": "Aprobar",
|
|
803
|
+
"staff.notifications.leaveRequest.actions.reject": "Rechazar",
|
|
800
804
|
"staff.leaveRequests.page.title": "Solicitudes de ausencia",
|
|
801
805
|
"staff.leaveRequests.page.description": "Revisa las solicitudes de ausencia del equipo.",
|
|
802
806
|
"staff.leaveRequests.my.title": "Mis solicitudes de ausencia",
|
|
@@ -797,6 +797,10 @@
|
|
|
797
797
|
"staff.teams.tabs.details": "Szczeg\u00f3\u0142y",
|
|
798
798
|
"staff.teams.tabs.label": "Sekcje zespo\u0142u",
|
|
799
799
|
"staff.teams.tabs.members": "Cz\u0142onkowie zespo\u0142u",
|
|
800
|
+
"staff.notifications.leaveRequest.pending.title": "Wniosek urlopowy oczekuje",
|
|
801
|
+
"staff.notifications.leaveRequest.pending.body": "{memberName} zło\u017cył wniosek o urlop od {startDate} do {endDate}",
|
|
802
|
+
"staff.notifications.leaveRequest.actions.approve": "Zatwierd\u017a",
|
|
803
|
+
"staff.notifications.leaveRequest.actions.reject": "Odrzu\u0107",
|
|
800
804
|
"staff.leaveRequests.page.title": "Wnioski urlopowe",
|
|
801
805
|
"staff.leaveRequests.page.description": "Przegl\u0105daj wnioski urlopowe zespo\u0142u.",
|
|
802
806
|
"staff.leaveRequests.my.title": "Moje wnioski urlopowe",
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
|
|
2
|
+
|
|
3
|
+
export const notificationTypes: NotificationTypeDefinition[] = [
|
|
4
|
+
{
|
|
5
|
+
type: 'staff.leave_request.pending',
|
|
6
|
+
module: 'staff',
|
|
7
|
+
titleKey: 'staff.notifications.leaveRequest.pending.title',
|
|
8
|
+
bodyKey: 'staff.notifications.leaveRequest.pending.body',
|
|
9
|
+
icon: 'calendar-off',
|
|
10
|
+
severity: 'warning',
|
|
11
|
+
actions: [
|
|
12
|
+
{
|
|
13
|
+
id: 'approve',
|
|
14
|
+
labelKey: 'staff.notifications.leaveRequest.actions.approve',
|
|
15
|
+
variant: 'default',
|
|
16
|
+
icon: 'check',
|
|
17
|
+
commandId: 'staff.leave-requests.accept',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'reject',
|
|
21
|
+
labelKey: 'staff.notifications.leaveRequest.actions.reject',
|
|
22
|
+
variant: 'destructive',
|
|
23
|
+
icon: 'x',
|
|
24
|
+
commandId: 'staff.leave-requests.reject',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
primaryActionId: 'approve',
|
|
28
|
+
linkHref: '/backend/staff/leave-requests/{sourceEntityId}',
|
|
29
|
+
expiresAfterHours: 168,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
type: 'staff.leave_request.approved',
|
|
33
|
+
module: 'staff',
|
|
34
|
+
titleKey: 'staff.notifications.leaveRequest.approved.title',
|
|
35
|
+
bodyKey: 'staff.notifications.leaveRequest.approved.body',
|
|
36
|
+
icon: 'calendar-check',
|
|
37
|
+
severity: 'success',
|
|
38
|
+
actions: [
|
|
39
|
+
{
|
|
40
|
+
id: 'view',
|
|
41
|
+
labelKey: 'common.view',
|
|
42
|
+
variant: 'outline',
|
|
43
|
+
href: '/backend/staff/leave-requests/{sourceEntityId}',
|
|
44
|
+
icon: 'external-link',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
linkHref: '/backend/staff/leave-requests/{sourceEntityId}',
|
|
48
|
+
expiresAfterHours: 168, // 7 days
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
type: 'staff.leave_request.rejected',
|
|
52
|
+
module: 'staff',
|
|
53
|
+
titleKey: 'staff.notifications.leaveRequest.rejected.title',
|
|
54
|
+
bodyKey: 'staff.notifications.leaveRequest.rejected.body',
|
|
55
|
+
icon: 'calendar-x',
|
|
56
|
+
severity: 'warning',
|
|
57
|
+
actions: [
|
|
58
|
+
{
|
|
59
|
+
id: 'view',
|
|
60
|
+
labelKey: 'common.view',
|
|
61
|
+
variant: 'outline',
|
|
62
|
+
href: '/backend/staff/leave-requests/{sourceEntityId}',
|
|
63
|
+
icon: 'external-link',
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
linkHref: '/backend/staff/leave-requests/{sourceEntityId}',
|
|
67
|
+
expiresAfterHours: 168, // 7 days
|
|
68
|
+
},
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
export default notificationTypes
|
|
@@ -274,22 +274,27 @@ export default function WorkflowDefinitionsListPage() {
|
|
|
274
274
|
<RowActions
|
|
275
275
|
items={[
|
|
276
276
|
{
|
|
277
|
+
id: 'edit',
|
|
277
278
|
label: t('common.edit'),
|
|
278
279
|
href: `/backend/definitions/${row.original.id}`,
|
|
279
280
|
},
|
|
280
281
|
{
|
|
282
|
+
id: 'edit-visual',
|
|
281
283
|
label: t('workflows.actions.editVisually'),
|
|
282
284
|
href: `/backend/definitions/visual-editor?id=${row.original.id}`,
|
|
283
285
|
},
|
|
284
286
|
{
|
|
287
|
+
id: row.original.enabled ? 'disable' : 'enable',
|
|
285
288
|
label: row.original.enabled ? t('common.disable') : t('common.enable'),
|
|
286
289
|
onSelect: () => handleToggleEnabled(row.original.id, row.original.enabled),
|
|
287
290
|
},
|
|
288
291
|
{
|
|
292
|
+
id: 'duplicate',
|
|
289
293
|
label: t('common.duplicate'),
|
|
290
294
|
onSelect: () => handleDuplicate(row.original),
|
|
291
295
|
},
|
|
292
296
|
{
|
|
297
|
+
id: 'delete',
|
|
293
298
|
label: t('common.delete'),
|
|
294
299
|
onSelect: () => handleDelete(row.original.id, row.original.workflowName),
|
|
295
300
|
destructive: true,
|
|
@@ -266,8 +266,9 @@ export default function WorkflowInstancesListPage() {
|
|
|
266
266
|
id: 'actions',
|
|
267
267
|
header: '',
|
|
268
268
|
cell: ({ row }) => {
|
|
269
|
-
const items: Array<{label: string; href?: string; onSelect?: () => void}> = [
|
|
269
|
+
const items: Array<{ id: string; label: string; href?: string; onSelect?: () => void }> = [
|
|
270
270
|
{
|
|
271
|
+
id: 'view',
|
|
271
272
|
label: t('workflows.instances.actions.viewDetails'),
|
|
272
273
|
href: `/backend/instances/${row.original.id}`,
|
|
273
274
|
},
|
|
@@ -275,6 +276,7 @@ export default function WorkflowInstancesListPage() {
|
|
|
275
276
|
|
|
276
277
|
if (row.original.status === 'RUNNING' || row.original.status === 'PAUSED') {
|
|
277
278
|
items.push({
|
|
279
|
+
id: 'cancel',
|
|
278
280
|
label: t('workflows.instances.actions.cancel'),
|
|
279
281
|
onSelect: () => handleCancel(row.original.id, row.original.workflowId),
|
|
280
282
|
})
|
|
@@ -282,6 +284,7 @@ export default function WorkflowInstancesListPage() {
|
|
|
282
284
|
|
|
283
285
|
if (row.original.status === 'FAILED') {
|
|
284
286
|
items.push({
|
|
287
|
+
id: 'retry',
|
|
285
288
|
label: t('workflows.instances.actions.retry'),
|
|
286
289
|
onSelect: () => handleRetry(row.original.id, row.original.workflowId),
|
|
287
290
|
})
|
|
@@ -273,8 +273,9 @@ export default function UserTasksListPage() {
|
|
|
273
273
|
id: 'actions',
|
|
274
274
|
header: '',
|
|
275
275
|
cell: ({ row }) => {
|
|
276
|
-
const items: Array<{label: string; href?: string; onSelect?: () => void}> = [
|
|
276
|
+
const items: Array<{ id: string; label: string; href?: string; onSelect?: () => void }> = [
|
|
277
277
|
{
|
|
278
|
+
id: 'view',
|
|
278
279
|
label: t('workflows.tasks.actions.viewDetails'),
|
|
279
280
|
href: `/backend/tasks/${row.original.id}`,
|
|
280
281
|
},
|
|
@@ -288,6 +289,7 @@ export default function UserTasksListPage() {
|
|
|
288
289
|
row.original.assignedToRoles.length > 0
|
|
289
290
|
) {
|
|
290
291
|
items.push({
|
|
292
|
+
id: 'claim',
|
|
291
293
|
label: t('workflows.tasks.actions.claim'),
|
|
292
294
|
onSelect: () => handleClaim(row.original.id, row.original.taskName),
|
|
293
295
|
})
|
|
@@ -296,6 +298,7 @@ export default function UserTasksListPage() {
|
|
|
296
298
|
// Allow completing if task is in progress or pending
|
|
297
299
|
if (row.original.status === 'PENDING' || row.original.status === 'IN_PROGRESS') {
|
|
298
300
|
items.push({
|
|
301
|
+
id: 'complete',
|
|
299
302
|
label: t('workflows.tasks.actions.complete'),
|
|
300
303
|
href: `/backend/tasks/${row.original.id}`,
|
|
301
304
|
})
|
|
@@ -56,7 +56,7 @@ const seedDemo: ModuleCli = {
|
|
|
56
56
|
})
|
|
57
57
|
|
|
58
58
|
if (existing) {
|
|
59
|
-
console.log(
|
|
59
|
+
console.log(`ℹ️ Demo workflow '${demoData.workflowId}' already exists (ID: ${existing.id})`)
|
|
60
60
|
return
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -69,7 +69,7 @@ const seedDemo: ModuleCli = {
|
|
|
69
69
|
|
|
70
70
|
await em.persistAndFlush(workflow)
|
|
71
71
|
|
|
72
|
-
console.log(
|
|
72
|
+
console.log(`✅ Seeded demo workflow: ${workflow.workflowName}`)
|
|
73
73
|
console.log(` - ID: ${workflow.id}`)
|
|
74
74
|
console.log(` - Workflow ID: ${workflow.workflowId}`)
|
|
75
75
|
console.log(` - Version: ${workflow.version}`)
|
|
@@ -107,15 +107,15 @@ const seedDemoWithRules: ModuleCli = {
|
|
|
107
107
|
return
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
console.log('🧩 Seeding demo workflow with guard rules...\n')
|
|
111
111
|
|
|
112
112
|
try {
|
|
113
113
|
// Seed the workflow definition
|
|
114
|
-
console.log('1. Seeding demo workflow...')
|
|
114
|
+
console.log('1. 🧩 Seeding demo workflow...')
|
|
115
115
|
await seedDemo.run(rest)
|
|
116
116
|
|
|
117
117
|
// Seed the guard rules
|
|
118
|
-
console.log('\n2. Seeding guard rules...')
|
|
118
|
+
console.log('\n2. 🧠 Seeding guard rules...')
|
|
119
119
|
const { resolve } = await createRequestContainer()
|
|
120
120
|
const em = resolve<EntityManager>('em')
|
|
121
121
|
|
|
@@ -153,7 +153,7 @@ const seedDemoWithRules: ModuleCli = {
|
|
|
153
153
|
seededCount++
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
console.log(`\n
|
|
156
|
+
console.log(`\n✅ Demo workflow with guard rules seeded successfully!`)
|
|
157
157
|
console.log(` - Workflow: checkout_simple_v1`)
|
|
158
158
|
console.log(` - Guard rules seeded: ${seededCount}`)
|
|
159
159
|
console.log(` - Guard rules skipped: ${skippedCount}`)
|
|
@@ -195,7 +195,7 @@ const seedSalesPipeline: ModuleCli = {
|
|
|
195
195
|
})
|
|
196
196
|
|
|
197
197
|
if (existing) {
|
|
198
|
-
console.log(
|
|
198
|
+
console.log(`ℹ️ Sales pipeline workflow '${pipelineData.workflowId}' already exists (ID: ${existing.id})`)
|
|
199
199
|
return
|
|
200
200
|
}
|
|
201
201
|
|
|
@@ -208,7 +208,7 @@ const seedSalesPipeline: ModuleCli = {
|
|
|
208
208
|
|
|
209
209
|
await em.persistAndFlush(workflow)
|
|
210
210
|
|
|
211
|
-
console.log(
|
|
211
|
+
console.log(`✅ Seeded sales pipeline workflow: ${workflow.workflowName}`)
|
|
212
212
|
console.log(` - ID: ${workflow.id}`)
|
|
213
213
|
console.log(` - Workflow ID: ${workflow.workflowId}`)
|
|
214
214
|
console.log(` - Version: ${workflow.version}`)
|
|
@@ -255,7 +255,7 @@ const seedSimpleApproval: ModuleCli = {
|
|
|
255
255
|
})
|
|
256
256
|
|
|
257
257
|
if (existing) {
|
|
258
|
-
console.log(
|
|
258
|
+
console.log(`ℹ️ Simple approval workflow '${approvalData.workflowId}' already exists (ID: ${existing.id})`)
|
|
259
259
|
return
|
|
260
260
|
}
|
|
261
261
|
|
|
@@ -268,7 +268,7 @@ const seedSimpleApproval: ModuleCli = {
|
|
|
268
268
|
|
|
269
269
|
await em.persistAndFlush(workflow)
|
|
270
270
|
|
|
271
|
-
console.log(
|
|
271
|
+
console.log(`✅ Seeded simple approval workflow: ${workflow.workflowName}`)
|
|
272
272
|
console.log(` - ID: ${workflow.id}`)
|
|
273
273
|
console.log(` - Workflow ID: ${workflow.workflowId}`)
|
|
274
274
|
console.log(` - Version: ${workflow.version}`)
|
|
@@ -351,7 +351,7 @@ const seedAll: ModuleCli = {
|
|
|
351
351
|
return
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
-
console.log('Seeding all example workflows...\n')
|
|
354
|
+
console.log('🧩 Seeding all example workflows...\n')
|
|
355
355
|
|
|
356
356
|
try {
|
|
357
357
|
// Seed demo checkout with rules
|
|
@@ -366,7 +366,7 @@ const seedAll: ModuleCli = {
|
|
|
366
366
|
await seedSimpleApproval.run(rest)
|
|
367
367
|
console.log('')
|
|
368
368
|
|
|
369
|
-
console.log('
|
|
369
|
+
console.log('✅ All example workflows seeded successfully!')
|
|
370
370
|
} catch (error) {
|
|
371
371
|
console.error('Error seeding workflows:', error)
|
|
372
372
|
throw error
|
|
@@ -676,5 +676,7 @@
|
|
|
676
676
|
"success": "Sub-workflow completed successfully",
|
|
677
677
|
"failed": "Sub-workflow failed"
|
|
678
678
|
}
|
|
679
|
-
}
|
|
679
|
+
},
|
|
680
|
+
"workflows.notifications.task.assigned.title": "Task Assigned",
|
|
681
|
+
"workflows.notifications.task.assigned.body": "You have been assigned to task \"{taskName}\" in workflow \"{workflowName}\"{dueDate, select, other { (due: {dueDate})}}"
|
|
680
682
|
}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import { EntityManager } from '@mikro-orm/core'
|
|
14
14
|
import type { AwilixContainer } from 'awilix'
|
|
15
|
+
import type { EventBus } from '@open-mercato/events'
|
|
15
16
|
import {
|
|
16
17
|
WorkflowInstance,
|
|
17
18
|
WorkflowDefinition,
|
|
@@ -271,6 +272,13 @@ export async function executeTransition(
|
|
|
271
272
|
context: TransitionExecutionContext
|
|
272
273
|
): Promise<TransitionExecutionResult> {
|
|
273
274
|
try {
|
|
275
|
+
let eventBus: Pick<EventBus, 'emitEvent'> | null = null
|
|
276
|
+
try {
|
|
277
|
+
eventBus = container.resolve('eventBus') as EventBus
|
|
278
|
+
} catch {
|
|
279
|
+
eventBus = null
|
|
280
|
+
}
|
|
281
|
+
|
|
274
282
|
// First, evaluate if transition is valid
|
|
275
283
|
const evaluation = await evaluateTransition(
|
|
276
284
|
em,
|
|
@@ -294,7 +302,8 @@ export async function executeTransition(
|
|
|
294
302
|
em,
|
|
295
303
|
instance,
|
|
296
304
|
transition,
|
|
297
|
-
context
|
|
305
|
+
context,
|
|
306
|
+
eventBus
|
|
298
307
|
)
|
|
299
308
|
|
|
300
309
|
if (!preConditionsResult.allowed) {
|
|
@@ -505,7 +514,8 @@ export async function executeTransition(
|
|
|
505
514
|
em,
|
|
506
515
|
instance,
|
|
507
516
|
transition,
|
|
508
|
-
context
|
|
517
|
+
context,
|
|
518
|
+
eventBus
|
|
509
519
|
)
|
|
510
520
|
|
|
511
521
|
if (!postConditionsResult.allowed) {
|
|
@@ -659,7 +669,8 @@ async function evaluatePreConditions(
|
|
|
659
669
|
em: EntityManager,
|
|
660
670
|
instance: WorkflowInstance,
|
|
661
671
|
transition: any,
|
|
662
|
-
context: TransitionExecutionContext
|
|
672
|
+
context: TransitionExecutionContext,
|
|
673
|
+
eventBus: Pick<EventBus, 'emitEvent'> | null
|
|
663
674
|
): Promise<ruleEngine.RuleEngineResult> {
|
|
664
675
|
try {
|
|
665
676
|
// Load workflow definition to get workflow ID
|
|
@@ -698,7 +709,7 @@ async function evaluatePreConditions(
|
|
|
698
709
|
}
|
|
699
710
|
|
|
700
711
|
// Execute rules - only GUARD rules will affect the 'allowed' status
|
|
701
|
-
const result = await ruleEngine.executeRules(em, ruleContext)
|
|
712
|
+
const result = await ruleEngine.executeRules(em, ruleContext, { eventBus })
|
|
702
713
|
|
|
703
714
|
return result
|
|
704
715
|
} catch (error) {
|
|
@@ -728,7 +739,8 @@ async function evaluatePostConditions(
|
|
|
728
739
|
em: EntityManager,
|
|
729
740
|
instance: WorkflowInstance,
|
|
730
741
|
transition: any,
|
|
731
|
-
context: TransitionExecutionContext
|
|
742
|
+
context: TransitionExecutionContext,
|
|
743
|
+
eventBus: Pick<EventBus, 'emitEvent'> | null
|
|
732
744
|
): Promise<ruleEngine.RuleEngineResult> {
|
|
733
745
|
try {
|
|
734
746
|
// Load workflow definition to get workflow ID
|
|
@@ -767,7 +779,7 @@ async function evaluatePostConditions(
|
|
|
767
779
|
}
|
|
768
780
|
|
|
769
781
|
// Execute rules
|
|
770
|
-
const result = await ruleEngine.executeRules(em, ruleContext)
|
|
782
|
+
const result = await ruleEngine.executeRules(em, ruleContext, { eventBus })
|
|
771
783
|
|
|
772
784
|
return result
|
|
773
785
|
} catch (error) {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
|
|
2
|
+
|
|
3
|
+
export const notificationTypes: NotificationTypeDefinition[] = [
|
|
4
|
+
{
|
|
5
|
+
type: 'workflows.task.assigned',
|
|
6
|
+
module: 'workflows',
|
|
7
|
+
titleKey: 'workflows.notifications.task.assigned.title',
|
|
8
|
+
bodyKey: 'workflows.notifications.task.assigned.body',
|
|
9
|
+
icon: 'clipboard-list',
|
|
10
|
+
severity: 'info',
|
|
11
|
+
actions: [
|
|
12
|
+
{
|
|
13
|
+
id: 'view',
|
|
14
|
+
labelKey: 'common.view',
|
|
15
|
+
variant: 'outline',
|
|
16
|
+
href: '/backend/workflows/tasks/{sourceEntityId}',
|
|
17
|
+
icon: 'external-link',
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
linkHref: '/backend/workflows/tasks/{sourceEntityId}',
|
|
21
|
+
expiresAfterHours: 168, // 7 days
|
|
22
|
+
},
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
export default notificationTypes
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import { resolveNotificationService } from '../../notifications/lib/notificationService'
|
|
3
|
+
import { buildNotificationFromType } from '../../notifications/lib/notificationBuilder'
|
|
4
|
+
import { notificationTypes } from '../notifications'
|
|
5
|
+
|
|
6
|
+
export const metadata = {
|
|
7
|
+
event: 'workflows.task.assigned',
|
|
8
|
+
persistent: true,
|
|
9
|
+
id: 'workflows:task-assigned-notification',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type TaskAssignedPayload = {
|
|
13
|
+
taskId: string
|
|
14
|
+
taskName: string
|
|
15
|
+
workflowName: string
|
|
16
|
+
assignedUserId: string
|
|
17
|
+
dueDate?: string | null
|
|
18
|
+
tenantId: string
|
|
19
|
+
organizationId?: string | null
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type ResolverContext = {
|
|
23
|
+
resolve: <T = unknown>(name: string) => T
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default async function handle(payload: TaskAssignedPayload, ctx: ResolverContext) {
|
|
27
|
+
if (!payload.assignedUserId) return
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
const notificationService = resolveNotificationService(ctx)
|
|
31
|
+
const typeDef = notificationTypes.find((type) => type.type === 'workflows.task.assigned')
|
|
32
|
+
if (!typeDef) return
|
|
33
|
+
|
|
34
|
+
const notificationInput = buildNotificationFromType(typeDef, {
|
|
35
|
+
recipientUserId: payload.assignedUserId,
|
|
36
|
+
bodyVariables: {
|
|
37
|
+
taskName: payload.taskName,
|
|
38
|
+
workflowName: payload.workflowName,
|
|
39
|
+
dueDate: payload.dueDate ?? '',
|
|
40
|
+
},
|
|
41
|
+
sourceEntityType: 'workflows:user_task',
|
|
42
|
+
sourceEntityId: payload.taskId,
|
|
43
|
+
linkHref: `/backend/workflows/tasks/${payload.taskId}`,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
await notificationService.create(notificationInput, {
|
|
47
|
+
tenantId: payload.tenantId,
|
|
48
|
+
organizationId: payload.organizationId ?? null,
|
|
49
|
+
})
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error('[workflows:task-assigned-notification] Failed to create notification:', err)
|
|
52
|
+
}
|
|
53
|
+
}
|