@open-mercato/core 0.6.5-develop.4534.1.b459babe6d → 0.6.5-develop.4559.1.839e136509
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/AGENTS.md +5 -0
- package/dist/generated/entities/role/index.js +3 -1
- package/dist/generated/entities/role/index.js.map +2 -2
- package/dist/generated/entities/user/index.js +3 -1
- package/dist/generated/entities/user/index.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/helpers/integration/dbFixtures.js +2 -1
- package/dist/helpers/integration/dbFixtures.js.map +2 -2
- package/dist/helpers/integration/optimisticLockUi.js +104 -0
- package/dist/helpers/integration/optimisticLockUi.js.map +7 -0
- package/dist/helpers/integration/salesFixtures.js +17 -0
- package/dist/helpers/integration/salesFixtures.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +9 -5
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +17 -9
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/auth/api/roles/acl/route.js +32 -13
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/roles/route.js +3 -1
- package/dist/modules/auth/api/roles/route.js.map +2 -2
- package/dist/modules/auth/api/sidebar/preferences/route.js +71 -3
- package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +42 -19
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +3 -1
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.js +24 -4
- package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +8 -4
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.js +27 -5
- package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +6 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/components/AclEditor.js +3 -1
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js +6 -0
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/services/sidebarPreferencesService.js +32 -4
- package/dist/modules/auth/services/sidebarPreferencesService.js.map +2 -2
- package/dist/modules/business_rules/api/rules/route.js +28 -0
- package/dist/modules/business_rules/api/rules/route.js.map +2 -2
- package/dist/modules/business_rules/api/sets/route.js +28 -0
- package/dist/modules/business_rules/api/sets/route.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.js +11 -4
- package/dist/modules/business_rules/backend/rules/[id]/page.js.map +3 -3
- package/dist/modules/business_rules/backend/rules/page.js +20 -11
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.js +11 -4
- package/dist/modules/business_rules/backend/sets/[id]/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +20 -11
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/catalog/api/categories/route.js +2 -0
- package/dist/modules/catalog/api/categories/route.js.map +2 -2
- package/dist/modules/catalog/api/products/route.js +2 -1
- package/dist/modules/catalog/api/products/route.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js +2 -0
- package/dist/modules/catalog/backend/catalog/categories/[id]/edit/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +94 -40
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +37 -8
- package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/optionSchemaClient.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +32 -31
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +12 -5
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +5 -3
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/productForm.js.map +2 -2
- package/dist/modules/catalog/components/products/variantForm.js +2 -1
- package/dist/modules/catalog/components/products/variantForm.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +23 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +5 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/set-primary-channel.js +2 -1
- package/dist/modules/communication_channels/commands/set-primary-channel.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/[id]/page.js +6 -3
- package/dist/modules/currencies/backend/currencies/[id]/page.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +18 -11
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js +1 -0
- package/dist/modules/currencies/backend/exchange-rates/[id]/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +10 -6
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/commands/currencies.js +7 -5
- package/dist/modules/currencies/commands/currencies.js.map +2 -2
- package/dist/modules/currencies/components/CurrencyFetchingConfig.js +26 -19
- package/dist/modules/currencies/components/CurrencyFetchingConfig.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/roles/[id].js +28 -5
- package/dist/modules/customer_accounts/api/admin/roles/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/roles.js +4 -2
- package/dist/modules/customer_accounts/api/admin/roles.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users/[id].js +28 -5
- package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users.js +2 -0
- package/dist/modules/customer_accounts/api/admin/users.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +16 -8
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +8 -4
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/page.js +8 -4
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +29 -18
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +18 -11
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customers/api/companies/route.js +13 -2
- package/dist/modules/customers/api/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +2 -0
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/people/route.js +11 -2
- package/dist/modules/customers/api/people/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +1 -0
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +34 -21
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/[id]/page.js +45 -27
- package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +22 -5
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js +30 -8
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +1 -0
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +16 -6
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +62 -39
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/[id]/page.js +41 -26
- package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +50 -23
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/commands/addresses.js +16 -14
- package/dist/modules/customers/commands/addresses.js.map +2 -2
- package/dist/modules/customers/commands/companies.js +1 -1
- package/dist/modules/customers/commands/companies.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +41 -4
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/commands/people.js +1 -1
- package/dist/modules/customers/commands/people.js.map +2 -2
- package/dist/modules/customers/commands/personCompanyLinks.js +8 -5
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/commands/pipeline-stages.js +13 -11
- package/dist/modules/customers/commands/pipeline-stages.js.map +3 -3
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/DictionarySettings.js +20 -13
- package/dist/modules/customers/components/DictionarySettings.js.map +2 -2
- package/dist/modules/customers/components/DictionarySortSettings.js +4 -0
- package/dist/modules/customers/components/DictionarySortSettings.js.map +2 -2
- package/dist/modules/customers/components/PipelineSettings.js +38 -23
- package/dist/modules/customers/components/PipelineSettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityTimeline.js +1 -1
- package/dist/modules/customers/components/detail/ActivityTimeline.js.map +2 -2
- package/dist/modules/customers/components/detail/AddressesSection.js +4 -0
- package/dist/modules/customers/components/detail/AddressesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +28 -22
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +36 -24
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EmailCardActions.js +5 -0
- package/dist/modules/customers/components/detail/EmailCardActions.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +7 -0
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/ManageTagsDialog.js +34 -22
- package/dist/modules/customers/components/detail/ManageTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +41 -29
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/RoleAssignmentRow.js +14 -8
- package/dist/modules/customers/components/detail/RoleAssignmentRow.js.map +2 -2
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +14 -6
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js +29 -13
- package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/useInteractions.js +77 -35
- package/dist/modules/customers/components/detail/hooks/useInteractions.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +25 -17
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/data/guards.js +66 -0
- package/dist/modules/customers/data/guards.js.map +7 -0
- package/dist/modules/customers/di.js +37 -0
- package/dist/modules/customers/di.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +11 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
- package/dist/modules/data_sync/api/options.js +4 -4
- package/dist/modules/data_sync/api/options.js.map +2 -2
- package/dist/modules/data_sync/api/schedules/route.js +9 -1
- package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +17 -8
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +43 -22
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-schedule-service.js +9 -0
- package/dist/modules/data_sync/lib/sync-schedule-service.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js +8 -1
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/route.js +17 -1
- package/dist/modules/dictionaries/api/[dictionaryId]/route.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionariesManager.js +31 -10
- package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +28 -15
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/directory/api/organizations/route.js +3 -0
- package/dist/modules/directory/api/organizations/route.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +2 -0
- package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +9 -5
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js +7 -3
- package/dist/modules/directory/backend/directory/tenants/[id]/edit/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +8 -4
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/commands/organizations.js +7 -2
- package/dist/modules/directory/commands/organizations.js.map +2 -2
- package/dist/modules/entities/api/records.js +66 -0
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js +1 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +8 -4
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/lib/helpers.js +17 -0
- package/dist/modules/entities/lib/helpers.js.map +2 -2
- package/dist/modules/feature_toggles/api/global/[id]/override/route.js +2 -1
- package/dist/modules/feature_toggles/api/global/[id]/override/route.js.map +2 -2
- package/dist/modules/feature_toggles/api/overrides/route.js +15 -0
- package/dist/modules/feature_toggles/api/overrides/route.js.map +2 -2
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js +15 -14
- package/dist/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js +20 -12
- package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +6 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/formConfig.js +2 -1
- package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
- package/dist/modules/feature_toggles/components/overrideFormConfig.js +5 -1
- package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
- package/dist/modules/feature_toggles/data/validators.js +7 -4
- package/dist/modules/feature_toggles/data/validators.js.map +2 -2
- package/dist/modules/inbox_ops/api/settings/route.js +17 -2
- package/dist/modules/inbox_ops/api/settings/route.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +13 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +9 -4
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +18 -11
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/page.js +12 -8
- package/dist/modules/integrations/backend/integrations/page.js.map +2 -2
- package/dist/modules/messages/commands/messages.js +13 -10
- package/dist/modules/messages/commands/messages.js.map +2 -2
- package/dist/modules/perspectives/api/[tableId]/route.js +39 -30
- package/dist/modules/perspectives/api/[tableId]/route.js.map +2 -2
- package/dist/modules/perspectives/services/perspectiveService.js +7 -0
- package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js +6 -14
- package/dist/modules/planner/backend/planner/availability-rulesets/[id]/page.js.map +3 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +4 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js +2 -0
- package/dist/modules/planner/components/AvailabilityRuleSetForm.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +36 -11
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/planner/components/AvailabilitySchedule.js +9 -5
- package/dist/modules/planner/components/AvailabilitySchedule.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +19 -0
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js +1 -0
- package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +4 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/[id]/page.js +14 -3
- package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +8 -4
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +2 -0
- package/dist/modules/resources/components/ResourceCrudForm.js.map +2 -2
- package/dist/modules/resources/components/ResourceTypeCrudForm.js +1 -0
- package/dist/modules/resources/components/ResourceTypeCrudForm.js.map +2 -2
- package/dist/modules/sales/api/documents/factory.js +7 -2
- package/dist/modules/sales/api/documents/factory.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +3 -1
- package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +13 -4
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +16 -4
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +68 -22
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/create/page.js.map +2 -2
- package/dist/modules/sales/commands/documentAddresses.js +181 -2
- package/dist/modules/sales/commands/documentAddresses.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +29 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/commands/returns.js +12 -2
- package/dist/modules/sales/commands/returns.js.map +2 -2
- package/dist/modules/sales/commands/shared.js +15 -0
- package/dist/modules/sales/commands/shared.js.map +2 -2
- package/dist/modules/sales/commands/shipments.js +4 -1
- package/dist/modules/sales/commands/shipments.js.map +2 -2
- package/dist/modules/sales/components/AdjustmentKindSettings.js +19 -11
- package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
- package/dist/modules/sales/components/DocumentNumberSettings.js.map +2 -2
- package/dist/modules/sales/components/OrderEditingSettings.js.map +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js +12 -4
- package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +12 -4
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/StatusSettings.js +18 -11
- package/dist/modules/sales/components/StatusSettings.js.map +2 -2
- package/dist/modules/sales/components/TaxRatesSettings.js +12 -4
- package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +47 -16
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +8 -4
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +44 -25
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +43 -23
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +22 -13
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +23 -10
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentDialog.js +29 -14
- package/dist/modules/sales/components/documents/PaymentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +20 -10
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnDialog.js +26 -17
- package/dist/modules/sales/components/documents/ReturnDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +3 -1
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +10 -5
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +21 -7
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +19 -10
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/optimisticLock.js +27 -0
- package/dist/modules/sales/components/documents/optimisticLock.js.map +7 -0
- package/dist/modules/sales/di.js +18 -0
- package/dist/modules/sales/di.js.map +2 -2
- package/dist/modules/staff/api/job-histories.js +11 -2
- package/dist/modules/staff/api/job-histories.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/route.js +11 -4
- package/dist/modules/staff/api/timesheets/time-entries/route.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +13 -8
- package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +2 -1
- package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js +7 -4
- package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +4 -2
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js +1 -0
- package/dist/modules/staff/backend/staff/team-roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +4 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +5 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +12 -3
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +4 -1
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +12 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/staff/commands/job-histories.js +40 -3
- package/dist/modules/staff/commands/job-histories.js.map +2 -2
- package/dist/modules/staff/components/LeaveRequestForm.js +1 -0
- package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
- package/dist/modules/staff/components/TeamForm.js +1 -0
- package/dist/modules/staff/components/TeamForm.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +1 -0
- package/dist/modules/staff/components/TeamMemberForm.js.map +2 -2
- package/dist/modules/staff/components/TeamRoleForm.js +1 -0
- package/dist/modules/staff/components/TeamRoleForm.js.map +2 -2
- package/dist/modules/staff/components/detail/JobHistorySection.js +20 -7
- package/dist/modules/staff/components/detail/JobHistorySection.js.map +2 -2
- package/dist/modules/staff/data/validators.js +7 -1
- package/dist/modules/staff/data/validators.js.map +2 -2
- package/dist/modules/staff/lib/leaveRequestHelpers.js +2 -1
- package/dist/modules/staff/lib/leaveRequestHelpers.js.map +2 -2
- package/dist/modules/translations/components/TranslationManager.js +12 -8
- package/dist/modules/translations/components/TranslationManager.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +106 -0
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.js +11 -3
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +19 -8
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +29 -16
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/components/formConfig.js +4 -1
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/di.js +12 -0
- package/dist/modules/workflows/di.js.map +2 -2
- package/generated/entities/role/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entity-fields-registry.ts +2 -0
- package/jest.setup.ts +17 -0
- package/package.json +8 -7
- package/src/helpers/integration/communicationChannelsFixtures.ts +6 -0
- package/src/helpers/integration/dbFixtures.ts +1 -1
- package/src/helpers/integration/optimisticLockUi.ts +172 -0
- package/src/helpers/integration/salesFixtures.ts +29 -0
- package/src/modules/api_keys/backend/api-keys/page.tsx +10 -5
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +19 -9
- package/src/modules/auth/api/roles/acl/route.ts +37 -11
- package/src/modules/auth/api/roles/route.ts +2 -0
- package/src/modules/auth/api/sidebar/preferences/route.ts +73 -0
- package/src/modules/auth/api/users/acl/route.ts +46 -18
- package/src/modules/auth/api/users/route.ts +2 -0
- package/src/modules/auth/backend/roles/[id]/edit/page.tsx +29 -4
- package/src/modules/auth/backend/roles/page.tsx +9 -4
- package/src/modules/auth/backend/users/[id]/edit/page.tsx +37 -4
- package/src/modules/auth/backend/users/page.tsx +7 -2
- package/src/modules/auth/components/AclEditor.tsx +10 -1
- package/src/modules/auth/data/entities.ts +7 -1
- package/src/modules/auth/services/sidebarPreferencesService.ts +38 -4
- package/src/modules/business_rules/api/rules/route.ts +30 -0
- package/src/modules/business_rules/api/sets/route.ts +30 -0
- package/src/modules/business_rules/backend/rules/[id]/page.tsx +16 -4
- package/src/modules/business_rules/backend/rules/page.tsx +20 -11
- package/src/modules/business_rules/backend/sets/[id]/page.tsx +16 -4
- package/src/modules/business_rules/backend/sets/page.tsx +20 -11
- package/src/modules/catalog/api/categories/route.ts +3 -0
- package/src/modules/catalog/api/products/route.ts +4 -0
- package/src/modules/catalog/backend/catalog/categories/[id]/edit/page.tsx +5 -0
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +112 -35
- package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +56 -7
- package/src/modules/catalog/backend/catalog/products/optionSchemaClient.ts +2 -0
- package/src/modules/catalog/commands/variants.ts +32 -32
- package/src/modules/catalog/components/PriceKindSettings.tsx +20 -7
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +1 -0
- package/src/modules/catalog/components/products/ProductMediaManager.tsx +2 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +8 -4
- package/src/modules/catalog/components/products/productForm.ts +3 -0
- package/src/modules/catalog/components/products/variantForm.ts +9 -0
- package/src/modules/communication_channels/api/post/test-seed/route.ts +28 -1
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +5 -0
- package/src/modules/communication_channels/commands/set-primary-channel.ts +10 -7
- package/src/modules/currencies/backend/currencies/[id]/page.tsx +13 -6
- package/src/modules/currencies/backend/currencies/page.tsx +18 -11
- package/src/modules/currencies/backend/exchange-rates/[id]/page.tsx +3 -0
- package/src/modules/currencies/backend/exchange-rates/page.tsx +10 -6
- package/src/modules/currencies/commands/currencies.ts +10 -5
- package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +31 -21
- package/src/modules/customer_accounts/api/admin/roles/[id].ts +35 -5
- package/src/modules/customer_accounts/api/admin/roles.ts +2 -0
- package/src/modules/customer_accounts/api/admin/users/[id].ts +38 -5
- package/src/modules/customer_accounts/api/admin/users.ts +2 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +34 -20
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +9 -4
- package/src/modules/customer_accounts/backend/customer_accounts/settings/domain/page.tsx +11 -4
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +28 -17
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +19 -11
- package/src/modules/customers/AGENTS.md +2 -2
- package/src/modules/customers/api/companies/route.ts +14 -1
- package/src/modules/customers/api/deals/route.ts +3 -0
- package/src/modules/customers/api/people/route.ts +12 -1
- package/src/modules/customers/api/todos/route.ts +1 -0
- package/src/modules/customers/backend/config/customers/deals/page.tsx +1 -0
- package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +36 -21
- package/src/modules/customers/backend/customers/companies/[id]/page.tsx +52 -27
- package/src/modules/customers/backend/customers/companies/page.tsx +2 -0
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +27 -5
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.ts +39 -7
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +1 -0
- package/src/modules/customers/backend/customers/deals/page.tsx +18 -6
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +64 -39
- package/src/modules/customers/backend/customers/people/[id]/page.tsx +46 -26
- package/src/modules/customers/backend/customers/people/page.tsx +2 -0
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +84 -24
- package/src/modules/customers/commands/addresses.ts +16 -14
- package/src/modules/customers/commands/companies.ts +3 -1
- package/src/modules/customers/commands/interactions.ts +50 -4
- package/src/modules/customers/commands/people.ts +2 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +8 -5
- package/src/modules/customers/commands/pipeline-stages.ts +16 -16
- package/src/modules/customers/components/AddressFormatSettings.tsx +1 -0
- package/src/modules/customers/components/DictionarySettings.tsx +18 -13
- package/src/modules/customers/components/DictionarySortSettings.tsx +4 -0
- package/src/modules/customers/components/PipelineSettings.tsx +42 -21
- package/src/modules/customers/components/detail/ActivityTimeline.tsx +3 -3
- package/src/modules/customers/components/detail/AddressesSection.tsx +4 -0
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +2 -0
- package/src/modules/customers/components/detail/DealsSection.tsx +4 -0
- package/src/modules/customers/components/detail/EmailCardActions.tsx +5 -0
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +7 -0
- package/src/modules/customers/components/detail/ManageTagsDialog.tsx +4 -0
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +4 -0
- package/src/modules/customers/components/detail/RoleAssignmentRow.tsx +2 -0
- package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +23 -7
- package/src/modules/customers/components/detail/hooks/useInteractionMutations.ts +25 -15
- package/src/modules/customers/components/detail/hooks/useInteractions.ts +76 -35
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +30 -17
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +2 -0
- package/src/modules/customers/components/detail/types.ts +1 -0
- package/src/modules/customers/components/formConfig.tsx +2 -0
- package/src/modules/customers/data/guards.ts +67 -0
- package/src/modules/customers/di.ts +66 -0
- package/src/modules/customers/i18n/de.json +2 -0
- package/src/modules/customers/i18n/en.json +2 -0
- package/src/modules/customers/i18n/es.json +2 -0
- package/src/modules/customers/i18n/pl.json +2 -0
- package/src/modules/customers/lib/todoCompatibility.ts +14 -0
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +2 -0
- package/src/modules/data_sync/api/options.ts +7 -4
- package/src/modules/data_sync/api/schedules/route.ts +9 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +18 -5
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +46 -19
- package/src/modules/data_sync/lib/sync-schedule-service.ts +11 -0
- package/src/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.ts +8 -1
- package/src/modules/dictionaries/api/[dictionaryId]/route.ts +23 -0
- package/src/modules/dictionaries/components/DictionariesManager.tsx +32 -9
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +30 -14
- package/src/modules/dictionaries/i18n/de.json +1 -0
- package/src/modules/dictionaries/i18n/en.json +1 -0
- package/src/modules/dictionaries/i18n/es.json +1 -0
- package/src/modules/dictionaries/i18n/pl.json +1 -0
- package/src/modules/directory/api/organizations/route.ts +3 -0
- package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +8 -0
- package/src/modules/directory/backend/directory/organizations/page.tsx +10 -5
- package/src/modules/directory/backend/directory/tenants/[id]/edit/page.tsx +16 -5
- package/src/modules/directory/backend/directory/tenants/page.tsx +8 -4
- package/src/modules/directory/commands/organizations.ts +7 -4
- package/src/modules/entities/api/records.ts +99 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/[recordId]/page.tsx +7 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +8 -4
- package/src/modules/entities/lib/helpers.ts +17 -0
- package/src/modules/feature_toggles/api/global/[id]/override/route.ts +1 -0
- package/src/modules/feature_toggles/api/overrides/route.ts +19 -0
- package/src/modules/feature_toggles/backend/feature-toggles/global/[id]/edit/page.tsx +19 -13
- package/src/modules/feature_toggles/components/FeatureToggleOverrideCard.tsx +22 -12
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +7 -2
- package/src/modules/feature_toggles/components/formConfig.tsx +2 -1
- package/src/modules/feature_toggles/components/overrideFormConfig.tsx +10 -1
- package/src/modules/feature_toggles/data/validators.ts +11 -3
- package/src/modules/inbox_ops/api/settings/route.ts +18 -0
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +15 -10
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +9 -4
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +20 -11
- package/src/modules/integrations/backend/integrations/page.tsx +13 -8
- package/src/modules/messages/commands/messages.ts +27 -15
- package/src/modules/perspectives/api/[tableId]/route.ts +11 -2
- package/src/modules/perspectives/services/perspectiveService.ts +13 -1
- package/src/modules/planner/backend/planner/availability-rulesets/[id]/page.tsx +16 -14
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +6 -3
- package/src/modules/planner/components/AvailabilityRuleSetForm.tsx +3 -0
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +58 -15
- package/src/modules/planner/components/AvailabilitySchedule.tsx +22 -7
- package/src/modules/query_index/lib/engine.ts +34 -0
- package/src/modules/resources/backend/resources/resource-types/[id]/edit/page.tsx +7 -1
- package/src/modules/resources/backend/resources/resource-types/page.tsx +6 -3
- package/src/modules/resources/backend/resources/resources/[id]/page.tsx +23 -3
- package/src/modules/resources/backend/resources/resources/page.tsx +15 -4
- package/src/modules/resources/components/ResourceCrudForm.tsx +3 -0
- package/src/modules/resources/components/ResourceTypeCrudForm.tsx +2 -0
- package/src/modules/sales/api/documents/factory.ts +13 -1
- package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +6 -0
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +10 -4
- package/src/modules/sales/backend/sales/channels/page.tsx +19 -4
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +73 -20
- package/src/modules/sales/backend/sales/documents/create/page.tsx +2 -0
- package/src/modules/sales/commands/documentAddresses.ts +226 -4
- package/src/modules/sales/commands/documents.ts +28 -0
- package/src/modules/sales/commands/returns.ts +12 -3
- package/src/modules/sales/commands/shared.ts +36 -0
- package/src/modules/sales/commands/shipments.ts +17 -1
- package/src/modules/sales/components/AdjustmentKindSettings.tsx +20 -11
- package/src/modules/sales/components/DocumentNumberSettings.tsx +1 -0
- package/src/modules/sales/components/OrderEditingSettings.tsx +1 -0
- package/src/modules/sales/components/PaymentMethodsSettings.tsx +12 -4
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +12 -4
- package/src/modules/sales/components/StatusSettings.tsx +20 -11
- package/src/modules/sales/components/TaxRatesSettings.tsx +12 -5
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +67 -14
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +7 -4
- package/src/modules/sales/components/documents/AddressesSection.tsx +35 -25
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +50 -25
- package/src/modules/sales/components/documents/ItemsSection.tsx +24 -13
- package/src/modules/sales/components/documents/LineItemDialog.tsx +26 -9
- package/src/modules/sales/components/documents/PaymentDialog.tsx +33 -14
- package/src/modules/sales/components/documents/PaymentsSection.tsx +22 -10
- package/src/modules/sales/components/documents/ReturnDialog.tsx +28 -17
- package/src/modules/sales/components/documents/ReturnsSection.tsx +4 -1
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +11 -4
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +23 -8
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +20 -10
- package/src/modules/sales/components/documents/optimisticLock.ts +34 -0
- package/src/modules/sales/components/documents/shipmentTypes.ts +1 -0
- package/src/modules/sales/di.ts +35 -0
- package/src/modules/sales/i18n/de.json +3 -0
- package/src/modules/sales/i18n/en.json +3 -0
- package/src/modules/sales/i18n/es.json +3 -0
- package/src/modules/sales/i18n/pl.json +3 -0
- package/src/modules/staff/api/job-histories.ts +12 -2
- package/src/modules/staff/api/timesheets/time-entries/route.ts +16 -4
- package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +12 -7
- package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +2 -0
- package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +16 -5
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -2
- package/src/modules/staff/backend/staff/team-roles/[id]/edit/page.tsx +8 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +6 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +13 -3
- package/src/modules/staff/backend/staff/teams/page.tsx +9 -3
- package/src/modules/staff/backend/staff/timesheets/page.tsx +10 -1
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +9 -3
- package/src/modules/staff/commands/job-histories.ts +42 -3
- package/src/modules/staff/components/LeaveRequestForm.tsx +2 -0
- package/src/modules/staff/components/TeamForm.tsx +2 -0
- package/src/modules/staff/components/TeamMemberForm.tsx +2 -0
- package/src/modules/staff/components/TeamRoleForm.tsx +2 -0
- package/src/modules/staff/components/detail/JobHistorySection.tsx +28 -6
- package/src/modules/staff/data/validators.ts +6 -0
- package/src/modules/staff/i18n/de.json +1 -0
- package/src/modules/staff/i18n/en.json +1 -0
- package/src/modules/staff/i18n/es.json +1 -0
- package/src/modules/staff/i18n/pl.json +1 -0
- package/src/modules/staff/lib/leaveRequestHelpers.ts +4 -0
- package/src/modules/translations/components/TranslationManager.tsx +13 -8
- package/src/modules/workflows/api/definitions/[id]/route.ts +112 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +20 -4
- package/src/modules/workflows/backend/definitions/page.tsx +20 -9
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +29 -16
- package/src/modules/workflows/components/formConfig.tsx +5 -0
- package/src/modules/workflows/di.ts +20 -0
- package/src/modules/workflows/i18n/de.json +1 -0
- package/src/modules/workflows/i18n/en.json +1 -0
- package/src/modules/workflows/i18n/es.json +1 -0
- package/src/modules/workflows/i18n/pl.json +1 -0
|
@@ -7,7 +7,8 @@ import { Page, PageBody } from "@open-mercato/ui/backend/Page";
|
|
|
7
7
|
import { Button } from "@open-mercato/ui/primitives/button";
|
|
8
8
|
import { Spinner } from "@open-mercato/ui/primitives/spinner";
|
|
9
9
|
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
10
|
-
import { apiCallOrThrow, readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
|
|
10
|
+
import { apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from "@open-mercato/ui/backend/utils/apiCall";
|
|
11
|
+
import { buildOptimisticLockHeader } from "@open-mercato/ui/backend/utils/optimisticLock";
|
|
11
12
|
import { collectCustomFieldValues } from "@open-mercato/ui/backend/utils/customFieldValues";
|
|
12
13
|
import { mapCrudServerErrorToFormErrors } from "@open-mercato/ui/backend/utils/serverErrors";
|
|
13
14
|
import { E } from "../../../../../../generated/entities.ids.generated.js";
|
|
@@ -237,19 +238,27 @@ function CustomerPersonDetailPage({ params }) {
|
|
|
237
238
|
async (patch, apply) => {
|
|
238
239
|
if (!data) return;
|
|
239
240
|
const payload = { id: data.person.id, ...patch };
|
|
240
|
-
await runMutationWithContext(
|
|
241
|
-
() =>
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
241
|
+
const result = await runMutationWithContext(
|
|
242
|
+
() => withScopedApiRequestHeaders(
|
|
243
|
+
buildOptimisticLockHeader(data?.person?.updatedAt),
|
|
244
|
+
() => apiCallOrThrow(
|
|
245
|
+
"/api/customers/people",
|
|
246
|
+
{
|
|
247
|
+
method: "PUT",
|
|
248
|
+
headers: { "content-type": "application/json" },
|
|
249
|
+
body: JSON.stringify(payload)
|
|
250
|
+
},
|
|
251
|
+
{ errorMessage: t("customers.people.detail.inline.error") }
|
|
252
|
+
)
|
|
249
253
|
),
|
|
250
254
|
payload
|
|
251
255
|
);
|
|
252
|
-
|
|
256
|
+
const nextUpdatedAt = result?.result?.updatedAt ?? null;
|
|
257
|
+
setData((prev) => {
|
|
258
|
+
if (!prev) return prev;
|
|
259
|
+
const applied = apply(prev);
|
|
260
|
+
return nextUpdatedAt ? { ...applied, person: { ...applied.person, updatedAt: nextUpdatedAt } } : applied;
|
|
261
|
+
});
|
|
253
262
|
},
|
|
254
263
|
[data, runMutationWithContext, t]
|
|
255
264
|
);
|
|
@@ -299,13 +308,16 @@ function CustomerPersonDetailPage({ params }) {
|
|
|
299
308
|
setIsDeleting(true);
|
|
300
309
|
try {
|
|
301
310
|
await runMutationWithContext(
|
|
302
|
-
() =>
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
311
|
+
() => withScopedApiRequestHeaders(
|
|
312
|
+
buildOptimisticLockHeader(data?.person?.updatedAt),
|
|
313
|
+
() => apiCallOrThrow(
|
|
314
|
+
`/api/customers/people?id=${encodeURIComponent(personId)}`,
|
|
315
|
+
{
|
|
316
|
+
method: "DELETE",
|
|
317
|
+
headers: { "content-type": "application/json" }
|
|
318
|
+
},
|
|
319
|
+
{ errorMessage: t("customers.people.list.deleteError") }
|
|
320
|
+
)
|
|
309
321
|
),
|
|
310
322
|
{ id: personId }
|
|
311
323
|
);
|
|
@@ -343,14 +355,17 @@ function CustomerPersonDetailPage({ params }) {
|
|
|
343
355
|
customFields: customPayload
|
|
344
356
|
};
|
|
345
357
|
await runMutationWithContext(
|
|
346
|
-
() =>
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
358
|
+
() => withScopedApiRequestHeaders(
|
|
359
|
+
buildOptimisticLockHeader(data?.person?.updatedAt),
|
|
360
|
+
() => apiCallOrThrow(
|
|
361
|
+
"/api/customers/people",
|
|
362
|
+
{
|
|
363
|
+
method: "PUT",
|
|
364
|
+
headers: { "content-type": "application/json" },
|
|
365
|
+
body: JSON.stringify(payload)
|
|
366
|
+
},
|
|
367
|
+
{ errorMessage: t("customers.people.detail.inline.error") }
|
|
368
|
+
)
|
|
354
369
|
),
|
|
355
370
|
payload
|
|
356
371
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/customers/backend/customers/people/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport {\n ActivitiesSection,\n} from '../../../../components/detail/ActivitiesSection'\nimport {\n NotesSection,\n type CommentSummary,\n type SectionAction,\n RecordNotFoundState,\n ErrorMessage,\n} from '@open-mercato/ui/backend/detail'\nimport {\n TagsSection,\n type TagOption,\n} from '../../../../components/detail/TagsSection'\nimport { DealsSection } from '../../../../components/detail/DealsSection'\nimport { AddressesSection } from '../../../../components/detail/AddressesSection'\nimport { TasksSection } from '../../../../components/detail/TasksSection'\nimport { PersonHighlights } from '../../../../components/detail/PersonHighlights'\nimport {\n renderLinkedInDisplay,\n renderTwitterDisplay,\n renderMultilineMarkdownDisplay,\n InlineDictionaryEditor,\n} from '../../../../components/detail/InlineEditors'\nimport { DetailFieldsSection, type DetailFieldConfig } from '@open-mercato/ui/backend/detail'\nimport { isValidSocialUrl } from '@open-mercato/core/modules/customers/lib/detailHelpers'\nimport type { ActivitySummary, DealSummary, TagSummary, TodoLinkSummary } from '../../../../components/detail/types'\nimport { CustomDataSection } from '../../../../components/detail/CustomDataSection'\nimport { createTranslatorWithFallback } from '@open-mercato/shared/lib/i18n/translate'\nimport { normalizeCustomFieldSubmitValue } from '../../../../components/detail/customFieldUtils'\nimport { renderDictionaryColor, renderDictionaryIcon } from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\nimport { ICON_SUGGESTIONS } from '../../../../lib/dictionaries'\nimport { createCustomerNotesAdapter } from '../../../../components/detail/notesAdapter'\nimport { readMarkdownPreferenceCookie, writeMarkdownPreferenceCookie } from '../../../../lib/markdownPreference'\nimport { InjectionSpot, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { DetailTabsLayout } from '../../../../components/detail/DetailTabsLayout'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'\n\ntype PersonOverview = {\n person: {\n id: string\n displayName: string\n description?: string | null\n primaryEmail?: string | null\n primaryPhone?: string | null\n status?: string | null\n lifecycleStage?: string | null\n source?: string | null\n nextInteractionAt?: string | null\n nextInteractionName?: string | null\n nextInteractionRefId?: string | null\n nextInteractionIcon?: string | null\n nextInteractionColor?: string | null\n organizationId?: string | null\n }\n profile: {\n id: string\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n jobTitle?: string | null\n department?: string | null\n seniority?: string | null\n timezone?: string | null\n linkedInUrl?: string | null\n twitterUrl?: string | null\n companyEntityId?: string | null\n } | null\n customFields: Record<string, unknown>\n tags: TagSummary[]\n comments: CommentSummary[]\n activities: ActivitySummary[]\n deals: DealSummary[]\n todos: TodoLinkSummary[]\n viewer?: {\n userId: string | null\n name?: string | null\n email?: string | null\n } | null\n}\n\ntype SectionKey = 'notes' | 'activities' | 'deals' | 'addresses' | 'tasks' | string\n\ntype ProfileEditableField = 'firstName' | 'lastName' | 'jobTitle' | 'department' | 'linkedInUrl' | 'twitterUrl'\n\n\nexport default function CustomerPersonDetailPage({ params }: { params?: { id?: string } }) {\n const id = params?.id\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const detailTranslator = React.useMemo(() => createTranslatorWithFallback(t), [t])\n const notesAdapter = React.useMemo(() => createCustomerNotesAdapter(detailTranslator), [detailTranslator])\n const router = useRouter()\n const searchParams = useSearchParams()\n const initialTab = React.useMemo(() => {\n const raw = searchParams?.get('tab')\n if (raw === 'notes' || raw === 'activities' || raw === 'deals' || raw === 'addresses' || raw === 'tasks') {\n return raw\n }\n return 'notes'\n }, [searchParams])\n const [data, setData] = React.useState<PersonOverview | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [isNotFound, setIsNotFound] = React.useState(false)\n const [activeTab, setActiveTab] = React.useState<SectionKey>(initialTab)\n const [sectionAction, setSectionAction] = React.useState<SectionAction | null>(null)\n const [isDeleting, setIsDeleting] = React.useState(false)\n\n const handleSectionActionChange = React.useCallback((action: SectionAction | null) => {\n setSectionAction(action)\n }, [])\n\n const handleSectionAction = React.useCallback(() => {\n if (!sectionAction || sectionAction.disabled) return\n sectionAction.onClick()\n }, [sectionAction])\n\n React.useEffect(() => {\n setSectionAction(null)\n }, [activeTab])\n const validators = React.useMemo(() => ({\n email: (value: string) => {\n if (!value) return null\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(value) ? null : t('customers.people.detail.inline.emailInvalid')\n },\n phone: (value: string) => {\n if (!value) return null\n return value.length >= 3 ? null : t('customers.people.detail.inline.phoneInvalid')\n },\n displayName: (value: string) => {\n const trimmed = value.trim()\n return trimmed.length ? null : t('customers.people.form.displayName.error')\n },\n linkedInUrl: (value: string) => {\n if (!value) return null\n const candidate = value.trim()\n return isValidSocialUrl(candidate, { hosts: ['linkedin.com'], pathRequired: true })\n ? null\n : t('customers.people.detail.inline.linkedInInvalid')\n },\n twitterUrl: (value: string) => {\n if (!value) return null\n const candidate = value.trim()\n return isValidSocialUrl(candidate, { hosts: ['twitter.com', 'x.com'], pathRequired: true })\n ? null\n : t('customers.people.detail.inline.twitterInvalid')\n },\n }), [t])\n\n const personId = data?.person?.id ?? null\n const mutationContextId = React.useMemo(\n () => (personId ? `customer-person:${personId}` : `customer-person:${id ?? 'pending'}`),\n [id, personId],\n )\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n personId?: string | null\n resourceKind: string\n resourceId?: string\n data: PersonOverview | null\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const injectionContext = React.useMemo(\n () => ({\n formId: mutationContextId,\n personId,\n resourceKind: 'customers.person',\n resourceId: personId ?? (id ?? undefined),\n data,\n retryLastMutation,\n }),\n [data, id, mutationContextId, personId, retryLastMutation],\n )\n const runMutationWithContext = React.useCallback(\n async <T,>(operation: () => Promise<T>, mutationPayload?: Record<string, unknown>): Promise<T> => {\n return runMutation({\n operation,\n mutationPayload,\n context: injectionContext,\n })\n },\n [injectionContext, runMutation],\n )\n const { widgets: injectedTabWidgets } = useInjectionWidgets('customers.person.detail:tabs', {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const injectedTabs = React.useMemo(\n () =>\n (injectedTabWidgets ?? [])\n .filter((widget) => (widget.placement?.kind ?? 'tab') === 'tab')\n .map((widget) => {\n const id = widget.placement?.groupId ?? widget.widgetId\n const label = widget.placement?.groupLabel ?? widget.module.metadata.title\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const render = () => (\n <widget.module.Widget\n context={injectionContext}\n data={data}\n onDataChange={(next) => setData(next as PersonOverview)}\n />\n )\n return { id, label, priority, render }\n })\n .sort((a, b) => b.priority - a.priority),\n [data, injectedTabWidgets, injectionContext],\n )\n const injectedTabMap = React.useMemo(() => new Map(injectedTabs.map((tab) => [tab.id, tab.render])), [injectedTabs])\n\n const tabs = React.useMemo(\n () => [\n { id: 'notes' as const, label: t('customers.people.detail.tabs.notes') },\n { id: 'activities' as const, label: t('customers.people.detail.tabs.activities') },\n { id: 'deals' as const, label: t('customers.people.detail.tabs.deals') },\n { id: 'addresses' as const, label: t('customers.people.detail.tabs.addresses') },\n { id: 'tasks' as const, label: t('customers.people.detail.tabs.tasks') },\n ...injectedTabs.map((tab) => ({ id: tab.id as SectionKey, label: tab.label })),\n ],\n [injectedTabs, t]\n )\n\n const personName = React.useMemo(\n () => (data?.person?.displayName ? data.person.displayName : t('customers.people.list.deleteFallbackName')),\n [data?.person?.displayName, t]\n )\n\n const dealsScope = React.useMemo(\n () => (personId ? ({ kind: 'person', entityId: personId } as const) : null),\n [personId],\n )\n const dealSelectOptions = React.useMemo(\n () =>\n Array.isArray(data?.deals)\n ? data.deals\n .map((deal) => {\n if (!deal || typeof deal !== 'object') return null\n const record = deal as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : ''\n if (!id) return null\n const rawTitle = typeof record.title === 'string' ? record.title.trim() : ''\n const label = rawTitle.length ? rawTitle : id\n return { id, label }\n })\n .filter((option): option is { id: string; label: string } => option !== null)\n : [],\n [data?.deals],\n )\n const handleNotesLoadingChange = React.useCallback(() => {}, [])\n\n const handleActivitiesLoadingChange = React.useCallback(() => {}, [])\n\n const handleDealsLoadingChange = React.useCallback(() => {}, [])\n\n const handleAddressesLoadingChange = React.useCallback(() => {}, [])\n\n const handleTasksLoadingChange = React.useCallback(() => {}, [])\n\n const initialLoadDoneRef = React.useRef(false)\n const loadData = React.useCallback(async () => {\n if (!id) {\n setIsNotFound(true)\n setIsLoading(false)\n return\n }\n if (!initialLoadDoneRef.current) {\n setIsLoading(true)\n }\n setError(null)\n setIsNotFound(false)\n try {\n const payload = await readApiResultOrThrow<PersonOverview>(\n `/api/customers/people/${encodeURIComponent(id)}?include=todos`,\n undefined,\n { errorMessage: t('customers.people.detail.error.load') },\n )\n setData(payload as PersonOverview)\n } catch (err) {\n if ((err as { status?: number }).status === 404) {\n setIsNotFound(true)\n } else {\n const message = err instanceof Error ? err.message : t('customers.people.detail.error.load')\n setError(message)\n }\n if (!initialLoadDoneRef.current) setData(null)\n } finally {\n setIsLoading(false)\n initialLoadDoneRef.current = true\n }\n }, [id, t])\n\n React.useEffect(() => {\n loadData().catch(() => {})\n }, [loadData])\n\n const savePerson = React.useCallback(\n async (patch: Record<string, unknown>, apply: (prev: PersonOverview) => PersonOverview) => {\n if (!data) return\n const payload = { id: data.person.id, ...patch }\n await runMutationWithContext(\n () => apiCallOrThrow(\n '/api/customers/people',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('customers.people.detail.inline.error') },\n ),\n payload,\n )\n setData((prev) => (prev ? apply(prev) : prev))\n },\n [data, runMutationWithContext, t]\n )\n\n const updateDisplayName = React.useCallback(\n async (next: string | null) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { displayName: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n displayName: next && next.length ? next : prev.person.displayName,\n },\n })\n )\n },\n [savePerson]\n )\n\n const updateProfileField = React.useCallback(\n async (field: ProfileEditableField, next: string | null) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { [field]: send },\n (prev) => {\n if (!prev.profile) return prev\n const nextValue = next && next.length ? next : null\n return {\n ...prev,\n profile: {\n ...prev.profile,\n [field]: nextValue,\n },\n }\n }\n )\n },\n [savePerson]\n )\n\n const handleDelete = React.useCallback(async () => {\n if (!personId) return\n const confirmed = await confirm({\n title: t('customers.people.list.deleteConfirm', undefined, { name: personName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n setIsDeleting(true)\n try {\n await runMutationWithContext(\n () => apiCallOrThrow(\n `/api/customers/people?id=${encodeURIComponent(personId)}`,\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n },\n { errorMessage: t('customers.people.list.deleteError') },\n ),\n { id: personId },\n )\n flash(t('customers.people.list.deleteSuccess'), 'success')\n router.push('/backend/customers/people')\n } catch (err) {\n const message = err instanceof Error ? err.message : t('customers.people.list.deleteError')\n flash(message, 'error')\n } finally {\n setIsDeleting(false)\n }\n }, [confirm, personId, personName, router, runMutationWithContext, t])\n\n const handleTagsChange = React.useCallback((nextTags: TagOption[]) => {\n setData((prev) => (prev ? { ...prev, tags: nextTags } : prev))\n }, [])\n \n const handleCustomFieldsSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n if (!data) {\n throw new Error(t('customers.people.detail.inline.error'))\n }\n const customPayload = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n })\n const prefixed: Record<string, unknown> = {}\n for (const [fieldId, value] of Object.entries(customPayload)) {\n prefixed[`cf_${fieldId}`] = value\n }\n if (!Object.keys(customPayload).length) {\n flash(t('ui.forms.flash.saveSuccess'), 'success')\n return\n }\n try {\n const payload = {\n id: data.person.id,\n customFields: customPayload,\n }\n await runMutationWithContext(\n () => apiCallOrThrow(\n '/api/customers/people',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('customers.people.detail.inline.error') },\n ),\n payload,\n )\n } catch (err) {\n const { message: helperMessage, fieldErrors } = mapCrudServerErrorToFormErrors(err)\n const mappedErrors = fieldErrors\n ? Object.entries(fieldErrors).reduce<Record<string, string>>((acc, [key, value]) => {\n const formKey = key.startsWith('cf_') ? key : `cf_${key}`\n acc[formKey] = value\n return acc\n }, {})\n : undefined\n const error = new Error(helperMessage ?? t('customers.people.detail.inline.error')) as Error & {\n fieldErrors?: Record<string, string>\n }\n if (mappedErrors && Object.keys(mappedErrors).length) error.fieldErrors = mappedErrors\n throw error\n }\n setData((prev) => {\n if (!prev) return prev\n const nextCustomFields = { ...prefixed }\n return { ...prev, customFields: nextCustomFields }\n })\n flash(t('ui.forms.flash.saveSuccess'), 'success')\n },\n [data, runMutationWithContext, t]\n )\n \n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('customers.people.detail.loading')}</span>\n </div>\n </PageBody>\n </Page>\n )\n }\n \n if (isNotFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={t('customers.people.detail.error.notFound', 'Person not found.')}\n backHref=\"/backend/customers/people\"\n backLabel={t('customers.people.detail.actions.backToList', 'Back to people')}\n />\n </PageBody>\n </Page>\n )\n }\n\n if (error || !data || !personId) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error ?? t('customers.people.detail.error.notFound', 'Person not found.')}\n action={\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link href=\"/backend/customers/people\">\n {t('customers.people.detail.actions.backToList', 'Back to people')}\n </Link>\n </Button>\n }\n />\n </PageBody>\n </Page>\n )\n }\n \n const { person, profile } = data\n \n const detailFields: DetailFieldConfig[] = [\n {\n key: 'displayName',\n kind: 'text',\n label: t('customers.people.detail.fields.displayName'),\n value: person.displayName,\n placeholder: t('customers.people.form.displayName.placeholder'),\n emptyLabel: t('customers.people.detail.noValue'),\n validator: validators.displayName,\n onSave: updateDisplayName,\n },\n {\n key: 'firstName',\n kind: 'text',\n label: t('customers.people.form.firstName'),\n value: profile?.firstName ?? null,\n placeholder: t('customers.people.form.firstName'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('firstName', next),\n },\n {\n key: 'lastName',\n kind: 'text',\n label: t('customers.people.form.lastName'),\n value: profile?.lastName ?? null,\n placeholder: t('customers.people.form.lastName'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('lastName', next),\n },\n {\n key: 'jobTitle',\n kind: 'custom',\n label: t('customers.people.form.jobTitle'),\n emptyLabel: t('customers.people.detail.noValue'),\n render: () => (\n <InlineDictionaryEditor\n label={t('customers.people.form.jobTitle')}\n value={profile?.jobTitle ?? null}\n emptyLabel={t('customers.people.detail.noValue')}\n kind=\"job-titles\"\n onSave={async (next) => updateProfileField('jobTitle', next)}\n selectClassName=\"h-9 w-full rounded border px-3 text-sm\"\n variant=\"muted\"\n activateOnClick\n />\n ),\n },\n {\n key: 'lifecycleStage',\n kind: 'custom',\n label: t('customers.people.detail.fields.lifecycleStage'),\n emptyLabel: t('customers.people.detail.noValue'),\n render: () => (\n <InlineDictionaryEditor\n label={t('customers.people.detail.fields.lifecycleStage')}\n value={person.lifecycleStage ?? null}\n emptyLabel={t('customers.people.detail.noValue')}\n kind=\"lifecycle-stages\"\n onSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { lifecycleStage: send },\n (prev) => ({\n ...prev,\n person: { ...prev.person, lifecycleStage: next && next.length ? next : null },\n })\n )\n }}\n selectClassName=\"h-9 w-full rounded border px-3 text-sm\"\n variant=\"muted\"\n activateOnClick\n />\n ),\n },\n {\n key: 'source',\n kind: 'custom',\n label: t('customers.people.form.source'),\n emptyLabel: t('customers.people.detail.noValue'),\n render: () => (\n <InlineDictionaryEditor\n label={t('customers.people.form.source')}\n value={person.source ?? null}\n emptyLabel={t('customers.people.detail.noValue')}\n kind=\"sources\"\n onSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { source: send },\n (prev) => ({\n ...prev,\n person: { ...prev.person, source: next && next.length ? next : null },\n })\n )\n }}\n selectClassName=\"h-9 w-full rounded border px-3 text-sm\"\n variant=\"muted\"\n activateOnClick\n />\n ),\n },\n {\n key: 'description',\n kind: 'multiline',\n label: t('customers.people.form.description'),\n value: person.description ?? null,\n placeholder: t('customers.people.form.description'),\n emptyLabel: t('customers.people.detail.noValue'),\n gridClassName: 'sm:col-span-2 xl:col-span-3',\n renderDisplay: renderMultilineMarkdownDisplay,\n onSave: async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { description: send },\n (prev) => ({\n ...prev,\n person: { ...prev.person, description: next && next.length ? next : null },\n })\n )\n },\n },\n {\n key: 'department',\n kind: 'text',\n label: t('customers.people.detail.fields.department'),\n value: profile?.department ?? null,\n placeholder: t('customers.people.detail.fields.department'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('department', next),\n },\n {\n key: 'linkedInUrl',\n kind: 'text',\n label: t('customers.people.detail.fields.linkedIn'),\n value: profile?.linkedInUrl ?? null,\n placeholder: t('customers.people.detail.fields.linkedIn'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('linkedInUrl', next),\n inputType: 'url',\n validator: validators.linkedInUrl,\n renderDisplay: renderLinkedInDisplay,\n },\n {\n key: 'twitterUrl',\n kind: 'text',\n label: t('customers.people.detail.fields.twitter'),\n value: profile?.twitterUrl ?? null,\n placeholder: t('customers.people.detail.fields.twitter'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('twitterUrl', next),\n inputType: 'url',\n validator: validators.twitterUrl,\n renderDisplay: renderTwitterDisplay,\n },\n ]\n \n return (\n <Page>\n <PageBody className=\"space-y-8\">\n <PersonHighlights\n person={person}\n profile={profile}\n validators={{\n email: validators.email,\n phone: validators.phone,\n displayName: validators.displayName,\n }}\n utilityActions={(\n <SendObjectMessageDialog\n object={{\n entityModule: 'customers',\n entityType: 'person',\n entityId: personId,\n previewData: {\n title: person.displayName,\n subtitle: person.primaryEmail ?? undefined,\n metadata: {\n [t('customers.people.detail.highlights.primaryPhone')]: person.primaryPhone ?? '-',\n [t('customers.people.detail.fields.jobTitle')]: profile?.jobTitle ?? '-',\n },\n },\n }}\n viewHref={`/backend/customers/people/${personId}`}\n />\n )}\n onDisplayNameSave={updateDisplayName}\n onPrimaryEmailSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { primaryEmail: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n primaryEmail: next && next.length ? next.toLowerCase() : null,\n },\n })\n )\n }}\n onPrimaryPhoneSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { primaryPhone: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n primaryPhone: next && next.length ? next : null,\n },\n })\n )\n }}\n onStatusSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { status: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n status: next && next.length ? next : null,\n },\n })\n )\n }}\n onNextInteractionSave={async (next) => {\n await savePerson(\n {\n nextInteraction: next\n ? {\n at: next.at,\n name: next.name,\n refId: next.refId ?? undefined,\n icon: next.icon ?? undefined,\n color: next.color ?? undefined,\n }\n : null,\n },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n nextInteractionAt: next ? next.at : null,\n nextInteractionName: next ? next.name || null : null,\n nextInteractionRefId: next ? next.refId || null : null,\n nextInteractionIcon: next ? next.icon || null : null,\n nextInteractionColor: next ? next.color || null : null,\n },\n })\n )\n }}\n onDelete={handleDelete}\n isDeleting={isDeleting}\n onCompanySave={async (next) => {\n const normalized = typeof next === 'string' && next.trim().length ? next.trim() : null\n await savePerson(\n { companyEntityId: normalized },\n (prev) => {\n if (!prev.profile) return prev\n return {\n ...prev,\n profile: {\n ...prev.profile,\n companyEntityId: normalized,\n },\n }\n }\n )\n }}\n />\n \n <DetailTabsLayout\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n sectionAction={sectionAction}\n onSectionAction={handleSectionAction}\n navAriaLabel={t('customers.people.detail.tabs.label', 'Person detail sections')}\n headerClassName=\"mb-1\"\n >\n {(() => {\n const injected = injectedTabMap.get(activeTab)\n if (injected) return injected()\n if (activeTab === 'notes') {\n return (\n <NotesSection\n entityId={personId}\n dealOptions={dealSelectOptions}\n emptyLabel={t('customers.people.detail.empty.comments')}\n viewerUserId={data.viewer?.userId ?? null}\n viewerName={data.viewer?.name ?? null}\n viewerEmail={data.viewer?.email ?? null}\n addActionLabel={t('customers.people.detail.notes.addLabel')}\n emptyState={{\n title: t('customers.people.detail.emptyState.notes.title'),\n actionLabel: t('customers.people.detail.emptyState.notes.action'),\n }}\n onActionChange={handleSectionActionChange}\n translator={detailTranslator}\n onLoadingChange={handleNotesLoadingChange}\n dataAdapter={notesAdapter}\n renderIcon={renderDictionaryIcon}\n renderColor={renderDictionaryColor}\n iconSuggestions={ICON_SUGGESTIONS}\n readMarkdownPreference={readMarkdownPreferenceCookie}\n writeMarkdownPreference={writeMarkdownPreferenceCookie}\n />\n )\n }\n if (activeTab === 'activities') {\n return (\n <ActivitiesSection\n entityId={personId}\n dealOptions={dealSelectOptions}\n defaultEntityId={personId ?? undefined}\n runGuardedMutation={runMutationWithContext}\n addActionLabel={t('customers.people.detail.activities.add')}\n emptyState={{\n title: t('customers.people.detail.emptyState.activities.title'),\n actionLabel: t('customers.people.detail.emptyState.activities.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleActivitiesLoadingChange}\n />\n )\n }\n if (activeTab === 'deals') {\n return (\n <DealsSection\n scope={dealsScope}\n emptyLabel={t('customers.people.detail.empty.deals')}\n addActionLabel={t('customers.people.detail.actions.addDeal')}\n emptyState={{\n title: t('customers.people.detail.emptyState.deals.title'),\n actionLabel: t('customers.people.detail.emptyState.deals.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleDealsLoadingChange}\n onDataRefresh={loadData}\n translator={detailTranslator}\n runGuardedMutation={runMutationWithContext}\n />\n )\n }\n if (activeTab === 'addresses') {\n return (\n <AddressesSection\n entityId={personId}\n emptyLabel={t('customers.people.detail.empty.addresses')}\n addActionLabel={t('customers.people.detail.addresses.add')}\n emptyState={{\n title: t('customers.people.detail.emptyState.addresses.title'),\n actionLabel: t('customers.people.detail.emptyState.addresses.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleAddressesLoadingChange}\n translator={detailTranslator}\n />\n )\n }\n if (activeTab === 'tasks') {\n return (\n <TasksSection\n entityId={personId}\n initialTasks={data.todos}\n runGuardedMutation={runMutationWithContext}\n emptyLabel={t('customers.people.detail.empty.todos')}\n addActionLabel={t('customers.people.detail.tasks.add')}\n emptyState={{\n title: t('customers.people.detail.emptyState.tasks.title'),\n actionLabel: t('customers.people.detail.emptyState.tasks.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleTasksLoadingChange}\n translator={detailTranslator}\n entityName={personName}\n dialogContextKey=\"customers.people.detail.tasks.dialog.context\"\n dialogContextFallback=\"This task will be linked to {{name}}\"\n />\n )\n }\n return null\n })()}\n </DetailTabsLayout>\n \n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <h2 className=\"text-sm font-semibold\">{t('customers.people.detail.sections.details')}</h2>\n <DetailFieldsSection fields={detailFields} />\n <InjectionSpot\n spotId=\"customers.person.detail:details\"\n context={injectionContext}\n data={data}\n onDataChange={(next) => setData(next as PersonOverview)}\n />\n </div>\n\n <CustomDataSection\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n values={data.customFields ?? {}}\n onSubmit={handleCustomFieldsSubmit}\n title={t('customers.people.detail.sections.customFields')}\n />\n \n <TagsSection\n entityId={data.person.id}\n tags={data.tags}\n onChange={handleTagsChange}\n isSubmitting={false}\n />\n </div>\n\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n \n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport {\n ActivitiesSection,\n} from '../../../../components/detail/ActivitiesSection'\nimport {\n NotesSection,\n type CommentSummary,\n type SectionAction,\n RecordNotFoundState,\n ErrorMessage,\n} from '@open-mercato/ui/backend/detail'\nimport {\n TagsSection,\n type TagOption,\n} from '../../../../components/detail/TagsSection'\nimport { DealsSection } from '../../../../components/detail/DealsSection'\nimport { AddressesSection } from '../../../../components/detail/AddressesSection'\nimport { TasksSection } from '../../../../components/detail/TasksSection'\nimport { PersonHighlights } from '../../../../components/detail/PersonHighlights'\nimport {\n renderLinkedInDisplay,\n renderTwitterDisplay,\n renderMultilineMarkdownDisplay,\n InlineDictionaryEditor,\n} from '../../../../components/detail/InlineEditors'\nimport { DetailFieldsSection, type DetailFieldConfig } from '@open-mercato/ui/backend/detail'\nimport { isValidSocialUrl } from '@open-mercato/core/modules/customers/lib/detailHelpers'\nimport type { ActivitySummary, DealSummary, TagSummary, TodoLinkSummary } from '../../../../components/detail/types'\nimport { CustomDataSection } from '../../../../components/detail/CustomDataSection'\nimport { createTranslatorWithFallback } from '@open-mercato/shared/lib/i18n/translate'\nimport { normalizeCustomFieldSubmitValue } from '../../../../components/detail/customFieldUtils'\nimport { renderDictionaryColor, renderDictionaryIcon } from '@open-mercato/core/modules/dictionaries/components/dictionaryAppearance'\nimport { ICON_SUGGESTIONS } from '../../../../lib/dictionaries'\nimport { createCustomerNotesAdapter } from '../../../../components/detail/notesAdapter'\nimport { readMarkdownPreferenceCookie, writeMarkdownPreferenceCookie } from '../../../../lib/markdownPreference'\nimport { InjectionSpot, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { DetailTabsLayout } from '../../../../components/detail/DetailTabsLayout'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { SendObjectMessageDialog } from '@open-mercato/ui/backend/messages'\n\ntype PersonOverview = {\n person: {\n id: string\n displayName: string\n description?: string | null\n primaryEmail?: string | null\n primaryPhone?: string | null\n status?: string | null\n lifecycleStage?: string | null\n source?: string | null\n nextInteractionAt?: string | null\n nextInteractionName?: string | null\n nextInteractionRefId?: string | null\n nextInteractionIcon?: string | null\n nextInteractionColor?: string | null\n organizationId?: string | null\n updatedAt?: string | null\n }\n profile: {\n id: string\n firstName?: string | null\n lastName?: string | null\n preferredName?: string | null\n jobTitle?: string | null\n department?: string | null\n seniority?: string | null\n timezone?: string | null\n linkedInUrl?: string | null\n twitterUrl?: string | null\n companyEntityId?: string | null\n } | null\n customFields: Record<string, unknown>\n tags: TagSummary[]\n comments: CommentSummary[]\n activities: ActivitySummary[]\n deals: DealSummary[]\n todos: TodoLinkSummary[]\n viewer?: {\n userId: string | null\n name?: string | null\n email?: string | null\n } | null\n}\n\ntype SectionKey = 'notes' | 'activities' | 'deals' | 'addresses' | 'tasks' | string\n\ntype ProfileEditableField = 'firstName' | 'lastName' | 'jobTitle' | 'department' | 'linkedInUrl' | 'twitterUrl'\n\n\nexport default function CustomerPersonDetailPage({ params }: { params?: { id?: string } }) {\n const id = params?.id\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const detailTranslator = React.useMemo(() => createTranslatorWithFallback(t), [t])\n const notesAdapter = React.useMemo(() => createCustomerNotesAdapter(detailTranslator), [detailTranslator])\n const router = useRouter()\n const searchParams = useSearchParams()\n const initialTab = React.useMemo(() => {\n const raw = searchParams?.get('tab')\n if (raw === 'notes' || raw === 'activities' || raw === 'deals' || raw === 'addresses' || raw === 'tasks') {\n return raw\n }\n return 'notes'\n }, [searchParams])\n const [data, setData] = React.useState<PersonOverview | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [error, setError] = React.useState<string | null>(null)\n const [isNotFound, setIsNotFound] = React.useState(false)\n const [activeTab, setActiveTab] = React.useState<SectionKey>(initialTab)\n const [sectionAction, setSectionAction] = React.useState<SectionAction | null>(null)\n const [isDeleting, setIsDeleting] = React.useState(false)\n\n const handleSectionActionChange = React.useCallback((action: SectionAction | null) => {\n setSectionAction(action)\n }, [])\n\n const handleSectionAction = React.useCallback(() => {\n if (!sectionAction || sectionAction.disabled) return\n sectionAction.onClick()\n }, [sectionAction])\n\n React.useEffect(() => {\n setSectionAction(null)\n }, [activeTab])\n const validators = React.useMemo(() => ({\n email: (value: string) => {\n if (!value) return null\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(value) ? null : t('customers.people.detail.inline.emailInvalid')\n },\n phone: (value: string) => {\n if (!value) return null\n return value.length >= 3 ? null : t('customers.people.detail.inline.phoneInvalid')\n },\n displayName: (value: string) => {\n const trimmed = value.trim()\n return trimmed.length ? null : t('customers.people.form.displayName.error')\n },\n linkedInUrl: (value: string) => {\n if (!value) return null\n const candidate = value.trim()\n return isValidSocialUrl(candidate, { hosts: ['linkedin.com'], pathRequired: true })\n ? null\n : t('customers.people.detail.inline.linkedInInvalid')\n },\n twitterUrl: (value: string) => {\n if (!value) return null\n const candidate = value.trim()\n return isValidSocialUrl(candidate, { hosts: ['twitter.com', 'x.com'], pathRequired: true })\n ? null\n : t('customers.people.detail.inline.twitterInvalid')\n },\n }), [t])\n\n const personId = data?.person?.id ?? null\n const mutationContextId = React.useMemo(\n () => (personId ? `customer-person:${personId}` : `customer-person:${id ?? 'pending'}`),\n [id, personId],\n )\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n personId?: string | null\n resourceKind: string\n resourceId?: string\n data: PersonOverview | null\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const injectionContext = React.useMemo(\n () => ({\n formId: mutationContextId,\n personId,\n resourceKind: 'customers.person',\n resourceId: personId ?? (id ?? undefined),\n data,\n retryLastMutation,\n }),\n [data, id, mutationContextId, personId, retryLastMutation],\n )\n const runMutationWithContext = React.useCallback(\n async <T,>(operation: () => Promise<T>, mutationPayload?: Record<string, unknown>): Promise<T> => {\n return runMutation({\n operation,\n mutationPayload,\n context: injectionContext,\n })\n },\n [injectionContext, runMutation],\n )\n const { widgets: injectedTabWidgets } = useInjectionWidgets('customers.person.detail:tabs', {\n context: injectionContext,\n triggerOnLoad: true,\n })\n const injectedTabs = React.useMemo(\n () =>\n (injectedTabWidgets ?? [])\n .filter((widget) => (widget.placement?.kind ?? 'tab') === 'tab')\n .map((widget) => {\n const id = widget.placement?.groupId ?? widget.widgetId\n const label = widget.placement?.groupLabel ?? widget.module.metadata.title\n const priority = typeof widget.placement?.priority === 'number' ? widget.placement.priority : 0\n const render = () => (\n <widget.module.Widget\n context={injectionContext}\n data={data}\n onDataChange={(next) => setData(next as PersonOverview)}\n />\n )\n return { id, label, priority, render }\n })\n .sort((a, b) => b.priority - a.priority),\n [data, injectedTabWidgets, injectionContext],\n )\n const injectedTabMap = React.useMemo(() => new Map(injectedTabs.map((tab) => [tab.id, tab.render])), [injectedTabs])\n\n const tabs = React.useMemo(\n () => [\n { id: 'notes' as const, label: t('customers.people.detail.tabs.notes') },\n { id: 'activities' as const, label: t('customers.people.detail.tabs.activities') },\n { id: 'deals' as const, label: t('customers.people.detail.tabs.deals') },\n { id: 'addresses' as const, label: t('customers.people.detail.tabs.addresses') },\n { id: 'tasks' as const, label: t('customers.people.detail.tabs.tasks') },\n ...injectedTabs.map((tab) => ({ id: tab.id as SectionKey, label: tab.label })),\n ],\n [injectedTabs, t]\n )\n\n const personName = React.useMemo(\n () => (data?.person?.displayName ? data.person.displayName : t('customers.people.list.deleteFallbackName')),\n [data?.person?.displayName, t]\n )\n\n const dealsScope = React.useMemo(\n () => (personId ? ({ kind: 'person', entityId: personId } as const) : null),\n [personId],\n )\n const dealSelectOptions = React.useMemo(\n () =>\n Array.isArray(data?.deals)\n ? data.deals\n .map((deal) => {\n if (!deal || typeof deal !== 'object') return null\n const record = deal as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : ''\n if (!id) return null\n const rawTitle = typeof record.title === 'string' ? record.title.trim() : ''\n const label = rawTitle.length ? rawTitle : id\n return { id, label }\n })\n .filter((option): option is { id: string; label: string } => option !== null)\n : [],\n [data?.deals],\n )\n const handleNotesLoadingChange = React.useCallback(() => {}, [])\n\n const handleActivitiesLoadingChange = React.useCallback(() => {}, [])\n\n const handleDealsLoadingChange = React.useCallback(() => {}, [])\n\n const handleAddressesLoadingChange = React.useCallback(() => {}, [])\n\n const handleTasksLoadingChange = React.useCallback(() => {}, [])\n\n const initialLoadDoneRef = React.useRef(false)\n const loadData = React.useCallback(async () => {\n if (!id) {\n setIsNotFound(true)\n setIsLoading(false)\n return\n }\n if (!initialLoadDoneRef.current) {\n setIsLoading(true)\n }\n setError(null)\n setIsNotFound(false)\n try {\n const payload = await readApiResultOrThrow<PersonOverview>(\n `/api/customers/people/${encodeURIComponent(id)}?include=todos`,\n undefined,\n { errorMessage: t('customers.people.detail.error.load') },\n )\n setData(payload as PersonOverview)\n } catch (err) {\n if ((err as { status?: number }).status === 404) {\n setIsNotFound(true)\n } else {\n const message = err instanceof Error ? err.message : t('customers.people.detail.error.load')\n setError(message)\n }\n if (!initialLoadDoneRef.current) setData(null)\n } finally {\n setIsLoading(false)\n initialLoadDoneRef.current = true\n }\n }, [id, t])\n\n React.useEffect(() => {\n loadData().catch(() => {})\n }, [loadData])\n\n const savePerson = React.useCallback(\n async (patch: Record<string, unknown>, apply: (prev: PersonOverview) => PersonOverview) => {\n if (!data) return\n const payload = { id: data.person.id, ...patch }\n const result = await runMutationWithContext(\n () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader((data?.person as { updatedAt?: string } | undefined)?.updatedAt),\n () => apiCallOrThrow<{ ok?: boolean; updatedAt?: string | null }>(\n '/api/customers/people',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('customers.people.detail.inline.error') },\n ),\n ),\n payload,\n )\n // Refresh the optimistic-lock token so the next sequential inline edit does not\n // send a stale updatedAt and falsely 409 (#2055, default-ON locking).\n const nextUpdatedAt = result?.result?.updatedAt ?? null\n setData((prev) => {\n if (!prev) return prev\n const applied = apply(prev)\n return nextUpdatedAt\n ? { ...applied, person: { ...applied.person, updatedAt: nextUpdatedAt } }\n : applied\n })\n },\n [data, runMutationWithContext, t]\n )\n\n const updateDisplayName = React.useCallback(\n async (next: string | null) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { displayName: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n displayName: next && next.length ? next : prev.person.displayName,\n },\n })\n )\n },\n [savePerson]\n )\n\n const updateProfileField = React.useCallback(\n async (field: ProfileEditableField, next: string | null) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { [field]: send },\n (prev) => {\n if (!prev.profile) return prev\n const nextValue = next && next.length ? next : null\n return {\n ...prev,\n profile: {\n ...prev.profile,\n [field]: nextValue,\n },\n }\n }\n )\n },\n [savePerson]\n )\n\n const handleDelete = React.useCallback(async () => {\n if (!personId) return\n const confirmed = await confirm({\n title: t('customers.people.list.deleteConfirm', undefined, { name: personName }),\n variant: 'destructive',\n })\n if (!confirmed) return\n setIsDeleting(true)\n try {\n await runMutationWithContext(\n () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader((data?.person as { updatedAt?: string } | undefined)?.updatedAt),\n () => apiCallOrThrow(\n `/api/customers/people?id=${encodeURIComponent(personId)}`,\n {\n method: 'DELETE',\n headers: { 'content-type': 'application/json' },\n },\n { errorMessage: t('customers.people.list.deleteError') },\n ),\n ),\n { id: personId },\n )\n flash(t('customers.people.list.deleteSuccess'), 'success')\n router.push('/backend/customers/people')\n } catch (err) {\n const message = err instanceof Error ? err.message : t('customers.people.list.deleteError')\n flash(message, 'error')\n } finally {\n setIsDeleting(false)\n }\n }, [confirm, personId, personName, router, runMutationWithContext, t])\n\n const handleTagsChange = React.useCallback((nextTags: TagOption[]) => {\n setData((prev) => (prev ? { ...prev, tags: nextTags } : prev))\n }, [])\n \n const handleCustomFieldsSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n if (!data) {\n throw new Error(t('customers.people.detail.inline.error'))\n }\n const customPayload = collectCustomFieldValues(values, {\n transform: (value) => normalizeCustomFieldSubmitValue(value),\n })\n const prefixed: Record<string, unknown> = {}\n for (const [fieldId, value] of Object.entries(customPayload)) {\n prefixed[`cf_${fieldId}`] = value\n }\n if (!Object.keys(customPayload).length) {\n flash(t('ui.forms.flash.saveSuccess'), 'success')\n return\n }\n try {\n const payload = {\n id: data.person.id,\n customFields: customPayload,\n }\n await runMutationWithContext(\n () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader((data?.person as { updatedAt?: string } | undefined)?.updatedAt),\n () => apiCallOrThrow(\n '/api/customers/people',\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { errorMessage: t('customers.people.detail.inline.error') },\n ),\n ),\n payload,\n )\n } catch (err) {\n const { message: helperMessage, fieldErrors } = mapCrudServerErrorToFormErrors(err)\n const mappedErrors = fieldErrors\n ? Object.entries(fieldErrors).reduce<Record<string, string>>((acc, [key, value]) => {\n const formKey = key.startsWith('cf_') ? key : `cf_${key}`\n acc[formKey] = value\n return acc\n }, {})\n : undefined\n const error = new Error(helperMessage ?? t('customers.people.detail.inline.error')) as Error & {\n fieldErrors?: Record<string, string>\n }\n if (mappedErrors && Object.keys(mappedErrors).length) error.fieldErrors = mappedErrors\n throw error\n }\n setData((prev) => {\n if (!prev) return prev\n const nextCustomFields = { ...prefixed }\n return { ...prev, customFields: nextCustomFields }\n })\n flash(t('ui.forms.flash.saveSuccess'), 'success')\n },\n [data, runMutationWithContext, t]\n )\n \n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('customers.people.detail.loading')}</span>\n </div>\n </PageBody>\n </Page>\n )\n }\n \n if (isNotFound) {\n return (\n <Page>\n <PageBody>\n <RecordNotFoundState\n label={t('customers.people.detail.error.notFound', 'Person not found.')}\n backHref=\"/backend/customers/people\"\n backLabel={t('customers.people.detail.actions.backToList', 'Back to people')}\n />\n </PageBody>\n </Page>\n )\n }\n\n if (error || !data || !personId) {\n return (\n <Page>\n <PageBody>\n <ErrorMessage\n label={error ?? t('customers.people.detail.error.notFound', 'Person not found.')}\n action={\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link href=\"/backend/customers/people\">\n {t('customers.people.detail.actions.backToList', 'Back to people')}\n </Link>\n </Button>\n }\n />\n </PageBody>\n </Page>\n )\n }\n \n const { person, profile } = data\n \n const detailFields: DetailFieldConfig[] = [\n {\n key: 'displayName',\n kind: 'text',\n label: t('customers.people.detail.fields.displayName'),\n value: person.displayName,\n placeholder: t('customers.people.form.displayName.placeholder'),\n emptyLabel: t('customers.people.detail.noValue'),\n validator: validators.displayName,\n onSave: updateDisplayName,\n },\n {\n key: 'firstName',\n kind: 'text',\n label: t('customers.people.form.firstName'),\n value: profile?.firstName ?? null,\n placeholder: t('customers.people.form.firstName'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('firstName', next),\n },\n {\n key: 'lastName',\n kind: 'text',\n label: t('customers.people.form.lastName'),\n value: profile?.lastName ?? null,\n placeholder: t('customers.people.form.lastName'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('lastName', next),\n },\n {\n key: 'jobTitle',\n kind: 'custom',\n label: t('customers.people.form.jobTitle'),\n emptyLabel: t('customers.people.detail.noValue'),\n render: () => (\n <InlineDictionaryEditor\n label={t('customers.people.form.jobTitle')}\n value={profile?.jobTitle ?? null}\n emptyLabel={t('customers.people.detail.noValue')}\n kind=\"job-titles\"\n onSave={async (next) => updateProfileField('jobTitle', next)}\n selectClassName=\"h-9 w-full rounded border px-3 text-sm\"\n variant=\"muted\"\n activateOnClick\n />\n ),\n },\n {\n key: 'lifecycleStage',\n kind: 'custom',\n label: t('customers.people.detail.fields.lifecycleStage'),\n emptyLabel: t('customers.people.detail.noValue'),\n render: () => (\n <InlineDictionaryEditor\n label={t('customers.people.detail.fields.lifecycleStage')}\n value={person.lifecycleStage ?? null}\n emptyLabel={t('customers.people.detail.noValue')}\n kind=\"lifecycle-stages\"\n onSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { lifecycleStage: send },\n (prev) => ({\n ...prev,\n person: { ...prev.person, lifecycleStage: next && next.length ? next : null },\n })\n )\n }}\n selectClassName=\"h-9 w-full rounded border px-3 text-sm\"\n variant=\"muted\"\n activateOnClick\n />\n ),\n },\n {\n key: 'source',\n kind: 'custom',\n label: t('customers.people.form.source'),\n emptyLabel: t('customers.people.detail.noValue'),\n render: () => (\n <InlineDictionaryEditor\n label={t('customers.people.form.source')}\n value={person.source ?? null}\n emptyLabel={t('customers.people.detail.noValue')}\n kind=\"sources\"\n onSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { source: send },\n (prev) => ({\n ...prev,\n person: { ...prev.person, source: next && next.length ? next : null },\n })\n )\n }}\n selectClassName=\"h-9 w-full rounded border px-3 text-sm\"\n variant=\"muted\"\n activateOnClick\n />\n ),\n },\n {\n key: 'description',\n kind: 'multiline',\n label: t('customers.people.form.description'),\n value: person.description ?? null,\n placeholder: t('customers.people.form.description'),\n emptyLabel: t('customers.people.detail.noValue'),\n gridClassName: 'sm:col-span-2 xl:col-span-3',\n renderDisplay: renderMultilineMarkdownDisplay,\n onSave: async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { description: send },\n (prev) => ({\n ...prev,\n person: { ...prev.person, description: next && next.length ? next : null },\n })\n )\n },\n },\n {\n key: 'department',\n kind: 'text',\n label: t('customers.people.detail.fields.department'),\n value: profile?.department ?? null,\n placeholder: t('customers.people.detail.fields.department'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('department', next),\n },\n {\n key: 'linkedInUrl',\n kind: 'text',\n label: t('customers.people.detail.fields.linkedIn'),\n value: profile?.linkedInUrl ?? null,\n placeholder: t('customers.people.detail.fields.linkedIn'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('linkedInUrl', next),\n inputType: 'url',\n validator: validators.linkedInUrl,\n renderDisplay: renderLinkedInDisplay,\n },\n {\n key: 'twitterUrl',\n kind: 'text',\n label: t('customers.people.detail.fields.twitter'),\n value: profile?.twitterUrl ?? null,\n placeholder: t('customers.people.detail.fields.twitter'),\n emptyLabel: t('customers.people.detail.noValue'),\n onSave: (next) => updateProfileField('twitterUrl', next),\n inputType: 'url',\n validator: validators.twitterUrl,\n renderDisplay: renderTwitterDisplay,\n },\n ]\n \n return (\n <Page>\n <PageBody className=\"space-y-8\">\n <PersonHighlights\n person={person}\n profile={profile}\n validators={{\n email: validators.email,\n phone: validators.phone,\n displayName: validators.displayName,\n }}\n utilityActions={(\n <SendObjectMessageDialog\n object={{\n entityModule: 'customers',\n entityType: 'person',\n entityId: personId,\n previewData: {\n title: person.displayName,\n subtitle: person.primaryEmail ?? undefined,\n metadata: {\n [t('customers.people.detail.highlights.primaryPhone')]: person.primaryPhone ?? '-',\n [t('customers.people.detail.fields.jobTitle')]: profile?.jobTitle ?? '-',\n },\n },\n }}\n viewHref={`/backend/customers/people/${personId}`}\n />\n )}\n onDisplayNameSave={updateDisplayName}\n onPrimaryEmailSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { primaryEmail: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n primaryEmail: next && next.length ? next.toLowerCase() : null,\n },\n })\n )\n }}\n onPrimaryPhoneSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { primaryPhone: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n primaryPhone: next && next.length ? next : null,\n },\n })\n )\n }}\n onStatusSave={async (next) => {\n const send = typeof next === 'string' ? next : ''\n await savePerson(\n { status: send },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n status: next && next.length ? next : null,\n },\n })\n )\n }}\n onNextInteractionSave={async (next) => {\n await savePerson(\n {\n nextInteraction: next\n ? {\n at: next.at,\n name: next.name,\n refId: next.refId ?? undefined,\n icon: next.icon ?? undefined,\n color: next.color ?? undefined,\n }\n : null,\n },\n (prev) => ({\n ...prev,\n person: {\n ...prev.person,\n nextInteractionAt: next ? next.at : null,\n nextInteractionName: next ? next.name || null : null,\n nextInteractionRefId: next ? next.refId || null : null,\n nextInteractionIcon: next ? next.icon || null : null,\n nextInteractionColor: next ? next.color || null : null,\n },\n })\n )\n }}\n onDelete={handleDelete}\n isDeleting={isDeleting}\n onCompanySave={async (next) => {\n const normalized = typeof next === 'string' && next.trim().length ? next.trim() : null\n await savePerson(\n { companyEntityId: normalized },\n (prev) => {\n if (!prev.profile) return prev\n return {\n ...prev,\n profile: {\n ...prev.profile,\n companyEntityId: normalized,\n },\n }\n }\n )\n }}\n />\n \n <DetailTabsLayout\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n sectionAction={sectionAction}\n onSectionAction={handleSectionAction}\n navAriaLabel={t('customers.people.detail.tabs.label', 'Person detail sections')}\n headerClassName=\"mb-1\"\n >\n {(() => {\n const injected = injectedTabMap.get(activeTab)\n if (injected) return injected()\n if (activeTab === 'notes') {\n return (\n <NotesSection\n entityId={personId}\n dealOptions={dealSelectOptions}\n emptyLabel={t('customers.people.detail.empty.comments')}\n viewerUserId={data.viewer?.userId ?? null}\n viewerName={data.viewer?.name ?? null}\n viewerEmail={data.viewer?.email ?? null}\n addActionLabel={t('customers.people.detail.notes.addLabel')}\n emptyState={{\n title: t('customers.people.detail.emptyState.notes.title'),\n actionLabel: t('customers.people.detail.emptyState.notes.action'),\n }}\n onActionChange={handleSectionActionChange}\n translator={detailTranslator}\n onLoadingChange={handleNotesLoadingChange}\n dataAdapter={notesAdapter}\n renderIcon={renderDictionaryIcon}\n renderColor={renderDictionaryColor}\n iconSuggestions={ICON_SUGGESTIONS}\n readMarkdownPreference={readMarkdownPreferenceCookie}\n writeMarkdownPreference={writeMarkdownPreferenceCookie}\n />\n )\n }\n if (activeTab === 'activities') {\n return (\n <ActivitiesSection\n entityId={personId}\n dealOptions={dealSelectOptions}\n defaultEntityId={personId ?? undefined}\n runGuardedMutation={runMutationWithContext}\n addActionLabel={t('customers.people.detail.activities.add')}\n emptyState={{\n title: t('customers.people.detail.emptyState.activities.title'),\n actionLabel: t('customers.people.detail.emptyState.activities.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleActivitiesLoadingChange}\n />\n )\n }\n if (activeTab === 'deals') {\n return (\n <DealsSection\n scope={dealsScope}\n emptyLabel={t('customers.people.detail.empty.deals')}\n addActionLabel={t('customers.people.detail.actions.addDeal')}\n emptyState={{\n title: t('customers.people.detail.emptyState.deals.title'),\n actionLabel: t('customers.people.detail.emptyState.deals.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleDealsLoadingChange}\n onDataRefresh={loadData}\n translator={detailTranslator}\n runGuardedMutation={runMutationWithContext}\n />\n )\n }\n if (activeTab === 'addresses') {\n return (\n <AddressesSection\n entityId={personId}\n emptyLabel={t('customers.people.detail.empty.addresses')}\n addActionLabel={t('customers.people.detail.addresses.add')}\n emptyState={{\n title: t('customers.people.detail.emptyState.addresses.title'),\n actionLabel: t('customers.people.detail.emptyState.addresses.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleAddressesLoadingChange}\n translator={detailTranslator}\n />\n )\n }\n if (activeTab === 'tasks') {\n return (\n <TasksSection\n entityId={personId}\n initialTasks={data.todos}\n runGuardedMutation={runMutationWithContext}\n emptyLabel={t('customers.people.detail.empty.todos')}\n addActionLabel={t('customers.people.detail.tasks.add')}\n emptyState={{\n title: t('customers.people.detail.emptyState.tasks.title'),\n actionLabel: t('customers.people.detail.emptyState.tasks.action'),\n }}\n onActionChange={handleSectionActionChange}\n onLoadingChange={handleTasksLoadingChange}\n translator={detailTranslator}\n entityName={personName}\n dialogContextKey=\"customers.people.detail.tasks.dialog.context\"\n dialogContextFallback=\"This task will be linked to {{name}}\"\n />\n )\n }\n return null\n })()}\n </DetailTabsLayout>\n \n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <h2 className=\"text-sm font-semibold\">{t('customers.people.detail.sections.details')}</h2>\n <DetailFieldsSection fields={detailFields} />\n <InjectionSpot\n spotId=\"customers.person.detail:details\"\n context={injectionContext}\n data={data}\n onDataChange={(next) => setData(next as PersonOverview)}\n />\n </div>\n\n <CustomDataSection\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n values={data.customFields ?? {}}\n onSubmit={handleCustomFieldsSubmit}\n title={t('customers.people.detail.sections.customFields')}\n />\n \n <TagsSection\n entityId={data.person.id}\n tags={data.tags}\n onChange={handleTagsChange}\n isSubmitting={false}\n />\n </div>\n\n </PageBody>\n {ConfirmDialogElement}\n </Page>\n )\n }\n \n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["id", "error"]
|
|
7
7
|
}
|