@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
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server'
|
|
2
2
|
import { z } from 'zod'
|
|
3
3
|
import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
4
|
-
import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
|
|
4
|
+
import { getAuthFromRequest, type AuthContext } from '@open-mercato/shared/lib/auth/server'
|
|
5
5
|
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
6
6
|
import { logCrudAccess } from '@open-mercato/shared/lib/crud/factory'
|
|
7
7
|
import { forbidden, isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'
|
|
8
8
|
import { enforceCommandOptimisticLockWithGuards } from '@open-mercato/shared/lib/crud/optimistic-lock-command'
|
|
9
9
|
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
10
|
-
import {
|
|
11
|
-
import { UserAcl } from '@open-mercato/core/modules/auth/data/entities'
|
|
10
|
+
import type { CommandBus, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'
|
|
11
|
+
import { User, UserAcl } from '@open-mercato/core/modules/auth/data/entities'
|
|
12
12
|
import {
|
|
13
13
|
assertActorCanAccessUserTarget,
|
|
14
14
|
assertActorCanGrantAcl,
|
|
@@ -16,15 +16,25 @@ import {
|
|
|
16
16
|
normalizeGrantFeatureList,
|
|
17
17
|
} from '@open-mercato/core/modules/auth/lib/grantChecks'
|
|
18
18
|
import type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'
|
|
19
|
-
import
|
|
19
|
+
import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
20
|
+
import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'
|
|
20
21
|
import { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'
|
|
22
|
+
import {
|
|
23
|
+
AUTH_USER_ACL_UPDATE_COMMAND_ID,
|
|
24
|
+
type AclUpdateResult,
|
|
25
|
+
type UserAclUpdateInput,
|
|
26
|
+
} from '@open-mercato/core/modules/auth/commands/acl'
|
|
21
27
|
|
|
22
|
-
const getSchema = z.object({
|
|
28
|
+
const getSchema = z.object({
|
|
29
|
+
userId: z.string().uuid(),
|
|
30
|
+
tenantId: z.string().uuid().optional(),
|
|
31
|
+
})
|
|
23
32
|
const putSchema = z.object({
|
|
24
33
|
userId: z.string().uuid(),
|
|
25
34
|
isSuperAdmin: z.boolean().optional(),
|
|
26
35
|
features: z.array(z.string()).optional(),
|
|
27
36
|
organizations: z.array(z.string()).nullable().optional(),
|
|
37
|
+
tenantId: z.string().uuid().optional(),
|
|
28
38
|
})
|
|
29
39
|
|
|
30
40
|
export const metadata = {
|
|
@@ -47,25 +57,95 @@ const userAclUpdateResponseSchema = z.object({
|
|
|
47
57
|
|
|
48
58
|
const userAclErrorSchema = z.object({ error: z.string() })
|
|
49
59
|
|
|
60
|
+
type TenantResolution = { tenantId: string | null } | { error: NextResponse }
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The single tenant scope both handlers work in. GET and PUT MUST resolve it the
|
|
64
|
+
* same way: the admin user form PUTs the ACL panel's state on every save, so a
|
|
65
|
+
* GET that reads a narrower scope than the PUT writes hands the operator an
|
|
66
|
+
* empty form and turns the next name-only edit into a silent revocation, with no
|
|
67
|
+
* `updatedAt` to arm the optimistic lock against it.
|
|
68
|
+
*
|
|
69
|
+
* `user_acls.tenant_id` is NOT NULL while `users.tenant_id` is nullable, so a
|
|
70
|
+
* global account legitimately signs in with `auth.tenantId === null` and the
|
|
71
|
+
* scope has to come from the target user instead. That fallback is reserved for
|
|
72
|
+
* a super admin: for anyone else it would let the target pick the scope its own
|
|
73
|
+
* access is then checked against, and it decrypts a possibly foreign user ahead
|
|
74
|
+
* of every guard. A tenant-less non-super-admin therefore resolves to `null`,
|
|
75
|
+
* which reads as "no override" and refuses to write — the behaviour that held
|
|
76
|
+
* before this route resolved a scope at all. The read is also skipped whenever a
|
|
77
|
+
* tenant is already known.
|
|
78
|
+
*
|
|
79
|
+
* An explicit `tenantId` wins, mirroring the role ACL route (additive there and
|
|
80
|
+
* here; no caller sends it yet) — but only for a super admin or for the actor's
|
|
81
|
+
* own tenant, so it cannot widen anyone's reach. The result is that for a
|
|
82
|
+
* non-super-admin the resolved scope is always the actor's own.
|
|
83
|
+
*/
|
|
84
|
+
async function resolveAclTenantId(args: {
|
|
85
|
+
em: EntityManager
|
|
86
|
+
auth: NonNullable<AuthContext>
|
|
87
|
+
actorIsSuperAdmin: boolean
|
|
88
|
+
userId: string
|
|
89
|
+
requestedTenantId?: string
|
|
90
|
+
}): Promise<TenantResolution> {
|
|
91
|
+
const authTenantId = args.auth.tenantId ?? null
|
|
92
|
+
if (args.requestedTenantId && args.requestedTenantId !== authTenantId && !args.actorIsSuperAdmin) {
|
|
93
|
+
return { error: NextResponse.json({ error: 'Forbidden' }, { status: 403 }) }
|
|
94
|
+
}
|
|
95
|
+
const known = args.requestedTenantId ?? authTenantId
|
|
96
|
+
if (known) return { tenantId: known }
|
|
97
|
+
if (!args.actorIsSuperAdmin) return { tenantId: null }
|
|
98
|
+
const targetUser = await findOneWithDecryption(
|
|
99
|
+
args.em,
|
|
100
|
+
User,
|
|
101
|
+
{ id: args.userId } as FilterQuery<User>,
|
|
102
|
+
{},
|
|
103
|
+
{ tenantId: null, organizationId: args.auth.orgId ?? null },
|
|
104
|
+
)
|
|
105
|
+
return { tenantId: targetUser?.tenantId ? String(targetUser.tenantId) : null }
|
|
106
|
+
}
|
|
107
|
+
|
|
50
108
|
export async function GET(req: Request) {
|
|
51
109
|
const auth = await getAuthFromRequest(req)
|
|
52
110
|
if (!auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
53
111
|
const url = new URL(req.url)
|
|
54
|
-
const parsed = getSchema.safeParse({
|
|
112
|
+
const parsed = getSchema.safeParse({
|
|
113
|
+
userId: url.searchParams.get('userId'),
|
|
114
|
+
tenantId: url.searchParams.get('tenantId') || undefined,
|
|
115
|
+
})
|
|
55
116
|
if (!parsed.success) return NextResponse.json({ error: 'Invalid input' }, { status: 400 })
|
|
56
117
|
const container = await createRequestContainer()
|
|
57
118
|
const em = container.resolve('em') as any
|
|
58
119
|
const rbacService = container.resolve('rbacService') as any
|
|
120
|
+
// Every grant check is answered in the actor's own scope, never in the scope
|
|
121
|
+
// resolved for the record: passing the resolved one would ask a foreign tenant
|
|
122
|
+
// whether this caller may act there, and for a tenant-less actor — whose scope
|
|
123
|
+
// comes from the target — it would compare the target against itself.
|
|
124
|
+
const actorTenantId = auth.tenantId ?? null
|
|
59
125
|
const actorAcl = auth.sub
|
|
60
|
-
? await rbacService.loadAcl(auth.sub, { tenantId:
|
|
126
|
+
? await rbacService.loadAcl(auth.sub, { tenantId: actorTenantId, organizationId: auth.orgId ?? null })
|
|
61
127
|
: null
|
|
62
|
-
|
|
128
|
+
const actorIsSuperAdmin = !!actorAcl?.isSuperAdmin
|
|
129
|
+
|
|
130
|
+
const resolution = await resolveAclTenantId({
|
|
131
|
+
em: em as EntityManager,
|
|
132
|
+
auth,
|
|
133
|
+
actorIsSuperAdmin,
|
|
134
|
+
userId: parsed.data.userId,
|
|
135
|
+
requestedTenantId: parsed.data.tenantId,
|
|
136
|
+
})
|
|
137
|
+
if ('error' in resolution) return resolution.error
|
|
138
|
+
// An unresolvable scope reads as "no override", which is what PUT then refuses
|
|
139
|
+
// to write (`Tenant required`) — so the pair still cannot destroy a row.
|
|
140
|
+
const tenantId = resolution.tenantId
|
|
141
|
+
|
|
142
|
+
if (!actorIsSuperAdmin && auth.sub) {
|
|
63
143
|
try {
|
|
64
144
|
await assertActorCanModifySuperAdminUserTarget({
|
|
65
145
|
em: em as EntityManager,
|
|
66
146
|
rbacService: rbacService as RbacService,
|
|
67
147
|
actorUserId: auth.sub,
|
|
68
|
-
tenantId:
|
|
148
|
+
tenantId: actorTenantId,
|
|
69
149
|
organizationId: auth.orgId ?? null,
|
|
70
150
|
targetUserId: parsed.data.userId,
|
|
71
151
|
actorIsSuperAdmin: false,
|
|
@@ -74,7 +154,7 @@ export async function GET(req: Request) {
|
|
|
74
154
|
em: em as EntityManager,
|
|
75
155
|
rbacService: rbacService as RbacService,
|
|
76
156
|
actorUserId: auth.sub,
|
|
77
|
-
tenantId:
|
|
157
|
+
tenantId: actorTenantId,
|
|
78
158
|
organizationId: auth.orgId ?? null,
|
|
79
159
|
targetUserId: parsed.data.userId,
|
|
80
160
|
actorIsSuperAdmin: false,
|
|
@@ -82,7 +162,7 @@ export async function GET(req: Request) {
|
|
|
82
162
|
container,
|
|
83
163
|
auth,
|
|
84
164
|
request: req,
|
|
85
|
-
tenantId:
|
|
165
|
+
tenantId: actorTenantId,
|
|
86
166
|
}),
|
|
87
167
|
})
|
|
88
168
|
} catch (err) {
|
|
@@ -90,7 +170,9 @@ export async function GET(req: Request) {
|
|
|
90
170
|
throw err
|
|
91
171
|
}
|
|
92
172
|
}
|
|
93
|
-
const acl =
|
|
173
|
+
const acl = tenantId
|
|
174
|
+
? await em.findOne(UserAcl, { user: parsed.data.userId as any, tenantId })
|
|
175
|
+
: null
|
|
94
176
|
const response = acl
|
|
95
177
|
? {
|
|
96
178
|
hasCustomAcl: true,
|
|
@@ -109,8 +191,8 @@ export async function GET(req: Request) {
|
|
|
109
191
|
idField: 'id',
|
|
110
192
|
resourceKind: 'auth.user_acl',
|
|
111
193
|
organizationId: auth.orgId ?? null,
|
|
112
|
-
tenantId
|
|
113
|
-
query: { userId: parsed.data.userId },
|
|
194
|
+
tenantId,
|
|
195
|
+
query: { userId: parsed.data.userId, tenantId },
|
|
114
196
|
accessType: 'read:item',
|
|
115
197
|
})
|
|
116
198
|
|
|
@@ -127,18 +209,40 @@ export async function PUT(req: Request) {
|
|
|
127
209
|
const em = container.resolve('em') as any
|
|
128
210
|
const rbacService = container.resolve('rbacService') as any
|
|
129
211
|
|
|
212
|
+
// Every grant check is answered in the actor's own scope, never in the scope
|
|
213
|
+
// resolved for the record: passing the resolved one would ask a foreign tenant
|
|
214
|
+
// whether this caller may act there, and for a tenant-less actor — whose scope
|
|
215
|
+
// comes from the target — it would compare the target against itself.
|
|
216
|
+
const actorTenantId = auth.tenantId ?? null
|
|
130
217
|
const actorAcl = auth.sub
|
|
131
|
-
? await rbacService.loadAcl(auth.sub, { tenantId:
|
|
218
|
+
? await rbacService.loadAcl(auth.sub, { tenantId: actorTenantId, organizationId: auth.orgId ?? null })
|
|
132
219
|
: null
|
|
133
220
|
const actorIsSuperAdmin = !!actorAcl?.isSuperAdmin
|
|
134
221
|
|
|
222
|
+
// The scope the row is read and written in. `auth.tenantId` is `string | null`
|
|
223
|
+
// — never `undefined`, since every producer normalizes with `?? null` — so the
|
|
224
|
+
// pre-fix lookup ran `tenant_id IS NULL` against a NOT NULL column: it matched
|
|
225
|
+
// no row, leaving create/update to fail the NOT NULL constraint and clear to
|
|
226
|
+
// no-op silently. Nothing cross-tenant was ever matched; the fix turns a 500
|
|
227
|
+
// into a working, correctly scoped write.
|
|
228
|
+
const resolution = await resolveAclTenantId({
|
|
229
|
+
em: em as EntityManager,
|
|
230
|
+
auth,
|
|
231
|
+
actorIsSuperAdmin,
|
|
232
|
+
userId: parsed.data.userId,
|
|
233
|
+
requestedTenantId: parsed.data.tenantId,
|
|
234
|
+
})
|
|
235
|
+
if ('error' in resolution) return resolution.error
|
|
236
|
+
const tenantId = resolution.tenantId
|
|
237
|
+
if (!tenantId) return NextResponse.json({ error: 'Tenant required' }, { status: 400 })
|
|
238
|
+
|
|
135
239
|
if (!actorIsSuperAdmin && auth.sub) {
|
|
136
240
|
try {
|
|
137
241
|
await assertActorCanModifySuperAdminUserTarget({
|
|
138
242
|
em: em as EntityManager,
|
|
139
243
|
rbacService: rbacService as RbacService,
|
|
140
244
|
actorUserId: auth.sub,
|
|
141
|
-
tenantId:
|
|
245
|
+
tenantId: actorTenantId,
|
|
142
246
|
organizationId: auth.orgId ?? null,
|
|
143
247
|
targetUserId: parsed.data.userId,
|
|
144
248
|
actorIsSuperAdmin: false,
|
|
@@ -147,7 +251,7 @@ export async function PUT(req: Request) {
|
|
|
147
251
|
em: em as EntityManager,
|
|
148
252
|
rbacService: rbacService as RbacService,
|
|
149
253
|
actorUserId: auth.sub,
|
|
150
|
-
tenantId:
|
|
254
|
+
tenantId: actorTenantId,
|
|
151
255
|
organizationId: auth.orgId ?? null,
|
|
152
256
|
targetUserId: parsed.data.userId,
|
|
153
257
|
actorIsSuperAdmin: false,
|
|
@@ -155,7 +259,7 @@ export async function PUT(req: Request) {
|
|
|
155
259
|
container,
|
|
156
260
|
auth,
|
|
157
261
|
request: req,
|
|
158
|
-
tenantId:
|
|
262
|
+
tenantId: actorTenantId,
|
|
159
263
|
}),
|
|
160
264
|
})
|
|
161
265
|
} catch (err) {
|
|
@@ -164,7 +268,7 @@ export async function PUT(req: Request) {
|
|
|
164
268
|
}
|
|
165
269
|
}
|
|
166
270
|
|
|
167
|
-
|
|
271
|
+
const acl = await em.findOne(UserAcl, { user: parsed.data.userId as any, tenantId })
|
|
168
272
|
// Optimistic lock: refuse a stale per-user ACL overwrite so concurrent edits
|
|
169
273
|
// cannot silently clobber each other (#2055). Strictly additive — a no-op when
|
|
170
274
|
// the client sends no expected-version header; skipped when no ACL row exists.
|
|
@@ -204,7 +308,7 @@ export async function PUT(req: Request) {
|
|
|
204
308
|
em: em as EntityManager,
|
|
205
309
|
rbacService: rbacService as RbacService,
|
|
206
310
|
actorUserId: auth.sub,
|
|
207
|
-
tenantId:
|
|
311
|
+
tenantId: actorTenantId,
|
|
208
312
|
organizationId: auth.orgId ?? null,
|
|
209
313
|
isSuperAdmin: requestedIsSuperAdmin,
|
|
210
314
|
features: requestedFeatures,
|
|
@@ -253,38 +357,57 @@ export async function PUT(req: Request) {
|
|
|
253
357
|
// custom exactly when it grants super admin or at least one feature.
|
|
254
358
|
const hasCustomAcl = effectiveIsSuperAdmin || effectiveFeatures.length > 0
|
|
255
359
|
|
|
256
|
-
//
|
|
257
|
-
//
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
() => {
|
|
272
|
-
aclRecord.isSuperAdmin = effectiveIsSuperAdmin
|
|
273
|
-
aclRecord.featuresJson = effectiveFeatures
|
|
274
|
-
aclRecord.organizationsJson = requestedOrganizations
|
|
275
|
-
em.persist(aclRecord)
|
|
276
|
-
},
|
|
277
|
-
],
|
|
278
|
-
{ transaction: true },
|
|
279
|
-
)
|
|
280
|
-
}
|
|
360
|
+
// What the caller asked for, handed to the command only when it exceeds what
|
|
361
|
+
// is about to be written. `assertActorCanGrantAcl` above refuses the blatant
|
|
362
|
+
// escalations; what reaches the strip is quieter — a restricted grant the
|
|
363
|
+
// actor does hold — and it leaves before/after identical, so the audit entry
|
|
364
|
+
// would otherwise be indistinguishable from a no-op and skipped as one.
|
|
365
|
+
//
|
|
366
|
+
// Features are the only axis that can be trimmed. A super-admin request is
|
|
367
|
+
// either honoured or refused outright above, never silently downgraded, so
|
|
368
|
+
// comparing the two flags here would be dead weight.
|
|
369
|
+
//
|
|
370
|
+
// Deliberately independent of the `sanitized` response flag below:
|
|
371
|
+
// `hasRestrictedChanges` stays false when the trimmed result equals the
|
|
372
|
+
// existing ACL, to avoid nagging the user about a save that changed nothing —
|
|
373
|
+
// but that is precisely an attempt the trail must keep.
|
|
374
|
+
const strippedFeatures = requestedFeatures.filter((feature) => !effectiveFeatures.includes(feature))
|
|
281
375
|
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
376
|
+
// Route the write through the command bus so the permission change lands in
|
|
377
|
+
// the action log. The command owns the transactional write (or removal) and
|
|
378
|
+
// the RBAC cache invalidation that used to live here.
|
|
379
|
+
const commandBus = container.resolve('commandBus') as CommandBus
|
|
380
|
+
// A tenant-less actor edits an override in the target user's tenant, so their
|
|
381
|
+
// organization belongs to a tenant the entry is not about. The bus resolves
|
|
382
|
+
// the log row's organization as `metadata.organizationId ??
|
|
383
|
+
// ctx.selectedOrganizationId ?? ctx.auth.orgId` — a `??` chain, so the
|
|
384
|
+
// handler's `resolveOrganizationId` cannot express "explicitly no
|
|
385
|
+
// organization" and the actor's would be restored. Strip it from the context
|
|
386
|
+
// instead, exactly as the roles route does: otherwise the entry carries a
|
|
387
|
+
// (target tenant, foreign organization) pair that `ActionLogService` — which
|
|
388
|
+
// filters organization with strict equality — can never surface for anyone.
|
|
389
|
+
const isForeignTenant = tenantId !== (auth.tenantId ?? null)
|
|
390
|
+
const actorOrgId = isForeignTenant ? null : auth.orgId ?? null
|
|
391
|
+
const commandCtx: CommandRuntimeContext = {
|
|
392
|
+
container,
|
|
393
|
+
auth: isForeignTenant ? { ...auth, orgId: null } : auth,
|
|
394
|
+
organizationScope: null,
|
|
395
|
+
selectedOrganizationId: actorOrgId,
|
|
396
|
+
organizationIds: actorOrgId ? [actorOrgId] : null,
|
|
397
|
+
request: req,
|
|
398
|
+
}
|
|
399
|
+
await commandBus.execute<UserAclUpdateInput, AclUpdateResult>(AUTH_USER_ACL_UPDATE_COMMAND_ID, {
|
|
400
|
+
input: {
|
|
401
|
+
userId: parsed.data.userId,
|
|
402
|
+
tenantId,
|
|
403
|
+
isSuperAdmin: effectiveIsSuperAdmin,
|
|
404
|
+
features: effectiveFeatures,
|
|
405
|
+
organizations: requestedOrganizations,
|
|
406
|
+
clear: !hasCustomAcl,
|
|
407
|
+
requested: strippedFeatures.length ? { features: requestedFeatures } : null,
|
|
408
|
+
},
|
|
409
|
+
ctx: commandCtx,
|
|
410
|
+
})
|
|
288
411
|
|
|
289
412
|
return NextResponse.json({
|
|
290
413
|
ok: true,
|
|
@@ -341,12 +464,13 @@ export const openApi: OpenApiRouteDoc = {
|
|
|
341
464
|
methods: {
|
|
342
465
|
GET: {
|
|
343
466
|
summary: 'Fetch user ACL',
|
|
344
|
-
description: 'Returns custom ACL overrides for a user
|
|
467
|
+
description: 'Returns custom ACL overrides for a user, scoped to the requested tenant when supplied and to the actor or target user tenant otherwise.',
|
|
345
468
|
query: getSchema,
|
|
346
469
|
responses: [
|
|
347
470
|
{ status: 200, description: 'User ACL entry', schema: userAclResponseSchema },
|
|
348
471
|
{ status: 400, description: 'Invalid user id', schema: userAclErrorSchema },
|
|
349
472
|
{ status: 401, description: 'Unauthorized', schema: userAclErrorSchema },
|
|
473
|
+
{ status: 403, description: 'Insufficient privileges for the requested tenant scope', schema: userAclErrorSchema },
|
|
350
474
|
],
|
|
351
475
|
},
|
|
352
476
|
PUT: {
|
|
@@ -358,7 +482,7 @@ export const openApi: OpenApiRouteDoc = {
|
|
|
358
482
|
},
|
|
359
483
|
responses: [
|
|
360
484
|
{ status: 200, description: 'User ACL updated', schema: userAclUpdateResponseSchema },
|
|
361
|
-
{ status: 400, description: 'Invalid payload', schema: userAclErrorSchema },
|
|
485
|
+
{ status: 400, description: 'Invalid payload or unresolved tenant scope', schema: userAclErrorSchema },
|
|
362
486
|
{ status: 401, description: 'Unauthorized', schema: userAclErrorSchema },
|
|
363
487
|
{ status: 403, description: 'Insufficient privileges to modify ACL', schema: userAclErrorSchema },
|
|
364
488
|
],
|
|
@@ -26,6 +26,7 @@ import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/
|
|
|
26
26
|
import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
27
27
|
import { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'
|
|
28
28
|
import { parseBooleanFlag } from '@open-mercato/shared/lib/boolean'
|
|
29
|
+
import { MAX_USER_LOOKUP_IDS, resolveUserIdFilter } from '@open-mercato/core/modules/auth/lib/userIdFilter'
|
|
29
30
|
import { findEntityIdsBySearchTokensCompat, type SearchTokenDatabase } from '@open-mercato/shared/lib/search/tokenLookup'
|
|
30
31
|
import { normalizeDisplayNameInput } from '@open-mercato/core/modules/auth/lib/displayName'
|
|
31
32
|
import {
|
|
@@ -38,6 +39,7 @@ const logger = createLogger('auth').child({ component: 'users' })
|
|
|
38
39
|
|
|
39
40
|
const querySchema = z.object({
|
|
40
41
|
id: z.string().uuid().optional(),
|
|
42
|
+
ids: z.string().optional().describe('Comma-separated user identifiers, at most 100'),
|
|
41
43
|
page: z.coerce.number().min(1).default(1),
|
|
42
44
|
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
43
45
|
search: z.string().optional(),
|
|
@@ -204,10 +206,17 @@ export async function GET(req: Request) {
|
|
|
204
206
|
if (!auth) return NextResponse.json({ items: [], total: 0, totalPages: 1 })
|
|
205
207
|
const url = new URL(req.url)
|
|
206
208
|
const rawRoleIds = url.searchParams.getAll('roleId').filter((id): id is string => typeof id === 'string' && id.trim().length > 0)
|
|
209
|
+
// Accept both the repeated (`?ids=a&ids=b`) and comma-joined (`?ids=a,b`) spellings.
|
|
210
|
+
const rawIds = url.searchParams.getAll('ids').join(',') || undefined
|
|
211
|
+
const userIdFilter = resolveUserIdFilter(rawIds, url.searchParams.get('id'))
|
|
207
212
|
const parsed = querySchema.safeParse({
|
|
208
213
|
id: url.searchParams.get('id') || undefined,
|
|
214
|
+
ids: rawIds,
|
|
209
215
|
page: url.searchParams.get('page') || undefined,
|
|
210
|
-
|
|
216
|
+
// A caller resolving a batch of ids wants all of them; without this the default page of 50
|
|
217
|
+
// would silently truncate a 100-id lookup.
|
|
218
|
+
pageSize: url.searchParams.get('pageSize')
|
|
219
|
+
|| (rawIds && userIdFilter.kind === 'ids' ? String(Math.min(userIdFilter.ids.length, MAX_USER_LOOKUP_IDS)) : undefined),
|
|
211
220
|
search: url.searchParams.get('search') || undefined,
|
|
212
221
|
name: url.searchParams.get('name') || undefined,
|
|
213
222
|
organizationId: url.searchParams.get('organizationId') || undefined,
|
|
@@ -228,6 +237,9 @@ export async function GET(req: Request) {
|
|
|
228
237
|
logger.error('Failed to resolve rbac', { err })
|
|
229
238
|
}
|
|
230
239
|
const { id, page, pageSize, search, name, organizationId, scopeToActiveOrganization, roleIds } = parsed.data
|
|
240
|
+
if (userIdFilter.kind === 'none') {
|
|
241
|
+
return NextResponse.json({ items: [], total: 0, totalPages: 1, isSuperAdmin })
|
|
242
|
+
}
|
|
231
243
|
const filters: any[] = [{ deletedAt: null }]
|
|
232
244
|
const actorTenantId = auth.tenantId ? String(auth.tenantId) : null
|
|
233
245
|
let effectiveTenantId: string | null = null
|
|
@@ -293,7 +305,8 @@ export async function GET(req: Request) {
|
|
|
293
305
|
}
|
|
294
306
|
filters.push(displayNameFilters.length > 1 ? { $or: displayNameFilters } : displayNameFilters[0])
|
|
295
307
|
}
|
|
296
|
-
|
|
308
|
+
// `?id=` and `?ids=` are already intersected by resolveUserIdFilter.
|
|
309
|
+
let idFilter: Set<string> | null = userIdFilter.kind === 'ids' ? new Set(userIdFilter.ids) : null
|
|
297
310
|
if (Array.isArray(roleIds) && roleIds.length > 0) {
|
|
298
311
|
const uniqueRoleIds = Array.from(new Set(roleIds))
|
|
299
312
|
const linksForRoles = await em.find(
|
|
@@ -387,10 +400,10 @@ export async function GET(req: Request) {
|
|
|
387
400
|
|
|
388
401
|
filters.push(searchFilters.length > 1 ? { $or: searchFilters } : searchFilters[0])
|
|
389
402
|
}
|
|
403
|
+
// `?id=` has no separate path: resolveUserIdFilter folds it into `idFilter`, and a `kind: 'none'`
|
|
404
|
+
// outcome already returned above, so `idFilter` is null only when neither param was supplied.
|
|
390
405
|
if (idFilter && idFilter.size) {
|
|
391
406
|
filters.push({ id: { $in: Array.from(idFilter) as any } })
|
|
392
|
-
} else if (id) {
|
|
393
|
-
filters.push({ id })
|
|
394
407
|
}
|
|
395
408
|
const where = filters.length > 1 ? { $and: filters } : filters[0]
|
|
396
409
|
const [rows, count] = await em.findAndCount(User, where, { limit: pageSize, offset: (page - 1) * pageSize })
|
|
@@ -713,7 +726,7 @@ export const openApi: OpenApiRouteDoc = {
|
|
|
713
726
|
GET: {
|
|
714
727
|
summary: 'List users',
|
|
715
728
|
description:
|
|
716
|
-
'Returns users for the effective selected tenant and organization scope. Search matches email, organization name, and role name. Super administrators may scope the response via the topbar context, organization filters, or role filters. Pass scopeToActiveOrganization=1 to restrict results to the caller\'s active organization (used by recipient/assignee pickers so suggestions stay within the org that owns the resulting record).',
|
|
729
|
+
'Returns users for the effective selected tenant and organization scope. Search matches email, organization name, and role name. Super administrators may scope the response via the topbar context, organization filters, or role filters. Pass scopeToActiveOrganization=1 to restrict results to the caller\'s active organization (used by recipient/assignee pickers so suggestions stay within the org that owns the resulting record). Pass ids=<uuid>,<uuid> (max 100) to resolve a known set of users in one request, for example to label a list of foreign keys; it intersects with id and roleId, and a supplied ids value that contains no valid identifier matches nothing.',
|
|
717
730
|
query: querySchema,
|
|
718
731
|
responses: [
|
|
719
732
|
{ status: 200, description: 'User collection', schema: userListResponseSchema },
|
|
@@ -2,7 +2,10 @@ export const metadata = {
|
|
|
2
2
|
requireAuth: true,
|
|
3
3
|
requireFeatures: ['auth.roles.manage'],
|
|
4
4
|
pageTitle: 'Edit Role',
|
|
5
|
-
|
|
5
|
+
pageTitleKey: 'auth.roles.form.title.edit',
|
|
6
|
+
breadcrumb: [
|
|
7
|
+
{ label: 'Roles', labelKey: 'auth.nav.roles', href: '/backend/roles' },
|
|
8
|
+
{ label: 'Edit', labelKey: 'common.edit' },
|
|
9
|
+
],
|
|
6
10
|
}
|
|
7
11
|
|
|
8
|
-
|
|
@@ -33,6 +33,7 @@ export default function RolesListPage() {
|
|
|
33
33
|
const [page, setPage] = React.useState(1)
|
|
34
34
|
const [total, setTotal] = React.useState(0)
|
|
35
35
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
36
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
36
37
|
const [search, setSearch] = React.useState('')
|
|
37
38
|
const [rows, setRows] = React.useState<Row[]>([])
|
|
38
39
|
const [isLoading, setIsLoading] = React.useState(true)
|
|
@@ -55,7 +56,7 @@ export default function RolesListPage() {
|
|
|
55
56
|
items?: Row[]
|
|
56
57
|
total?: number
|
|
57
58
|
totalPages?: number
|
|
58
|
-
isSuperAdmin?: boolean
|
|
59
|
+
isSuperAdmin?: boolean; totalIsCapped?: boolean
|
|
59
60
|
}>(
|
|
60
61
|
`/api/auth/roles?${params.toString()}`,
|
|
61
62
|
undefined,
|
|
@@ -65,6 +66,7 @@ export default function RolesListPage() {
|
|
|
65
66
|
setRows(j.items || [])
|
|
66
67
|
setTotal(j.total || 0)
|
|
67
68
|
setTotalPages(j.totalPages || 1)
|
|
69
|
+
setTotalIsCapped(j?.totalIsCapped === true)
|
|
68
70
|
setIsSuperAdmin(!!j.isSuperAdmin)
|
|
69
71
|
}
|
|
70
72
|
} finally {
|
|
@@ -156,7 +158,7 @@ export default function RolesListPage() {
|
|
|
156
158
|
createLabel={t('auth.roles.list.actions.create', 'Create')}
|
|
157
159
|
/>
|
|
158
160
|
)}
|
|
159
|
-
pagination={{ page, pageSize: 50, total, totalPages, onPageChange: setPage }}
|
|
161
|
+
pagination={{ page, pageSize: 50, total, totalPages, totalIsCapped, onPageChange: setPage }}
|
|
160
162
|
isLoading={isLoading}
|
|
161
163
|
/>
|
|
162
164
|
</PageBody>
|
|
@@ -2,7 +2,10 @@ export const metadata = {
|
|
|
2
2
|
requireAuth: true,
|
|
3
3
|
requireFeatures: ['auth.users.edit'],
|
|
4
4
|
pageTitle: 'Edit User',
|
|
5
|
-
|
|
5
|
+
pageTitleKey: 'auth.users.form.title.edit',
|
|
6
|
+
breadcrumb: [
|
|
7
|
+
{ label: 'Users', labelKey: 'auth.nav.users', href: '/backend/users' },
|
|
8
|
+
{ label: 'Edit', labelKey: 'common.edit' },
|
|
9
|
+
],
|
|
6
10
|
}
|
|
7
11
|
|
|
8
|
-
|
|
@@ -351,7 +351,7 @@ export default function UsersListPage() {
|
|
|
351
351
|
const { data: usersData, isLoading } = useQuery({
|
|
352
352
|
queryKey: ['users', params, scopeVersion],
|
|
353
353
|
queryFn: async () => {
|
|
354
|
-
const call = await apiCall<{ items: Row[]; total: number; totalPages: number; isSuperAdmin?: boolean }>(
|
|
354
|
+
const call = await apiCall<{ items: Row[]; total: number; totalPages: number; totalIsCapped?: boolean; isSuperAdmin?: boolean }>(
|
|
355
355
|
`/api/auth/users?${params}`,
|
|
356
356
|
)
|
|
357
357
|
if (!call.ok) {
|
|
@@ -364,6 +364,7 @@ export default function UsersListPage() {
|
|
|
364
364
|
const rows = usersData?.items || []
|
|
365
365
|
const total = usersData?.total || 0
|
|
366
366
|
const totalPages = usersData?.totalPages || 1
|
|
367
|
+
const totalIsCapped = usersData?.totalIsCapped === true
|
|
367
368
|
const isSuperAdmin = !!usersData?.isSuperAdmin
|
|
368
369
|
const rowsWithOrgNames: Row[] = React.useMemo(() => rows.map(row => ({
|
|
369
370
|
...row,
|
|
@@ -456,7 +457,7 @@ export default function UsersListPage() {
|
|
|
456
457
|
{ id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },
|
|
457
458
|
]} />
|
|
458
459
|
)}
|
|
459
|
-
pagination={{ page, pageSize: 50, total, totalPages, onPageChange: setPage }}
|
|
460
|
+
pagination={{ page, pageSize: 50, total, totalPages, totalIsCapped, onPageChange: setPage }}
|
|
460
461
|
isLoading={isLoading}
|
|
461
462
|
/>
|
|
462
463
|
</PageBody>
|