@open-mercato/core 0.6.8-develop.7100.1.fbf66fca35 → 0.7.0
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 +1 -13
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +0 -19
- 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 +1 -3
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- 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 +0 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +1 -11
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/scoped-upload-service.js +2 -15
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +2 -6
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +0 -6
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +11 -19
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +12 -57
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +5 -30
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +2 -8
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +20 -4
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/roles/acl/route.js +33 -28
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/routeError.js +11 -0
- package/dist/modules/auth/api/routeError.js.map +7 -0
- package/dist/modules/auth/api/session/refresh.js +1 -25
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +73 -102
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +5 -13
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +1 -3
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/components/AclEditor.js +30 -39
- 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 +1 -5
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +9 -35
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +0 -46
- 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/services/authService.js +2 -16
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +24 -67
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/business_rules/backend/logs/page.js +1 -3
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +1 -3
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +1 -3
- 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 +9 -10
- 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 +2 -5
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +0 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +1 -7
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +0 -2
- 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 +1 -9
- 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 +10 -95
- 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 +0 -3
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +1 -14
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +1 -7
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +1 -4
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/test-seed.js +2 -41
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +0 -9
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +1 -3
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +1 -3
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +0 -9
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +1 -3
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +523 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/extension-points.js +1 -1
- package/dist/modules/customer_accounts/extension-points.js.map +2 -2
- package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
- package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js +0 -10
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +1 -4
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +2 -13
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +6 -52
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +1 -4
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +6 -48
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +64 -20
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +94 -17
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +5 -8
- 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 +25 -8
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +22 -3
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +4 -11
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +1 -2
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +1 -38
- 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 +1 -3
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +4 -27
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +3 -4
- 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 +10 -11
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +9 -51
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +5 -30
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -6
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +1 -6
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +4 -7
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +13 -4
- 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 +14 -85
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +4 -6
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +3 -9
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +34 -21
- 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 +2 -131
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +6 -7
- 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 +2 -3
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +5 -40
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +1 -2
- 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/AssignRoleDialog.js +33 -28
- package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +4 -5
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +1 -3
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +7 -19
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +5 -6
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +11 -35
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +1 -3
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +13 -19
- 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 +3 -32
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +0 -5
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +2 -8
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +2 -3
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +3 -8
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/dealStatus.js +0 -30
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/findPeopleByAddresses.js +0 -1
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +2 -100
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +0 -12
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +1 -6
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +1 -3
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-engine.js +6 -72
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +1 -5
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +1 -5
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +1 -9
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +32 -5
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +1 -14
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +12 -99
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/openapi.js +1 -3
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +1 -9
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +26 -10
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +1 -17
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +34 -28
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/setup.js +2 -6
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +1 -2
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +1 -2
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +0 -9
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +2 -4
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +1 -3
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +1 -5
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +30 -28
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +8 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
- package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
- package/dist/modules/eudr/components/formConfig.js +6 -2
- package/dist/modules/eudr/components/formConfig.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +1 -4
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
- package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +0 -1
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +0 -1
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +8 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +12 -1
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +1 -6
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +29 -38
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +9 -36
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/data/validators.js +3 -11
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +2 -6
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +1 -29
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +2 -17
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +2 -17
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +14 -7
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +0 -15
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +1 -11
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +1 -3
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +1 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +2 -14
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +4 -18
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +6 -4
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +1 -3
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +0 -7
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +0 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +1 -3
- 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 +51 -150
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +3 -79
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +1 -3
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +1 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +8 -10
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +1 -79
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +5 -7
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -3
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +22 -51
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +19 -84
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +9 -23
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +6 -8
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +14 -68
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +5 -6
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +4 -5
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- 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 +2 -8
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +0 -1
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/setup.js +0 -2
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +2 -10
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +7 -4
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +18 -29
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +0 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +0 -1
- 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 +9 -12
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +0 -3
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +0 -3
- 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 +0 -3
- 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 +0 -3
- 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 +0 -3
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouses/route.js +9 -13
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +2 -15
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +9 -121
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +0 -3
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +1 -9
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +111 -76
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +0 -1
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +0 -1
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +20 -27
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +1 -3
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +1 -3
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +1 -3
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -3
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +0 -4
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +10 -9
- package/src/helpers/integration/api.ts +1 -33
- package/src/helpers/integration/communicationChannelsFixtures.ts +1 -69
- package/src/modules/api_keys/api/keys/route.ts +1 -3
- package/src/modules/api_keys/backend/api-keys/page.tsx +1 -4
- package/src/modules/attachments/AGENTS.md +0 -15
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -3
- package/src/modules/attachments/di.ts +0 -16
- package/src/modules/attachments/i18n/de.json +0 -5
- package/src/modules/attachments/i18n/en.json +0 -5
- package/src/modules/attachments/i18n/es.json +0 -5
- package/src/modules/attachments/i18n/ko.json +0 -5
- package/src/modules/attachments/i18n/pl.json +0 -5
- package/src/modules/attachments/index.ts +0 -10
- package/src/modules/attachments/lib/scoped-upload-service.ts +0 -46
- package/src/modules/attachments/lib/upload-limits.ts +2 -6
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +0 -8
- package/src/modules/audit_logs/lib/display-helpers.tsx +32 -42
- package/src/modules/audit_logs/services/actionLogService.ts +11 -74
- package/src/modules/auth/acl.ts +6 -30
- package/src/modules/auth/api/feature-check.ts +3 -10
- package/src/modules/auth/api/login.ts +24 -9
- package/src/modules/auth/api/roles/acl/route.ts +39 -42
- package/src/modules/auth/api/routeError.ts +30 -0
- package/src/modules/auth/api/session/refresh.ts +1 -32
- package/src/modules/auth/api/users/acl/route.ts +101 -185
- package/src/modules/auth/api/users/route.ts +5 -18
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/roles/page.tsx +2 -4
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/users/page.tsx +2 -3
- package/src/modules/auth/components/AclEditor.tsx +33 -63
- package/src/modules/auth/data/entities.ts +1 -4
- package/src/modules/auth/data/validators.ts +0 -5
- package/src/modules/auth/di.ts +16 -46
- package/src/modules/auth/frontend/reset/[token]/page.tsx +0 -74
- package/src/modules/auth/i18n/de.json +0 -389
- package/src/modules/auth/i18n/en.json +0 -389
- package/src/modules/auth/i18n/es.json +0 -389
- package/src/modules/auth/i18n/ko.json +0 -389
- package/src/modules/auth/i18n/pl.json +2 -391
- package/src/modules/auth/lib/grantChecks.ts +0 -6
- package/src/modules/auth/services/authService.ts +2 -18
- package/src/modules/auth/services/rbacService.ts +24 -110
- package/src/modules/business_rules/backend/logs/page.tsx +1 -4
- package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/rules/page.tsx +1 -4
- package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/sets/page.tsx +1 -4
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +9 -10
- 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 +5 -12
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +0 -3
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -7
- package/src/modules/catalog/i18n/de.json +0 -1
- package/src/modules/catalog/i18n/en.json +0 -1
- package/src/modules/catalog/i18n/es.json +0 -1
- package/src/modules/catalog/i18n/ko.json +0 -1
- package/src/modules/catalog/i18n/pl.json +0 -1
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +0 -4
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +1 -17
- package/src/modules/communication_channels/api/post/test-seed/route.ts +16 -155
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +0 -4
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +1 -38
- package/src/modules/communication_channels/di.ts +0 -7
- package/src/modules/communication_channels/lib/adapter.ts +0 -14
- package/src/modules/communication_channels/lib/email-capabilities.ts +0 -4
- package/src/modules/communication_channels/lib/test-seed.ts +4 -64
- package/src/modules/configs/i18n/de.json +0 -2
- package/src/modules/configs/i18n/en.json +0 -2
- package/src/modules/configs/i18n/es.json +0 -2
- package/src/modules/configs/i18n/ko.json +0 -2
- package/src/modules/configs/i18n/pl.json +0 -2
- package/src/modules/configs/lib/system-status.ts +0 -9
- package/src/modules/currencies/backend/currencies/page.tsx +1 -4
- package/src/modules/currencies/backend/exchange-rates/page.tsx +1 -4
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +0 -7
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +1 -4
- package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
- package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +598 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
- package/src/modules/customer_accounts/extension-points.ts +1 -1
- package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
- package/src/modules/customer_accounts/services/domainMappingService.ts +0 -10
- package/src/modules/customers/ai-tools/companies-pack.ts +1 -4
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +2 -17
- package/src/modules/customers/ai-tools/deals-pack.ts +1 -66
- package/src/modules/customers/ai-tools/people-pack.ts +1 -4
- package/src/modules/customers/api/activities/route.ts +0 -45
- package/src/modules/customers/api/companies/[id]/people/route.ts +73 -24
- package/src/modules/customers/api/companies/[id]/route.ts +107 -24
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +8 -16
- package/src/modules/customers/api/deals/[id]/companies/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/people/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/route.ts +28 -17
- package/src/modules/customers/api/deals/[id]/stats/route.ts +25 -10
- package/src/modules/customers/api/deals/aggregate/route.ts +4 -14
- package/src/modules/customers/api/deals/map/route.ts +0 -1
- package/src/modules/customers/api/deals/route.ts +1 -50
- package/src/modules/customers/api/entity-roles-factory.ts +4 -8
- package/src/modules/customers/api/interactions/route.ts +2 -8
- package/src/modules/customers/api/interactions/tasks/route.ts +1 -24
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +4 -12
- package/src/modules/customers/api/people/[id]/companies/context.ts +1 -4
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +1 -4
- package/src/modules/customers/api/people/[id]/route.ts +11 -16
- package/src/modules/customers/api/people/check-phone/route.ts +10 -75
- package/src/modules/customers/api/todos/route.ts +2 -27
- package/src/modules/customers/backend/customers/companies/page.tsx +4 -7
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +2 -7
- package/src/modules/customers/backend/customers/deals/page.tsx +4 -10
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +14 -5
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +27 -109
- package/src/modules/customers/backend/customers/people/page.tsx +4 -7
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +4 -12
- package/src/modules/customers/commands/deals.ts +59 -34
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +8 -224
- package/src/modules/customers/components/CustomerTodosTable.tsx +0 -2
- 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 +2 -4
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +5 -61
- package/src/modules/customers/components/calendar/editor/hooks.ts +1 -7
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +4 -5
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +1 -8
- package/src/modules/customers/components/detail/DealForm.tsx +2 -22
- package/src/modules/customers/components/detail/DealsSection.tsx +5 -11
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +12 -58
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +1 -8
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +14 -23
- 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 +5 -15
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +9 -50
- package/src/modules/customers/events.ts +0 -5
- package/src/modules/customers/i18n/de.json +1 -9
- package/src/modules/customers/i18n/en.json +1 -9
- package/src/modules/customers/i18n/es.json +1 -9
- package/src/modules/customers/i18n/ko.json +1 -9
- package/src/modules/customers/i18n/pl.json +1 -9
- package/src/modules/customers/lib/calendar/conflicts.ts +2 -10
- package/src/modules/customers/lib/calendar/editorPayload.ts +3 -4
- package/src/modules/customers/lib/calendar/mapItem.ts +3 -8
- package/src/modules/customers/lib/dealStatus.ts +0 -42
- package/src/modules/customers/lib/findPeopleByAddresses.ts +6 -8
- package/src/modules/customers/lib/personCompanies.ts +1 -136
- package/src/modules/customers/lib/todoCompatibility.ts +1 -19
- 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 +0 -6
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +1 -4
- package/src/modules/data_sync/lib/adapter.ts +0 -36
- package/src/modules/data_sync/lib/sync-engine.ts +5 -113
- package/src/modules/data_sync/workers/sync-export.ts +0 -4
- package/src/modules/data_sync/workers/sync-import.ts +0 -4
- package/src/modules/devices/AGENTS.md +1 -20
- package/src/modules/devices/acl.ts +1 -9
- package/src/modules/devices/api/admin/devices/[id]/route.ts +34 -5
- package/src/modules/devices/api/admin/devices/route.ts +1 -14
- package/src/modules/devices/api/deviceList.ts +11 -135
- package/src/modules/devices/api/openapi.ts +1 -9
- package/src/modules/devices/api/route.ts +1 -9
- package/src/modules/devices/backend/devices/[id]/page.tsx +32 -18
- package/src/modules/devices/backend/devices/create/page.tsx +1 -17
- package/src/modules/devices/backend/devices/page.tsx +45 -44
- package/src/modules/devices/i18n/de.json +2 -3
- package/src/modules/devices/i18n/en.json +2 -3
- package/src/modules/devices/i18n/es.json +2 -3
- package/src/modules/devices/i18n/ko.json +2 -3
- package/src/modules/devices/i18n/pl.json +2 -3
- package/src/modules/devices/setup.ts +2 -6
- package/src/modules/directory/backend/directory/organizations/page.tsx +1 -3
- package/src/modules/directory/backend/directory/tenants/page.tsx +1 -3
- package/src/modules/directory/di.ts +2 -14
- package/src/modules/directory/utils/organizationScope.ts +15 -4
- package/src/modules/entities/api/records.ts +0 -2
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +1 -4
- package/src/modules/eudr/api/plots/route.ts +0 -4
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
- package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/plots/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -30
- package/src/modules/eudr/commands/statements.ts +7 -2
- package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
- package/src/modules/eudr/components/formConfig.tsx +9 -1
- package/src/modules/eudr/data/validators.ts +1 -16
- package/src/modules/eudr/i18n/de.json +3 -2
- package/src/modules/eudr/i18n/en.json +3 -2
- package/src/modules/eudr/i18n/es.json +3 -2
- package/src/modules/eudr/i18n/ko.json +3 -2
- package/src/modules/eudr/i18n/pl.json +3 -2
- package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +1 -2
- package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -2
- package/src/modules/feature_toggles/defaults.json +8 -0
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +0 -4
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +0 -4
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +17 -1
- package/src/modules/integrations/api/[id]/credentials/route.ts +4 -6
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +31 -61
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +9 -44
- package/src/modules/integrations/data/validators.ts +2 -12
- package/src/modules/integrations/i18n/de.json +0 -1
- package/src/modules/integrations/i18n/en.json +0 -1
- package/src/modules/integrations/i18n/es.json +0 -1
- package/src/modules/integrations/i18n/ko.json +0 -1
- package/src/modules/integrations/i18n/pl.json +0 -1
- package/src/modules/integrations/lib/credentials-masking.ts +6 -10
- package/src/modules/messages/api/[id]/route.ts +1 -55
- package/src/modules/messages/api/openapi.ts +0 -20
- package/src/modules/messages/api/route.ts +2 -31
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +16 -9
- package/src/modules/messages/components/inboxFilters.ts +0 -36
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +1 -14
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +1 -3
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +1 -2
- package/src/modules/messages/components/message-detail/types.ts +0 -3
- package/src/modules/messages/components/messageListLabels.ts +3 -52
- package/src/modules/messages/data/validators.ts +4 -43
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +6 -4
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +1 -4
- package/src/modules/payment_gateways/lib/webhook-processor.ts +0 -11
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +0 -4
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +1 -4
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +61 -249
- package/src/modules/query_index/lib/search-tokens.ts +3 -135
- package/src/modules/resources/backend/resources/resource-types/page.tsx +1 -4
- package/src/modules/resources/backend/resources/resources/page.tsx +1 -4
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -4
- package/src/modules/sales/backend/sales/channels/page.tsx +0 -4
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +8 -14
- package/src/modules/sales/commands/documents.ts +0 -93
- package/src/modules/sales/components/PriceWithCurrency.tsx +5 -17
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -4
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/ItemsSection.tsx +18 -56
- package/src/modules/sales/components/documents/LineItemDialog.tsx +21 -138
- package/src/modules/sales/components/documents/PaymentsSection.tsx +9 -20
- package/src/modules/sales/components/documents/ReturnsSection.tsx +5 -6
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +14 -106
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +5 -6
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +4 -5
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/lineItemUtils.ts +2 -7
- package/src/modules/sales/data/entities.ts +0 -6
- package/src/modules/sales/extension-points.ts +0 -1
- package/src/modules/sales/i18n/de.json +37 -8
- package/src/modules/sales/i18n/en.json +37 -8
- package/src/modules/sales/i18n/es.json +37 -8
- package/src/modules/sales/i18n/ko.json +37 -8
- package/src/modules/sales/i18n/pl.json +37 -8
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +0 -60
- package/src/modules/sales/setup.ts +0 -2
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +1 -9
- package/src/modules/sales/widgets/injection-table.ts +7 -4
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/team-members/page.tsx +0 -6
- package/src/modules/staff/backend/staff/team-roles/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/page.tsx +0 -4
- package/src/modules/staff/backend/staff/timesheets/page.tsx +1 -12
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +0 -4
- package/src/modules/sync_excel/lib/adapters/customers.ts +0 -5
- 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 +9 -12
- package/src/modules/warranty_claims/backend/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +0 -4
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +0 -4
- package/src/modules/wms/api/warehouses/route.ts +9 -13
- package/src/modules/wms/api/zones/route.ts +0 -16
- package/src/modules/wms/commands/configuration.ts +10 -159
- package/src/modules/wms/commands/inventory-actions.ts +0 -3
- package/src/modules/wms/commands/shared.ts +0 -17
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +141 -95
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +20 -36
- package/src/modules/wms/i18n/de.json +0 -2
- package/src/modules/wms/i18n/en.json +0 -2
- package/src/modules/wms/i18n/es.json +0 -2
- package/src/modules/wms/i18n/ko.json +0 -2
- package/src/modules/wms/i18n/pl.json +0 -2
- package/src/modules/workflows/backend/definitions/page.tsx +1 -4
- package/src/modules/workflows/backend/events/page.tsx +1 -4
- package/src/modules/workflows/backend/instances/page.tsx +1 -4
- package/src/modules/workflows/backend/tasks/page.tsx +1 -4
- package/src/modules/workflows/lib/activity-executor.ts +0 -9
- package/dist/modules/api_keys/di.js +0 -9
- package/dist/modules/api_keys/di.js.map +0 -7
- package/dist/modules/api_keys/services/principalService.js +0 -31
- package/dist/modules/api_keys/services/principalService.js.map +0 -7
- package/dist/modules/attachments/lib/attachment-service.js +0 -313
- package/dist/modules/attachments/lib/attachment-service.js.map +0 -7
- package/dist/modules/auth/api/reset/validate.js +0 -55
- package/dist/modules/auth/api/reset/validate.js.map +0 -7
- package/dist/modules/auth/commands/acl.js +0 -254
- package/dist/modules/auth/commands/acl.js.map +0 -7
- package/dist/modules/auth/lib/userIdFilter.js +0 -16
- package/dist/modules/auth/lib/userIdFilter.js.map +0 -7
- package/dist/modules/auth/services/principalService.js +0 -200
- package/dist/modules/auth/services/principalService.js.map +0 -7
- package/dist/modules/auth/services/roleOrganizationScope.js +0 -41
- package/dist/modules/auth/services/roleOrganizationScope.js.map +0 -7
- package/dist/modules/communication_channels/lib/outbound-recipient.js +0 -33
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +0 -7
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +0 -51
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +0 -7
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +0 -18
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +0 -7
- package/dist/modules/customers/lib/calendar/participantIdentity.js +0 -9
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +0 -7
- package/dist/modules/customers/lib/closureStage.js +0 -45
- package/dist/modules/customers/lib/closureStage.js.map +0 -7
- package/dist/modules/customers/lib/detailReadAccess.js +0 -12
- package/dist/modules/customers/lib/detailReadAccess.js.map +0 -7
- package/dist/modules/data_sync/lib/abandoned-run.js +0 -19
- package/dist/modules/data_sync/lib/abandoned-run.js.map +0 -7
- package/dist/modules/devices/api/deviceSerialization.js +0 -46
- package/dist/modules/devices/api/deviceSerialization.js.map +0 -7
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +0 -34
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +0 -7
- package/dist/modules/devices/backend/devices/userOptions.js +0 -52
- package/dist/modules/devices/backend/devices/userOptions.js.map +0 -7
- package/dist/modules/directory/services/organizationHierarchyService.js +0 -29
- package/dist/modules/directory/services/organizationHierarchyService.js.map +0 -7
- package/dist/modules/directory/services/organizationScopeService.js +0 -56
- package/dist/modules/directory/services/organizationScopeService.js.map +0 -7
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +0 -55
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +0 -7
- package/dist/modules/messages/lib/channel-sender-identity.js +0 -26
- package/dist/modules/messages/lib/channel-sender-identity.js.map +0 -7
- package/dist/modules/messages/lib/composeSourceChannelType.js +0 -41
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +0 -7
- package/dist/modules/query_index/lib/search-entity-policy.js +0 -14
- package/dist/modules/query_index/lib/search-entity-policy.js.map +0 -7
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +0 -54
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +0 -7
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +0 -33
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +0 -7
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +0 -32
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +0 -7
- package/dist/modules/wms/api/warehouseSearch.js +0 -21
- package/dist/modules/wms/api/warehouseSearch.js.map +0 -7
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +0 -158
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +0 -7
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +0 -66
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +0 -7
- package/src/modules/api_keys/di.ts +0 -7
- package/src/modules/api_keys/services/principalService.ts +0 -33
- package/src/modules/attachments/lib/attachment-service.ts +0 -468
- package/src/modules/auth/api/reset/validate.ts +0 -57
- package/src/modules/auth/commands/acl.ts +0 -495
- package/src/modules/auth/lib/userIdFilter.ts +0 -31
- package/src/modules/auth/services/principalService.ts +0 -266
- package/src/modules/auth/services/roleOrganizationScope.ts +0 -70
- package/src/modules/communication_channels/lib/outbound-recipient.ts +0 -71
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +0 -99
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +0 -21
- package/src/modules/customers/lib/calendar/participantIdentity.ts +0 -17
- package/src/modules/customers/lib/closureStage.ts +0 -76
- package/src/modules/customers/lib/detailReadAccess.ts +0 -35
- package/src/modules/data_sync/lib/abandoned-run.ts +0 -56
- package/src/modules/devices/api/deviceSerialization.ts +0 -50
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +0 -45
- package/src/modules/devices/backend/devices/userOptions.ts +0 -99
- package/src/modules/directory/services/organizationHierarchyService.ts +0 -34
- package/src/modules/directory/services/organizationScopeService.ts +0 -85
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +0 -84
- package/src/modules/messages/lib/channel-sender-identity.ts +0 -55
- package/src/modules/messages/lib/composeSourceChannelType.ts +0 -95
- package/src/modules/query_index/lib/search-entity-policy.ts +0 -46
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +0 -74
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +0 -42
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +0 -87
- package/src/modules/wms/api/warehouseSearch.ts +0 -23
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +0 -216
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +0 -72
|
@@ -1,13 +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
|
|
4
|
+
import { getAuthFromRequest } 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
|
-
import
|
|
10
|
-
import {
|
|
9
|
+
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
10
|
+
import { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'
|
|
11
|
+
import { UserAcl } from '@open-mercato/core/modules/auth/data/entities'
|
|
11
12
|
import {
|
|
12
13
|
assertActorCanAccessUserTarget,
|
|
13
14
|
assertActorCanGrantAcl,
|
|
@@ -15,25 +16,15 @@ import {
|
|
|
15
16
|
normalizeGrantFeatureList,
|
|
16
17
|
} from '@open-mercato/core/modules/auth/lib/grantChecks'
|
|
17
18
|
import type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'
|
|
18
|
-
import {
|
|
19
|
-
import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'
|
|
19
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
20
20
|
import { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'
|
|
21
|
-
import {
|
|
22
|
-
AUTH_USER_ACL_UPDATE_COMMAND_ID,
|
|
23
|
-
type AclUpdateResult,
|
|
24
|
-
type UserAclUpdateInput,
|
|
25
|
-
} from '@open-mercato/core/modules/auth/commands/acl'
|
|
26
21
|
|
|
27
|
-
const getSchema = z.object({
|
|
28
|
-
userId: z.string().uuid(),
|
|
29
|
-
tenantId: z.string().uuid().optional(),
|
|
30
|
-
})
|
|
22
|
+
const getSchema = z.object({ userId: z.string().uuid() })
|
|
31
23
|
const putSchema = z.object({
|
|
32
24
|
userId: z.string().uuid(),
|
|
33
25
|
isSuperAdmin: z.boolean().optional(),
|
|
34
26
|
features: z.array(z.string()).optional(),
|
|
35
27
|
organizations: z.array(z.string()).nullable().optional(),
|
|
36
|
-
tenantId: z.string().uuid().optional(),
|
|
37
28
|
})
|
|
38
29
|
|
|
39
30
|
export const metadata = {
|
|
@@ -56,95 +47,25 @@ const userAclUpdateResponseSchema = z.object({
|
|
|
56
47
|
|
|
57
48
|
const userAclErrorSchema = z.object({ error: z.string() })
|
|
58
49
|
|
|
59
|
-
type TenantResolution = { tenantId: string | null } | { error: NextResponse }
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* The single tenant scope both handlers work in. GET and PUT MUST resolve it the
|
|
63
|
-
* same way: the admin user form PUTs the ACL panel's state on every save, so a
|
|
64
|
-
* GET that reads a narrower scope than the PUT writes hands the operator an
|
|
65
|
-
* empty form and turns the next name-only edit into a silent revocation, with no
|
|
66
|
-
* `updatedAt` to arm the optimistic lock against it.
|
|
67
|
-
*
|
|
68
|
-
* `user_acls.tenant_id` is NOT NULL while `users.tenant_id` is nullable, so a
|
|
69
|
-
* global account legitimately signs in with `auth.tenantId === null` and the
|
|
70
|
-
* scope has to come from the target user instead. That fallback is reserved for
|
|
71
|
-
* a super admin: for anyone else it would let the target pick the scope its own
|
|
72
|
-
* access is then checked against, and it decrypts a possibly foreign user ahead
|
|
73
|
-
* of every guard. A tenant-less non-super-admin therefore resolves to `null`,
|
|
74
|
-
* which reads as "no override" and refuses to write — the behaviour that held
|
|
75
|
-
* before this route resolved a scope at all. The read is also skipped whenever a
|
|
76
|
-
* tenant is already known.
|
|
77
|
-
*
|
|
78
|
-
* An explicit `tenantId` wins, mirroring the role ACL route (additive there and
|
|
79
|
-
* here; no caller sends it yet) — but only for a super admin or for the actor's
|
|
80
|
-
* own tenant, so it cannot widen anyone's reach. The result is that for a
|
|
81
|
-
* non-super-admin the resolved scope is always the actor's own.
|
|
82
|
-
*/
|
|
83
|
-
async function resolveAclTenantId(args: {
|
|
84
|
-
em: EntityManager
|
|
85
|
-
auth: NonNullable<AuthContext>
|
|
86
|
-
actorIsSuperAdmin: boolean
|
|
87
|
-
userId: string
|
|
88
|
-
requestedTenantId?: string
|
|
89
|
-
}): Promise<TenantResolution> {
|
|
90
|
-
const authTenantId = args.auth.tenantId ?? null
|
|
91
|
-
if (args.requestedTenantId && args.requestedTenantId !== authTenantId && !args.actorIsSuperAdmin) {
|
|
92
|
-
return { error: NextResponse.json({ error: 'Forbidden' }, { status: 403 }) }
|
|
93
|
-
}
|
|
94
|
-
const known = args.requestedTenantId ?? authTenantId
|
|
95
|
-
if (known) return { tenantId: known }
|
|
96
|
-
if (!args.actorIsSuperAdmin) return { tenantId: null }
|
|
97
|
-
const targetUser = await findOneWithDecryption(
|
|
98
|
-
args.em,
|
|
99
|
-
User,
|
|
100
|
-
{ id: args.userId } as FilterQuery<User>,
|
|
101
|
-
{},
|
|
102
|
-
{ tenantId: null, organizationId: args.auth.orgId ?? null },
|
|
103
|
-
)
|
|
104
|
-
return { tenantId: targetUser?.tenantId ? String(targetUser.tenantId) : null }
|
|
105
|
-
}
|
|
106
|
-
|
|
107
50
|
export async function GET(req: Request) {
|
|
108
51
|
const auth = await getAuthFromRequest(req)
|
|
109
52
|
if (!auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
110
53
|
const url = new URL(req.url)
|
|
111
|
-
const parsed = getSchema.safeParse({
|
|
112
|
-
userId: url.searchParams.get('userId'),
|
|
113
|
-
tenantId: url.searchParams.get('tenantId') || undefined,
|
|
114
|
-
})
|
|
54
|
+
const parsed = getSchema.safeParse({ userId: url.searchParams.get('userId') })
|
|
115
55
|
if (!parsed.success) return NextResponse.json({ error: 'Invalid input' }, { status: 400 })
|
|
116
56
|
const container = await createRequestContainer()
|
|
117
57
|
const em = container.resolve('em') as any
|
|
118
58
|
const rbacService = container.resolve('rbacService') as any
|
|
119
|
-
// Every grant check is answered in the actor's own scope, never in the scope
|
|
120
|
-
// resolved for the record: passing the resolved one would ask a foreign tenant
|
|
121
|
-
// whether this caller may act there, and for a tenant-less actor — whose scope
|
|
122
|
-
// comes from the target — it would compare the target against itself.
|
|
123
|
-
const actorTenantId = auth.tenantId ?? null
|
|
124
59
|
const actorAcl = auth.sub
|
|
125
|
-
? await rbacService.loadAcl(auth.sub, { tenantId:
|
|
60
|
+
? await rbacService.loadAcl(auth.sub, { tenantId: auth.tenantId ?? null, organizationId: auth.orgId ?? null })
|
|
126
61
|
: null
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const resolution = await resolveAclTenantId({
|
|
130
|
-
em: em as EntityManager,
|
|
131
|
-
auth,
|
|
132
|
-
actorIsSuperAdmin,
|
|
133
|
-
userId: parsed.data.userId,
|
|
134
|
-
requestedTenantId: parsed.data.tenantId,
|
|
135
|
-
})
|
|
136
|
-
if ('error' in resolution) return resolution.error
|
|
137
|
-
// An unresolvable scope reads as "no override", which is what PUT then refuses
|
|
138
|
-
// to write (`Tenant required`) — so the pair still cannot destroy a row.
|
|
139
|
-
const tenantId = resolution.tenantId
|
|
140
|
-
|
|
141
|
-
if (!actorIsSuperAdmin && auth.sub) {
|
|
62
|
+
if (!actorAcl?.isSuperAdmin && auth.sub) {
|
|
142
63
|
try {
|
|
143
64
|
await assertActorCanModifySuperAdminUserTarget({
|
|
144
65
|
em: em as EntityManager,
|
|
145
66
|
rbacService: rbacService as RbacService,
|
|
146
67
|
actorUserId: auth.sub,
|
|
147
|
-
tenantId:
|
|
68
|
+
tenantId: auth.tenantId ?? null,
|
|
148
69
|
organizationId: auth.orgId ?? null,
|
|
149
70
|
targetUserId: parsed.data.userId,
|
|
150
71
|
actorIsSuperAdmin: false,
|
|
@@ -153,7 +74,7 @@ export async function GET(req: Request) {
|
|
|
153
74
|
em: em as EntityManager,
|
|
154
75
|
rbacService: rbacService as RbacService,
|
|
155
76
|
actorUserId: auth.sub,
|
|
156
|
-
tenantId:
|
|
77
|
+
tenantId: auth.tenantId ?? null,
|
|
157
78
|
organizationId: auth.orgId ?? null,
|
|
158
79
|
targetUserId: parsed.data.userId,
|
|
159
80
|
actorIsSuperAdmin: false,
|
|
@@ -161,7 +82,7 @@ export async function GET(req: Request) {
|
|
|
161
82
|
container,
|
|
162
83
|
auth,
|
|
163
84
|
request: req,
|
|
164
|
-
tenantId:
|
|
85
|
+
tenantId: auth.tenantId ?? null,
|
|
165
86
|
}),
|
|
166
87
|
})
|
|
167
88
|
} catch (err) {
|
|
@@ -169,9 +90,7 @@ export async function GET(req: Request) {
|
|
|
169
90
|
throw err
|
|
170
91
|
}
|
|
171
92
|
}
|
|
172
|
-
const acl = tenantId
|
|
173
|
-
? await em.findOne(UserAcl, { user: parsed.data.userId as any, tenantId })
|
|
174
|
-
: null
|
|
93
|
+
const acl = await em.findOne(UserAcl, { user: parsed.data.userId as any, tenantId: auth.tenantId as any })
|
|
175
94
|
const response = acl
|
|
176
95
|
? {
|
|
177
96
|
hasCustomAcl: true,
|
|
@@ -190,8 +109,8 @@ export async function GET(req: Request) {
|
|
|
190
109
|
idField: 'id',
|
|
191
110
|
resourceKind: 'auth.user_acl',
|
|
192
111
|
organizationId: auth.orgId ?? null,
|
|
193
|
-
tenantId,
|
|
194
|
-
query: { userId: parsed.data.userId
|
|
112
|
+
tenantId: auth.tenantId ?? null,
|
|
113
|
+
query: { userId: parsed.data.userId },
|
|
195
114
|
accessType: 'read:item',
|
|
196
115
|
})
|
|
197
116
|
|
|
@@ -208,40 +127,18 @@ export async function PUT(req: Request) {
|
|
|
208
127
|
const em = container.resolve('em') as any
|
|
209
128
|
const rbacService = container.resolve('rbacService') as any
|
|
210
129
|
|
|
211
|
-
// Every grant check is answered in the actor's own scope, never in the scope
|
|
212
|
-
// resolved for the record: passing the resolved one would ask a foreign tenant
|
|
213
|
-
// whether this caller may act there, and for a tenant-less actor — whose scope
|
|
214
|
-
// comes from the target — it would compare the target against itself.
|
|
215
|
-
const actorTenantId = auth.tenantId ?? null
|
|
216
130
|
const actorAcl = auth.sub
|
|
217
|
-
? await rbacService.loadAcl(auth.sub, { tenantId:
|
|
131
|
+
? await rbacService.loadAcl(auth.sub, { tenantId: auth.tenantId ?? null, organizationId: auth.orgId ?? null })
|
|
218
132
|
: null
|
|
219
133
|
const actorIsSuperAdmin = !!actorAcl?.isSuperAdmin
|
|
220
134
|
|
|
221
|
-
// The scope the row is read and written in. `auth.tenantId` is `string | null`
|
|
222
|
-
// — never `undefined`, since every producer normalizes with `?? null` — so the
|
|
223
|
-
// pre-fix lookup ran `tenant_id IS NULL` against a NOT NULL column: it matched
|
|
224
|
-
// no row, leaving create/update to fail the NOT NULL constraint and clear to
|
|
225
|
-
// no-op silently. Nothing cross-tenant was ever matched; the fix turns a 500
|
|
226
|
-
// into a working, correctly scoped write.
|
|
227
|
-
const resolution = await resolveAclTenantId({
|
|
228
|
-
em: em as EntityManager,
|
|
229
|
-
auth,
|
|
230
|
-
actorIsSuperAdmin,
|
|
231
|
-
userId: parsed.data.userId,
|
|
232
|
-
requestedTenantId: parsed.data.tenantId,
|
|
233
|
-
})
|
|
234
|
-
if ('error' in resolution) return resolution.error
|
|
235
|
-
const tenantId = resolution.tenantId
|
|
236
|
-
if (!tenantId) return NextResponse.json({ error: 'Tenant required' }, { status: 400 })
|
|
237
|
-
|
|
238
135
|
if (!actorIsSuperAdmin && auth.sub) {
|
|
239
136
|
try {
|
|
240
137
|
await assertActorCanModifySuperAdminUserTarget({
|
|
241
138
|
em: em as EntityManager,
|
|
242
139
|
rbacService: rbacService as RbacService,
|
|
243
140
|
actorUserId: auth.sub,
|
|
244
|
-
tenantId:
|
|
141
|
+
tenantId: auth.tenantId ?? null,
|
|
245
142
|
organizationId: auth.orgId ?? null,
|
|
246
143
|
targetUserId: parsed.data.userId,
|
|
247
144
|
actorIsSuperAdmin: false,
|
|
@@ -250,7 +147,7 @@ export async function PUT(req: Request) {
|
|
|
250
147
|
em: em as EntityManager,
|
|
251
148
|
rbacService: rbacService as RbacService,
|
|
252
149
|
actorUserId: auth.sub,
|
|
253
|
-
tenantId:
|
|
150
|
+
tenantId: auth.tenantId ?? null,
|
|
254
151
|
organizationId: auth.orgId ?? null,
|
|
255
152
|
targetUserId: parsed.data.userId,
|
|
256
153
|
actorIsSuperAdmin: false,
|
|
@@ -258,7 +155,7 @@ export async function PUT(req: Request) {
|
|
|
258
155
|
container,
|
|
259
156
|
auth,
|
|
260
157
|
request: req,
|
|
261
|
-
tenantId:
|
|
158
|
+
tenantId: auth.tenantId ?? null,
|
|
262
159
|
}),
|
|
263
160
|
})
|
|
264
161
|
} catch (err) {
|
|
@@ -267,10 +164,7 @@ export async function PUT(req: Request) {
|
|
|
267
164
|
}
|
|
268
165
|
}
|
|
269
166
|
|
|
270
|
-
|
|
271
|
-
const organizations = normalizeOrganizations(parsed.data.organizations)
|
|
272
|
-
|
|
273
|
-
const acl = await em.findOne(UserAcl, { user: parsed.data.userId as any, tenantId })
|
|
167
|
+
let acl = await em.findOne(UserAcl, { user: parsed.data.userId as any, tenantId: auth.tenantId as any })
|
|
274
168
|
// Optimistic lock: refuse a stale per-user ACL overwrite so concurrent edits
|
|
275
169
|
// cannot silently clobber each other (#2055). Strictly additive — a no-op when
|
|
276
170
|
// the client sends no expected-version header; skipped when no ACL row exists.
|
|
@@ -289,26 +183,42 @@ export async function PUT(req: Request) {
|
|
|
289
183
|
}
|
|
290
184
|
const existingIsSuperAdmin = acl ? !!acl.isSuperAdmin : false
|
|
291
185
|
const existingFeatures = acl ? normalizeGrantFeatureList(acl.featuresJson) : []
|
|
292
|
-
|
|
293
|
-
|
|
186
|
+
const existingOrganizations = acl ? normalizeOrganizations(acl.organizationsJson) : null
|
|
187
|
+
|
|
188
|
+
// A per-user ACL is an absolute override, so an omitted dimension must keep
|
|
189
|
+
// its stored value. Normalizing an omitted `features` to `[]` or an omitted
|
|
190
|
+
// `organizations` to `null` turned a single-dimension edit into a silent
|
|
191
|
+
// clear, deleting the row and widening the user back to their full role.
|
|
192
|
+
const featuresWereProvided = parsed.data.features !== undefined
|
|
193
|
+
const requestedFeatures = featuresWereProvided
|
|
194
|
+
? normalizeGrantFeatureList(parsed.data.features)
|
|
195
|
+
: existingFeatures
|
|
196
|
+
const requestedOrganizations = parsed.data.organizations === undefined
|
|
197
|
+
? existingOrganizations
|
|
198
|
+
: normalizeOrganizations(parsed.data.organizations)
|
|
199
|
+
|
|
200
|
+
const requestedIsSuperAdmin = parsed.data.isSuperAdmin ?? existingIsSuperAdmin
|
|
294
201
|
|
|
295
202
|
try {
|
|
296
203
|
await assertActorCanGrantAcl({
|
|
297
204
|
em: em as EntityManager,
|
|
298
205
|
rbacService: rbacService as RbacService,
|
|
299
206
|
actorUserId: auth.sub,
|
|
300
|
-
tenantId:
|
|
207
|
+
tenantId: auth.tenantId ?? null,
|
|
301
208
|
organizationId: auth.orgId ?? null,
|
|
302
209
|
isSuperAdmin: requestedIsSuperAdmin,
|
|
303
210
|
features: requestedFeatures,
|
|
304
|
-
organizations,
|
|
211
|
+
organizations: requestedOrganizations,
|
|
305
212
|
})
|
|
306
213
|
} catch (err) {
|
|
307
214
|
if (isCrudHttpError(err)) return NextResponse.json(err.body, { status: err.status })
|
|
308
215
|
throw err
|
|
309
216
|
}
|
|
310
217
|
|
|
311
|
-
|
|
218
|
+
// An omitted feature list is already stored and in effect. Re-sanitizing it
|
|
219
|
+
// during an unrelated organization edit would silently revoke grants the
|
|
220
|
+
// actor did not touch, so only an explicitly submitted list is sanitized.
|
|
221
|
+
const effectiveFeatures = actorIsSuperAdmin || !featuresWereProvided
|
|
312
222
|
? requestedFeatures
|
|
313
223
|
: sanitizeTenantFeatures(requestedFeatures)
|
|
314
224
|
|
|
@@ -325,59 +235,56 @@ export async function PUT(req: Request) {
|
|
|
325
235
|
}
|
|
326
236
|
}
|
|
327
237
|
|
|
328
|
-
|
|
238
|
+
// Retaining an organization-only override with no features would revoke every
|
|
239
|
+
// role-granted feature instead of narrowing the role. Refuse that state rather
|
|
240
|
+
// than persisting it or silently dropping the organization scope.
|
|
241
|
+
if (!effectiveIsSuperAdmin && effectiveFeatures.length === 0 && hasOrganizationRestriction(requestedOrganizations)) {
|
|
242
|
+
const { translate } = await resolveTranslations()
|
|
243
|
+
return NextResponse.json({
|
|
244
|
+
error: translate(
|
|
245
|
+
'auth.acl.organizationWarning',
|
|
246
|
+
'Organization restrictions are saved only when at least one feature override is selected. Add a feature or enable a module wildcard before saving.',
|
|
247
|
+
),
|
|
248
|
+
}, { status: 400 })
|
|
249
|
+
}
|
|
329
250
|
|
|
330
|
-
//
|
|
331
|
-
//
|
|
332
|
-
//
|
|
333
|
-
|
|
334
|
-
// would otherwise be indistinguishable from a no-op and skipped as one.
|
|
335
|
-
//
|
|
336
|
-
// Features are the only axis that can be trimmed. A super-admin request is
|
|
337
|
-
// either honoured or refused outright above, never silently downgraded, so
|
|
338
|
-
// comparing the two flags here would be dead weight.
|
|
339
|
-
//
|
|
340
|
-
// Deliberately independent of the `sanitized` response flag below:
|
|
341
|
-
// `hasRestrictedChanges` stays false when the trimmed result equals the
|
|
342
|
-
// existing ACL, to avoid nagging the user about a save that changed nothing —
|
|
343
|
-
// but that is precisely an attempt the trail must keep.
|
|
344
|
-
const strippedFeatures = requestedFeatures.filter((feature) => !effectiveFeatures.includes(feature))
|
|
251
|
+
// An unrestricted organization list carries no override on its own, and the guard
|
|
252
|
+
// above already refused the restricted-but-featureless case, so the override is
|
|
253
|
+
// custom exactly when it grants super admin or at least one feature.
|
|
254
|
+
const hasCustomAcl = effectiveIsSuperAdmin || effectiveFeatures.length > 0
|
|
345
255
|
|
|
346
|
-
//
|
|
347
|
-
//
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
256
|
+
// Persist the ACL mutation inside a transaction so the per-user permission
|
|
257
|
+
// write (or removal) commits atomically (proper ACL-edit transaction handling).
|
|
258
|
+
if (!hasCustomAcl) {
|
|
259
|
+
if (acl) {
|
|
260
|
+
const aclToRemove = acl
|
|
261
|
+
await withAtomicFlush(em, [() => em.remove(aclToRemove)], { transaction: true })
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
if (!acl) {
|
|
265
|
+
acl = em.create(UserAcl, { user: parsed.data.userId as any, tenantId: auth.tenantId as any })
|
|
266
|
+
}
|
|
267
|
+
const aclRecord = acl as any
|
|
268
|
+
await withAtomicFlush(
|
|
269
|
+
em,
|
|
270
|
+
[
|
|
271
|
+
() => {
|
|
272
|
+
aclRecord.isSuperAdmin = effectiveIsSuperAdmin
|
|
273
|
+
aclRecord.featuresJson = effectiveFeatures
|
|
274
|
+
aclRecord.organizationsJson = requestedOrganizations
|
|
275
|
+
em.persist(aclRecord)
|
|
276
|
+
},
|
|
277
|
+
],
|
|
278
|
+
{ transaction: true },
|
|
279
|
+
)
|
|
368
280
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
clear: !hasCustomAcl,
|
|
377
|
-
requested: strippedFeatures.length ? { features: requestedFeatures } : null,
|
|
378
|
-
},
|
|
379
|
-
ctx: commandCtx,
|
|
380
|
-
})
|
|
281
|
+
|
|
282
|
+
// Invalidate cache for this user
|
|
283
|
+
await rbacService.invalidateUserCache(parsed.data.userId)
|
|
284
|
+
try {
|
|
285
|
+
const cache = container.resolve('cache') as any
|
|
286
|
+
if (cache) await cache.deleteByTags([`rbac:user:${parsed.data.userId}`])
|
|
287
|
+
} catch {}
|
|
381
288
|
|
|
382
289
|
return NextResponse.json({
|
|
383
290
|
ok: true,
|
|
@@ -390,6 +297,16 @@ function normalizeOrganizations(organizations: unknown): string[] | null {
|
|
|
390
297
|
return normalizeGrantFeatureList(organizations)
|
|
391
298
|
}
|
|
392
299
|
|
|
300
|
+
// Whether the caller expressed an intentional narrowing. `null` and `__all__`
|
|
301
|
+
// are the two documented ways to say "every organization"; an empty list is the
|
|
302
|
+
// editor's "no organization picked" state ("Empty = all organizations"), which
|
|
303
|
+
// is not a restriction an administrator chose. Only a concrete list narrows, so
|
|
304
|
+
// only a concrete list has to justify itself against the feature grant below.
|
|
305
|
+
function hasOrganizationRestriction(organizations: string[] | null): boolean {
|
|
306
|
+
if (!organizations || organizations.length === 0) return false
|
|
307
|
+
return !organizations.includes('__all__')
|
|
308
|
+
}
|
|
309
|
+
|
|
393
310
|
function sanitizeTenantFeatures(features: string[]): string[] {
|
|
394
311
|
return features.filter((feature) => !isTenantRestrictedFeature(feature))
|
|
395
312
|
}
|
|
@@ -424,25 +341,24 @@ export const openApi: OpenApiRouteDoc = {
|
|
|
424
341
|
methods: {
|
|
425
342
|
GET: {
|
|
426
343
|
summary: 'Fetch user ACL',
|
|
427
|
-
description: 'Returns custom ACL overrides for a user
|
|
344
|
+
description: 'Returns custom ACL overrides for a user within the current tenant, if any.',
|
|
428
345
|
query: getSchema,
|
|
429
346
|
responses: [
|
|
430
347
|
{ status: 200, description: 'User ACL entry', schema: userAclResponseSchema },
|
|
431
348
|
{ status: 400, description: 'Invalid user id', schema: userAclErrorSchema },
|
|
432
349
|
{ status: 401, description: 'Unauthorized', schema: userAclErrorSchema },
|
|
433
|
-
{ status: 403, description: 'Insufficient privileges for the requested tenant scope', schema: userAclErrorSchema },
|
|
434
350
|
],
|
|
435
351
|
},
|
|
436
352
|
PUT: {
|
|
437
353
|
summary: 'Update user ACL',
|
|
438
|
-
description: '
|
|
354
|
+
description: 'Updates a per-user ACL override. Omitted super admin, feature, and organization fields preserve their stored values. An organization-scoped non-super-admin override requires at least one feature grant.',
|
|
439
355
|
requestBody: {
|
|
440
356
|
contentType: 'application/json',
|
|
441
357
|
schema: putSchema,
|
|
442
358
|
},
|
|
443
359
|
responses: [
|
|
444
360
|
{ status: 200, description: 'User ACL updated', schema: userAclUpdateResponseSchema },
|
|
445
|
-
{ status: 400, description: 'Invalid payload
|
|
361
|
+
{ status: 400, description: 'Invalid payload', schema: userAclErrorSchema },
|
|
446
362
|
{ status: 401, description: 'Unauthorized', schema: userAclErrorSchema },
|
|
447
363
|
{ status: 403, description: 'Insufficient privileges to modify ACL', schema: userAclErrorSchema },
|
|
448
364
|
],
|
|
@@ -26,7 +26,6 @@ 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'
|
|
30
29
|
import { findEntityIdsBySearchTokensCompat, type SearchTokenDatabase } from '@open-mercato/shared/lib/search/tokenLookup'
|
|
31
30
|
import { normalizeDisplayNameInput } from '@open-mercato/core/modules/auth/lib/displayName'
|
|
32
31
|
import {
|
|
@@ -39,7 +38,6 @@ const logger = createLogger('auth').child({ component: 'users' })
|
|
|
39
38
|
|
|
40
39
|
const querySchema = z.object({
|
|
41
40
|
id: z.string().uuid().optional(),
|
|
42
|
-
ids: z.string().optional().describe('Comma-separated user identifiers, at most 100'),
|
|
43
41
|
page: z.coerce.number().min(1).default(1),
|
|
44
42
|
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
45
43
|
search: z.string().optional(),
|
|
@@ -206,17 +204,10 @@ export async function GET(req: Request) {
|
|
|
206
204
|
if (!auth) return NextResponse.json({ items: [], total: 0, totalPages: 1 })
|
|
207
205
|
const url = new URL(req.url)
|
|
208
206
|
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'))
|
|
212
207
|
const parsed = querySchema.safeParse({
|
|
213
208
|
id: url.searchParams.get('id') || undefined,
|
|
214
|
-
ids: rawIds,
|
|
215
209
|
page: url.searchParams.get('page') || undefined,
|
|
216
|
-
|
|
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),
|
|
210
|
+
pageSize: url.searchParams.get('pageSize') || undefined,
|
|
220
211
|
search: url.searchParams.get('search') || undefined,
|
|
221
212
|
name: url.searchParams.get('name') || undefined,
|
|
222
213
|
organizationId: url.searchParams.get('organizationId') || undefined,
|
|
@@ -237,9 +228,6 @@ export async function GET(req: Request) {
|
|
|
237
228
|
logger.error('Failed to resolve rbac', { err })
|
|
238
229
|
}
|
|
239
230
|
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
|
-
}
|
|
243
231
|
const filters: any[] = [{ deletedAt: null }]
|
|
244
232
|
const actorTenantId = auth.tenantId ? String(auth.tenantId) : null
|
|
245
233
|
let effectiveTenantId: string | null = null
|
|
@@ -305,8 +293,7 @@ export async function GET(req: Request) {
|
|
|
305
293
|
}
|
|
306
294
|
filters.push(displayNameFilters.length > 1 ? { $or: displayNameFilters } : displayNameFilters[0])
|
|
307
295
|
}
|
|
308
|
-
|
|
309
|
-
let idFilter: Set<string> | null = userIdFilter.kind === 'ids' ? new Set(userIdFilter.ids) : null
|
|
296
|
+
let idFilter: Set<string> | null = id ? new Set([id]) : null
|
|
310
297
|
if (Array.isArray(roleIds) && roleIds.length > 0) {
|
|
311
298
|
const uniqueRoleIds = Array.from(new Set(roleIds))
|
|
312
299
|
const linksForRoles = await em.find(
|
|
@@ -400,10 +387,10 @@ export async function GET(req: Request) {
|
|
|
400
387
|
|
|
401
388
|
filters.push(searchFilters.length > 1 ? { $or: searchFilters } : searchFilters[0])
|
|
402
389
|
}
|
|
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.
|
|
405
390
|
if (idFilter && idFilter.size) {
|
|
406
391
|
filters.push({ id: { $in: Array.from(idFilter) as any } })
|
|
392
|
+
} else if (id) {
|
|
393
|
+
filters.push({ id })
|
|
407
394
|
}
|
|
408
395
|
const where = filters.length > 1 ? { $and: filters } : filters[0]
|
|
409
396
|
const [rows, count] = await em.findAndCount(User, where, { limit: pageSize, offset: (page - 1) * pageSize })
|
|
@@ -726,7 +713,7 @@ export const openApi: OpenApiRouteDoc = {
|
|
|
726
713
|
GET: {
|
|
727
714
|
summary: 'List users',
|
|
728
715
|
description:
|
|
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).
|
|
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).',
|
|
730
717
|
query: querySchema,
|
|
731
718
|
responses: [
|
|
732
719
|
{ status: 200, description: 'User collection', schema: userListResponseSchema },
|
|
@@ -2,10 +2,7 @@ export const metadata = {
|
|
|
2
2
|
requireAuth: true,
|
|
3
3
|
requireFeatures: ['auth.roles.manage'],
|
|
4
4
|
pageTitle: 'Edit Role',
|
|
5
|
-
|
|
6
|
-
breadcrumb: [
|
|
7
|
-
{ label: 'Roles', labelKey: 'auth.nav.roles', href: '/backend/roles' },
|
|
8
|
-
{ label: 'Edit', labelKey: 'common.edit' },
|
|
9
|
-
],
|
|
5
|
+
breadcrumb: [ { label: 'Roles', href: '/backend/roles' }, { label: 'Edit' } ],
|
|
10
6
|
}
|
|
11
7
|
|
|
8
|
+
|
|
@@ -33,7 +33,6 @@ 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)
|
|
37
36
|
const [search, setSearch] = React.useState('')
|
|
38
37
|
const [rows, setRows] = React.useState<Row[]>([])
|
|
39
38
|
const [isLoading, setIsLoading] = React.useState(true)
|
|
@@ -56,7 +55,7 @@ export default function RolesListPage() {
|
|
|
56
55
|
items?: Row[]
|
|
57
56
|
total?: number
|
|
58
57
|
totalPages?: number
|
|
59
|
-
isSuperAdmin?: boolean
|
|
58
|
+
isSuperAdmin?: boolean
|
|
60
59
|
}>(
|
|
61
60
|
`/api/auth/roles?${params.toString()}`,
|
|
62
61
|
undefined,
|
|
@@ -66,7 +65,6 @@ export default function RolesListPage() {
|
|
|
66
65
|
setRows(j.items || [])
|
|
67
66
|
setTotal(j.total || 0)
|
|
68
67
|
setTotalPages(j.totalPages || 1)
|
|
69
|
-
setTotalIsCapped(j?.totalIsCapped === true)
|
|
70
68
|
setIsSuperAdmin(!!j.isSuperAdmin)
|
|
71
69
|
}
|
|
72
70
|
} finally {
|
|
@@ -158,7 +156,7 @@ export default function RolesListPage() {
|
|
|
158
156
|
createLabel={t('auth.roles.list.actions.create', 'Create')}
|
|
159
157
|
/>
|
|
160
158
|
)}
|
|
161
|
-
pagination={{ page, pageSize: 50, total, totalPages,
|
|
159
|
+
pagination={{ page, pageSize: 50, total, totalPages, onPageChange: setPage }}
|
|
162
160
|
isLoading={isLoading}
|
|
163
161
|
/>
|
|
164
162
|
</PageBody>
|
|
@@ -2,10 +2,7 @@ export const metadata = {
|
|
|
2
2
|
requireAuth: true,
|
|
3
3
|
requireFeatures: ['auth.users.edit'],
|
|
4
4
|
pageTitle: 'Edit User',
|
|
5
|
-
|
|
6
|
-
breadcrumb: [
|
|
7
|
-
{ label: 'Users', labelKey: 'auth.nav.users', href: '/backend/users' },
|
|
8
|
-
{ label: 'Edit', labelKey: 'common.edit' },
|
|
9
|
-
],
|
|
5
|
+
breadcrumb: [ { label: 'Users', href: '/backend/users' }, { label: 'Edit' } ],
|
|
10
6
|
}
|
|
11
7
|
|
|
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;
|
|
354
|
+
const call = await apiCall<{ items: Row[]; total: number; totalPages: number; isSuperAdmin?: boolean }>(
|
|
355
355
|
`/api/auth/users?${params}`,
|
|
356
356
|
)
|
|
357
357
|
if (!call.ok) {
|
|
@@ -364,7 +364,6 @@ 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
|
|
368
367
|
const isSuperAdmin = !!usersData?.isSuperAdmin
|
|
369
368
|
const rowsWithOrgNames: Row[] = React.useMemo(() => rows.map(row => ({
|
|
370
369
|
...row,
|
|
@@ -457,7 +456,7 @@ export default function UsersListPage() {
|
|
|
457
456
|
{ id: 'delete', label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },
|
|
458
457
|
]} />
|
|
459
458
|
)}
|
|
460
|
-
pagination={{ page, pageSize: 50, total, totalPages,
|
|
459
|
+
pagination={{ page, pageSize: 50, total, totalPages, onPageChange: setPage }}
|
|
461
460
|
isLoading={isLoading}
|
|
462
461
|
/>
|
|
463
462
|
</PageBody>
|