@open-mercato/core 0.7.0 → 0.7.1-develop.7103.1.41ff100d93
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/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/api.js +13 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/di.js +9 -0
- package/dist/modules/api_keys/di.js.map +7 -0
- package/dist/modules/api_keys/services/principalService.js +31 -0
- package/dist/modules/api_keys/services/principalService.js.map +7 -0
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +11 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/attachment-service.js +313 -0
- package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +6 -2
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +57 -12
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +8 -2
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +4 -1
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/validate.js +55 -0
- package/dist/modules/auth/api/reset/validate.js.map +7 -0
- package/dist/modules/auth/api/roles/acl/route.js +28 -33
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/session/refresh.js +25 -1
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +96 -51
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +13 -5
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/commands/acl.js +254 -0
- package/dist/modules/auth/commands/acl.js.map +7 -0
- package/dist/modules/auth/components/AclEditor.js +39 -30
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +5 -1
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +35 -9
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/userIdFilter.js +16 -0
- package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
- package/dist/modules/auth/services/authService.js +16 -2
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/principalService.js +200 -0
- package/dist/modules/auth/services/principalService.js.map +7 -0
- package/dist/modules/auth/services/rbacService.js +67 -24
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
- package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
- package/dist/modules/business_rules/backend/logs/page.js +3 -1
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +3 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -1
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +7 -1
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +41 -2
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +9 -0
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/services/rateFetchingService.js +6 -1
- package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +4 -1
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +48 -6
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +17 -94
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +8 -25
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +14 -9
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +5 -5
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +38 -1
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +3 -1
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +11 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +51 -9
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +30 -5
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +5 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
- package/dist/modules/customers/backend/customers/people/page.js +4 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +21 -34
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
- package/dist/modules/customers/commands/personCompanyLinks.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/components/DealsKpiStrip.js +7 -6
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -7
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +6 -5
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +32 -3
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +5 -0
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
- package/dist/modules/customers/lib/closureStage.js +45 -0
- package/dist/modules/customers/lib/closureStage.js.map +7 -0
- package/dist/modules/customers/lib/dealStatus.js +30 -0
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/detailReadAccess.js +12 -0
- package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +100 -2
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +12 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +6 -1
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
- package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +72 -6
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +5 -1
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +5 -1
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +9 -1
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +14 -1
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +99 -12
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/deviceSerialization.js +46 -0
- package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +3 -1
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +9 -1
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +17 -1
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +28 -34
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
- package/dist/modules/devices/backend/devices/userOptions.js +52 -0
- package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
- package/dist/modules/devices/setup.js +6 -2
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +9 -0
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
- package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
- package/dist/modules/directory/services/organizationScopeService.js +56 -0
- package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +4 -2
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +5 -1
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +0 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +4 -1
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +0 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
- package/dist/modules/integrations/data/validators.js +11 -3
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +6 -2
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +29 -1
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +17 -2
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +17 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +15 -0
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +14 -2
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +18 -4
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
- package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +150 -51
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
- package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
- package/dist/modules/query_index/lib/search-tokens.js +79 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +79 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +8 -2
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +1 -0
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
- package/dist/modules/sales/setup.js +2 -0
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +4 -7
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +3 -0
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +121 -9
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +3 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +9 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +3 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +3 -1
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -1
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -0
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +9 -10
- package/src/helpers/integration/api.ts +33 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
- package/src/modules/api_keys/api/keys/route.ts +3 -1
- package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
- package/src/modules/api_keys/di.ts +7 -0
- package/src/modules/api_keys/services/principalService.ts +33 -0
- package/src/modules/attachments/AGENTS.md +15 -0
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
- package/src/modules/attachments/di.ts +16 -0
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/index.ts +10 -0
- package/src/modules/attachments/lib/attachment-service.ts +468 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
- package/src/modules/attachments/lib/upload-limits.ts +6 -2
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
- package/src/modules/audit_logs/services/actionLogService.ts +74 -11
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/auth/api/feature-check.ts +10 -3
- package/src/modules/auth/api/login.ts +9 -1
- package/src/modules/auth/api/reset/validate.ts +57 -0
- package/src/modules/auth/api/roles/acl/route.ts +42 -39
- package/src/modules/auth/api/session/refresh.ts +32 -1
- package/src/modules/auth/api/users/acl/route.ts +177 -53
- package/src/modules/auth/api/users/route.ts +18 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/roles/page.tsx +4 -2
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/users/page.tsx +3 -2
- package/src/modules/auth/commands/acl.ts +495 -0
- package/src/modules/auth/components/AclEditor.tsx +63 -33
- package/src/modules/auth/data/entities.ts +4 -1
- package/src/modules/auth/data/validators.ts +5 -0
- package/src/modules/auth/di.ts +46 -16
- package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
- package/src/modules/auth/i18n/de.json +389 -0
- package/src/modules/auth/i18n/en.json +389 -0
- package/src/modules/auth/i18n/es.json +389 -0
- package/src/modules/auth/i18n/ko.json +389 -0
- package/src/modules/auth/i18n/pl.json +391 -2
- package/src/modules/auth/lib/grantChecks.ts +6 -0
- package/src/modules/auth/lib/userIdFilter.ts +31 -0
- package/src/modules/auth/services/authService.ts +18 -2
- package/src/modules/auth/services/principalService.ts +266 -0
- package/src/modules/auth/services/rbacService.ts +110 -24
- package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
- package/src/modules/business_rules/backend/logs/page.tsx +4 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -1
- package/src/modules/business_rules/backend/sets/page.tsx +4 -1
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
- package/src/modules/communication_channels/di.ts +7 -0
- package/src/modules/communication_channels/lib/adapter.ts +14 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
- package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
- package/src/modules/communication_channels/lib/test-seed.ts +64 -4
- package/src/modules/configs/i18n/de.json +2 -0
- package/src/modules/configs/i18n/en.json +2 -0
- package/src/modules/configs/i18n/es.json +2 -0
- package/src/modules/configs/i18n/ko.json +2 -0
- package/src/modules/configs/i18n/pl.json +2 -0
- package/src/modules/configs/lib/system-status.ts +9 -0
- package/src/modules/currencies/AGENTS.md +3 -0
- package/src/modules/currencies/backend/currencies/page.tsx +4 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
- package/src/modules/currencies/services/README.md +45 -0
- package/src/modules/currencies/services/rateFetchingService.ts +6 -1
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
- package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
- package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
- package/src/modules/customers/ai-tools/people-pack.ts +4 -1
- package/src/modules/customers/api/activities/route.ts +45 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
- package/src/modules/customers/api/companies/[id]/route.ts +24 -107
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
- package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/route.ts +17 -28
- package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
- package/src/modules/customers/api/deals/aggregate/route.ts +17 -9
- package/src/modules/customers/api/deals/map/route.ts +4 -4
- package/src/modules/customers/api/deals/route.ts +50 -1
- package/src/modules/customers/api/entity-roles-factory.ts +8 -4
- package/src/modules/customers/api/interactions/route.ts +8 -2
- package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
- package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
- package/src/modules/customers/api/people/[id]/route.ts +16 -11
- package/src/modules/customers/api/people/check-phone/route.ts +75 -10
- package/src/modules/customers/api/todos/route.ts +27 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
- package/src/modules/customers/backend/customers/people/page.tsx +5 -2
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
- package/src/modules/customers/commands/deals.ts +34 -59
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
- package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
- package/src/modules/customers/components/detail/DealForm.tsx +22 -2
- package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +15 -5
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +50 -9
- package/src/modules/customers/events.ts +5 -0
- package/src/modules/customers/i18n/de.json +9 -1
- package/src/modules/customers/i18n/en.json +9 -1
- package/src/modules/customers/i18n/es.json +9 -1
- package/src/modules/customers/i18n/ko.json +9 -1
- package/src/modules/customers/i18n/pl.json +9 -1
- package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
- package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
- package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
- package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
- package/src/modules/customers/lib/closureStage.ts +76 -0
- package/src/modules/customers/lib/dealStatus.ts +42 -0
- package/src/modules/customers/lib/detailReadAccess.ts +35 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
- package/src/modules/customers/lib/personCompanies.ts +136 -1
- package/src/modules/customers/lib/todoCompatibility.ts +19 -1
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +6 -0
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
- package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
- package/src/modules/data_sync/lib/adapter.ts +36 -0
- package/src/modules/data_sync/lib/sync-engine.ts +113 -5
- package/src/modules/data_sync/workers/sync-export.ts +4 -0
- package/src/modules/data_sync/workers/sync-import.ts +4 -0
- package/src/modules/devices/AGENTS.md +20 -1
- package/src/modules/devices/acl.ts +9 -1
- package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
- package/src/modules/devices/api/admin/devices/route.ts +14 -1
- package/src/modules/devices/api/deviceList.ts +135 -11
- package/src/modules/devices/api/deviceSerialization.ts +50 -0
- package/src/modules/devices/api/openapi.ts +9 -1
- package/src/modules/devices/api/route.ts +9 -1
- package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
- package/src/modules/devices/backend/devices/create/page.tsx +17 -1
- package/src/modules/devices/backend/devices/page.tsx +44 -45
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
- package/src/modules/devices/backend/devices/userOptions.ts +99 -0
- package/src/modules/devices/i18n/de.json +3 -2
- package/src/modules/devices/i18n/en.json +3 -2
- package/src/modules/devices/i18n/es.json +3 -2
- package/src/modules/devices/i18n/ko.json +3 -2
- package/src/modules/devices/i18n/pl.json +3 -2
- package/src/modules/devices/setup.ts +6 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
- package/src/modules/directory/di.ts +14 -2
- package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
- package/src/modules/directory/services/organizationScopeService.ts +85 -0
- package/src/modules/directory/utils/organizationScope.ts +4 -15
- package/src/modules/entities/api/records.ts +2 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
- package/src/modules/eudr/api/plots/route.ts +4 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
- package/src/modules/eudr/commands/statements.ts +0 -3
- package/src/modules/eudr/data/validators.ts +16 -1
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/feature_toggles/defaults.json +0 -8
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
- package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
- package/src/modules/integrations/data/validators.ts +12 -2
- package/src/modules/integrations/i18n/de.json +1 -0
- package/src/modules/integrations/i18n/en.json +1 -0
- package/src/modules/integrations/i18n/es.json +1 -0
- package/src/modules/integrations/i18n/ko.json +1 -0
- package/src/modules/integrations/i18n/pl.json +1 -0
- package/src/modules/integrations/lib/credentials-masking.ts +10 -6
- package/src/modules/messages/api/[id]/route.ts +55 -1
- package/src/modules/messages/api/openapi.ts +20 -0
- package/src/modules/messages/api/route.ts +31 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
- package/src/modules/messages/components/inboxFilters.ts +36 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
- package/src/modules/messages/components/message-detail/types.ts +3 -0
- package/src/modules/messages/components/messageListLabels.ts +52 -3
- package/src/modules/messages/data/validators.ts +43 -4
- package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
- package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
- package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +249 -61
- package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
- package/src/modules/query_index/lib/search-tokens.ts +135 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
- package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
- package/src/modules/sales/commands/documents.ts +93 -0
- package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
- package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
- package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
- package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
- package/src/modules/sales/data/entities.ts +6 -0
- package/src/modules/sales/extension-points.ts +1 -0
- package/src/modules/sales/i18n/de.json +8 -0
- package/src/modules/sales/i18n/en.json +8 -0
- package/src/modules/sales/i18n/es.json +8 -0
- package/src/modules/sales/i18n/ko.json +8 -0
- package/src/modules/sales/i18n/pl.json +8 -0
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
- package/src/modules/sales/setup.ts +2 -0
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
- package/src/modules/sales/widgets/injection-table.ts +4 -7
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
- package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
- package/src/modules/warranty_claims/backend/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +159 -10
- package/src/modules/wms/commands/inventory-actions.ts +3 -0
- package/src/modules/wms/commands/shared.ts +17 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/page.tsx +4 -1
- package/src/modules/workflows/backend/events/page.tsx +4 -1
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/lib/activity-executor.ts +9 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import type { FilterQuery } from '@mikro-orm/core'
|
|
2
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
3
|
+
import { sql } from 'kysely'
|
|
4
|
+
import type {
|
|
5
|
+
AuthPrincipalLabel,
|
|
6
|
+
AuthPrincipalRolePage,
|
|
7
|
+
AuthPrincipalService,
|
|
8
|
+
OrganizationHierarchyService,
|
|
9
|
+
PrincipalScope,
|
|
10
|
+
} from '@open-mercato/shared/lib/auth/principal-service'
|
|
11
|
+
import { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'
|
|
12
|
+
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
13
|
+
import { Role, RoleAcl, User, UserRole } from '../data/entities'
|
|
14
|
+
import { listSuperAdminUserIds } from '../lib/grantChecks'
|
|
15
|
+
import { resolveRoleOrganizationScope, roleAclGrantsPrincipalOrganization } from './roleOrganizationScope'
|
|
16
|
+
|
|
17
|
+
const MAX_ROLE_PAGE_SIZE = 100
|
|
18
|
+
const MAX_ROLE_RESULTS = 1_000
|
|
19
|
+
|
|
20
|
+
type AuthPrincipalDatabase = {
|
|
21
|
+
roles: {
|
|
22
|
+
id: string
|
|
23
|
+
tenant_id: string
|
|
24
|
+
name: string
|
|
25
|
+
deleted_at: Date | null
|
|
26
|
+
}
|
|
27
|
+
role_acls: {
|
|
28
|
+
role_id: string
|
|
29
|
+
tenant_id: string
|
|
30
|
+
organizations_json: string[] | null
|
|
31
|
+
deleted_at: Date | null
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function normalizeIds(ids: string[]): string[] {
|
|
36
|
+
return Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function relationId(value: unknown): string | null {
|
|
40
|
+
if (typeof value === 'string') return value.trim() || null
|
|
41
|
+
if (!value || typeof value !== 'object') return null
|
|
42
|
+
const id = (value as { id?: unknown }).id
|
|
43
|
+
return typeof id === 'string' && id.trim().length > 0 ? id.trim() : null
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export class DefaultAuthPrincipalService implements AuthPrincipalService {
|
|
47
|
+
constructor(
|
|
48
|
+
private readonly em: EntityManager,
|
|
49
|
+
private readonly organizationHierarchyService?: OrganizationHierarchyService,
|
|
50
|
+
) {}
|
|
51
|
+
|
|
52
|
+
async principalExists(input: {
|
|
53
|
+
type: 'user' | 'role'
|
|
54
|
+
id: string
|
|
55
|
+
scope: PrincipalScope
|
|
56
|
+
}): Promise<boolean> {
|
|
57
|
+
if (input.type === 'role') {
|
|
58
|
+
return (await this.filterActiveRoleIds([input.id], input.scope)).includes(input.id)
|
|
59
|
+
}
|
|
60
|
+
return Boolean(await findOneWithDecryption(
|
|
61
|
+
this.em,
|
|
62
|
+
User,
|
|
63
|
+
{
|
|
64
|
+
id: input.id,
|
|
65
|
+
tenantId: input.scope.tenantId,
|
|
66
|
+
deletedAt: null,
|
|
67
|
+
$or: [{ organizationId: null }, { organizationId: input.scope.organizationId }],
|
|
68
|
+
} as FilterQuery<User>,
|
|
69
|
+
{ fields: ['id'] as const },
|
|
70
|
+
input.scope,
|
|
71
|
+
))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async resolveActiveUserRoleIds(userId: string, scope: PrincipalScope): Promise<string[]> {
|
|
75
|
+
const links = await findWithDecryption(
|
|
76
|
+
this.em,
|
|
77
|
+
UserRole,
|
|
78
|
+
{
|
|
79
|
+
user: userId,
|
|
80
|
+
deletedAt: null,
|
|
81
|
+
role: { tenantId: scope.tenantId, deletedAt: null },
|
|
82
|
+
} as FilterQuery<UserRole>,
|
|
83
|
+
{ fields: ['role'] as const },
|
|
84
|
+
scope,
|
|
85
|
+
)
|
|
86
|
+
return this.filterActiveRoleIds(
|
|
87
|
+
normalizeIds(links.flatMap((link) => {
|
|
88
|
+
const id = relationId(link.role)
|
|
89
|
+
return id ? [id] : []
|
|
90
|
+
})),
|
|
91
|
+
scope,
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async filterActiveRoleIds(roleIds: string[], scope: PrincipalScope): Promise<string[]> {
|
|
96
|
+
const ids = normalizeIds(roleIds)
|
|
97
|
+
if (ids.length === 0) return []
|
|
98
|
+
const roles = await findWithDecryption(
|
|
99
|
+
this.em,
|
|
100
|
+
Role,
|
|
101
|
+
{ id: { $in: ids }, tenantId: scope.tenantId, deletedAt: null } as FilterQuery<Role>,
|
|
102
|
+
{ fields: ['id'] as const },
|
|
103
|
+
scope,
|
|
104
|
+
)
|
|
105
|
+
const activeIds = normalizeIds(roles.map((role) => role.id))
|
|
106
|
+
if (activeIds.length === 0) return []
|
|
107
|
+
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
108
|
+
this.organizationHierarchyService,
|
|
109
|
+
scope.tenantId,
|
|
110
|
+
scope.organizationId,
|
|
111
|
+
)
|
|
112
|
+
const acls = await findWithDecryption(
|
|
113
|
+
this.em,
|
|
114
|
+
RoleAcl,
|
|
115
|
+
{
|
|
116
|
+
tenantId: scope.tenantId,
|
|
117
|
+
role: { $in: activeIds },
|
|
118
|
+
deletedAt: null,
|
|
119
|
+
} as FilterQuery<RoleAcl>,
|
|
120
|
+
{ fields: ['role', 'organizationsJson'] as const },
|
|
121
|
+
scope,
|
|
122
|
+
)
|
|
123
|
+
const eligibilityById = new Map<string, boolean>()
|
|
124
|
+
for (const acl of acls) {
|
|
125
|
+
const id = relationId(acl.role)
|
|
126
|
+
if (!id) continue
|
|
127
|
+
eligibilityById.set(
|
|
128
|
+
id,
|
|
129
|
+
eligibilityById.get(id) === true || roleAclGrantsPrincipalOrganization(acl, roleOrganizationScope),
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
// A tenant role without an ACL remains a valid explicit-share principal.
|
|
133
|
+
// Only an existing ACL can restrict that role away from this organization.
|
|
134
|
+
return activeIds.filter((id) => eligibilityById.get(id) !== false)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async resolveLabels(input: {
|
|
138
|
+
type: 'user' | 'role'
|
|
139
|
+
ids: string[]
|
|
140
|
+
scope: PrincipalScope
|
|
141
|
+
}): Promise<AuthPrincipalLabel[]> {
|
|
142
|
+
const ids = normalizeIds(input.ids)
|
|
143
|
+
if (ids.length === 0) return []
|
|
144
|
+
if (input.type === 'role') {
|
|
145
|
+
const eligibleIds = await this.filterActiveRoleIds(ids, input.scope)
|
|
146
|
+
if (eligibleIds.length === 0) return []
|
|
147
|
+
const roles = await findWithDecryption(
|
|
148
|
+
this.em,
|
|
149
|
+
Role,
|
|
150
|
+
{ id: { $in: eligibleIds }, tenantId: input.scope.tenantId, deletedAt: null } as FilterQuery<Role>,
|
|
151
|
+
{ fields: ['id', 'name'] as const },
|
|
152
|
+
input.scope,
|
|
153
|
+
)
|
|
154
|
+
return roles.map((role) => ({ id: role.id, label: role.name, secondary: null }))
|
|
155
|
+
}
|
|
156
|
+
const users = await findWithDecryption(
|
|
157
|
+
this.em,
|
|
158
|
+
User,
|
|
159
|
+
{
|
|
160
|
+
id: { $in: ids },
|
|
161
|
+
tenantId: input.scope.tenantId,
|
|
162
|
+
deletedAt: null,
|
|
163
|
+
$or: [{ organizationId: null }, { organizationId: input.scope.organizationId }],
|
|
164
|
+
} as FilterQuery<User>,
|
|
165
|
+
{ fields: ['id', 'name', 'email'] as const },
|
|
166
|
+
input.scope,
|
|
167
|
+
)
|
|
168
|
+
return users.map((user) => ({
|
|
169
|
+
id: user.id,
|
|
170
|
+
label: user.name?.trim() || user.email,
|
|
171
|
+
secondary: user.name?.trim() && user.email !== user.name.trim() ? user.email : null,
|
|
172
|
+
}))
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async queryActiveRolePage(input: {
|
|
176
|
+
scope: PrincipalScope
|
|
177
|
+
search?: string
|
|
178
|
+
excludedIds?: string[]
|
|
179
|
+
page: number
|
|
180
|
+
pageSize: number
|
|
181
|
+
}): Promise<AuthPrincipalRolePage> {
|
|
182
|
+
const page = Math.max(1, Math.floor(input.page))
|
|
183
|
+
const pageSize = Math.min(MAX_ROLE_PAGE_SIZE, Math.max(1, Math.floor(input.pageSize)))
|
|
184
|
+
const offset = (page - 1) * pageSize
|
|
185
|
+
const excludedIds = normalizeIds(input.excludedIds ?? [])
|
|
186
|
+
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
187
|
+
this.organizationHierarchyService,
|
|
188
|
+
input.scope.tenantId,
|
|
189
|
+
input.scope.organizationId,
|
|
190
|
+
)
|
|
191
|
+
const db = this.em.getKysely<AuthPrincipalDatabase>()
|
|
192
|
+
let eligibleRoles = db
|
|
193
|
+
.selectFrom('roles as r')
|
|
194
|
+
.where('r.tenant_id', '=', input.scope.tenantId)
|
|
195
|
+
.where('r.deleted_at', 'is', null)
|
|
196
|
+
|
|
197
|
+
if (roleOrganizationScope) {
|
|
198
|
+
const allowedOrganizations = Array.from(roleOrganizationScope)
|
|
199
|
+
const organizationPredicates = [
|
|
200
|
+
sql<boolean>`ra.organizations_json is null`,
|
|
201
|
+
sql<boolean>`ra.organizations_json::jsonb @> ${JSON.stringify(['__all__'])}::jsonb`,
|
|
202
|
+
...allowedOrganizations.map((organizationId) => (
|
|
203
|
+
sql<boolean>`ra.organizations_json::jsonb @> ${JSON.stringify([organizationId])}::jsonb`
|
|
204
|
+
)),
|
|
205
|
+
]
|
|
206
|
+
const organizationAllowed = sql<boolean>`(${sql.join(organizationPredicates, sql` or `)})`
|
|
207
|
+
eligibleRoles = eligibleRoles.where(sql<boolean>`(
|
|
208
|
+
not exists (
|
|
209
|
+
select 1
|
|
210
|
+
from role_acls as ra_any
|
|
211
|
+
where ra_any.role_id = r.id
|
|
212
|
+
and ra_any.tenant_id = ${input.scope.tenantId}
|
|
213
|
+
and ra_any.deleted_at is null
|
|
214
|
+
)
|
|
215
|
+
or exists (
|
|
216
|
+
select 1
|
|
217
|
+
from role_acls as ra
|
|
218
|
+
where ra.role_id = r.id
|
|
219
|
+
and ra.tenant_id = ${input.scope.tenantId}
|
|
220
|
+
and ra.deleted_at is null
|
|
221
|
+
and ${organizationAllowed}
|
|
222
|
+
)
|
|
223
|
+
)`)
|
|
224
|
+
}
|
|
225
|
+
if (input.search?.trim()) {
|
|
226
|
+
const searchPattern = `%${escapeLikePattern(input.search.trim())}%`
|
|
227
|
+
eligibleRoles = eligibleRoles.where(sql<boolean>`r.name ilike ${searchPattern}`)
|
|
228
|
+
}
|
|
229
|
+
if (excludedIds.length > 0) {
|
|
230
|
+
eligibleRoles = eligibleRoles.where('r.id', 'not in', excludedIds)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const boundedRoleIds = eligibleRoles
|
|
234
|
+
.select('r.id')
|
|
235
|
+
.limit(MAX_ROLE_RESULTS)
|
|
236
|
+
.as('bounded_roles')
|
|
237
|
+
const countQuery = db
|
|
238
|
+
.selectFrom(boundedRoleIds)
|
|
239
|
+
.select(sql<string>`count(*)`.as('count'))
|
|
240
|
+
const pageQuery = eligibleRoles
|
|
241
|
+
.select(['r.id', 'r.name'])
|
|
242
|
+
.orderBy('r.id', 'asc')
|
|
243
|
+
.limit(offset < MAX_ROLE_RESULTS ? Math.min(pageSize, MAX_ROLE_RESULTS - offset) : 0)
|
|
244
|
+
.offset(Math.min(offset, MAX_ROLE_RESULTS))
|
|
245
|
+
|
|
246
|
+
const [rows, countRow] = await Promise.all([
|
|
247
|
+
pageQuery.execute() as Promise<Array<{ id: string; name: string }>>,
|
|
248
|
+
countQuery.executeTakeFirst() as Promise<{ count?: string | number } | undefined>,
|
|
249
|
+
])
|
|
250
|
+
const parsedTotal = Number(countRow?.count ?? 0)
|
|
251
|
+
const total = Number.isFinite(parsedTotal)
|
|
252
|
+
? Math.min(MAX_ROLE_RESULTS, Math.max(0, Math.floor(parsedTotal)))
|
|
253
|
+
: 0
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
items: rows.map((role) => ({ id: role.id, label: role.name, secondary: null })),
|
|
257
|
+
page,
|
|
258
|
+
pageSize,
|
|
259
|
+
total,
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
async listSuperAdminUserIds(tenantId: string): Promise<string[]> {
|
|
264
|
+
return Array.from(await listSuperAdminUserIds(this.em, tenantId))
|
|
265
|
+
}
|
|
266
|
+
}
|
|
@@ -4,12 +4,14 @@ import { getCurrentCacheTenant, runWithCacheTenant } from '@open-mercato/cache'
|
|
|
4
4
|
import { UserAcl, RoleAcl, User, UserRole } from '@open-mercato/core/modules/auth/data/entities'
|
|
5
5
|
import { ApiKey } from '@open-mercato/core/modules/api_keys/data/entities'
|
|
6
6
|
import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
7
|
+
import type { OrganizationHierarchyService } from '@open-mercato/shared/lib/auth/principal-service'
|
|
7
8
|
import { buildOrgScopeUserCacheTag, buildOrgScopeTenantCacheTag } from '@open-mercato/core/modules/directory/utils/organizationScope'
|
|
8
9
|
import {
|
|
9
10
|
authorizeFeatures,
|
|
10
11
|
resolveEffectiveFeatures,
|
|
11
12
|
} from '@open-mercato/shared/security/featurePolicy'
|
|
12
13
|
import { filterGrantsByEnabledModules } from '@open-mercato/shared/security/enabledModulesRegistry'
|
|
14
|
+
import { resolveRoleOrganizationScope, roleAclAllowsOrganization } from './roleOrganizationScope'
|
|
13
15
|
|
|
14
16
|
interface AclData {
|
|
15
17
|
isSuperAdmin: boolean
|
|
@@ -29,12 +31,22 @@ function isAclData(value: unknown): value is AclData {
|
|
|
29
31
|
return true
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
function isRestrictedRoleAcl(acl: Pick<RoleAcl, 'organizationsJson'>): boolean {
|
|
35
|
+
return Array.isArray(acl.organizationsJson)
|
|
36
|
+
&& acl.organizationsJson.length > 0
|
|
37
|
+
&& !acl.organizationsJson.includes('__all__')
|
|
38
|
+
}
|
|
39
|
+
|
|
32
40
|
export class RbacService {
|
|
33
41
|
private cacheTtlMs: number = 5 * 60 * 1000 // 5 minutes default
|
|
34
42
|
private cache: CacheStrategy | null = null
|
|
35
43
|
private globalSuperAdminCache = new Map<string, boolean>()
|
|
36
44
|
|
|
37
|
-
constructor(
|
|
45
|
+
constructor(
|
|
46
|
+
private em: EntityManager,
|
|
47
|
+
cache?: CacheStrategy,
|
|
48
|
+
private readonly organizationHierarchyService?: OrganizationHierarchyService,
|
|
49
|
+
) {
|
|
38
50
|
this.cache = cache || null
|
|
39
51
|
}
|
|
40
52
|
|
|
@@ -51,13 +63,6 @@ export class RbacService {
|
|
|
51
63
|
return authorizeFeatures(required, { grantedFeatures: granted })
|
|
52
64
|
}
|
|
53
65
|
|
|
54
|
-
private roleAclAllowsOrganization(acl: RoleAcl, organizationId: string | null | undefined): boolean {
|
|
55
|
-
if (!organizationId) return true
|
|
56
|
-
const organizations = Array.isArray(acl.organizationsJson) ? acl.organizationsJson : null
|
|
57
|
-
if (!organizations || !organizations.length || organizations.includes('__all__')) return true
|
|
58
|
-
return organizations.includes(organizationId)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
66
|
private getCacheKey(userId: string, scope: { tenantId: string | null; organizationId: string | null }): string {
|
|
62
67
|
return `rbac:${userId}:${scope.tenantId || 'null'}:${scope.organizationId || 'null'}`
|
|
63
68
|
}
|
|
@@ -91,6 +96,10 @@ export class RbacService {
|
|
|
91
96
|
|
|
92
97
|
if (scope.tenantId) {
|
|
93
98
|
tags.push(this.getTenantTag(scope.tenantId))
|
|
99
|
+
// Scoped role projections depend on the selected organization's ancestor
|
|
100
|
+
// chain, so Directory hierarchy changes must evict them as well as the
|
|
101
|
+
// separately cached OrganizationScope entries.
|
|
102
|
+
tags.push(buildOrgScopeTenantCacheTag(scope.tenantId))
|
|
94
103
|
}
|
|
95
104
|
|
|
96
105
|
if (scope.organizationId) {
|
|
@@ -203,8 +212,10 @@ export class RbacService {
|
|
|
203
212
|
this.globalSuperAdminCache.set(userId, false)
|
|
204
213
|
return false
|
|
205
214
|
}
|
|
206
|
-
const
|
|
207
|
-
const result =
|
|
215
|
+
const roleSupers = await em.find(RoleAcl, { isSuperAdmin: true, role: { $in: roleIds as any } } as any)
|
|
216
|
+
const result = roleSupers.some((roleAcl) => (
|
|
217
|
+
!!roleAcl.isSuperAdmin && !isRestrictedRoleAcl(roleAcl)
|
|
218
|
+
))
|
|
208
219
|
this.globalSuperAdminCache.set(userId, result)
|
|
209
220
|
return result
|
|
210
221
|
}
|
|
@@ -239,6 +250,10 @@ export class RbacService {
|
|
|
239
250
|
const cached = await this.getFromCache(cacheKey)
|
|
240
251
|
if (cached) return cached
|
|
241
252
|
|
|
253
|
+
// Direct user-level super-admin grants and unrestricted role-level
|
|
254
|
+
// super-admin grants are global. Organization-restricted role grants are
|
|
255
|
+
// deliberately excluded by isGlobalSuperAdmin and continue through the
|
|
256
|
+
// scoped ACL projection below.
|
|
242
257
|
if (!userId.startsWith('api_key:')) {
|
|
243
258
|
if (await this.isGlobalSuperAdmin(userId)) {
|
|
244
259
|
const result = { isSuperAdmin: true, features: ['*'], organizations: null }
|
|
@@ -258,28 +273,71 @@ export class RbacService {
|
|
|
258
273
|
}
|
|
259
274
|
const tenantId = scope.tenantId || key.tenantId || null
|
|
260
275
|
const roleIds = Array.isArray(key.rolesJson) ? key.rolesJson.filter(Boolean) : []
|
|
276
|
+
const keyOrganizationId = typeof key.organizationId === 'string' && key.organizationId.trim().length > 0
|
|
277
|
+
? key.organizationId.trim()
|
|
278
|
+
: null
|
|
279
|
+
const evaluatedOrganizationId = scope.organizationId || keyOrganizationId
|
|
261
280
|
let isSuper = false
|
|
262
281
|
const features: string[] = []
|
|
263
|
-
let
|
|
282
|
+
let roleOrganizations: string[] | null = []
|
|
283
|
+
let hasApplicableRestrictedRole = false
|
|
264
284
|
if (tenantId && roleIds.length) {
|
|
285
|
+
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
286
|
+
this.organizationHierarchyService,
|
|
287
|
+
tenantId,
|
|
288
|
+
evaluatedOrganizationId,
|
|
289
|
+
)
|
|
265
290
|
const racls = await em.find(RoleAcl, { tenantId, role: { $in: roleIds as any } } as any)
|
|
266
291
|
for (const acl of racls) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
292
|
+
if (roleAclAllowsOrganization(acl, roleOrganizationScope)) {
|
|
293
|
+
isSuper = isSuper || !!acl.isSuperAdmin
|
|
294
|
+
if (Array.isArray(acl.featuresJson)) {
|
|
295
|
+
for (const f of acl.featuresJson) if (!features.includes(f)) features.push(f)
|
|
296
|
+
}
|
|
297
|
+
if (isRestrictedRoleAcl(acl)) hasApplicableRestrictedRole = true
|
|
270
298
|
}
|
|
271
|
-
if (
|
|
272
|
-
if (acl.organizationsJson == null) {
|
|
273
|
-
|
|
299
|
+
if (roleOrganizations !== null) {
|
|
300
|
+
if (acl.organizationsJson == null || (Array.isArray(acl.organizationsJson) && acl.organizationsJson.length === 0)) {
|
|
301
|
+
roleOrganizations = null
|
|
274
302
|
} else if (Array.isArray(acl.organizationsJson) && acl.organizationsJson.includes('__all__')) {
|
|
275
|
-
|
|
303
|
+
roleOrganizations = null
|
|
276
304
|
} else {
|
|
277
|
-
|
|
305
|
+
roleOrganizations = Array.from(new Set([
|
|
306
|
+
...roleOrganizations,
|
|
307
|
+
...(Array.isArray(acl.organizationsJson) ? acl.organizationsJson : []),
|
|
308
|
+
]))
|
|
278
309
|
}
|
|
279
310
|
}
|
|
280
311
|
}
|
|
312
|
+
if (
|
|
313
|
+
roleOrganizations !== null
|
|
314
|
+
&& evaluatedOrganizationId
|
|
315
|
+
&& roleOrganizationScope !== null
|
|
316
|
+
&& roleOrganizationScope.size > 0
|
|
317
|
+
&& hasApplicableRestrictedRole
|
|
318
|
+
&& !roleOrganizations.includes(evaluatedOrganizationId)
|
|
319
|
+
) {
|
|
320
|
+
roleOrganizations.push(evaluatedOrganizationId)
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
let organizations = roleOrganizations
|
|
324
|
+
if (keyOrganizationId) {
|
|
325
|
+
const keyOrganizationScope = await resolveRoleOrganizationScope(
|
|
326
|
+
this.organizationHierarchyService,
|
|
327
|
+
tenantId,
|
|
328
|
+
keyOrganizationId,
|
|
329
|
+
)
|
|
330
|
+
organizations = roleOrganizations === null
|
|
331
|
+
|| roleOrganizations.some((organizationId) => keyOrganizationScope?.has(organizationId))
|
|
332
|
+
? [keyOrganizationId]
|
|
333
|
+
: []
|
|
281
334
|
}
|
|
282
|
-
|
|
335
|
+
// A role-level super-admin grant still respects the API key's effective
|
|
336
|
+
// organization allowlist. Represent it as a wildcard feature whenever
|
|
337
|
+
// the key is restricted so downstream super-admin shortcuts cannot
|
|
338
|
+
// bypass the key or role organization bounds.
|
|
339
|
+
if (isSuper && organizations !== null && !features.includes('*')) features.push('*')
|
|
340
|
+
const result = { isSuperAdmin: isSuper && organizations === null, features, organizations }
|
|
283
341
|
await this.setCache(cacheKey, result, userId, scope)
|
|
284
342
|
return result
|
|
285
343
|
}
|
|
@@ -326,18 +384,42 @@ export class RbacService {
|
|
|
326
384
|
let isSuper = false
|
|
327
385
|
const features: string[] = []
|
|
328
386
|
let organizations: string[] | null = []
|
|
387
|
+
let hasApplicableRestrictedRole = false
|
|
329
388
|
if (roleIds.length) {
|
|
389
|
+
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
390
|
+
this.organizationHierarchyService,
|
|
391
|
+
tenantId,
|
|
392
|
+
scope.organizationId,
|
|
393
|
+
)
|
|
330
394
|
const racls = await em.find(RoleAcl, { tenantId, role: { $in: roleIds as any } } as any, {})
|
|
331
395
|
const roleAcls = Array.isArray(racls) ? racls : []
|
|
332
396
|
for (const r of roleAcls) {
|
|
333
|
-
|
|
334
|
-
|
|
397
|
+
if (roleAclAllowsOrganization(r, roleOrganizationScope)) {
|
|
398
|
+
isSuper = isSuper || !!r.isSuperAdmin
|
|
399
|
+
if (Array.isArray(r.featuresJson)) for (const f of r.featuresJson) if (!features.includes(f)) features.push(f)
|
|
400
|
+
if (isRestrictedRoleAcl(r)) hasApplicableRestrictedRole = true
|
|
401
|
+
}
|
|
335
402
|
if (organizations !== null) {
|
|
403
|
+
// For a user principal an empty allowlist is a deny-all scope (#4033), not
|
|
404
|
+
// "unrestricted": it must merge to an empty set so scoped reads and deletes
|
|
405
|
+
// fail closed. Only an absent allowlist or an explicit '__all__' widens to
|
|
406
|
+
// every organization. (The API-key branch above deliberately differs — an
|
|
407
|
+
// empty role list there means the key inherits the key's own scope.)
|
|
336
408
|
if (r.organizationsJson == null) organizations = null
|
|
337
409
|
else if (Array.isArray(r.organizationsJson) && r.organizationsJson.includes('__all__')) organizations = null
|
|
338
410
|
else organizations = Array.from(new Set([...(organizations || []), ...r.organizationsJson]))
|
|
339
411
|
}
|
|
340
412
|
}
|
|
413
|
+
if (
|
|
414
|
+
organizations !== null
|
|
415
|
+
&& scope.organizationId
|
|
416
|
+
&& roleOrganizationScope !== null
|
|
417
|
+
&& roleOrganizationScope.size > 0
|
|
418
|
+
&& hasApplicableRestrictedRole
|
|
419
|
+
&& !organizations.includes(scope.organizationId)
|
|
420
|
+
) {
|
|
421
|
+
organizations.push(scope.organizationId)
|
|
422
|
+
}
|
|
341
423
|
}
|
|
342
424
|
if (organizations && orgId && !organizations.includes(orgId) && !organizations.includes('__all__')) {
|
|
343
425
|
// Out-of-scope org; caller will enforce
|
|
@@ -361,12 +443,16 @@ export class RbacService {
|
|
|
361
443
|
if (!tenantId || !feature) return false
|
|
362
444
|
|
|
363
445
|
const em = this.em.fork()
|
|
446
|
+
const roleOrganizationScope = await resolveRoleOrganizationScope(
|
|
447
|
+
this.organizationHierarchyService,
|
|
448
|
+
tenantId,
|
|
449
|
+
opts?.organizationId,
|
|
450
|
+
)
|
|
364
451
|
const roleAcls = await em.find(RoleAcl, { tenantId, deletedAt: null } as any, {})
|
|
365
452
|
const list = Array.isArray(roleAcls) ? roleAcls : []
|
|
366
|
-
const organizationId = opts?.organizationId ?? null
|
|
367
453
|
|
|
368
454
|
for (const acl of list) {
|
|
369
|
-
if (!
|
|
455
|
+
if (!roleAclAllowsOrganization(acl, roleOrganizationScope)) continue
|
|
370
456
|
const grants = Array.isArray(acl.featuresJson) ? acl.featuresJson : []
|
|
371
457
|
if (authorizeFeatures([feature], {
|
|
372
458
|
grantedFeatures: grants,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { OrganizationHierarchyService } from '@open-mercato/shared/lib/auth/principal-service'
|
|
2
|
+
import type { RoleAcl } from '../data/entities'
|
|
3
|
+
|
|
4
|
+
export type RoleOrganizationScope = ReadonlySet<string> | null
|
|
5
|
+
|
|
6
|
+
function normalizeId(value: unknown): string | null {
|
|
7
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function resolveRoleOrganizationScope(
|
|
11
|
+
hierarchyService: OrganizationHierarchyService | null | undefined,
|
|
12
|
+
tenantId: string | null | undefined,
|
|
13
|
+
organizationId: string | null | undefined,
|
|
14
|
+
): Promise<RoleOrganizationScope> {
|
|
15
|
+
const selectedId = normalizeId(organizationId)
|
|
16
|
+
if (!selectedId) return null
|
|
17
|
+
const normalizedTenantId = normalizeId(tenantId)
|
|
18
|
+
if (!normalizedTenantId) return new Set()
|
|
19
|
+
|
|
20
|
+
const ids = new Set<string>([selectedId])
|
|
21
|
+
// Auth remains independently usable when Directory is disabled: exact-org
|
|
22
|
+
// grants still apply, while parent-to-descendant expansion fails closed.
|
|
23
|
+
if (!hierarchyService) return ids
|
|
24
|
+
|
|
25
|
+
const ancestorIds = await hierarchyService.resolveAncestorIds({
|
|
26
|
+
tenantId: normalizedTenantId,
|
|
27
|
+
organizationId: selectedId,
|
|
28
|
+
})
|
|
29
|
+
// A registered Directory seam can prove an invalid/wrong-tenant selection.
|
|
30
|
+
// Fail closed for restricted roles in that case.
|
|
31
|
+
if (ancestorIds === null) return new Set()
|
|
32
|
+
for (const ancestorId of ancestorIds) {
|
|
33
|
+
const normalized = normalizeId(ancestorId)
|
|
34
|
+
if (normalized) ids.add(normalized)
|
|
35
|
+
}
|
|
36
|
+
return ids
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function roleAclAllowsOrganization(
|
|
40
|
+
acl: Pick<RoleAcl, 'organizationsJson'>,
|
|
41
|
+
scope: RoleOrganizationScope,
|
|
42
|
+
): boolean {
|
|
43
|
+
if (!scope) return true
|
|
44
|
+
const organizations = Array.isArray(acl.organizationsJson) ? acl.organizationsJson : null
|
|
45
|
+
if (!organizations || organizations.length === 0 || organizations.includes('__all__')) return true
|
|
46
|
+
return organizations.some((organizationId) => scope.has(organizationId))
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Principal eligibility — which roles may be selected as, or resolved into, an explicit share
|
|
51
|
+
* target — follows the human-principal deny-all contract instead: an empty allowlist grants no
|
|
52
|
+
* organization reach, so such a role must not become a share principal here (#4033).
|
|
53
|
+
*
|
|
54
|
+
* This deliberately differs from `roleAclAllowsOrganization` above, which governs *feature*
|
|
55
|
+
* evaluation and keeps the wider "an empty list applies everywhere" meaning, and from the
|
|
56
|
+
* API-key projection, where an empty list means "inherit the key's own organization binding".
|
|
57
|
+
* Without this split a user who reaches an organization through a second role could inherit
|
|
58
|
+
* viewer/editor access from a share assigned to a deny-all role.
|
|
59
|
+
*/
|
|
60
|
+
export function roleAclGrantsPrincipalOrganization(
|
|
61
|
+
acl: Pick<RoleAcl, 'organizationsJson'>,
|
|
62
|
+
scope: RoleOrganizationScope,
|
|
63
|
+
): boolean {
|
|
64
|
+
if (!scope) return true
|
|
65
|
+
const organizations = Array.isArray(acl.organizationsJson) ? acl.organizationsJson : null
|
|
66
|
+
if (!organizations) return true
|
|
67
|
+
if (organizations.length === 0) return false
|
|
68
|
+
if (organizations.includes('__all__')) return true
|
|
69
|
+
return organizations.some((organizationId) => scope.has(organizationId))
|
|
70
|
+
}
|
|
@@ -38,6 +38,7 @@ type LogsResponse = {
|
|
|
38
38
|
items: RuleExecutionLog[]
|
|
39
39
|
total: number
|
|
40
40
|
totalPages: number
|
|
41
|
+
totalIsCapped?: boolean
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
export default function ExecutionLogsPage() {
|
|
@@ -45,6 +46,7 @@ export default function ExecutionLogsPage() {
|
|
|
45
46
|
const [pageSize] = React.useState(50)
|
|
46
47
|
const [total, setTotal] = React.useState(0)
|
|
47
48
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
49
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
48
50
|
const t = useT()
|
|
49
51
|
const [filterValues, setFilterValues] = React.useState<FilterValues>({})
|
|
50
52
|
|
|
@@ -76,6 +78,7 @@ export default function ExecutionLogsPage() {
|
|
|
76
78
|
if (response) {
|
|
77
79
|
setTotal(response.total || 0)
|
|
78
80
|
setTotalPages(response.totalPages || 1)
|
|
81
|
+
setTotalIsCapped(response?.totalIsCapped === true)
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
return response?.items || []
|
|
@@ -246,7 +249,7 @@ export default function ExecutionLogsPage() {
|
|
|
246
249
|
onFiltersClear={handleFiltersClear}
|
|
247
250
|
isLoading={isLoading}
|
|
248
251
|
error={error ? t('business_rules.logs.messages.loadFailed') : undefined}
|
|
249
|
-
pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}
|
|
252
|
+
pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}
|
|
250
253
|
/>
|
|
251
254
|
</PageBody>
|
|
252
255
|
</Page>
|
|
@@ -42,6 +42,7 @@ type RulesResponse = {
|
|
|
42
42
|
items: Rule[]
|
|
43
43
|
total: number
|
|
44
44
|
totalPages: number
|
|
45
|
+
totalIsCapped?: boolean
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
export default function RulesListPage() {
|
|
@@ -49,6 +50,7 @@ export default function RulesListPage() {
|
|
|
49
50
|
const [pageSize] = React.useState(20)
|
|
50
51
|
const [total, setTotal] = React.useState(0)
|
|
51
52
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
53
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
52
54
|
const t = useT()
|
|
53
55
|
const router = useRouter()
|
|
54
56
|
const queryClient = useQueryClient()
|
|
@@ -82,6 +84,7 @@ export default function RulesListPage() {
|
|
|
82
84
|
if (response) {
|
|
83
85
|
setTotal(response.total || 0)
|
|
84
86
|
setTotalPages(response.totalPages || 1)
|
|
87
|
+
setTotalIsCapped(response?.totalIsCapped === true)
|
|
85
88
|
}
|
|
86
89
|
|
|
87
90
|
return response?.items || []
|
|
@@ -352,7 +355,7 @@ export default function RulesListPage() {
|
|
|
352
355
|
createLabel={t('business_rules.actions.create')}
|
|
353
356
|
/>
|
|
354
357
|
)}
|
|
355
|
-
pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}
|
|
358
|
+
pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}
|
|
356
359
|
/>
|
|
357
360
|
</PageBody>
|
|
358
361
|
{ConfirmDialogElement}
|
|
@@ -35,6 +35,7 @@ type RuleSetsResponse = {
|
|
|
35
35
|
items: RuleSet[]
|
|
36
36
|
total: number
|
|
37
37
|
totalPages: number
|
|
38
|
+
totalIsCapped?: boolean
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
export default function RuleSetsListPage() {
|
|
@@ -42,6 +43,7 @@ export default function RuleSetsListPage() {
|
|
|
42
43
|
const [pageSize] = React.useState(20)
|
|
43
44
|
const [total, setTotal] = React.useState(0)
|
|
44
45
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
46
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
45
47
|
const t = useT()
|
|
46
48
|
const router = useRouter()
|
|
47
49
|
const queryClient = useQueryClient()
|
|
@@ -72,6 +74,7 @@ export default function RuleSetsListPage() {
|
|
|
72
74
|
if (response) {
|
|
73
75
|
setTotal(response.total || 0)
|
|
74
76
|
setTotalPages(response.totalPages || 1)
|
|
77
|
+
setTotalIsCapped(response?.totalIsCapped === true)
|
|
75
78
|
}
|
|
76
79
|
|
|
77
80
|
return response?.items || []
|
|
@@ -258,7 +261,7 @@ export default function RuleSetsListPage() {
|
|
|
258
261
|
createLabel={t('business_rules.sets.actions.create')}
|
|
259
262
|
/>
|
|
260
263
|
)}
|
|
261
|
-
pagination={{ page, pageSize, total, totalPages, onPageChange: setPage }}
|
|
264
|
+
pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage }}
|
|
262
265
|
/>
|
|
263
266
|
</PageBody>
|
|
264
267
|
{ConfirmDialogElement}
|