@open-mercato/core 0.7.0 → 0.7.1-develop.7102.1.b41f7e3e51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/helpers/integration/api.js +13 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/di.js +9 -0
- package/dist/modules/api_keys/di.js.map +7 -0
- package/dist/modules/api_keys/services/principalService.js +31 -0
- package/dist/modules/api_keys/services/principalService.js.map +7 -0
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +11 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/attachment-service.js +313 -0
- package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +6 -2
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +57 -12
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +8 -2
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +4 -1
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/validate.js +55 -0
- package/dist/modules/auth/api/reset/validate.js.map +7 -0
- package/dist/modules/auth/api/roles/acl/route.js +28 -33
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/session/refresh.js +25 -1
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +96 -51
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +13 -5
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/commands/acl.js +254 -0
- package/dist/modules/auth/commands/acl.js.map +7 -0
- package/dist/modules/auth/components/AclEditor.js +39 -30
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +5 -1
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +35 -9
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/userIdFilter.js +16 -0
- package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
- package/dist/modules/auth/services/authService.js +16 -2
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/principalService.js +200 -0
- package/dist/modules/auth/services/principalService.js.map +7 -0
- package/dist/modules/auth/services/rbacService.js +67 -24
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
- package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
- package/dist/modules/business_rules/backend/logs/page.js +3 -1
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +3 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -1
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +7 -1
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +41 -2
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +9 -0
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/services/rateFetchingService.js +6 -1
- package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +4 -1
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +48 -6
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +17 -94
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +8 -25
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +11 -4
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +2 -1
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +38 -1
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +3 -1
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +11 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +51 -9
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +30 -5
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +5 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
- package/dist/modules/customers/backend/customers/people/page.js +4 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +21 -34
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -7
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +6 -5
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +32 -3
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +5 -0
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
- package/dist/modules/customers/lib/closureStage.js +45 -0
- package/dist/modules/customers/lib/closureStage.js.map +7 -0
- package/dist/modules/customers/lib/dealStatus.js +30 -0
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/detailReadAccess.js +12 -0
- package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +100 -2
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +12 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +6 -1
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
- package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +72 -6
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +5 -1
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +5 -1
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +9 -1
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +14 -1
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +99 -12
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/deviceSerialization.js +46 -0
- package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +3 -1
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +9 -1
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +17 -1
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +28 -34
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
- package/dist/modules/devices/backend/devices/userOptions.js +52 -0
- package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
- package/dist/modules/devices/setup.js +6 -2
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +9 -0
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
- package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
- package/dist/modules/directory/services/organizationScopeService.js +56 -0
- package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +4 -2
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +5 -1
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +0 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +4 -1
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +0 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
- package/dist/modules/integrations/data/validators.js +11 -3
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +6 -2
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +29 -1
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +17 -2
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +17 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +15 -0
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +14 -2
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +18 -4
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
- package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +150 -51
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
- package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
- package/dist/modules/query_index/lib/search-tokens.js +79 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +79 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +8 -2
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +1 -0
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
- package/dist/modules/sales/setup.js +2 -0
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +4 -7
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +3 -0
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +121 -9
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +3 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +9 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +3 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +3 -1
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -1
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -0
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +9 -10
- package/src/helpers/integration/api.ts +33 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
- package/src/modules/api_keys/api/keys/route.ts +3 -1
- package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
- package/src/modules/api_keys/di.ts +7 -0
- package/src/modules/api_keys/services/principalService.ts +33 -0
- package/src/modules/attachments/AGENTS.md +15 -0
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
- package/src/modules/attachments/di.ts +16 -0
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/index.ts +10 -0
- package/src/modules/attachments/lib/attachment-service.ts +468 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
- package/src/modules/attachments/lib/upload-limits.ts +6 -2
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
- package/src/modules/audit_logs/services/actionLogService.ts +74 -11
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/auth/api/feature-check.ts +10 -3
- package/src/modules/auth/api/login.ts +9 -1
- package/src/modules/auth/api/reset/validate.ts +57 -0
- package/src/modules/auth/api/roles/acl/route.ts +42 -39
- package/src/modules/auth/api/session/refresh.ts +32 -1
- package/src/modules/auth/api/users/acl/route.ts +177 -53
- package/src/modules/auth/api/users/route.ts +18 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/roles/page.tsx +4 -2
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/users/page.tsx +3 -2
- package/src/modules/auth/commands/acl.ts +495 -0
- package/src/modules/auth/components/AclEditor.tsx +63 -33
- package/src/modules/auth/data/entities.ts +4 -1
- package/src/modules/auth/data/validators.ts +5 -0
- package/src/modules/auth/di.ts +46 -16
- package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
- package/src/modules/auth/i18n/de.json +389 -0
- package/src/modules/auth/i18n/en.json +389 -0
- package/src/modules/auth/i18n/es.json +389 -0
- package/src/modules/auth/i18n/ko.json +389 -0
- package/src/modules/auth/i18n/pl.json +391 -2
- package/src/modules/auth/lib/grantChecks.ts +6 -0
- package/src/modules/auth/lib/userIdFilter.ts +31 -0
- package/src/modules/auth/services/authService.ts +18 -2
- package/src/modules/auth/services/principalService.ts +266 -0
- package/src/modules/auth/services/rbacService.ts +110 -24
- package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
- package/src/modules/business_rules/backend/logs/page.tsx +4 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -1
- package/src/modules/business_rules/backend/sets/page.tsx +4 -1
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
- package/src/modules/communication_channels/di.ts +7 -0
- package/src/modules/communication_channels/lib/adapter.ts +14 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
- package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
- package/src/modules/communication_channels/lib/test-seed.ts +64 -4
- package/src/modules/configs/i18n/de.json +2 -0
- package/src/modules/configs/i18n/en.json +2 -0
- package/src/modules/configs/i18n/es.json +2 -0
- package/src/modules/configs/i18n/ko.json +2 -0
- package/src/modules/configs/i18n/pl.json +2 -0
- package/src/modules/configs/lib/system-status.ts +9 -0
- package/src/modules/currencies/AGENTS.md +3 -0
- package/src/modules/currencies/backend/currencies/page.tsx +4 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
- package/src/modules/currencies/services/README.md +45 -0
- package/src/modules/currencies/services/rateFetchingService.ts +6 -1
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
- package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
- package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
- package/src/modules/customers/ai-tools/people-pack.ts +4 -1
- package/src/modules/customers/api/activities/route.ts +45 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
- package/src/modules/customers/api/companies/[id]/route.ts +24 -107
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
- package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/route.ts +17 -28
- package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
- package/src/modules/customers/api/deals/aggregate/route.ts +14 -4
- package/src/modules/customers/api/deals/map/route.ts +1 -0
- package/src/modules/customers/api/deals/route.ts +50 -1
- package/src/modules/customers/api/entity-roles-factory.ts +8 -4
- package/src/modules/customers/api/interactions/route.ts +8 -2
- package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
- package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
- package/src/modules/customers/api/people/[id]/route.ts +16 -11
- package/src/modules/customers/api/people/check-phone/route.ts +75 -10
- package/src/modules/customers/api/todos/route.ts +27 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
- package/src/modules/customers/backend/customers/people/page.tsx +5 -2
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
- package/src/modules/customers/commands/deals.ts +34 -59
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
- package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
- package/src/modules/customers/components/detail/DealForm.tsx +22 -2
- package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +15 -5
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +50 -9
- package/src/modules/customers/events.ts +5 -0
- package/src/modules/customers/i18n/de.json +9 -1
- package/src/modules/customers/i18n/en.json +9 -1
- package/src/modules/customers/i18n/es.json +9 -1
- package/src/modules/customers/i18n/ko.json +9 -1
- package/src/modules/customers/i18n/pl.json +9 -1
- package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
- package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
- package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
- package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
- package/src/modules/customers/lib/closureStage.ts +76 -0
- package/src/modules/customers/lib/dealStatus.ts +42 -0
- package/src/modules/customers/lib/detailReadAccess.ts +35 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
- package/src/modules/customers/lib/personCompanies.ts +136 -1
- package/src/modules/customers/lib/todoCompatibility.ts +19 -1
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +6 -0
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
- package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
- package/src/modules/data_sync/lib/adapter.ts +36 -0
- package/src/modules/data_sync/lib/sync-engine.ts +113 -5
- package/src/modules/data_sync/workers/sync-export.ts +4 -0
- package/src/modules/data_sync/workers/sync-import.ts +4 -0
- package/src/modules/devices/AGENTS.md +20 -1
- package/src/modules/devices/acl.ts +9 -1
- package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
- package/src/modules/devices/api/admin/devices/route.ts +14 -1
- package/src/modules/devices/api/deviceList.ts +135 -11
- package/src/modules/devices/api/deviceSerialization.ts +50 -0
- package/src/modules/devices/api/openapi.ts +9 -1
- package/src/modules/devices/api/route.ts +9 -1
- package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
- package/src/modules/devices/backend/devices/create/page.tsx +17 -1
- package/src/modules/devices/backend/devices/page.tsx +44 -45
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
- package/src/modules/devices/backend/devices/userOptions.ts +99 -0
- package/src/modules/devices/i18n/de.json +3 -2
- package/src/modules/devices/i18n/en.json +3 -2
- package/src/modules/devices/i18n/es.json +3 -2
- package/src/modules/devices/i18n/ko.json +3 -2
- package/src/modules/devices/i18n/pl.json +3 -2
- package/src/modules/devices/setup.ts +6 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
- package/src/modules/directory/di.ts +14 -2
- package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
- package/src/modules/directory/services/organizationScopeService.ts +85 -0
- package/src/modules/directory/utils/organizationScope.ts +4 -15
- package/src/modules/entities/api/records.ts +2 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
- package/src/modules/eudr/api/plots/route.ts +4 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
- package/src/modules/eudr/commands/statements.ts +0 -3
- package/src/modules/eudr/data/validators.ts +16 -1
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/feature_toggles/defaults.json +0 -8
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
- package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
- package/src/modules/integrations/data/validators.ts +12 -2
- package/src/modules/integrations/i18n/de.json +1 -0
- package/src/modules/integrations/i18n/en.json +1 -0
- package/src/modules/integrations/i18n/es.json +1 -0
- package/src/modules/integrations/i18n/ko.json +1 -0
- package/src/modules/integrations/i18n/pl.json +1 -0
- package/src/modules/integrations/lib/credentials-masking.ts +10 -6
- package/src/modules/messages/api/[id]/route.ts +55 -1
- package/src/modules/messages/api/openapi.ts +20 -0
- package/src/modules/messages/api/route.ts +31 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
- package/src/modules/messages/components/inboxFilters.ts +36 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
- package/src/modules/messages/components/message-detail/types.ts +3 -0
- package/src/modules/messages/components/messageListLabels.ts +52 -3
- package/src/modules/messages/data/validators.ts +43 -4
- package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
- package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
- package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +249 -61
- package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
- package/src/modules/query_index/lib/search-tokens.ts +135 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
- package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
- package/src/modules/sales/commands/documents.ts +93 -0
- package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
- package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
- package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
- package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
- package/src/modules/sales/data/entities.ts +6 -0
- package/src/modules/sales/extension-points.ts +1 -0
- package/src/modules/sales/i18n/de.json +8 -0
- package/src/modules/sales/i18n/en.json +8 -0
- package/src/modules/sales/i18n/es.json +8 -0
- package/src/modules/sales/i18n/ko.json +8 -0
- package/src/modules/sales/i18n/pl.json +8 -0
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
- package/src/modules/sales/setup.ts +2 -0
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
- package/src/modules/sales/widgets/injection-table.ts +4 -7
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
- package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
- package/src/modules/warranty_claims/backend/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +159 -10
- package/src/modules/wms/commands/inventory-actions.ts +3 -0
- package/src/modules/wms/commands/shared.ts +17 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/page.tsx +4 -1
- package/src/modules/workflows/backend/events/page.tsx +4 -1
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/lib/activity-executor.ts +9 -0
|
@@ -3,9 +3,12 @@ import { z } from 'zod'
|
|
|
3
3
|
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
4
4
|
import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
|
|
5
5
|
import { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'
|
|
6
|
-
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
6
|
+
import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'
|
|
7
7
|
import { CustomerEntity } from '../../../data/entities'
|
|
8
8
|
import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
9
|
+
import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
10
|
+
import { isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'
|
|
11
|
+
import { MATCH_CANDIDATE_LIMIT } from '../../../lib/findPeopleByAddresses'
|
|
9
12
|
|
|
10
13
|
const querySchema = z.object({
|
|
11
14
|
digits: z
|
|
@@ -18,6 +21,10 @@ export const metadata = {
|
|
|
18
21
|
GET: { requireAuth: true, requireFeatures: ['customers.people.view'] },
|
|
19
22
|
}
|
|
20
23
|
|
|
24
|
+
function normalizePhoneDigits(value: string | null | undefined): string {
|
|
25
|
+
return typeof value === 'string' ? value.replace(/\D/g, '') : ''
|
|
26
|
+
}
|
|
27
|
+
|
|
21
28
|
export async function GET(req: Request) {
|
|
22
29
|
const url = new URL(req.url)
|
|
23
30
|
const rawQuery: Record<string, string | null> = { digits: url.searchParams.get('digits') }
|
|
@@ -45,18 +52,76 @@ export async function GET(req: Request) {
|
|
|
45
52
|
return NextResponse.json({ match: null })
|
|
46
53
|
}
|
|
47
54
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
// SQL fast path, gated on the encryption toggle: it can only match stored
|
|
56
|
+
// plaintext digits, so running it while tenant data encryption is enabled
|
|
57
|
+
// (the default) would pay a per-row scan that provably returns nothing.
|
|
58
|
+
// When encryption is off it serves the pre-encryption single-query behavior,
|
|
59
|
+
// including legacy plaintext rows. Encrypted rows written before the toggle
|
|
60
|
+
// was turned off are not resolvable by either path by design; plaintext
|
|
61
|
+
// legacy rows under an enabled toggle still resolve through the decrypted
|
|
62
|
+
// scan below, where decryption no-ops on non-ciphertext values.
|
|
63
|
+
if (!isTenantDataEncryptionEnabled()) {
|
|
64
|
+
const qb = em.createQueryBuilder(CustomerEntity, 'person')
|
|
65
|
+
qb.select(['person.id', 'person.displayName'])
|
|
66
|
+
qb.where({ kind: 'person', deletedAt: null })
|
|
67
|
+
qb.andWhere('person.primary_phone is not null')
|
|
68
|
+
qb.andWhere("regexp_replace(person.primary_phone, '\\D', '', 'g') = ?", [parse.data.digits])
|
|
69
|
+
if (auth.tenantId) {
|
|
70
|
+
qb.andWhere({ tenantId: auth.tenantId })
|
|
71
|
+
}
|
|
72
|
+
qb.andWhere({ organizationId: { $in: Array.from(allowedOrgIds) } })
|
|
73
|
+
qb.limit(1)
|
|
74
|
+
|
|
75
|
+
const fastMatch = await qb.getSingleResult()
|
|
76
|
+
if (fastMatch) {
|
|
77
|
+
return NextResponse.json({
|
|
78
|
+
match: {
|
|
79
|
+
id: fastMatch.id,
|
|
80
|
+
displayName: fastMatch.displayName,
|
|
81
|
+
},
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Encryption-on path: primary_phone holds random-IV ciphertext, so digit
|
|
87
|
+
// normalization must run in application code over decrypted rows instead of
|
|
88
|
+
// SQL against the stored column (issue #3840).
|
|
89
|
+
// Encryption-on path: primary_phone holds random-IV ciphertext, so digit
|
|
90
|
+
// normalization must run in application code over decrypted rows instead of
|
|
91
|
+
// SQL against the stored column (issue #3840). The scan is bounded newest-
|
|
92
|
+
// first and projected to the columns the route uses plus tenantId/
|
|
93
|
+
// organizationId, which the decryption path reads per row to resolve each
|
|
94
|
+
// row's own key (a request-level fallback cannot cover multi-org scans or
|
|
95
|
+
// null-tenant sessions). A primary_phone blind index is the exact O(1)
|
|
96
|
+
// follow-up (#5515).
|
|
97
|
+
const where: FilterQuery<CustomerEntity> = {
|
|
98
|
+
kind: 'person',
|
|
99
|
+
deletedAt: null,
|
|
100
|
+
primaryPhone: { $ne: null },
|
|
101
|
+
organizationId: { $in: Array.from(allowedOrgIds) },
|
|
102
|
+
}
|
|
53
103
|
if (auth.tenantId) {
|
|
54
|
-
|
|
104
|
+
where.tenantId = auth.tenantId
|
|
55
105
|
}
|
|
56
|
-
qb.andWhere({ organizationId: { $in: Array.from(allowedOrgIds) } })
|
|
57
|
-
qb.limit(1)
|
|
58
106
|
|
|
59
|
-
const
|
|
107
|
+
const candidates = await findWithDecryption(
|
|
108
|
+
em,
|
|
109
|
+
CustomerEntity,
|
|
110
|
+
where,
|
|
111
|
+
{
|
|
112
|
+
limit: MATCH_CANDIDATE_LIMIT,
|
|
113
|
+
orderBy: { createdAt: 'DESC' },
|
|
114
|
+
fields: ['id', 'displayName', 'primaryPhone', 'tenantId', 'organizationId'],
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
tenantId: auth.tenantId ?? null,
|
|
118
|
+
organizationId: scope?.selectedId ?? auth.orgId ?? null,
|
|
119
|
+
},
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
const match = candidates.find(
|
|
123
|
+
(candidate) => normalizePhoneDigits(candidate.primaryPhone) === parse.data.digits,
|
|
124
|
+
)
|
|
60
125
|
if (!match) {
|
|
61
126
|
return NextResponse.json({ match: null })
|
|
62
127
|
}
|
|
@@ -9,6 +9,7 @@ import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
|
9
9
|
import type { CommandBus } from '@open-mercato/shared/lib/commands'
|
|
10
10
|
import { isCrudHttpError, notFound } from '@open-mercato/shared/lib/crud/errors'
|
|
11
11
|
import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
|
|
12
|
+
import { isUnrestrictedOrganizationScope } from '@open-mercato/shared/lib/auth/organizationAccess'
|
|
12
13
|
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
13
14
|
import {
|
|
14
15
|
runCrudMutationGuardAfterSuccess,
|
|
@@ -233,15 +234,36 @@ async function resolveCanonicalTodoTargetId(
|
|
|
233
234
|
|
|
234
235
|
export async function GET(request: Request): Promise<Response> {
|
|
235
236
|
try {
|
|
236
|
-
const { auth, em, organizationIds, container, selectedOrganizationId } =
|
|
237
|
+
const { auth, em, organizationIds, container, selectedOrganizationId, scope } =
|
|
237
238
|
await resolveCustomersRequestContext(request)
|
|
238
239
|
const query = querySchema.parse(Object.fromEntries(new URL(request.url).searchParams))
|
|
239
240
|
const flags = await resolveCustomerInteractionFeatureFlags(container, auth.tenantId)
|
|
240
241
|
if (!flags.legacyAdapters) {
|
|
241
242
|
return await legacyAdaptersDisabledResponse()
|
|
242
243
|
}
|
|
243
|
-
const queryEngine = container.resolve('queryEngine') as QueryEngine
|
|
244
244
|
const exportAll = parseBooleanToken(query.all) === true
|
|
245
|
+
const isUnrestricted = isUnrestrictedOrganizationScope({
|
|
246
|
+
isSuperAdmin: auth.isSuperAdmin === true,
|
|
247
|
+
allowedOrganizationIds: scope?.allowedIds,
|
|
248
|
+
})
|
|
249
|
+
if (!isUnrestricted && (!organizationIds || organizationIds.length === 0)) {
|
|
250
|
+
logger.warn('customers.todos.list collapsed organization scope', {
|
|
251
|
+
tenantId: auth.tenantId,
|
|
252
|
+
organizationIds,
|
|
253
|
+
selectedId: scope?.selectedId ?? null,
|
|
254
|
+
allowedIdsCount: scope?.allowedIds?.length ?? null,
|
|
255
|
+
})
|
|
256
|
+
return withAdapterHeaders(
|
|
257
|
+
NextResponse.json({
|
|
258
|
+
items: [],
|
|
259
|
+
total: 0,
|
|
260
|
+
page: exportAll ? 1 : query.page,
|
|
261
|
+
pageSize: exportAll ? 0 : query.pageSize,
|
|
262
|
+
totalPages: 1,
|
|
263
|
+
}),
|
|
264
|
+
)
|
|
265
|
+
}
|
|
266
|
+
const queryEngine = container.resolve('queryEngine') as QueryEngine
|
|
245
267
|
const search = normalizeTodoSearch(query.search)
|
|
246
268
|
|
|
247
269
|
if (flags.unified) {
|
|
@@ -255,6 +277,7 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
255
277
|
entityId: query.entityId,
|
|
256
278
|
pagination: exportAll ? null : { page: query.page, pageSize: query.pageSize },
|
|
257
279
|
searchText: search,
|
|
280
|
+
isUnrestricted,
|
|
258
281
|
},
|
|
259
282
|
)
|
|
260
283
|
const total = canonical.total
|
|
@@ -275,6 +298,7 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
275
298
|
const [legacyRows, canonicalRows] = await Promise.all([
|
|
276
299
|
listLegacyTodoRows(em, queryEngine, auth.tenantId, organizationIds, query.entityId, {
|
|
277
300
|
limit: legacyWindow,
|
|
301
|
+
isUnrestricted,
|
|
278
302
|
}),
|
|
279
303
|
listCanonicalTodoRows(
|
|
280
304
|
em,
|
|
@@ -287,6 +311,7 @@ export async function GET(request: Request): Promise<Response> {
|
|
|
287
311
|
includeDeleted: true,
|
|
288
312
|
source: CUSTOMER_INTERACTION_TODO_ADAPTER_SOURCE,
|
|
289
313
|
limit: legacyWindow,
|
|
314
|
+
isUnrestricted,
|
|
290
315
|
},
|
|
291
316
|
),
|
|
292
317
|
])
|
|
@@ -118,6 +118,7 @@ type CompaniesResponse = {
|
|
|
118
118
|
total?: number
|
|
119
119
|
page?: number
|
|
120
120
|
totalPages?: number
|
|
121
|
+
totalIsCapped?: boolean
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
type DictionaryKindKey = CustomerDictionaryKind
|
|
@@ -198,9 +199,10 @@ export default function CustomersCompaniesPage() {
|
|
|
198
199
|
const [sorting, setSorting] = React.useState<SortingState>([])
|
|
199
200
|
const [total, setTotal] = React.useState(0)
|
|
200
201
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
201
|
-
const [
|
|
202
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
202
203
|
const pathname = usePathname()
|
|
203
204
|
const searchParams = useSearchParams()
|
|
205
|
+
const [search, setSearch] = React.useState(() => searchParams?.get('search')?.trim() ?? '')
|
|
204
206
|
// One-shot URL hydration used as the hook's initial value. The hook is the
|
|
205
207
|
// single source of truth from this point on — the page MUST NOT keep a
|
|
206
208
|
// parallel `useState<AdvancedFilterTree>` (see spec "Migration & Backward
|
|
@@ -422,6 +424,7 @@ export default function CustomersCompaniesPage() {
|
|
|
422
424
|
setRows(items.map((item) => mapApiItem(item as Record<string, unknown>)).filter((row): row is CompanyRow => !!row))
|
|
423
425
|
setTotal(typeof payload.total === 'number' ? payload.total : items.length)
|
|
424
426
|
setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)
|
|
427
|
+
setTotalIsCapped(payload?.totalIsCapped === true)
|
|
425
428
|
} catch (err) {
|
|
426
429
|
if (!cancelled) {
|
|
427
430
|
setCacheStatus(null)
|
|
@@ -963,7 +966,7 @@ export default function CustomersCompaniesPage() {
|
|
|
963
966
|
/>
|
|
964
967
|
)}
|
|
965
968
|
virtualized
|
|
966
|
-
pagination={{ page, pageSize, total, totalPages, onPageChange: setPage, pageSizeOptions: [10, 25, 50, 100], onPageSizeChange: handlePageSizeChange, cacheStatus }}
|
|
969
|
+
pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage, pageSizeOptions: [10, 25, 50, 100], onPageSizeChange: handlePageSizeChange, cacheStatus }}
|
|
967
970
|
isLoading={isLoading}
|
|
968
971
|
/>
|
|
969
972
|
<AdvancedFilterPanel
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import * as React from 'react'
|
|
4
4
|
import { extensionPoints } from '@open-mercato/core/modules/customers/extension-points'
|
|
5
5
|
import Link from 'next/link'
|
|
6
|
-
import { Building2, UserSearch, Users } from 'lucide-react'
|
|
6
|
+
import { Building2, FileText, Hash, UserSearch, Users } from 'lucide-react'
|
|
7
7
|
import { EmptyState } from '@open-mercato/ui/primitives/empty-state'
|
|
8
8
|
import { useRouter, useSearchParams, usePathname } from 'next/navigation'
|
|
9
9
|
import { Page, PageBody } from '@open-mercato/ui/backend/Page'
|
|
@@ -12,7 +12,7 @@ import { AttachmentsSection, ErrorMessage, LoadingMessage, NotesSection, RecordN
|
|
|
12
12
|
import { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'
|
|
13
13
|
import { buildRecordInjectionContext, useSetCurrentRecordInjectionContext } from '@open-mercato/ui/backend/injection/recordContext'
|
|
14
14
|
import { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'
|
|
15
|
-
import { CollapsibleZoneLayout } from '@open-mercato/ui/backend/crud/CollapsibleZoneLayout'
|
|
15
|
+
import { CollapsibleZoneLayout, type ZoneSectionDescriptor } from '@open-mercato/ui/backend/crud/CollapsibleZoneLayout'
|
|
16
16
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
17
17
|
import { createTranslatorWithFallback } from '@open-mercato/shared/lib/i18n/translate'
|
|
18
18
|
import { E } from '#generated/entities.ids.generated'
|
|
@@ -57,6 +57,10 @@ export default function DealDetailPage({ params }: { params?: { id?: string } })
|
|
|
57
57
|
const pathname = usePathname()
|
|
58
58
|
const { confirm, ConfirmDialogElement } = useConfirmDialog()
|
|
59
59
|
const detailTranslator = React.useMemo(() => createTranslatorWithFallback(t), [t])
|
|
60
|
+
const zoneSections = React.useMemo<ZoneSectionDescriptor[]>(() => [
|
|
61
|
+
{ id: 'details', icon: FileText, label: t('customers.people.detail.deals.form.details', 'Deal details') },
|
|
62
|
+
{ id: 'custom', icon: Hash, label: t('customers.people.detail.deals.form.customFields', 'Custom fields') },
|
|
63
|
+
], [t])
|
|
60
64
|
|
|
61
65
|
const { data, setData, isLoading, error, isNotFound, loadData } = useDealData(id)
|
|
62
66
|
const [isDirty, setIsDirty] = React.useState(false)
|
|
@@ -664,6 +668,7 @@ export default function DealDetailPage({ params }: { params?: { id?: string } })
|
|
|
664
668
|
pageType="deal-detail-v3"
|
|
665
669
|
entityName={dealName}
|
|
666
670
|
isDirty={isDirty}
|
|
671
|
+
sections={zoneSections}
|
|
667
672
|
zone1DefaultWidth="540px"
|
|
668
673
|
zone1={zone1Content}
|
|
669
674
|
zone2={zone2Content}
|
|
@@ -125,6 +125,7 @@ type DealsResponse = {
|
|
|
125
125
|
items?: Array<Record<string, unknown>>
|
|
126
126
|
total?: number
|
|
127
127
|
totalPages?: number
|
|
128
|
+
totalIsCapped?: boolean
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
type FilterOption = { value: string; label: string }
|
|
@@ -210,6 +211,7 @@ export default function CustomersDealsPage() {
|
|
|
210
211
|
const [sorting, setSorting] = React.useState<import('@tanstack/react-table').SortingState>([])
|
|
211
212
|
const [total, setTotal] = React.useState(0)
|
|
212
213
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
214
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
213
215
|
const [search, setSearch] = React.useState(() => searchParams?.get('search')?.trim() ?? '')
|
|
214
216
|
const [isLoading, setIsLoading] = React.useState(false)
|
|
215
217
|
const [reloadToken, setReloadToken] = React.useState(0)
|
|
@@ -397,6 +399,7 @@ export default function CustomersDealsPage() {
|
|
|
397
399
|
setRows(mapped)
|
|
398
400
|
setTotal(typeof payload.total === 'number' ? payload.total : mapped.length)
|
|
399
401
|
setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)
|
|
402
|
+
setTotalIsCapped(payload.totalIsCapped === true)
|
|
400
403
|
} catch (err) {
|
|
401
404
|
if (!cancelled) {
|
|
402
405
|
setCacheStatus(null)
|
|
@@ -412,10 +415,12 @@ export default function CustomersDealsPage() {
|
|
|
412
415
|
}, [queryParams, reloadToken, scopeVersion, t])
|
|
413
416
|
|
|
414
417
|
React.useEffect(() => {
|
|
415
|
-
|
|
418
|
+
// A capped totalPages is a floor — pages past it hold reachable rows, so
|
|
419
|
+
// clamping would bounce a deep-linked user off data that exists.
|
|
420
|
+
if (!totalIsCapped && totalPages > 0 && page > totalPages) {
|
|
416
421
|
setPage(totalPages)
|
|
417
422
|
}
|
|
418
|
-
}, [page, totalPages])
|
|
423
|
+
}, [page, totalPages, totalIsCapped])
|
|
419
424
|
|
|
420
425
|
const queryRef = React.useRef(searchParams?.toString() ?? '')
|
|
421
426
|
React.useEffect(() => {
|
|
@@ -1136,6 +1141,7 @@ export default function CustomersDealsPage() {
|
|
|
1136
1141
|
pageSize,
|
|
1137
1142
|
total,
|
|
1138
1143
|
totalPages,
|
|
1144
|
+
totalIsCapped,
|
|
1139
1145
|
onPageChange: (nextPage) => setPage(nextPage),
|
|
1140
1146
|
pageSizeOptions: [10, 25, 50, 100],
|
|
1141
1147
|
onPageSizeChange: handlePageSizeChange,
|
|
@@ -7,6 +7,7 @@ import type { RowActionItem } from '@open-mercato/ui/backend/RowActions'
|
|
|
7
7
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
8
8
|
import { translateWithFallback } from '@open-mercato/shared/lib/i18n/translate'
|
|
9
9
|
import type { FilterOptionTone } from '@open-mercato/shared/lib/query/advanced-filter'
|
|
10
|
+
import { toneToDotClass } from './toneClasses'
|
|
10
11
|
import { DealCard, type DealCardData } from './DealCard'
|
|
11
12
|
import { DashedTileButton } from './DashedTileButton'
|
|
12
13
|
import { LANE_WIDTH_PX } from './constants'
|
|
@@ -52,15 +53,10 @@ type LaneProps = {
|
|
|
52
53
|
onResetWidth?: (stageId: string) => void
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
// 4px color bar tone —
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
warning: 'bg-status-warning-icon',
|
|
60
|
-
info: 'bg-status-info-icon',
|
|
61
|
-
neutral: 'bg-status-neutral-icon',
|
|
62
|
-
brand: 'bg-brand-violet',
|
|
63
|
-
pink: 'bg-status-pink-icon',
|
|
56
|
+
// 4px color bar tone — saturated icon tokens shared with the status filter pills
|
|
57
|
+
// (toneClasses.ts) so the lane bar and the filter dots stay in lockstep (#5107 review).
|
|
58
|
+
function getAccentClass(tone: FilterOptionTone | null): string {
|
|
59
|
+
return toneToDotClass(tone, 'bg-border')
|
|
64
60
|
}
|
|
65
61
|
|
|
66
62
|
// Count pill bg uses very-light status background, text uses status text color
|
|
@@ -74,11 +70,6 @@ const COUNT_BADGE_TONE_CLASS: Record<FilterOptionTone, string> = {
|
|
|
74
70
|
pink: 'bg-status-pink-bg text-status-pink-text',
|
|
75
71
|
}
|
|
76
72
|
|
|
77
|
-
function getAccentClass(tone: FilterOptionTone | null): string {
|
|
78
|
-
if (tone && tone in ACCENT_TONE_CLASS) return ACCENT_TONE_CLASS[tone]
|
|
79
|
-
return 'bg-border'
|
|
80
|
-
}
|
|
81
|
-
|
|
82
73
|
function getCountBadgeClass(tone: FilterOptionTone | null): string {
|
|
83
74
|
if (tone && tone in COUNT_BADGE_TONE_CLASS) return COUNT_BADGE_TONE_CLASS[tone]
|
|
84
75
|
return 'bg-muted text-muted-foreground'
|
package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx
CHANGED
|
@@ -10,45 +10,70 @@ import {
|
|
|
10
10
|
} from '@open-mercato/ui/primitives/popover'
|
|
11
11
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
12
12
|
import { translateWithFallback } from '@open-mercato/shared/lib/i18n/translate'
|
|
13
|
+
import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
14
|
+
import { mapDictionaryColorToTone } from '@open-mercato/shared/lib/query/advanced-filter'
|
|
15
|
+
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
16
|
+
import { useCustomerDictionary } from '../../../../../components/detail/hooks/useCustomerDictionary'
|
|
17
|
+
import { canonicalDealStatus } from '../../../../../lib/dealStatus'
|
|
18
|
+
import { toneToDotClass } from './toneClasses'
|
|
13
19
|
import { ChipButton } from './ChipButton'
|
|
14
20
|
import { FilterPopoverShell } from './FilterPopoverShell'
|
|
15
21
|
|
|
16
22
|
/**
|
|
17
23
|
* Filter options exposed to the operator.
|
|
18
24
|
*
|
|
19
|
-
* The deal `status` column
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
25
|
+
* The deal `status` column is dictionary-driven (`deal-statuses`); the seeded dictionary
|
|
26
|
+
* carries five values (`open`, `closed`, `win`, `loose`, `in_progress`) plus any
|
|
27
|
+
* tenant-custom entries. We render every dictionary entry de-duplicated by canonical
|
|
28
|
+
* spelling so the kanban Status pill stays aligned with the list page's advanced filter
|
|
29
|
+
* (which also uses the dictionary). A hard-coded fallback keeps the popover usable while
|
|
30
|
+
* the dictionary is loading or when a tenant has no entries.
|
|
31
|
+
*
|
|
32
|
+
* `won` / `lost` are accepted as aliases for `win` / `loose` at the API layer (see
|
|
33
|
+
* `lib/dealStatus.ts:expandDealStatusAliases`, shared by the deals list route and the
|
|
34
|
+
* kanban aggregate route). The UI only exposes the canonical values to avoid duplicate
|
|
35
|
+
* pills, but `canonicalDealStatus` normalizes any alias passed in through `values` so
|
|
36
|
+
* the chip and draft selection render the correct label.
|
|
26
37
|
*/
|
|
27
|
-
const
|
|
38
|
+
const FALLBACK_STATUS_OPTIONS: Array<{
|
|
28
39
|
value: string
|
|
29
40
|
labelKey: string
|
|
30
41
|
labelFallback: string
|
|
31
|
-
/** Tone selects the small ●-dot color on the pill (per Figma: green / amber / gray) */
|
|
32
42
|
dotClass: string
|
|
33
43
|
}> = [
|
|
34
44
|
{
|
|
35
45
|
value: 'open',
|
|
36
46
|
labelKey: 'customers.deals.kanban.filter.status.open',
|
|
37
47
|
labelFallback: 'Open',
|
|
38
|
-
|
|
48
|
+
// Tones mirror mapDictionaryColorToTone over the seeded dictionary colors
|
|
49
|
+
// (#2563eb → info, #22c55e → success, #ef4444 → error) so the fallback pills
|
|
50
|
+
// render identically to the dictionary-driven ones.
|
|
51
|
+
dotClass: 'bg-status-info-icon',
|
|
39
52
|
},
|
|
40
53
|
{
|
|
41
54
|
value: 'win',
|
|
42
55
|
labelKey: 'customers.deals.kanban.filter.status.won',
|
|
43
56
|
labelFallback: 'Won',
|
|
44
|
-
dotClass: 'bg-status-
|
|
57
|
+
dotClass: 'bg-status-success-icon',
|
|
45
58
|
},
|
|
46
59
|
{
|
|
47
60
|
value: 'loose',
|
|
48
61
|
labelKey: 'customers.deals.kanban.filter.status.lost',
|
|
49
62
|
labelFallback: 'Lost',
|
|
63
|
+
dotClass: 'bg-status-error-icon',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
value: 'closed',
|
|
67
|
+
labelKey: 'customers.deals.kanban.filter.status.closed',
|
|
68
|
+
labelFallback: 'Closed',
|
|
50
69
|
dotClass: 'bg-status-neutral-icon',
|
|
51
70
|
},
|
|
71
|
+
{
|
|
72
|
+
value: 'in_progress',
|
|
73
|
+
labelKey: 'customers.deals.kanban.filter.status.inProgress',
|
|
74
|
+
labelFallback: 'In progress',
|
|
75
|
+
dotClass: 'bg-status-warning-icon',
|
|
76
|
+
},
|
|
52
77
|
]
|
|
53
78
|
|
|
54
79
|
type StatusFilterPopoverProps = {
|
|
@@ -58,29 +83,75 @@ type StatusFilterPopoverProps = {
|
|
|
58
83
|
|
|
59
84
|
export function StatusFilterPopover({ values, onApply }: StatusFilterPopoverProps): React.ReactElement {
|
|
60
85
|
const t = useT()
|
|
86
|
+
const scopeVersion = useOrganizationScopeVersion()
|
|
87
|
+
const { data: dictionaryData, isLoading: dictionaryLoading } = useCustomerDictionary(
|
|
88
|
+
'deal-statuses',
|
|
89
|
+
scopeVersion,
|
|
90
|
+
)
|
|
61
91
|
const [open, setOpen] = React.useState(false)
|
|
62
|
-
const
|
|
92
|
+
const normalizedValues = React.useMemo(
|
|
93
|
+
() => Array.from(new Set(values.map(canonicalDealStatus))),
|
|
94
|
+
[values],
|
|
95
|
+
)
|
|
96
|
+
const [draft, setDraft] = React.useState<string[]>(normalizedValues)
|
|
63
97
|
|
|
64
98
|
React.useEffect(() => {
|
|
65
|
-
if (open) setDraft(
|
|
66
|
-
}, [open,
|
|
99
|
+
if (open) setDraft(normalizedValues)
|
|
100
|
+
}, [open, normalizedValues])
|
|
101
|
+
|
|
102
|
+
const statusOptions = React.useMemo(() => {
|
|
103
|
+
const entries = dictionaryData?.entries
|
|
104
|
+
if (entries && entries.length > 0) {
|
|
105
|
+
const byCanonical = new Map<string, { value: string; label: string; dotClass: string }>()
|
|
106
|
+
for (const entry of entries) {
|
|
107
|
+
const canonical = canonicalDealStatus(entry.value)
|
|
108
|
+
if (byCanonical.has(canonical)) continue
|
|
109
|
+
const tone = mapDictionaryColorToTone(entry.color ?? null)
|
|
110
|
+
byCanonical.set(canonical, {
|
|
111
|
+
value: canonical,
|
|
112
|
+
label: entry.label,
|
|
113
|
+
dotClass: toneToDotClass(tone),
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
// Sort by label exactly like the List page's advanced filter
|
|
117
|
+
// (backend/customers/deals/page.tsx dictionaryOptions) so both surfaces render
|
|
118
|
+
// the same pills in the same order.
|
|
119
|
+
return Array.from(byCanonical.values()).sort((a, b) =>
|
|
120
|
+
a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }),
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
return FALLBACK_STATUS_OPTIONS.map((entry) => ({
|
|
124
|
+
value: entry.value,
|
|
125
|
+
label: translateWithFallback(t, entry.labelKey, entry.labelFallback),
|
|
126
|
+
dotClass: entry.dotClass,
|
|
127
|
+
}))
|
|
128
|
+
}, [dictionaryData, t])
|
|
129
|
+
|
|
130
|
+
const labelByValue = React.useMemo(() => {
|
|
131
|
+
const map = new Map<string, string>()
|
|
132
|
+
for (const option of statusOptions) {
|
|
133
|
+
map.set(option.value, option.label)
|
|
134
|
+
}
|
|
135
|
+
for (const fallback of FALLBACK_STATUS_OPTIONS) {
|
|
136
|
+
if (!map.has(fallback.value)) {
|
|
137
|
+
map.set(fallback.value, translateWithFallback(t, fallback.labelKey, fallback.labelFallback))
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return map
|
|
141
|
+
}, [statusOptions, t])
|
|
67
142
|
|
|
68
143
|
const chipLabel = translateWithFallback(t, 'customers.deals.kanban.filter.status', 'Status')
|
|
69
144
|
const chipValue =
|
|
70
|
-
|
|
145
|
+
normalizedValues.length === 0
|
|
71
146
|
? translateWithFallback(t, 'customers.deals.kanban.filter.all', 'All')
|
|
72
|
-
:
|
|
73
|
-
.map((value) =>
|
|
74
|
-
const option = STATUS_OPTIONS.find((entry) => entry.value === value)
|
|
75
|
-
return option
|
|
76
|
-
? translateWithFallback(t, option.labelKey, option.labelFallback)
|
|
77
|
-
: value
|
|
78
|
-
})
|
|
147
|
+
: normalizedValues
|
|
148
|
+
.map((value) => labelByValue.get(value) ?? value)
|
|
79
149
|
.join(', ')
|
|
80
150
|
|
|
81
151
|
const toggleDraft = (value: string) => {
|
|
152
|
+
const normalized = canonicalDealStatus(value)
|
|
82
153
|
setDraft((prev) =>
|
|
83
|
-
prev.includes(
|
|
154
|
+
prev.includes(normalized) ? prev.filter((entry) => entry !== normalized) : [...prev, normalized],
|
|
84
155
|
)
|
|
85
156
|
}
|
|
86
157
|
|
|
@@ -101,7 +172,7 @@ export function StatusFilterPopover({ values, onApply }: StatusFilterPopoverProp
|
|
|
101
172
|
return (
|
|
102
173
|
<Popover open={open} onOpenChange={setOpen}>
|
|
103
174
|
<PopoverTrigger asChild>
|
|
104
|
-
<ChipButton label={chipLabel} value={chipValue} active={
|
|
175
|
+
<ChipButton label={chipLabel} value={chipValue} active={normalizedValues.length > 0} />
|
|
105
176
|
</PopoverTrigger>
|
|
106
177
|
<PopoverContent
|
|
107
178
|
className="w-96 rounded-2xl border-border bg-transparent p-0 shadow-xl"
|
|
@@ -133,9 +204,19 @@ export function StatusFilterPopover({ values, onApply }: StatusFilterPopoverProp
|
|
|
133
204
|
{translateWithFallback(t, 'customers.deals.kanban.filter.status', 'Status')}
|
|
134
205
|
</span>
|
|
135
206
|
<div className="flex flex-wrap items-center gap-x-1.5 gap-y-2">
|
|
136
|
-
{
|
|
207
|
+
{dictionaryLoading ? (
|
|
208
|
+
<span className="flex items-center gap-2 text-xs text-muted-foreground" role="status" aria-live="polite">
|
|
209
|
+
<Spinner className="size-3" />
|
|
210
|
+
{translateWithFallback(
|
|
211
|
+
t,
|
|
212
|
+
'customers.deals.kanban.filter.status.loading',
|
|
213
|
+
'Loading statuses…',
|
|
214
|
+
)}
|
|
215
|
+
</span>
|
|
216
|
+
) : (
|
|
217
|
+
statusOptions.map((option) => {
|
|
137
218
|
const isSelected = draft.includes(option.value)
|
|
138
|
-
const label =
|
|
219
|
+
const label = option.label
|
|
139
220
|
return (
|
|
140
221
|
<Button
|
|
141
222
|
key={option.value}
|
|
@@ -160,7 +241,8 @@ export function StatusFilterPopover({ values, onApply }: StatusFilterPopoverProp
|
|
|
160
241
|
) : null}
|
|
161
242
|
</Button>
|
|
162
243
|
)
|
|
163
|
-
|
|
244
|
+
})
|
|
245
|
+
)}
|
|
164
246
|
</div>
|
|
165
247
|
</FilterPopoverShell>
|
|
166
248
|
</PopoverContent>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FilterOptionTone } from '@open-mercato/shared/lib/query/advanced-filter'
|
|
2
|
+
|
|
3
|
+
// Saturated icon tokens shared by the kanban lane accent bar and the status filter
|
|
4
|
+
// pills, so both surfaces render the same tone identically (#5107 review).
|
|
5
|
+
export const TONE_DOT_CLASS: Record<FilterOptionTone, string> = {
|
|
6
|
+
success: 'bg-status-success-icon',
|
|
7
|
+
error: 'bg-status-error-icon',
|
|
8
|
+
warning: 'bg-status-warning-icon',
|
|
9
|
+
info: 'bg-status-info-icon',
|
|
10
|
+
neutral: 'bg-status-neutral-icon',
|
|
11
|
+
brand: 'bg-brand-violet',
|
|
12
|
+
pink: 'bg-status-pink-icon',
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function toneToDotClass(
|
|
16
|
+
tone: FilterOptionTone | null | undefined,
|
|
17
|
+
fallback = 'bg-status-neutral-icon',
|
|
18
|
+
): string {
|
|
19
|
+
if (tone && tone in TONE_DOT_CLASS) return TONE_DOT_CLASS[tone]
|
|
20
|
+
return fallback
|
|
21
|
+
}
|
|
@@ -125,6 +125,7 @@ type PeopleResponse = {
|
|
|
125
125
|
total?: number
|
|
126
126
|
page?: number
|
|
127
127
|
totalPages?: number
|
|
128
|
+
totalIsCapped?: boolean
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
type DictionaryKindKey = CustomerDictionaryKind
|
|
@@ -206,9 +207,10 @@ export default function CustomersPeoplePage() {
|
|
|
206
207
|
const [sorting, setSorting] = React.useState<SortingState>([])
|
|
207
208
|
const [total, setTotal] = React.useState(0)
|
|
208
209
|
const [totalPages, setTotalPages] = React.useState(1)
|
|
209
|
-
const [
|
|
210
|
+
const [totalIsCapped, setTotalIsCapped] = React.useState(false)
|
|
210
211
|
const pathname = usePathname()
|
|
211
212
|
const searchParams = useSearchParams()
|
|
213
|
+
const [search, setSearch] = React.useState(() => searchParams?.get('search')?.trim() ?? '')
|
|
212
214
|
// One-shot URL hydration used as the hook's initial value. The hook is the
|
|
213
215
|
// single source of truth from this point on — the page MUST NOT keep a
|
|
214
216
|
// parallel `useState<AdvancedFilterTree>` (see spec "Migration & Backward
|
|
@@ -435,6 +437,7 @@ export default function CustomersPeoplePage() {
|
|
|
435
437
|
setRows(items.map((item) => mapApiItem(item as Record<string, unknown>)).filter((row): row is PersonRow => !!row))
|
|
436
438
|
setTotal(typeof payload.total === 'number' ? payload.total : items.length)
|
|
437
439
|
setTotalPages(typeof payload.totalPages === 'number' ? payload.totalPages : 1)
|
|
440
|
+
setTotalIsCapped(payload?.totalIsCapped === true)
|
|
438
441
|
} catch (err) {
|
|
439
442
|
if (!cancelled) {
|
|
440
443
|
setCacheStatus(null)
|
|
@@ -990,7 +993,7 @@ export default function CustomersPeoplePage() {
|
|
|
990
993
|
/>
|
|
991
994
|
)}
|
|
992
995
|
virtualized
|
|
993
|
-
pagination={{ page, pageSize, total, totalPages, onPageChange: setPage, cacheStatus, pageSizeOptions: [10, 25, 50, 100], onPageSizeChange: handlePageSizeChange }}
|
|
996
|
+
pagination={{ page, pageSize, total, totalPages, totalIsCapped, onPageChange: setPage, cacheStatus, pageSizeOptions: [10, 25, 50, 100], onPageSizeChange: handlePageSizeChange }}
|
|
994
997
|
isLoading={isLoading}
|
|
995
998
|
/>
|
|
996
999
|
<AdvancedFilterPanel
|
|
@@ -40,16 +40,24 @@ export function useEmailDuplicateCheck(
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
const normalized = trimmed.toLowerCase()
|
|
43
|
+
const excludedId = typeof recordId === 'string' && recordId.trim().length ? recordId.trim() : null
|
|
43
44
|
let cancelled = false
|
|
44
45
|
const controller = new AbortController()
|
|
45
46
|
const timer = window.setTimeout(async () => {
|
|
46
47
|
setChecking(true)
|
|
47
48
|
try {
|
|
48
|
-
const
|
|
49
|
+
const params = [
|
|
49
50
|
matchMode === 'prefix'
|
|
50
51
|
? `emailStartsWith=${encodeURIComponent(normalized)}`
|
|
51
|
-
: `email=${encodeURIComponent(normalized)}
|
|
52
|
-
|
|
52
|
+
: `email=${encodeURIComponent(normalized)}`,
|
|
53
|
+
'pageSize=5',
|
|
54
|
+
'page=1',
|
|
55
|
+
]
|
|
56
|
+
// The record being edited is never its own duplicate (#5534). Excluding it in the
|
|
57
|
+
// query — not only in the client-side scan below — also stops it from consuming one
|
|
58
|
+
// of the five returned slots and hiding a genuine duplicate.
|
|
59
|
+
if (excludedId) params.push(`excludeIds=${encodeURIComponent(excludedId)}`)
|
|
60
|
+
const call = await apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.join('&')}`, {
|
|
53
61
|
signal: controller.signal,
|
|
54
62
|
})
|
|
55
63
|
if (!call.ok) {
|
|
@@ -72,7 +80,7 @@ export function useEmailDuplicateCheck(
|
|
|
72
80
|
})
|
|
73
81
|
.filter((entry: EmailDuplicateMatch | null): entry is EmailDuplicateMatch => !!entry)
|
|
74
82
|
.find((entry: EmailDuplicateMatch) => {
|
|
75
|
-
if (entry.id ===
|
|
83
|
+
if (excludedId && entry.id === excludedId) return false
|
|
76
84
|
return matchMode === 'prefix'
|
|
77
85
|
? entry.email.startsWith(normalized)
|
|
78
86
|
: entry.email === normalized
|