@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
|
@@ -13,7 +13,8 @@ import {
|
|
|
13
13
|
DialogTitle,
|
|
14
14
|
} from '@open-mercato/ui/primitives/dialog'
|
|
15
15
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
16
|
-
import { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
|
|
16
|
+
import { apiCall, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'
|
|
17
|
+
import { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'
|
|
17
18
|
import { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'
|
|
18
19
|
import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
19
20
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
@@ -40,6 +41,7 @@ type Pipeline = {
|
|
|
40
41
|
isDefault: boolean
|
|
41
42
|
organizationId: string
|
|
42
43
|
tenantId: string
|
|
44
|
+
updatedAt?: string | null
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
type PipelineStage = {
|
|
@@ -49,6 +51,7 @@ type PipelineStage = {
|
|
|
49
51
|
order: number
|
|
50
52
|
color: string | null
|
|
51
53
|
icon: string | null
|
|
54
|
+
updatedAt?: string | null
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
type PipelineDialogState =
|
|
@@ -66,6 +69,7 @@ function normalizePipeline(raw: Record<string, unknown>): Pipeline {
|
|
|
66
69
|
isDefault: raw.isDefault === true || raw.is_default === true,
|
|
67
70
|
organizationId: typeof raw.organizationId === 'string' ? raw.organizationId : (typeof raw.organization_id === 'string' ? raw.organization_id : ''),
|
|
68
71
|
tenantId: typeof raw.tenantId === 'string' ? raw.tenantId : (typeof raw.tenant_id === 'string' ? raw.tenant_id : ''),
|
|
72
|
+
updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : (typeof raw.updated_at === 'string' ? raw.updated_at : null),
|
|
69
73
|
}
|
|
70
74
|
}
|
|
71
75
|
|
|
@@ -77,6 +81,7 @@ function normalizeStage(raw: Record<string, unknown>): PipelineStage {
|
|
|
77
81
|
order: typeof raw.order === 'number' ? raw.order : 0,
|
|
78
82
|
color: typeof raw.color === 'string' && raw.color.trim().length ? raw.color.trim() : null,
|
|
79
83
|
icon: typeof raw.icon === 'string' && raw.icon.trim().length ? raw.icon.trim() : null,
|
|
84
|
+
updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : (typeof raw.updated_at === 'string' ? raw.updated_at : null),
|
|
80
85
|
}
|
|
81
86
|
}
|
|
82
87
|
|
|
@@ -171,11 +176,15 @@ export default function PipelineSettings(): React.ReactElement {
|
|
|
171
176
|
}
|
|
172
177
|
flash(t('customers.pipelines.flash.created', 'Pipeline created'), 'success')
|
|
173
178
|
} else if (pipelineDialog?.mode === 'edit') {
|
|
174
|
-
const res = await
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
+
const res = await withScopedApiRequestHeaders(
|
|
180
|
+
buildOptimisticLockHeader(pipelineDialog.entry.updatedAt),
|
|
181
|
+
() =>
|
|
182
|
+
apiCall('/api/customers/pipelines', {
|
|
183
|
+
method: 'PUT',
|
|
184
|
+
headers: { 'content-type': 'application/json' },
|
|
185
|
+
body: JSON.stringify({ id: pipelineDialog.entry.id, name: pipelineForm.name.trim(), isDefault: pipelineForm.isDefault }),
|
|
186
|
+
}),
|
|
187
|
+
)
|
|
179
188
|
if (!res.ok) {
|
|
180
189
|
await raiseCrudError(res.response, t('customers.pipelines.errors.updateFailed', 'Failed to update pipeline'))
|
|
181
190
|
return
|
|
@@ -197,11 +206,15 @@ export default function PipelineSettings(): React.ReactElement {
|
|
|
197
206
|
variant: 'destructive',
|
|
198
207
|
})
|
|
199
208
|
if (!confirmed) return
|
|
200
|
-
const res = await
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
209
|
+
const res = await withScopedApiRequestHeaders(
|
|
210
|
+
buildOptimisticLockHeader(pipeline.updatedAt),
|
|
211
|
+
() =>
|
|
212
|
+
apiCall('/api/customers/pipelines', {
|
|
213
|
+
method: 'DELETE',
|
|
214
|
+
headers: { 'content-type': 'application/json' },
|
|
215
|
+
body: JSON.stringify({ id: pipeline.id }),
|
|
216
|
+
}),
|
|
217
|
+
)
|
|
205
218
|
if (!res.ok) {
|
|
206
219
|
const body = (res.result ?? {}) as Record<string, unknown>
|
|
207
220
|
const msg = typeof body.error === 'string' ? body.error : t('customers.pipelines.errors.deleteFailed', 'Failed to delete pipeline')
|
|
@@ -248,11 +261,15 @@ export default function PipelineSettings(): React.ReactElement {
|
|
|
248
261
|
flash(t('customers.pipelines.flash.stageCreated', 'Stage created'), 'success')
|
|
249
262
|
await loadStages(stageDialog.pipelineId)
|
|
250
263
|
} else if (stageDialog?.mode === 'edit') {
|
|
251
|
-
const res = await
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
264
|
+
const res = await withScopedApiRequestHeaders(
|
|
265
|
+
buildOptimisticLockHeader(stageDialog.entry.updatedAt),
|
|
266
|
+
() =>
|
|
267
|
+
apiCall('/api/customers/pipeline-stages', {
|
|
268
|
+
method: 'PUT',
|
|
269
|
+
headers: { 'content-type': 'application/json' },
|
|
270
|
+
body: JSON.stringify({ id: stageDialog.entry.id, label: stageForm.label.trim(), ...appearance }),
|
|
271
|
+
}),
|
|
272
|
+
)
|
|
256
273
|
if (!res.ok) {
|
|
257
274
|
await raiseCrudError(res.response, t('customers.pipelines.errors.stageUpdateFailed', 'Failed to update stage'))
|
|
258
275
|
return
|
|
@@ -274,11 +291,15 @@ export default function PipelineSettings(): React.ReactElement {
|
|
|
274
291
|
variant: 'destructive',
|
|
275
292
|
})
|
|
276
293
|
if (!confirmed) return
|
|
277
|
-
const res = await
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
294
|
+
const res = await withScopedApiRequestHeaders(
|
|
295
|
+
buildOptimisticLockHeader(stage.updatedAt),
|
|
296
|
+
() =>
|
|
297
|
+
apiCall('/api/customers/pipeline-stages', {
|
|
298
|
+
method: 'DELETE',
|
|
299
|
+
headers: { 'content-type': 'application/json' },
|
|
300
|
+
body: JSON.stringify({ id: stage.id }),
|
|
301
|
+
}),
|
|
302
|
+
)
|
|
282
303
|
if (!res.ok) {
|
|
283
304
|
const body = (res.result ?? {}) as Record<string, unknown>
|
|
284
305
|
const msg = typeof body.error === 'string' ? body.error : t('customers.pipelines.errors.stageDeleteFailed', 'Failed to delete stage')
|
|
@@ -18,7 +18,7 @@ const TYPE_ICONS: Record<string, React.ComponentType<{ className?: string }>> =
|
|
|
18
18
|
interface ActivityTimelineProps {
|
|
19
19
|
activities: InteractionSummary[]
|
|
20
20
|
onEdit?: (activity: InteractionSummary) => void
|
|
21
|
-
onMarkDone?: (activityId: string) => void | Promise<void>
|
|
21
|
+
onMarkDone?: (activityId: string, updatedAt?: string | null) => void | Promise<void>
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export function ActivityTimeline({ activities, onEdit, onMarkDone }: ActivityTimelineProps) {
|
|
@@ -77,7 +77,7 @@ function TimelineEntry({
|
|
|
77
77
|
t: TranslateFn
|
|
78
78
|
withBorder: boolean
|
|
79
79
|
onEdit?: (activity: InteractionSummary) => void
|
|
80
|
-
onMarkDone?: (activityId: string) => void | Promise<void>
|
|
80
|
+
onMarkDone?: (activityId: string, updatedAt?: string | null) => void | Promise<void>
|
|
81
81
|
}) {
|
|
82
82
|
const dateStr = activity.scheduledAt ?? activity.occurredAt ?? activity.createdAt
|
|
83
83
|
const TypeIcon = TYPE_ICONS[activity.interactionType]
|
|
@@ -91,7 +91,7 @@ function TimelineEntry({
|
|
|
91
91
|
if (!onMarkDone || markingDone) return
|
|
92
92
|
setMarkingDone(true)
|
|
93
93
|
try {
|
|
94
|
-
await onMarkDone(activity.id)
|
|
94
|
+
await onMarkDone(activity.id, activity.updatedAt)
|
|
95
95
|
} finally {
|
|
96
96
|
setMarkingDone(false)
|
|
97
97
|
}
|
|
@@ -107,6 +107,7 @@ export function AddressesSection({
|
|
|
107
107
|
const response = await apiCallOrThrow<Record<string, unknown>>(
|
|
108
108
|
'/api/customers/addresses',
|
|
109
109
|
{
|
|
110
|
+
// optimistic-lock-exempt: address link add/remove sub-resource
|
|
110
111
|
method: 'POST',
|
|
111
112
|
headers: { 'content-type': 'application/json' },
|
|
112
113
|
body: JSON.stringify({
|
|
@@ -123,6 +124,7 @@ export function AddressesSection({
|
|
|
123
124
|
await apiCallOrThrow(
|
|
124
125
|
'/api/customers/addresses',
|
|
125
126
|
{
|
|
127
|
+
// optimistic-lock-exempt: address link add/remove sub-resource
|
|
126
128
|
method: 'PUT',
|
|
127
129
|
headers: { 'content-type': 'application/json' },
|
|
128
130
|
body: JSON.stringify({
|
|
@@ -138,6 +140,7 @@ export function AddressesSection({
|
|
|
138
140
|
await apiCallOrThrow(
|
|
139
141
|
'/api/customers/addresses',
|
|
140
142
|
{
|
|
143
|
+
// optimistic-lock-exempt: address link add/remove sub-resource
|
|
141
144
|
method: 'DELETE',
|
|
142
145
|
headers: { 'content-type': 'application/json' },
|
|
143
146
|
body: JSON.stringify({ id }),
|
|
@@ -170,6 +173,7 @@ export function AddressesSection({
|
|
|
170
173
|
const response = await apiCallOrThrow<Record<string, unknown>>(
|
|
171
174
|
'/api/customers/dictionaries/address-types',
|
|
172
175
|
{
|
|
176
|
+
// optimistic-lock-exempt: address-type dictionary create-only
|
|
173
177
|
method: 'POST',
|
|
174
178
|
headers: { 'content-type': 'application/json' },
|
|
175
179
|
body: JSON.stringify({ value }),
|
|
@@ -360,6 +360,7 @@ export function CompanyPeopleSection({
|
|
|
360
360
|
for (const personId of addedIds) {
|
|
361
361
|
await runWriteMutation(
|
|
362
362
|
() =>
|
|
363
|
+
// optimistic-lock-exempt: person-company link add/remove
|
|
363
364
|
apiCallOrThrow(
|
|
364
365
|
`/api/customers/people/${encodeURIComponent(personId)}/companies`,
|
|
365
366
|
{
|
|
@@ -514,6 +515,7 @@ export function CompanyPeopleSection({
|
|
|
514
515
|
try {
|
|
515
516
|
await runWriteMutation(
|
|
516
517
|
() =>
|
|
518
|
+
// optimistic-lock-exempt: person-company link add/remove
|
|
517
519
|
apiCallOrThrow(
|
|
518
520
|
`/api/customers/people/${encodeURIComponent(personId)}/companies/${encodeURIComponent(companyId)}`,
|
|
519
521
|
{ method: 'DELETE' },
|
|
@@ -651,6 +651,7 @@ export function DealsSection({
|
|
|
651
651
|
: currentCompanyIds
|
|
652
652
|
await runWriteMutation(
|
|
653
653
|
() =>
|
|
654
|
+
// optimistic-lock-exempt: deal association list (link)
|
|
654
655
|
updateCrud(
|
|
655
656
|
'customers/deals',
|
|
656
657
|
{ id: dealId, personIds: nextPersonIds, companyIds: nextCompanyIds },
|
|
@@ -684,6 +685,7 @@ export function DealsSection({
|
|
|
684
685
|
: currentCompanyIds
|
|
685
686
|
await runWriteMutation(
|
|
686
687
|
() =>
|
|
688
|
+
// optimistic-lock-exempt: deal association list (unlink)
|
|
687
689
|
updateCrud(
|
|
688
690
|
'customers/deals',
|
|
689
691
|
{ id: dealId, personIds: nextPersonIds, companyIds: nextCompanyIds },
|
|
@@ -762,6 +764,7 @@ export function DealsSection({
|
|
|
762
764
|
if (Object.keys(custom).length) payload.customFields = custom
|
|
763
765
|
const { result } = await runWriteMutation(
|
|
764
766
|
() =>
|
|
767
|
+
// optimistic-lock-exempt: deal create-only, no prior version
|
|
765
768
|
createCrud<{ id?: string }>('customers/deals', payload, {
|
|
766
769
|
errorMessage: translate('customers.people.detail.deals.error', 'Failed to save deal.'),
|
|
767
770
|
}),
|
|
@@ -848,6 +851,7 @@ export function DealsSection({
|
|
|
848
851
|
}
|
|
849
852
|
await runWriteMutation(
|
|
850
853
|
() =>
|
|
854
|
+
// optimistic-lock-exempt: deal association list (unlink)
|
|
851
855
|
updateCrud('customers/deals', payload, {
|
|
852
856
|
errorMessage: translate('customers.people.detail.deals.unlinkError', 'Failed to unlink deal.'),
|
|
853
857
|
}),
|
|
@@ -190,6 +190,11 @@ export function EmailCardActions({ data }: EmailCardActionsProps) {
|
|
|
190
190
|
const next = data.currentVisibility === 'private' ? 'shared' : 'private'
|
|
191
191
|
try {
|
|
192
192
|
await runMutation({
|
|
193
|
+
// optimistic-lock-exempt: dedicated single-field visibility
|
|
194
|
+
// action endpoint (shared/private toggle), not a full-record
|
|
195
|
+
// edit. The canonical interaction edit/delete is version-locked
|
|
196
|
+
// at the command layer (customers.interactions.* commands); this
|
|
197
|
+
// idempotent toggle derives `next` from freshly-loaded state.
|
|
193
198
|
operation: async () => {
|
|
194
199
|
const r = await apiCall<{ ok?: boolean }>(
|
|
195
200
|
`/api/customers/interactions/${interactionId}/visibility`,
|
|
@@ -854,6 +854,7 @@ export function EntityTagsDialog({
|
|
|
854
854
|
readApiResultOrThrow<Record<string, unknown>>(
|
|
855
855
|
'/api/customers/tags',
|
|
856
856
|
{
|
|
857
|
+
// optimistic-lock-exempt: tag dictionary create-only
|
|
857
858
|
method: 'POST',
|
|
858
859
|
headers: { 'content-type': 'application/json' },
|
|
859
860
|
body: JSON.stringify({
|
|
@@ -892,6 +893,7 @@ export function EntityTagsDialog({
|
|
|
892
893
|
readApiResultOrThrow<{ id: string; slug: string; label: string }>(
|
|
893
894
|
'/api/customers/labels',
|
|
894
895
|
{
|
|
896
|
+
// optimistic-lock-exempt: label dictionary create-only
|
|
895
897
|
method: 'POST',
|
|
896
898
|
headers: { 'content-type': 'application/json' },
|
|
897
899
|
body: JSON.stringify(payload),
|
|
@@ -956,6 +958,7 @@ export function EntityTagsDialog({
|
|
|
956
958
|
await runGuardedMutation(
|
|
957
959
|
() =>
|
|
958
960
|
apiCallOrThrow(`/api/customers/${entityType === 'person' ? 'people' : 'companies'}`, {
|
|
961
|
+
// optimistic-lock-exempt: tag/label dictionary + custom-field selection write (assignment add/remove)
|
|
959
962
|
method: 'PUT',
|
|
960
963
|
headers: { 'content-type': 'application/json' },
|
|
961
964
|
body: JSON.stringify({
|
|
@@ -984,6 +987,7 @@ export function EntityTagsDialog({
|
|
|
984
987
|
await runGuardedMutation(
|
|
985
988
|
() =>
|
|
986
989
|
apiCallOrThrow('/api/customers/tags/assign', {
|
|
990
|
+
// optimistic-lock-exempt: tag assignment add/remove
|
|
987
991
|
method: 'POST',
|
|
988
992
|
headers: { 'content-type': 'application/json' },
|
|
989
993
|
body: JSON.stringify({ tagId, entityId }),
|
|
@@ -996,6 +1000,7 @@ export function EntityTagsDialog({
|
|
|
996
1000
|
await runGuardedMutation(
|
|
997
1001
|
() =>
|
|
998
1002
|
apiCallOrThrow('/api/customers/tags/unassign', {
|
|
1003
|
+
// optimistic-lock-exempt: tag assignment add/remove
|
|
999
1004
|
method: 'POST',
|
|
1000
1005
|
headers: { 'content-type': 'application/json' },
|
|
1001
1006
|
body: JSON.stringify({ tagId, entityId }),
|
|
@@ -1016,6 +1021,7 @@ export function EntityTagsDialog({
|
|
|
1016
1021
|
await runGuardedMutation(
|
|
1017
1022
|
() =>
|
|
1018
1023
|
apiCallOrThrow('/api/customers/labels/assign', {
|
|
1024
|
+
// optimistic-lock-exempt: label assignment add/remove
|
|
1019
1025
|
method: 'POST',
|
|
1020
1026
|
headers: { 'content-type': 'application/json' },
|
|
1021
1027
|
body: JSON.stringify(payload),
|
|
@@ -1031,6 +1037,7 @@ export function EntityTagsDialog({
|
|
|
1031
1037
|
await runGuardedMutation(
|
|
1032
1038
|
() =>
|
|
1033
1039
|
apiCallOrThrow('/api/customers/labels/unassign', {
|
|
1040
|
+
// optimistic-lock-exempt: label assignment add/remove
|
|
1034
1041
|
method: 'POST',
|
|
1035
1042
|
headers: { 'content-type': 'application/json' },
|
|
1036
1043
|
body: JSON.stringify(payload),
|
|
@@ -760,6 +760,7 @@ export function ManageTagsDialog({ open, onClose }: ManageTagsDialogProps) {
|
|
|
760
760
|
if (entry.id) {
|
|
761
761
|
await runGuardedMutation(
|
|
762
762
|
() =>
|
|
763
|
+
// optimistic-lock-exempt: tag dictionary entry assignment add/remove
|
|
763
764
|
apiCallOrThrow(`/api/customers/dictionaries/${category.kind}/${entry.id}`, {
|
|
764
765
|
method: 'DELETE',
|
|
765
766
|
}),
|
|
@@ -779,6 +780,7 @@ export function ManageTagsDialog({ open, onClose }: ManageTagsDialogProps) {
|
|
|
779
780
|
if (!entry.id) {
|
|
780
781
|
await runGuardedMutation(
|
|
781
782
|
() =>
|
|
783
|
+
// optimistic-lock-exempt: tag dictionary entry create-only
|
|
782
784
|
apiCallOrThrow(`/api/customers/dictionaries/${category.kind}`, {
|
|
783
785
|
method: 'POST',
|
|
784
786
|
headers: { 'content-type': 'application/json' },
|
|
@@ -805,6 +807,7 @@ export function ManageTagsDialog({ open, onClose }: ManageTagsDialogProps) {
|
|
|
805
807
|
|
|
806
808
|
await runGuardedMutation(
|
|
807
809
|
() =>
|
|
810
|
+
// optimistic-lock-exempt: tag dictionary entry assignment add/remove
|
|
808
811
|
apiCallOrThrow(`/api/customers/dictionaries/${category.kind}/${entry.id}`, {
|
|
809
812
|
method: 'PATCH',
|
|
810
813
|
headers: { 'content-type': 'application/json' },
|
|
@@ -891,6 +894,7 @@ export function ManageTagsDialog({ open, onClose }: ManageTagsDialogProps) {
|
|
|
891
894
|
try {
|
|
892
895
|
await runGuardedMutation(
|
|
893
896
|
() =>
|
|
897
|
+
// optimistic-lock-exempt: tag dictionary kind-settings assignment add/remove
|
|
894
898
|
apiCallOrThrow('/api/customers/dictionaries/kind-settings', {
|
|
895
899
|
method: 'PATCH',
|
|
896
900
|
headers: { 'content-type': 'application/json' },
|
|
@@ -238,6 +238,7 @@ export function PersonCompaniesSection({
|
|
|
238
238
|
for (const companyId of removedIds) {
|
|
239
239
|
await runWriteMutation(
|
|
240
240
|
() =>
|
|
241
|
+
// optimistic-lock-exempt: person-company link add/remove
|
|
241
242
|
apiCallOrThrow(
|
|
242
243
|
`/api/customers/people/${encodeURIComponent(personId)}/companies/${encodeURIComponent(companyId)}`,
|
|
243
244
|
{ method: 'DELETE' },
|
|
@@ -249,6 +250,7 @@ export function PersonCompaniesSection({
|
|
|
249
250
|
for (const companyId of addedIds) {
|
|
250
251
|
await runWriteMutation(
|
|
251
252
|
() =>
|
|
253
|
+
// optimistic-lock-exempt: person-company link add/remove
|
|
252
254
|
apiCallOrThrow(
|
|
253
255
|
`/api/customers/people/${encodeURIComponent(personId)}/companies`,
|
|
254
256
|
{
|
|
@@ -271,6 +273,7 @@ export function PersonCompaniesSection({
|
|
|
271
273
|
) {
|
|
272
274
|
await runWriteMutation(
|
|
273
275
|
() =>
|
|
276
|
+
// optimistic-lock-exempt: person-company link set-primary (add/remove)
|
|
274
277
|
apiCallOrThrow(
|
|
275
278
|
`/api/customers/people/${encodeURIComponent(personId)}/companies/${encodeURIComponent(nextPrimaryId)}`,
|
|
276
279
|
{
|
|
@@ -332,6 +335,7 @@ export function PersonCompaniesSection({
|
|
|
332
335
|
try {
|
|
333
336
|
await runWriteMutation(
|
|
334
337
|
() =>
|
|
338
|
+
// optimistic-lock-exempt: person-company link add/remove
|
|
335
339
|
apiCallOrThrow(
|
|
336
340
|
`/api/customers/people/${encodeURIComponent(personId)}/companies/${encodeURIComponent(companyId)}`,
|
|
337
341
|
{ method: 'DELETE' },
|
|
@@ -82,6 +82,7 @@ export function RoleAssignmentRow({
|
|
|
82
82
|
try {
|
|
83
83
|
await runMutationWithContext(
|
|
84
84
|
() =>
|
|
85
|
+
// optimistic-lock-exempt: role assignment add/remove
|
|
85
86
|
apiCallOrThrow(`/api/customers/${basePath}/${entityId}/roles?roleId=${role.id}`, {
|
|
86
87
|
method: 'PUT',
|
|
87
88
|
headers: { 'content-type': 'application/json' },
|
|
@@ -110,6 +111,7 @@ export function RoleAssignmentRow({
|
|
|
110
111
|
try {
|
|
111
112
|
await runMutationWithContext(
|
|
112
113
|
() =>
|
|
114
|
+
// optimistic-lock-exempt: role assignment add/remove
|
|
113
115
|
apiCallOrThrow(`/api/customers/${basePath}/${entityId}/roles?roleId=${role.id}`, {
|
|
114
116
|
method: 'DELETE',
|
|
115
117
|
}),
|
|
@@ -5,7 +5,8 @@ import { Users, Phone, Check, Mail, Calendar, AlertTriangle, X, StickyNote } fro
|
|
|
5
5
|
import { cn } from '@open-mercato/shared/lib/utils'
|
|
6
6
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
7
7
|
import { validatePhoneNumber } from '@open-mercato/shared/lib/phone'
|
|
8
|
-
import { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
|
|
8
|
+
import { apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'
|
|
9
|
+
import { buildOptimisticLockHeader, extractOptimisticLockConflict } from '@open-mercato/ui/backend/utils/optimisticLock'
|
|
9
10
|
import { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'
|
|
10
11
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
11
12
|
import { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'
|
|
@@ -411,12 +412,19 @@ export function ScheduleActivityDialog({
|
|
|
411
412
|
...(Object.keys(customValues).length > 0 ? { customValues } : {}),
|
|
412
413
|
}
|
|
413
414
|
await runGuardedMutation(
|
|
414
|
-
() =>
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
415
|
+
() => {
|
|
416
|
+
const call = () =>
|
|
417
|
+
apiCallOrThrow('/api/customers/interactions', {
|
|
418
|
+
method: isSaveEdit ? 'PUT' : 'POST',
|
|
419
|
+
headers: { 'content-type': 'application/json' },
|
|
420
|
+
body: JSON.stringify(payload),
|
|
421
|
+
})
|
|
422
|
+
// Optimistic lock only applies to edits — a stale modal save against a
|
|
423
|
+
// concurrently changed/deleted activity surfaces the conflict bar (#2055).
|
|
424
|
+
return isSaveEdit
|
|
425
|
+
? withScopedApiRequestHeaders(buildOptimisticLockHeader(editData?.updatedAt), call)
|
|
426
|
+
: call()
|
|
427
|
+
},
|
|
420
428
|
{
|
|
421
429
|
operation: isSaveEdit ? 'updateActivity' : 'createActivity',
|
|
422
430
|
interactionId: editData?.id ?? null,
|
|
@@ -428,6 +436,14 @@ export function ScheduleActivityDialog({
|
|
|
428
436
|
// Delay data reload so the dialog can unmount cleanly and Radix restores body scroll
|
|
429
437
|
requestAnimationFrame(() => { onActivityCreated?.() })
|
|
430
438
|
} catch (err) {
|
|
439
|
+
// An optimistic-lock 409 was already surfaced as the persistent conflict
|
|
440
|
+
// bar by `runGuardedMutation` (useGuardedMutation → surfaceRecordConflict).
|
|
441
|
+
// Do NOT additionally flash the raw `record_modified` code here — that
|
|
442
|
+
// showed an untranslated toast on top of the localized bar (#2055 QA).
|
|
443
|
+
if (extractOptimisticLockConflict(err)) {
|
|
444
|
+
onClose()
|
|
445
|
+
return
|
|
446
|
+
}
|
|
431
447
|
const { message, fieldErrors } = mapCrudServerErrorToFormErrors(err)
|
|
432
448
|
const phoneFieldError = fieldErrors?.phoneNumber
|
|
433
449
|
if (state.activityType === 'call' && phoneFieldError) {
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import * as React from 'react'
|
|
4
4
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
5
|
-
import { apiCallOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
|
|
5
|
+
import { apiCallOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'
|
|
6
|
+
import { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'
|
|
7
|
+
import { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'
|
|
6
8
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
7
9
|
|
|
8
10
|
export type GuardedMutationRunner = <T>(
|
|
@@ -18,8 +20,8 @@ export type UseInteractionMutationsOptions = {
|
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
export type UseInteractionMutationsResult = {
|
|
21
|
-
completeInteraction: (interactionId: string) => Promise<void>
|
|
22
|
-
cancelInteraction: (interactionId: string) => Promise<void>
|
|
23
|
+
completeInteraction: (interactionId: string, updatedAt?: string | null) => Promise<void>
|
|
24
|
+
cancelInteraction: (interactionId: string, updatedAt?: string | null) => Promise<void>
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
/**
|
|
@@ -44,20 +46,24 @@ export function useInteractionMutations({
|
|
|
44
46
|
}, [logContext, onAfterChange])
|
|
45
47
|
|
|
46
48
|
const completeInteraction = React.useCallback(
|
|
47
|
-
async (interactionId: string) => {
|
|
49
|
+
async (interactionId: string, updatedAt?: string | null) => {
|
|
48
50
|
try {
|
|
49
51
|
await runMutationWithContext(
|
|
50
52
|
() =>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
withScopedApiRequestHeaders(
|
|
54
|
+
buildOptimisticLockHeader(updatedAt ?? null),
|
|
55
|
+
() => apiCallOrThrow('/api/customers/interactions/complete', {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'content-type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ id: interactionId, occurredAt: new Date().toISOString() }),
|
|
59
|
+
}),
|
|
60
|
+
),
|
|
56
61
|
{ id: interactionId, status: 'done', operation: 'completeActivity' },
|
|
57
62
|
)
|
|
58
63
|
flash(t('customers.timeline.planned.completed', 'Activity completed'), 'success')
|
|
59
64
|
await triggerRefresh()
|
|
60
65
|
} catch (err) {
|
|
66
|
+
if (surfaceRecordConflict(err, t)) { await triggerRefresh(); return }
|
|
61
67
|
console.warn(`[${logContext}] complete interaction failed`, interactionId, err)
|
|
62
68
|
flash(t('customers.timeline.planned.error', 'Failed to complete activity'), 'error')
|
|
63
69
|
}
|
|
@@ -66,20 +72,24 @@ export function useInteractionMutations({
|
|
|
66
72
|
)
|
|
67
73
|
|
|
68
74
|
const cancelInteraction = React.useCallback(
|
|
69
|
-
async (interactionId: string) => {
|
|
75
|
+
async (interactionId: string, updatedAt?: string | null) => {
|
|
70
76
|
try {
|
|
71
77
|
await runMutationWithContext(
|
|
72
78
|
() =>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
withScopedApiRequestHeaders(
|
|
80
|
+
buildOptimisticLockHeader(updatedAt ?? null),
|
|
81
|
+
() => apiCallOrThrow('/api/customers/interactions', {
|
|
82
|
+
method: 'PUT',
|
|
83
|
+
headers: { 'content-type': 'application/json' },
|
|
84
|
+
body: JSON.stringify({ id: interactionId, status: 'canceled' }),
|
|
85
|
+
}),
|
|
86
|
+
),
|
|
78
87
|
{ id: interactionId, status: 'canceled', operation: 'cancelActivity' },
|
|
79
88
|
)
|
|
80
89
|
flash(t('customers.timeline.planned.canceled', 'Activity canceled'), 'success')
|
|
81
90
|
await triggerRefresh()
|
|
82
91
|
} catch (err) {
|
|
92
|
+
if (surfaceRecordConflict(err, t)) { await triggerRefresh(); return }
|
|
83
93
|
console.warn(`[${logContext}] cancel interaction failed`, interactionId, err)
|
|
84
94
|
flash(t('customers.timeline.planned.cancelError', 'Failed to cancel activity'), 'error')
|
|
85
95
|
}
|