@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
|
@@ -45,6 +45,13 @@ import type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/l
|
|
|
45
45
|
import { E } from '#generated/entities.ids.generated'
|
|
46
46
|
import { findWithDecryption, findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
47
47
|
import { isMissingDealStageTransitionTable, warnMissingDealStageTransitionTable } from '../lib/dealStageTransitionTable'
|
|
48
|
+
import {
|
|
49
|
+
dealClosureOutcomeFromStatus,
|
|
50
|
+
loadClosurePipelineStageSnapshot,
|
|
51
|
+
type DealClosureOutcome,
|
|
52
|
+
type PipelineStageSnapshot,
|
|
53
|
+
} from '../lib/closureStage'
|
|
54
|
+
import { canonicalDealStatus, isClosedDealStatus } from '../lib/dealStatus'
|
|
48
55
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
49
56
|
|
|
50
57
|
const logger = createLogger('customers')
|
|
@@ -65,20 +72,6 @@ const dealCrudEvents: CrudEventsConfig = {
|
|
|
65
72
|
}),
|
|
66
73
|
}
|
|
67
74
|
|
|
68
|
-
type PipelineStageSnapshot = {
|
|
69
|
-
id: string
|
|
70
|
-
pipelineId: string
|
|
71
|
-
label: string
|
|
72
|
-
order: number
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
type DealClosureOutcome = 'won' | 'lost'
|
|
76
|
-
|
|
77
|
-
const TERMINAL_PIPELINE_STAGE_LABELS: Record<DealClosureOutcome, ReadonlySet<string>> = {
|
|
78
|
-
won: new Set(['won', 'win', 'closed won', 'closed win']),
|
|
79
|
-
lost: new Set(['lost', 'loose', 'closed lost', 'closed loose']),
|
|
80
|
-
}
|
|
81
|
-
|
|
82
75
|
type DealStageTransitionSnapshot = {
|
|
83
76
|
id: string
|
|
84
77
|
pipelineId: string
|
|
@@ -123,54 +116,14 @@ async function loadPipelineStageSnapshot(
|
|
|
123
116
|
}
|
|
124
117
|
}
|
|
125
118
|
|
|
126
|
-
function normalizePipelineStageLabel(value: string): string {
|
|
127
|
-
return value
|
|
128
|
-
.trim()
|
|
129
|
-
.toLowerCase()
|
|
130
|
-
.replace(/[^a-z0-9]+/g, ' ')
|
|
131
|
-
.trim()
|
|
132
|
-
}
|
|
133
|
-
|
|
134
119
|
function resolveRequestedClosureOutcome(input: DealUpdateInput): DealClosureOutcome | null {
|
|
135
120
|
if (input.closureOutcome === 'won' || input.closureOutcome === 'lost') {
|
|
136
121
|
return input.closureOutcome
|
|
137
122
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
async function loadClosurePipelineStageSnapshot(
|
|
144
|
-
em: EntityManager,
|
|
145
|
-
input: {
|
|
146
|
-
pipelineId: string | null
|
|
147
|
-
closureOutcome: DealClosureOutcome
|
|
148
|
-
tenantId: string
|
|
149
|
-
organizationId: string
|
|
150
|
-
},
|
|
151
|
-
): Promise<PipelineStageSnapshot | null> {
|
|
152
|
-
if (!input.pipelineId) return null
|
|
153
|
-
|
|
154
|
-
const stages = await findWithDecryption(
|
|
155
|
-
em,
|
|
156
|
-
CustomerPipelineStage,
|
|
157
|
-
{
|
|
158
|
-
pipelineId: input.pipelineId,
|
|
159
|
-
tenantId: input.tenantId,
|
|
160
|
-
organizationId: input.organizationId,
|
|
161
|
-
},
|
|
162
|
-
{ orderBy: { order: 'ASC' } },
|
|
163
|
-
{ tenantId: input.tenantId, organizationId: input.organizationId },
|
|
164
|
-
)
|
|
165
|
-
const aliases = TERMINAL_PIPELINE_STAGE_LABELS[input.closureOutcome]
|
|
166
|
-
const stage = stages.find((candidate) => aliases.has(normalizePipelineStageLabel(candidate.label)))
|
|
167
|
-
if (!stage) return null
|
|
168
|
-
return {
|
|
169
|
-
id: stage.id,
|
|
170
|
-
pipelineId: stage.pipelineId,
|
|
171
|
-
label: stage.label,
|
|
172
|
-
order: stage.order,
|
|
173
|
-
}
|
|
123
|
+
// `win` / `loose` are what the UI closure flows persist; `won` / `lost` are the
|
|
124
|
+
// spellings the AI stage tool persists. Both must derive the same closure outcome so
|
|
125
|
+
// every closed deal lands in the pipeline's terminal stage (#5107).
|
|
126
|
+
return dealClosureOutcomeFromStatus(input.status)
|
|
174
127
|
}
|
|
175
128
|
|
|
176
129
|
async function resolvePipelineStageValue(
|
|
@@ -739,6 +692,7 @@ const updateDealCommand: CommandHandler<DealUpdateInput, { dealId: string }> = {
|
|
|
739
692
|
let nextPipelineStageLabel: string | null = null
|
|
740
693
|
let resolvedCurrentPipelineStageLabel: string | null = null
|
|
741
694
|
let pipelineStageAssignmentChanged = false
|
|
695
|
+
let requestedClosureOutcome: DealClosureOutcome | null = null
|
|
742
696
|
|
|
743
697
|
await runCrudCommandWrite({
|
|
744
698
|
ctx,
|
|
@@ -759,7 +713,7 @@ const updateDealCommand: CommandHandler<DealUpdateInput, { dealId: string }> = {
|
|
|
759
713
|
}),
|
|
760
714
|
phases: [
|
|
761
715
|
async () => {
|
|
762
|
-
|
|
716
|
+
requestedClosureOutcome = resolveRequestedClosureOutcome(parsed)
|
|
763
717
|
const requestedPipelineId =
|
|
764
718
|
parsed.pipelineId !== undefined ? parsed.pipelineId ?? null : record.pipelineId ?? null
|
|
765
719
|
const closureStageSnapshot =
|
|
@@ -828,6 +782,27 @@ const updateDealCommand: CommandHandler<DealUpdateInput, { dealId: string }> = {
|
|
|
828
782
|
if (parsed.ownerUserId !== undefined) record.ownerUserId = parsed.ownerUserId ?? null
|
|
829
783
|
if (parsed.source !== undefined) record.source = parsed.source ?? null
|
|
830
784
|
if (parsed.closureOutcome !== undefined) record.closureOutcome = parsed.closureOutcome ?? null
|
|
785
|
+
// Derive the outcome only when the status spelling alone drives the closure —
|
|
786
|
+
// the same condition that triggers the terminal-stage move below — so an
|
|
787
|
+
// explicit non-terminal pipelineStageId never produces a half-closed state.
|
|
788
|
+
else if (requestedClosureOutcome && parsed.pipelineStageId === undefined) {
|
|
789
|
+
record.closureOutcome = requestedClosureOutcome
|
|
790
|
+
} else if (
|
|
791
|
+
parsed.status !== undefined &&
|
|
792
|
+
!requestedClosureOutcome &&
|
|
793
|
+
// `closed` is a seeded dictionary status: saving it is not a reopen, so only
|
|
794
|
+
// a genuinely non-closed status clears stored closure state — and only when
|
|
795
|
+
// the deal actually carries any (a no-op status echo must not wipe loss data).
|
|
796
|
+
// Canonicalize first: `dealClosureOutcomeFromStatus` above already matches
|
|
797
|
+
// case-insensitively, so matching `closed` exactly would let `Closed` through
|
|
798
|
+
// this guard and null the operator's loss notes.
|
|
799
|
+
!isClosedDealStatus(canonicalDealStatus(parsed.status)) &&
|
|
800
|
+
record.closureOutcome !== null
|
|
801
|
+
) {
|
|
802
|
+
record.closureOutcome = null
|
|
803
|
+
if (parsed.lossReasonId === undefined) record.lossReasonId = null
|
|
804
|
+
if (parsed.lossNotes === undefined) record.lossNotes = null
|
|
805
|
+
}
|
|
831
806
|
if (parsed.lossReasonId !== undefined) record.lossReasonId = parsed.lossReasonId ?? null
|
|
832
807
|
if (parsed.lossNotes !== undefined) record.lossNotes = parsed.lossNotes ?? null
|
|
833
808
|
},
|
|
@@ -114,7 +114,7 @@ type InteractionSnapshot = {
|
|
|
114
114
|
allDay: boolean | null
|
|
115
115
|
recurrenceRule: string | null
|
|
116
116
|
recurrenceEnd: Date | null
|
|
117
|
-
participants: Array<{ userId
|
|
117
|
+
participants: Array<{ userId?: string; name?: string; email?: string; status?: string }> | null
|
|
118
118
|
reminderMinutes: number | null
|
|
119
119
|
visibility: string | null
|
|
120
120
|
linkedEntities: Array<{ id: string; type: string; label: string }> | null
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { registerCommand } from '@open-mercato/shared/lib/commands'
|
|
2
|
-
import type { CommandHandler } from '@open-mercato/shared/lib/commands'
|
|
2
|
+
import type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'
|
|
3
3
|
import type { CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'
|
|
4
4
|
import { emitCrudSideEffects, emitCrudUndoSideEffects } from '@open-mercato/shared/lib/commands/helpers'
|
|
5
5
|
import { CrudHttpError, notFound } from '@open-mercato/shared/lib/crud/errors'
|
|
@@ -24,14 +24,27 @@ import {
|
|
|
24
24
|
findDeletedPersonCompanyLink,
|
|
25
25
|
loadPersonCompanyLinks,
|
|
26
26
|
promoteFallbackPrimaryLink,
|
|
27
|
+
removePersonCompanyLink,
|
|
27
28
|
} from '../lib/personCompanies'
|
|
28
29
|
import {
|
|
30
|
+
emitQueryIndexUpsertEvents,
|
|
29
31
|
ensureOrganizationScope,
|
|
30
32
|
ensureTenantScope,
|
|
31
33
|
extractUndoPayload,
|
|
34
|
+
type QueryIndexEventEntry,
|
|
32
35
|
} from './shared'
|
|
36
|
+
import type { CustomersEventId } from '../events'
|
|
37
|
+
import { E } from '#generated/entities.ids.generated'
|
|
38
|
+
import type { EventBus } from '@open-mercato/events'
|
|
33
39
|
import { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'
|
|
34
40
|
import { resolveRedoSnapshot } from '@open-mercato/shared/lib/commands/redo'
|
|
41
|
+
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
42
|
+
|
|
43
|
+
const logger = createLogger('customers').child({ component: 'personCompanyLinks' })
|
|
44
|
+
|
|
45
|
+
// Typed against the module's declared event ids so removing or renaming the declaration in
|
|
46
|
+
// `events.ts` fails the build here rather than emitting an undeclared event at runtime.
|
|
47
|
+
const PROFILE_ONLY_DETACHED_EVENT: CustomersEventId = 'customers.person.company_assignment.detached'
|
|
35
48
|
|
|
36
49
|
type PersonCompanyLinkSnapshot = {
|
|
37
50
|
id: string
|
|
@@ -48,6 +61,65 @@ type PersonCompanyLinkUndoPayload = {
|
|
|
48
61
|
after?: PersonCompanyLinkSnapshot | null
|
|
49
62
|
}
|
|
50
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Snapshot of a legacy profile-only company assignment — `customer_person_profiles.company_id`
|
|
66
|
+
* set with no backing link row (#5114). It carries no link id because none exists; `kind`
|
|
67
|
+
* discriminates it from `PersonCompanyLinkSnapshot` in the delete command's undo payload.
|
|
68
|
+
*/
|
|
69
|
+
type PersonCompanyProfileAssignmentSnapshot = {
|
|
70
|
+
kind: 'profile-only'
|
|
71
|
+
personEntityId: string
|
|
72
|
+
companyEntityId: string
|
|
73
|
+
tenantId: string
|
|
74
|
+
organizationId: string
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
type PersonCompanyLinkDeleteSnapshot = PersonCompanyLinkSnapshot | PersonCompanyProfileAssignmentSnapshot
|
|
78
|
+
|
|
79
|
+
type PersonCompanyLinkDeleteUndoPayload = {
|
|
80
|
+
before?: PersonCompanyLinkDeleteSnapshot | null
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
type PersonCompanyLinkDeleteResult = {
|
|
84
|
+
linkId: string | null
|
|
85
|
+
personEntityId: string | null
|
|
86
|
+
companyEntityId: string | null
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function isProfileAssignmentSnapshot(
|
|
90
|
+
snapshot: PersonCompanyLinkDeleteSnapshot | null | undefined,
|
|
91
|
+
): snapshot is PersonCompanyProfileAssignmentSnapshot {
|
|
92
|
+
return Boolean(snapshot) && (snapshot as PersonCompanyProfileAssignmentSnapshot).kind === 'profile-only'
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function resolveProfileOnlyTarget(
|
|
96
|
+
parsed: PersonCompanyLinkDeleteInput,
|
|
97
|
+
): { personEntityId: string; companyEntityId: string } | null {
|
|
98
|
+
if (parsed.linkId) return null
|
|
99
|
+
if (!parsed.personEntityId || !parsed.companyEntityId) return null
|
|
100
|
+
return { personEntityId: parsed.personEntityId, companyEntityId: parsed.companyEntityId }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function personQueryIndexEntries(
|
|
104
|
+
person: CustomerEntity,
|
|
105
|
+
profile: CustomerPersonProfile,
|
|
106
|
+
): QueryIndexEventEntry[] {
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
entityType: E.customers.customer_entity,
|
|
110
|
+
recordId: person.id,
|
|
111
|
+
tenantId: person.tenantId,
|
|
112
|
+
organizationId: person.organizationId,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
entityType: E.customers.customer_person_profile,
|
|
116
|
+
recordId: profile.id,
|
|
117
|
+
tenantId: profile.tenantId,
|
|
118
|
+
organizationId: profile.organizationId,
|
|
119
|
+
},
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
|
|
51
123
|
const personCompanyLinkCrudEvents: CrudEventsConfig = {
|
|
52
124
|
module: 'customers',
|
|
53
125
|
entity: 'person_company_link',
|
|
@@ -576,12 +648,144 @@ const updatePersonCompanyLinkCommand: CommandHandler<PersonCompanyLinkUpdateInpu
|
|
|
576
648
|
},
|
|
577
649
|
}
|
|
578
650
|
|
|
579
|
-
|
|
651
|
+
/**
|
|
652
|
+
* Detach a legacy profile-only company assignment: `customer_person_profiles.company_id`
|
|
653
|
+
* points at the company but no `customer_person_company_links` row was ever created, so
|
|
654
|
+
* there is no link row for the id-based branch to soft-delete (#5114). Running it as part
|
|
655
|
+
* of the same command keeps the audit entry, the undo token and the CRUD cache
|
|
656
|
+
* invalidation identical to a link-backed detach.
|
|
657
|
+
*/
|
|
658
|
+
async function detachProfileOnlyCompany(
|
|
659
|
+
em: EntityManager,
|
|
660
|
+
ctx: CommandRuntimeContext,
|
|
661
|
+
parsed: PersonCompanyLinkDeleteInput,
|
|
662
|
+
target: { personEntityId: string; companyEntityId: string },
|
|
663
|
+
): Promise<PersonCompanyLinkDeleteResult> {
|
|
664
|
+
const person = await requirePersonEntity(em, target.personEntityId, parsed.tenantId, parsed.organizationId)
|
|
665
|
+
const profile = await requirePersonProfile(em, person)
|
|
666
|
+
const assignedCompany = profile.company
|
|
667
|
+
const assignedCompanyId = typeof assignedCompany === 'string' ? assignedCompany : assignedCompany?.id ?? null
|
|
668
|
+
if (assignedCompanyId !== target.companyEntityId) {
|
|
669
|
+
throw notFound('Company link not found')
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
await withAtomicFlush(em, [
|
|
673
|
+
() => removePersonCompanyLink(em, person, profile, target.companyEntityId),
|
|
674
|
+
], { transaction: true })
|
|
675
|
+
|
|
676
|
+
// There is no link entity to hand to `emitCrudSideEffects`; what changed is the
|
|
677
|
+
// person's own company assignment, so reindex the person and its profile instead.
|
|
678
|
+
await emitQueryIndexUpsertEvents(ctx, personQueryIndexEntries(person, profile))
|
|
679
|
+
await emitProfileOnlyDetachedEvent(ctx, person, target.companyEntityId)
|
|
680
|
+
|
|
681
|
+
return { linkId: null, personEntityId: person.id, companyEntityId: target.companyEntityId }
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* Live-refresh signal for the company People tab and the person Companies tab, which the
|
|
686
|
+
* link-backed branch gets from `customers.person_company_link.deleted` via `emitCrudSideEffects`.
|
|
687
|
+
* The profile-only branch has no link row to emit that for, so it publishes the sibling
|
|
688
|
+
* `clientBroadcast` event instead (#5114). `tenantId` must travel in the payload: the event bus
|
|
689
|
+
* only forwards a broadcast event cross-process when the payload carries a tenant scope. The
|
|
690
|
+
* write is already committed, so a failed refresh signal must never fail the detach.
|
|
691
|
+
*/
|
|
692
|
+
async function emitProfileOnlyDetachedEvent(
|
|
693
|
+
ctx: CommandRuntimeContext,
|
|
694
|
+
person: CustomerEntity,
|
|
695
|
+
companyEntityId: string,
|
|
696
|
+
): Promise<void> {
|
|
697
|
+
try {
|
|
698
|
+
const bus = ctx.container.resolve<EventBus>('eventBus')
|
|
699
|
+
await bus.emitEvent(
|
|
700
|
+
PROFILE_ONLY_DETACHED_EVENT,
|
|
701
|
+
{
|
|
702
|
+
linkId: null,
|
|
703
|
+
personEntityId: person.id,
|
|
704
|
+
companyEntityId,
|
|
705
|
+
tenantId: person.tenantId,
|
|
706
|
+
organizationId: person.organizationId,
|
|
707
|
+
},
|
|
708
|
+
{ tenantId: person.tenantId, organizationId: person.organizationId },
|
|
709
|
+
)
|
|
710
|
+
} catch (err) {
|
|
711
|
+
logger.warn('Profile-only company detach broadcast failed', {
|
|
712
|
+
command: 'customers.personCompanyLinks.delete',
|
|
713
|
+
personEntityId: person.id,
|
|
714
|
+
companyEntityId,
|
|
715
|
+
err,
|
|
716
|
+
})
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
/**
|
|
721
|
+
* Undo counterpart of `detachProfileOnlyCompany`: re-point the person's legacy
|
|
722
|
+
* `profile.company` at the company it was detached from. The lookups run in the first
|
|
723
|
+
* flush phase and the assignment in the second so the encryption subscriber's
|
|
724
|
+
* re-baseline on find cannot drop the pending change (#2507).
|
|
725
|
+
*/
|
|
726
|
+
async function restoreProfileOnlyCompany(
|
|
727
|
+
ctx: CommandRuntimeContext,
|
|
728
|
+
before: PersonCompanyProfileAssignmentSnapshot,
|
|
729
|
+
): Promise<void> {
|
|
730
|
+
const em = (ctx.container.resolve('em') as EntityManager).fork()
|
|
731
|
+
let person: CustomerEntity | null = null
|
|
732
|
+
let profile: CustomerPersonProfile | null = null
|
|
733
|
+
let company: CustomerEntity | null = null
|
|
734
|
+
|
|
735
|
+
await withAtomicFlush(em, [
|
|
736
|
+
async () => {
|
|
737
|
+
person = await findOneWithDecryption(
|
|
738
|
+
em,
|
|
739
|
+
CustomerEntity,
|
|
740
|
+
{ id: before.personEntityId, kind: 'person', tenantId: before.tenantId, organizationId: before.organizationId, deletedAt: null },
|
|
741
|
+
undefined,
|
|
742
|
+
{ tenantId: before.tenantId, organizationId: before.organizationId },
|
|
743
|
+
)
|
|
744
|
+
if (!person) return
|
|
745
|
+
profile = await findOneWithDecryption(
|
|
746
|
+
em,
|
|
747
|
+
CustomerPersonProfile,
|
|
748
|
+
{ entity: person },
|
|
749
|
+
{ populate: ['company'] },
|
|
750
|
+
{ tenantId: before.tenantId, organizationId: before.organizationId },
|
|
751
|
+
)
|
|
752
|
+
if (!profile) return
|
|
753
|
+
company = await findOneWithDecryption(
|
|
754
|
+
em,
|
|
755
|
+
CustomerEntity,
|
|
756
|
+
{ id: before.companyEntityId, kind: 'company', tenantId: before.tenantId, organizationId: before.organizationId, deletedAt: null },
|
|
757
|
+
undefined,
|
|
758
|
+
{ tenantId: before.tenantId, organizationId: before.organizationId },
|
|
759
|
+
)
|
|
760
|
+
},
|
|
761
|
+
() => {
|
|
762
|
+
if (profile && company) profile.company = company
|
|
763
|
+
},
|
|
764
|
+
], { transaction: true })
|
|
765
|
+
|
|
766
|
+
if (person && profile) {
|
|
767
|
+
await emitQueryIndexUpsertEvents(ctx, personQueryIndexEntries(person, profile))
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
const deletePersonCompanyLinkCommand: CommandHandler<PersonCompanyLinkDeleteInput, PersonCompanyLinkDeleteResult> = {
|
|
580
772
|
id: 'customers.personCompanyLinks.delete',
|
|
581
773
|
async prepare(rawInput, ctx) {
|
|
582
774
|
const parsed = personCompanyLinkDeleteSchema.parse(rawInput)
|
|
775
|
+
const profileOnlyTarget = resolveProfileOnlyTarget(parsed)
|
|
776
|
+
if (profileOnlyTarget) {
|
|
777
|
+
return {
|
|
778
|
+
before: {
|
|
779
|
+
kind: 'profile-only',
|
|
780
|
+
personEntityId: profileOnlyTarget.personEntityId,
|
|
781
|
+
companyEntityId: profileOnlyTarget.companyEntityId,
|
|
782
|
+
tenantId: parsed.tenantId,
|
|
783
|
+
organizationId: parsed.organizationId,
|
|
784
|
+
} satisfies PersonCompanyProfileAssignmentSnapshot,
|
|
785
|
+
}
|
|
786
|
+
}
|
|
583
787
|
const em = (ctx.container.resolve('em') as EntityManager).fork()
|
|
584
|
-
const snapshot = await loadPersonCompanyLinkSnapshot(em, parsed.linkId, {
|
|
788
|
+
const snapshot = await loadPersonCompanyLinkSnapshot(em, parsed.linkId as string, {
|
|
585
789
|
tenantId: ctx.auth?.tenantId ?? null,
|
|
586
790
|
organizationId: ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null,
|
|
587
791
|
})
|
|
@@ -593,11 +797,16 @@ const deletePersonCompanyLinkCommand: CommandHandler<PersonCompanyLinkDeleteInpu
|
|
|
593
797
|
ensureOrganizationScope(ctx, parsed.organizationId)
|
|
594
798
|
|
|
595
799
|
const em = (ctx.container.resolve('em') as EntityManager).fork()
|
|
800
|
+
const profileOnlyTarget = resolveProfileOnlyTarget(parsed)
|
|
801
|
+
if (profileOnlyTarget) {
|
|
802
|
+
return await detachProfileOnlyCompany(em, ctx, parsed, profileOnlyTarget)
|
|
803
|
+
}
|
|
804
|
+
|
|
596
805
|
const link = await findOneWithDecryption(
|
|
597
806
|
em,
|
|
598
807
|
CustomerPersonCompanyLink,
|
|
599
808
|
{
|
|
600
|
-
id: parsed.linkId,
|
|
809
|
+
id: parsed.linkId as string,
|
|
601
810
|
tenantId: parsed.tenantId,
|
|
602
811
|
organizationId: parsed.organizationId,
|
|
603
812
|
deletedAt: null,
|
|
@@ -647,13 +856,15 @@ const deletePersonCompanyLinkCommand: CommandHandler<PersonCompanyLinkDeleteInpu
|
|
|
647
856
|
indexer: { entityType: 'customers:customer_person_company_link' },
|
|
648
857
|
})
|
|
649
858
|
|
|
650
|
-
return { linkId: link.id }
|
|
859
|
+
return { linkId: link.id, personEntityId: personId, companyEntityId: companyId }
|
|
651
860
|
},
|
|
652
861
|
buildLog: async ({ result, snapshots }) => {
|
|
653
862
|
const { translate } = await resolveTranslations()
|
|
654
|
-
const before = snapshots.before as
|
|
863
|
+
const before = snapshots.before as PersonCompanyLinkDeleteSnapshot | undefined
|
|
655
864
|
return {
|
|
656
865
|
actionLabel: translate('customers.audit.personCompanyLinks.delete', 'Remove company link'),
|
|
866
|
+
// Kept as `customers.personCompanyLink` for the profile-only shape too: the company
|
|
867
|
+
// detail cache tags this resource kind, so both detach shapes must invalidate it.
|
|
657
868
|
resourceKind: 'customers.personCompanyLink',
|
|
658
869
|
resourceId: result.linkId,
|
|
659
870
|
parentResourceKind: 'customers.person',
|
|
@@ -664,15 +875,20 @@ const deletePersonCompanyLinkCommand: CommandHandler<PersonCompanyLinkDeleteInpu
|
|
|
664
875
|
payload: {
|
|
665
876
|
undo: {
|
|
666
877
|
before: before ?? null,
|
|
667
|
-
} satisfies
|
|
878
|
+
} satisfies PersonCompanyLinkDeleteUndoPayload,
|
|
668
879
|
},
|
|
669
880
|
}
|
|
670
881
|
},
|
|
671
882
|
undo: async ({ logEntry, ctx }) => {
|
|
672
|
-
const payload = extractUndoPayload<
|
|
883
|
+
const payload = extractUndoPayload<PersonCompanyLinkDeleteUndoPayload>(logEntry)
|
|
673
884
|
const before = payload?.before
|
|
674
885
|
if (!before) return
|
|
675
886
|
|
|
887
|
+
if (isProfileAssignmentSnapshot(before)) {
|
|
888
|
+
await restoreProfileOnlyCompany(ctx, before)
|
|
889
|
+
return
|
|
890
|
+
}
|
|
891
|
+
|
|
676
892
|
const em = (ctx.container.resolve('em') as EntityManager).fork()
|
|
677
893
|
const link = await findOneWithDecryption(
|
|
678
894
|
em,
|
|
@@ -47,6 +47,7 @@ type CustomerTodosResponse = {
|
|
|
47
47
|
page: number
|
|
48
48
|
pageSize: number
|
|
49
49
|
totalPages: number
|
|
50
|
+
totalIsCapped?: boolean
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
const TASKS_TAB_QUERY = 'tab=tasks'
|
|
@@ -279,6 +280,7 @@ export function CustomerTodosTable(): React.JSX.Element {
|
|
|
279
280
|
pageSize,
|
|
280
281
|
total: data?.total ?? 0,
|
|
281
282
|
totalPages: data?.totalPages ?? 0,
|
|
283
|
+
totalIsCapped: data?.totalIsCapped === true,
|
|
282
284
|
onPageChange: setPage,
|
|
283
285
|
}}
|
|
284
286
|
isLoading={isLoading}
|
|
@@ -63,13 +63,12 @@ export type DealsKpiStripProps = {
|
|
|
63
63
|
onNeedsAttentionClick?: () => void
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return compactNumberFormatter.format(value)
|
|
66
|
+
function createCompactFormatter(locale: string): (value: number) => string {
|
|
67
|
+
const formatter = new Intl.NumberFormat(locale, {
|
|
68
|
+
notation: 'compact',
|
|
69
|
+
maximumFractionDigits: 1,
|
|
70
|
+
})
|
|
71
|
+
return (value: number) => formatter.format(value)
|
|
73
72
|
}
|
|
74
73
|
|
|
75
74
|
function buildCurrencySuffix(code: string | null, convertedAll: boolean): string {
|
|
@@ -136,6 +135,7 @@ export function DealsKpiStrip({
|
|
|
136
135
|
}: DealsKpiStripProps) {
|
|
137
136
|
const t = useT()
|
|
138
137
|
const locale = useLocale()
|
|
138
|
+
const formatCompact = React.useMemo(() => createCompactFormatter(locale), [locale])
|
|
139
139
|
const pluralCat = React.useCallback((count: number): string => {
|
|
140
140
|
try {
|
|
141
141
|
return new Intl.PluralRules(locale).select(count)
|
|
@@ -56,7 +56,7 @@ function deriveTypeLabel(interactionType: string): string {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
function participantLabel(participant: CalendarItem['participants'][number]): string {
|
|
59
|
-
return participant.name ?? participant.email ?? participant.userId
|
|
59
|
+
return participant.name ?? participant.email ?? participant.userId ?? ''
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
function buildDayGroups(anchor: Date, horizonDays: number, items: CalendarItem[]): AgendaDayGroup[] {
|
|
@@ -171,8 +171,8 @@ function AgendaRow({
|
|
|
171
171
|
<div className="flex shrink-0 items-center gap-2">
|
|
172
172
|
{item.participants.length > 0 ? (
|
|
173
173
|
<span className="hidden items-center gap-0.5 sm:flex">
|
|
174
|
-
{item.participants.slice(0, MAX_AVATARS_PER_ROW).map((participant) => (
|
|
175
|
-
<Avatar key={participant.userId} size="xs" label={participantLabel(participant)} />
|
|
174
|
+
{item.participants.slice(0, MAX_AVATARS_PER_ROW).map((participant, index) => (
|
|
175
|
+
<Avatar key={participant.userId ?? participant.email ?? index} size="xs" label={participantLabel(participant)} />
|
|
176
176
|
))}
|
|
177
177
|
{item.participants.length > MAX_AVATARS_PER_ROW ? (
|
|
178
178
|
<span className="ps-0.5 text-xs font-medium text-muted-foreground">
|
|
@@ -170,7 +170,7 @@ function EditorBody({
|
|
|
170
170
|
const ids: string[] = []
|
|
171
171
|
if (form.relatedTo && form.relatedTo.kind !== 'company') ids.push(form.relatedTo.id)
|
|
172
172
|
for (const participant of form.participants) {
|
|
173
|
-
if (participant.isCustomer) ids.push(participant.userId)
|
|
173
|
+
if (participant.isCustomer && participant.userId) ids.push(participant.userId)
|
|
174
174
|
}
|
|
175
175
|
return Array.from(new Set(ids))
|
|
176
176
|
}, [form.relatedTo, form.participants])
|
|
@@ -238,7 +238,7 @@ export function CalendarScreen({ resourcesEnabled = false, staffEnabled = true }
|
|
|
238
238
|
const participantNames = new Map<string, string>()
|
|
239
239
|
for (const item of visibleItems) {
|
|
240
240
|
for (const participant of item.participants) {
|
|
241
|
-
if (participant.name && !participantNames.has(participant.userId)) {
|
|
241
|
+
if (participant.userId && participant.name && !participantNames.has(participant.userId)) {
|
|
242
242
|
participantNames.set(participant.userId, participant.name)
|
|
243
243
|
}
|
|
244
244
|
}
|
|
@@ -72,7 +72,7 @@ export function CalendarSettingsModal({
|
|
|
72
72
|
|
|
73
73
|
const toggleRows: Array<{ key: ToggleKey; label: string }> = [
|
|
74
74
|
{ key: 'showCrmActivities', label: t('customers.calendar.settings.showCrmActivities', 'Show CRM activities on calendar') },
|
|
75
|
-
{ key: 'aiSummaries', label: t('customers.calendar.settings.aiSummaries', 'AI summaries
|
|
75
|
+
{ key: 'aiSummaries', label: t('customers.calendar.settings.aiSummaries', 'AI summaries') },
|
|
76
76
|
{ key: 'conflictWarnings', label: t('customers.calendar.settings.conflictWarnings', 'Conflict warnings') },
|
|
77
77
|
{ key: 'showWeekends', label: t('customers.calendar.settings.showWeekends', 'Show weekends') },
|
|
78
78
|
]
|
|
@@ -180,8 +180,8 @@ export const EventBlock = React.forwardRef<HTMLButtonElement, EventBlockProps>(f
|
|
|
180
180
|
{visibleParticipants.length > 0 ? (
|
|
181
181
|
<>
|
|
182
182
|
<AvatarStack size="xs" max={MAX_VISIBLE_AVATARS} className="shrink-0 gap-px [&>*:not(:first-child)]:-ml-1">
|
|
183
|
-
{visibleParticipants.map((participant) => (
|
|
184
|
-
<Avatar key={participant.userId} size="xs" label={participantLabel(participant)} />
|
|
183
|
+
{visibleParticipants.map((participant, index) => (
|
|
184
|
+
<Avatar key={participant.userId ?? participant.email ?? index} size="xs" label={participantLabel(participant)} />
|
|
185
185
|
))}
|
|
186
186
|
</AvatarStack>
|
|
187
187
|
{overflowCount > 0 ? (
|
|
@@ -22,6 +22,7 @@ export type EventPeekPopoverProps = {
|
|
|
22
22
|
joinUrl: string | null
|
|
23
23
|
aiSummaries: boolean
|
|
24
24
|
canManage?: boolean
|
|
25
|
+
side?: React.ComponentProps<typeof PopoverContent>['side']
|
|
25
26
|
onOpenChange(open: boolean): void
|
|
26
27
|
onJoin(item: CalendarItem): void
|
|
27
28
|
onEdit(item: CalendarItem): void
|
|
@@ -34,6 +35,7 @@ export function EventPeekPopover({
|
|
|
34
35
|
joinUrl,
|
|
35
36
|
aiSummaries,
|
|
36
37
|
canManage = true,
|
|
38
|
+
side = 'right',
|
|
37
39
|
onOpenChange,
|
|
38
40
|
onJoin,
|
|
39
41
|
onEdit,
|
|
@@ -63,12 +65,12 @@ export function EventPeekPopover({
|
|
|
63
65
|
(part): part is string => Boolean(part),
|
|
64
66
|
)
|
|
65
67
|
const showSummary = aiSummaries && metaParts.length > 0
|
|
66
|
-
const showJoin =
|
|
68
|
+
const showJoin = Boolean(joinUrl)
|
|
67
69
|
|
|
68
70
|
return (
|
|
69
71
|
<Popover open={open} onOpenChange={onOpenChange}>
|
|
70
72
|
<PopoverTrigger asChild>{children}</PopoverTrigger>
|
|
71
|
-
<PopoverContent align="start" side=
|
|
73
|
+
<PopoverContent align="start" side={side} sideOffset={8} className="w-56 p-3">
|
|
72
74
|
<div className="flex flex-col gap-2">
|
|
73
75
|
<p className="text-sm font-semibold leading-5 text-foreground">{title}</p>
|
|
74
76
|
<p className="text-xs leading-4 text-muted-foreground">{`${dateLabel} · ${timeRange}`}</p>
|