@open-mercato/core 0.6.5-develop.4534.1.b459babe6d → 0.6.5-develop.4544.1.71c003c861
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/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/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/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/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/backend/profile/communication-channels/page.tsx +5 -0
- 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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/staff/components/TeamMemberForm.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields/normalize'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { AttachmentsSection, TagsSection, type TagOption, type TagsSectionLabels } from '@open-mercato/ui/backend/detail'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { Plus } from 'lucide-react'\n\nconst DEFAULT_PAGE_SIZE = 100\n\nexport type TeamMemberFormValues = {\n id?: string\n teamId?: string | null\n userId?: string | null\n displayName?: string | null\n description?: string | null\n roleIds?: string[]\n tags?: string[]\n isActive?: boolean\n} & Record<string, unknown>\n\nexport type TeamMemberFormProps = {\n title: string\n submitLabel?: string\n backHref: string\n cancelHref: string\n embedded?: boolean\n initialValues: TeamMemberFormValues\n onSubmit: (values: TeamMemberFormValues) => Promise<void>\n onDelete?: () => Promise<void>\n isLoading?: boolean\n loadingMessage?: string\n tagsSection?: TeamMemberTagsSectionConfig\n}\n\ntype TeamRoleRow = {\n id: string\n name: string\n teamId: string | null\n}\n\ntype TeamRolesResponse = {\n items?: Array<Record<string, unknown>>\n}\n\ntype UsersResponse = {\n items?: Array<{ id?: string; email?: string; organizationName?: string | null }>\n}\n\ntype TeamsResponse = {\n items?: Array<{ id?: string; name?: string }>\n}\n\ntype TeamMemberTagsSectionConfig = {\n title: string\n tags: TagOption[]\n onChange: (next: TagOption[]) => void\n loadOptions: (query?: string) => Promise<TagOption[]>\n createTag: (label: string) => Promise<TagOption>\n onSave: (payload: { next: TagOption[]; added: TagOption[]; removed: TagOption[] }) => Promise<void>\n labels: TagsSectionLabels\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n const normalized = normalizeCustomFieldValues({ value })\n return normalized.value\n}\n\nexport const buildTeamMemberPayload = (\n values: TeamMemberFormValues,\n options: { id?: string } = {},\n): Record<string, unknown> => {\n const roleIds = Array.isArray(values.roleIds)\n ? values.roleIds.filter((item): item is string => typeof item === 'string')\n : []\n const tags = Array.isArray(values.tags)\n ? values.tags.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n : null\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n return {\n ...(options.id ? { id: options.id } : {}),\n teamId: values.teamId ? String(values.teamId) : null,\n userId: values.userId ? String(values.userId) : null,\n displayName: typeof values.displayName === 'string' ? values.displayName : '',\n description: typeof values.description === 'string' && values.description.trim().length ? values.description : null,\n roleIds,\n ...(tags ? { tags } : {}),\n isActive: values.isActive ?? true,\n ...(Object.keys(customFields).length ? { customFields } : {}),\n }\n}\n\nexport function TeamMemberForm(props: TeamMemberFormProps) {\n const {\n title,\n submitLabel,\n backHref,\n cancelHref,\n embedded = false,\n initialValues,\n onSubmit,\n onDelete,\n isLoading,\n loadingMessage,\n tagsSection,\n } = props\n const translate = useT()\n const recordId = typeof initialValues?.id === 'string' ? initialValues.id : null\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const [roles, setRoles] = React.useState<TeamRoleRow[]>([])\n const [selectedTeamId, setSelectedTeamId] = React.useState<string | null>(null)\n const [userOptions, setUserOptions] = React.useState<LookupSelectItem[]>([])\n const [teamOptions, setTeamOptions] = React.useState<Array<{ value: string; label: string }>>([])\n const [roleSearch, setRoleSearch] = React.useState('')\n\n const resolvedTeamId = typeof initialValues.teamId === 'string' && initialValues.teamId.trim().length\n ? initialValues.teamId\n : null\n const resolvedUserId = typeof initialValues.userId === 'string' && initialValues.userId.trim().length\n ? initialValues.userId\n : null\n\n React.useEffect(() => {\n setSelectedTeamId(resolvedTeamId)\n }, [resolvedTeamId])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadRoles() {\n try {\n const params = new URLSearchParams({ page: '1', pageSize: String(DEFAULT_PAGE_SIZE) })\n const call = await apiCall<TeamRolesResponse>(`/api/staff/team-roles?${params.toString()}`)\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const nextRoles = items\n .map(mapTeamRole)\n .filter((role): role is TeamRoleRow => role !== null)\n if (!cancelled) setRoles(nextRoles)\n } catch {\n if (!cancelled) setRoles([])\n }\n }\n loadRoles()\n return () => { cancelled = true }\n }, [scopeVersion])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadTeams() {\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const call = await apiCall<TeamsResponse>(`/api/staff/teams?${params.toString()}`)\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const options = items\n .map((team) => {\n const id = typeof team.id === 'string' ? team.id : null\n const name = typeof team.name === 'string' ? team.name : null\n if (!id || !name) return null\n return { value: id, label: name }\n })\n .filter((entry): entry is { value: string; label: string } => entry !== null)\n if (!cancelled) setTeamOptions(options)\n } catch {\n if (!cancelled) setTeamOptions([])\n }\n }\n loadTeams()\n return () => { cancelled = true }\n }, [scopeVersion])\n\n React.useEffect(() => {\n if (!resolvedUserId) return\n const userId = resolvedUserId\n if (userOptions.some((option) => option.id === resolvedUserId)) return\n let cancelled = false\n async function loadSelectedUser() {\n try {\n const call = await apiCall<UsersResponse>(`/api/auth/users?id=${encodeURIComponent(userId)}`)\n const entry = Array.isArray(call.result?.items) ? call.result.items[0] : null\n const entryId = typeof entry?.id === 'string' ? entry.id : null\n const entryEmail = typeof entry?.email === 'string' ? entry.email : null\n if (!entryId || !entryEmail) return\n if (!cancelled) {\n setUserOptions((prev) => {\n if (prev.some((option) => option.id === entryId)) return prev\n return [{ id: entryId, title: entryEmail, subtitle: entry?.organizationName ?? null }, ...prev]\n })\n }\n } catch {\n if (!cancelled) setUserOptions((prev) => prev)\n }\n }\n loadSelectedUser()\n return () => { cancelled = true }\n }, [resolvedUserId, userOptions])\n\n const filteredRoles = React.useMemo(\n () => filterRolesByTeam(roles, selectedTeamId),\n [roles, selectedTeamId],\n )\n const roleOptions = React.useMemo(\n () => filteredRoles.map((role) => ({ value: role.id, label: role.name })),\n [filteredRoles],\n )\n const filteredRoleOptions = React.useMemo(() => {\n const query = roleSearch.trim().toLowerCase()\n if (!query) return roleOptions\n return roleOptions.filter((option) => (\n option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query)\n ))\n }, [roleOptions, roleSearch])\n const createRoleHref = React.useMemo(() => {\n const params = new URLSearchParams()\n if (selectedTeamId) params.set('teamId', selectedTeamId)\n const query = params.toString()\n return `/backend/staff/team-roles/create${query ? `?${query}` : ''}`\n }, [selectedTeamId])\n const createTeamHref = '/backend/staff/teams/create'\n\n React.useEffect(() => {\n setRoleSearch('')\n }, [selectedTeamId])\n\n const fetchUserOptions = React.useCallback(async (query?: string): Promise<LookupSelectItem[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<UsersResponse>(`/api/auth/users?${params.toString()}`)\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const options = items\n .map((user): LookupSelectItem | null => {\n const id = typeof user?.id === 'string' ? user.id : null\n const email = typeof user?.email === 'string' ? user.email : null\n if (!id || !email) return null\n return {\n id,\n title: email,\n subtitle: user.organizationName ?? null,\n }\n })\n .filter((option): option is LookupSelectItem => option !== null)\n setUserOptions(options)\n return options\n }, [])\n\n const fields = React.useMemo<CrudField[]>(() => {\n const baseFields: CrudField[] = [\n {\n id: 'userId',\n label: translate('staff.teamMembers.form.fields.user', 'User'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n options={userOptions}\n fetchOptions={fetchUserOptions}\n placeholder={translate('staff.teamMembers.form.fields.user.placeholder', 'Select a user')}\n searchPlaceholder={translate('staff.teamMembers.form.fields.user.search', 'Search users')}\n emptyLabel={translate('staff.teamMembers.form.fields.user.empty', 'No users found')}\n selectedHintLabel={(id) => translate('staff.teamMembers.form.fields.user.selected', 'Selected user: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'teamId',\n label: '',\n type: 'custom',\n component: ({ value, setValue, setFormValue, values, disabled }) => {\n const currentValue = typeof value === 'string' ? value : ''\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium\">\n {translate('staff.teamMembers.form.fields.team', 'Team')}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => router.push(createTeamHref)}\n disabled={disabled}\n >\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('staff.teamMembers.form.actions.createTeam', 'Create new team')}\n </Button>\n </div>\n <Select\n value={currentValue || undefined}\n onValueChange={(value) => {\n const nextValue = value || undefined\n const nextTeamId = value || null\n setValue(nextValue)\n setSelectedTeamId(nextTeamId)\n if (!setFormValue) return\n const roleIds = Array.isArray(values?.roleIds)\n ? values?.roleIds.filter((item): item is string => typeof item === 'string')\n : []\n const allowedRoleIds = buildAllowedRoleIdSet(roles, nextTeamId)\n const nextRoleIds = roleIds.filter((roleId) => allowedRoleIds.has(roleId))\n if (nextRoleIds.length !== roleIds.length) {\n setFormValue('roleIds', nextRoleIds)\n }\n }}\n disabled={disabled}\n >\n <SelectTrigger data-crud-focus-target=\"\">\n <SelectValue placeholder={translate('ui.forms.select.emptyOption', '\u2014')} />\n </SelectTrigger>\n <SelectContent>\n {teamOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n },\n },\n {\n id: 'displayName',\n label: translate('staff.teamMembers.form.fields.displayName', 'Display name'),\n type: 'text',\n required: true,\n },\n {\n id: 'description',\n label: translate('staff.teamMembers.form.fields.description', 'Description'),\n type: 'richtext',\n editor: 'html',\n },\n {\n id: 'roleIds',\n label: '',\n type: 'custom',\n component: ({ value, setValue, disabled }) => {\n const selectedValues = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium\">\n {translate('staff.teamMembers.form.fields.roles', 'Roles')}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => router.push(createRoleHref)}\n disabled={disabled}\n >\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('staff.teamMembers.form.actions.defineRole', 'Define new role')}\n </Button>\n </div>\n <input\n className=\"w-full h-8 rounded border px-2 text-sm\"\n placeholder={translate('ui.forms.listbox.searchPlaceholder', 'Search...')}\n value={roleSearch}\n onChange={(event) => setRoleSearch(event.target.value)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n <div className=\"rounded border max-h-48 overflow-auto divide-y\">\n {filteredRoleOptions.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n return (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => {\n const next = new Set(selectedValues)\n if (isSelected) {\n next.delete(option.value)\n } else {\n next.add(option.value)\n }\n setValue(Array.from(next))\n }}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-muted ${isSelected ? 'bg-muted' : ''}`}\n disabled={disabled}\n >\n <span className=\"inline-flex items-center gap-2\">\n <input type=\"checkbox\" className=\"size-4\" readOnly checked={isSelected} />\n <span>{option.label}</span>\n </span>\n </button>\n )\n })}\n {!filteredRoleOptions.length ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">\n {translate('ui.forms.listbox.noMatches', 'No matches')}\n </div>\n ) : null}\n </div>\n </div>\n )\n },\n },\n {\n id: 'isActive',\n label: translate('staff.teamMembers.form.fields.active', 'Active'),\n type: 'checkbox',\n },\n ]\n\n if (!tagsSection) {\n baseFields.splice(5, 0, {\n id: 'tags',\n label: translate('staff.teamMembers.form.fields.tags', 'Tags'),\n type: 'tags',\n placeholder: translate('staff.teamMembers.form.fields.tags.placeholder', 'Add tags'),\n })\n }\n\n return baseFields\n }, [\n createRoleHref,\n fetchUserOptions,\n filteredRoleOptions,\n roleSearch,\n roles,\n router,\n tagsSection,\n translate,\n teamOptions,\n userOptions,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n const baseGroups: CrudFormGroup[] = [\n {\n id: 'details',\n column: 1,\n fields: ['userId', 'teamId', 'displayName', 'description', 'roleIds', 'isActive'],\n },\n {\n id: 'custom',\n title: translate('entities.customFields.title', 'Custom Attributes'),\n column: 2,\n kind: 'customFields',\n },\n ]\n\n if (tagsSection) {\n baseGroups.push({\n id: 'tags',\n column: 2,\n bare: true,\n component: () => (\n <TagsSection\n title={tagsSection.title}\n tags={tagsSection.tags}\n onChange={tagsSection.onChange}\n loadOptions={tagsSection.loadOptions}\n createTag={tagsSection.createTag}\n onSave={tagsSection.onSave}\n labels={tagsSection.labels}\n />\n ),\n })\n } else {\n baseGroups.splice(1, 0, {\n id: 'tags',\n title: translate('staff.teamMembers.form.fields.tags', 'Tags'),\n column: 2,\n fields: ['tags'],\n })\n }\n\n baseGroups.push({\n id: 'attachments',\n title: translate('attachments.library.title', 'Attachments'),\n column: 1,\n component: () => (\n <AttachmentsSection\n entityId={E.staff.staff_team_member}\n recordId={recordId}\n showHeader={false}\n />\n ),\n })\n\n return baseGroups\n }, [recordId, tagsSection, translate])\n\n return (\n <CrudForm<TeamMemberFormValues>\n embedded={embedded}\n title={title}\n backHref={backHref}\n cancelHref={cancelHref}\n versionHistory={initialValues.id\n ? { resourceKind: 'staff.teamMember', resourceId: String(initialValues.id) }\n : undefined}\n submitLabel={submitLabel}\n fields={fields}\n groups={groups}\n entityId={E.staff.staff_team_member}\n initialValues={initialValues}\n onSubmit={onSubmit}\n onDelete={onDelete}\n isLoading={isLoading}\n loadingMessage={loadingMessage}\n />\n )\n}\n\nfunction mapTeamRole(item: Record<string, unknown>): TeamRoleRow | null {\n const id = typeof item.id === 'string' ? item.id : ''\n if (!id) return null\n const name = typeof item.name === 'string' && item.name.trim().length ? item.name.trim() : id\n const teamId = typeof item.teamId === 'string'\n ? item.teamId\n : typeof item.team_id === 'string'\n ? item.team_id\n : null\n return { id, name, teamId }\n}\n\nfunction filterRolesByTeam(roles: TeamRoleRow[], teamId: string | null): TeamRoleRow[] {\n if (!teamId) return roles.filter((role) => role.teamId == null)\n return roles.filter((role) => role.teamId == null || role.teamId === teamId)\n}\n\nfunction buildAllowedRoleIdSet(roles: TeamRoleRow[], teamId: string | null): Set<string> {\n return new Set(filterRolesByTeam(roles, teamId).map((role) => role.id))\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields/normalize'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { AttachmentsSection, TagsSection, type TagOption, type TagsSectionLabels } from '@open-mercato/ui/backend/detail'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { Plus } from 'lucide-react'\n\nconst DEFAULT_PAGE_SIZE = 100\n\nexport type TeamMemberFormValues = {\n id?: string\n teamId?: string | null\n userId?: string | null\n displayName?: string | null\n description?: string | null\n roleIds?: string[]\n tags?: string[]\n isActive?: boolean\n updatedAt?: string | null\n} & Record<string, unknown>\n\nexport type TeamMemberFormProps = {\n title: string\n submitLabel?: string\n backHref: string\n cancelHref: string\n embedded?: boolean\n initialValues: TeamMemberFormValues\n onSubmit: (values: TeamMemberFormValues) => Promise<void>\n onDelete?: () => Promise<void>\n isLoading?: boolean\n loadingMessage?: string\n tagsSection?: TeamMemberTagsSectionConfig\n}\n\ntype TeamRoleRow = {\n id: string\n name: string\n teamId: string | null\n}\n\ntype TeamRolesResponse = {\n items?: Array<Record<string, unknown>>\n}\n\ntype UsersResponse = {\n items?: Array<{ id?: string; email?: string; organizationName?: string | null }>\n}\n\ntype TeamsResponse = {\n items?: Array<{ id?: string; name?: string }>\n}\n\ntype TeamMemberTagsSectionConfig = {\n title: string\n tags: TagOption[]\n onChange: (next: TagOption[]) => void\n loadOptions: (query?: string) => Promise<TagOption[]>\n createTag: (label: string) => Promise<TagOption>\n onSave: (payload: { next: TagOption[]; added: TagOption[]; removed: TagOption[] }) => Promise<void>\n labels: TagsSectionLabels\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n const normalized = normalizeCustomFieldValues({ value })\n return normalized.value\n}\n\nexport const buildTeamMemberPayload = (\n values: TeamMemberFormValues,\n options: { id?: string } = {},\n): Record<string, unknown> => {\n const roleIds = Array.isArray(values.roleIds)\n ? values.roleIds.filter((item): item is string => typeof item === 'string')\n : []\n const tags = Array.isArray(values.tags)\n ? values.tags.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n : null\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n return {\n ...(options.id ? { id: options.id } : {}),\n teamId: values.teamId ? String(values.teamId) : null,\n userId: values.userId ? String(values.userId) : null,\n displayName: typeof values.displayName === 'string' ? values.displayName : '',\n description: typeof values.description === 'string' && values.description.trim().length ? values.description : null,\n roleIds,\n ...(tags ? { tags } : {}),\n isActive: values.isActive ?? true,\n ...(Object.keys(customFields).length ? { customFields } : {}),\n }\n}\n\nexport function TeamMemberForm(props: TeamMemberFormProps) {\n const {\n title,\n submitLabel,\n backHref,\n cancelHref,\n embedded = false,\n initialValues,\n onSubmit,\n onDelete,\n isLoading,\n loadingMessage,\n tagsSection,\n } = props\n const translate = useT()\n const recordId = typeof initialValues?.id === 'string' ? initialValues.id : null\n const router = useRouter()\n const scopeVersion = useOrganizationScopeVersion()\n const [roles, setRoles] = React.useState<TeamRoleRow[]>([])\n const [selectedTeamId, setSelectedTeamId] = React.useState<string | null>(null)\n const [userOptions, setUserOptions] = React.useState<LookupSelectItem[]>([])\n const [teamOptions, setTeamOptions] = React.useState<Array<{ value: string; label: string }>>([])\n const [roleSearch, setRoleSearch] = React.useState('')\n\n const resolvedTeamId = typeof initialValues.teamId === 'string' && initialValues.teamId.trim().length\n ? initialValues.teamId\n : null\n const resolvedUserId = typeof initialValues.userId === 'string' && initialValues.userId.trim().length\n ? initialValues.userId\n : null\n\n React.useEffect(() => {\n setSelectedTeamId(resolvedTeamId)\n }, [resolvedTeamId])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadRoles() {\n try {\n const params = new URLSearchParams({ page: '1', pageSize: String(DEFAULT_PAGE_SIZE) })\n const call = await apiCall<TeamRolesResponse>(`/api/staff/team-roles?${params.toString()}`)\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const nextRoles = items\n .map(mapTeamRole)\n .filter((role): role is TeamRoleRow => role !== null)\n if (!cancelled) setRoles(nextRoles)\n } catch {\n if (!cancelled) setRoles([])\n }\n }\n loadRoles()\n return () => { cancelled = true }\n }, [scopeVersion])\n\n React.useEffect(() => {\n let cancelled = false\n async function loadTeams() {\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const call = await apiCall<TeamsResponse>(`/api/staff/teams?${params.toString()}`)\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const options = items\n .map((team) => {\n const id = typeof team.id === 'string' ? team.id : null\n const name = typeof team.name === 'string' ? team.name : null\n if (!id || !name) return null\n return { value: id, label: name }\n })\n .filter((entry): entry is { value: string; label: string } => entry !== null)\n if (!cancelled) setTeamOptions(options)\n } catch {\n if (!cancelled) setTeamOptions([])\n }\n }\n loadTeams()\n return () => { cancelled = true }\n }, [scopeVersion])\n\n React.useEffect(() => {\n if (!resolvedUserId) return\n const userId = resolvedUserId\n if (userOptions.some((option) => option.id === resolvedUserId)) return\n let cancelled = false\n async function loadSelectedUser() {\n try {\n const call = await apiCall<UsersResponse>(`/api/auth/users?id=${encodeURIComponent(userId)}`)\n const entry = Array.isArray(call.result?.items) ? call.result.items[0] : null\n const entryId = typeof entry?.id === 'string' ? entry.id : null\n const entryEmail = typeof entry?.email === 'string' ? entry.email : null\n if (!entryId || !entryEmail) return\n if (!cancelled) {\n setUserOptions((prev) => {\n if (prev.some((option) => option.id === entryId)) return prev\n return [{ id: entryId, title: entryEmail, subtitle: entry?.organizationName ?? null }, ...prev]\n })\n }\n } catch {\n if (!cancelled) setUserOptions((prev) => prev)\n }\n }\n loadSelectedUser()\n return () => { cancelled = true }\n }, [resolvedUserId, userOptions])\n\n const filteredRoles = React.useMemo(\n () => filterRolesByTeam(roles, selectedTeamId),\n [roles, selectedTeamId],\n )\n const roleOptions = React.useMemo(\n () => filteredRoles.map((role) => ({ value: role.id, label: role.name })),\n [filteredRoles],\n )\n const filteredRoleOptions = React.useMemo(() => {\n const query = roleSearch.trim().toLowerCase()\n if (!query) return roleOptions\n return roleOptions.filter((option) => (\n option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query)\n ))\n }, [roleOptions, roleSearch])\n const createRoleHref = React.useMemo(() => {\n const params = new URLSearchParams()\n if (selectedTeamId) params.set('teamId', selectedTeamId)\n const query = params.toString()\n return `/backend/staff/team-roles/create${query ? `?${query}` : ''}`\n }, [selectedTeamId])\n const createTeamHref = '/backend/staff/teams/create'\n\n React.useEffect(() => {\n setRoleSearch('')\n }, [selectedTeamId])\n\n const fetchUserOptions = React.useCallback(async (query?: string): Promise<LookupSelectItem[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<UsersResponse>(`/api/auth/users?${params.toString()}`)\n const items = Array.isArray(call.result?.items) ? call.result.items : []\n const options = items\n .map((user): LookupSelectItem | null => {\n const id = typeof user?.id === 'string' ? user.id : null\n const email = typeof user?.email === 'string' ? user.email : null\n if (!id || !email) return null\n return {\n id,\n title: email,\n subtitle: user.organizationName ?? null,\n }\n })\n .filter((option): option is LookupSelectItem => option !== null)\n setUserOptions(options)\n return options\n }, [])\n\n const fields = React.useMemo<CrudField[]>(() => {\n const baseFields: CrudField[] = [\n {\n id: 'userId',\n label: translate('staff.teamMembers.form.fields.user', 'User'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n options={userOptions}\n fetchOptions={fetchUserOptions}\n placeholder={translate('staff.teamMembers.form.fields.user.placeholder', 'Select a user')}\n searchPlaceholder={translate('staff.teamMembers.form.fields.user.search', 'Search users')}\n emptyLabel={translate('staff.teamMembers.form.fields.user.empty', 'No users found')}\n selectedHintLabel={(id) => translate('staff.teamMembers.form.fields.user.selected', 'Selected user: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'teamId',\n label: '',\n type: 'custom',\n component: ({ value, setValue, setFormValue, values, disabled }) => {\n const currentValue = typeof value === 'string' ? value : ''\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium\">\n {translate('staff.teamMembers.form.fields.team', 'Team')}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => router.push(createTeamHref)}\n disabled={disabled}\n >\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('staff.teamMembers.form.actions.createTeam', 'Create new team')}\n </Button>\n </div>\n <Select\n value={currentValue || undefined}\n onValueChange={(value) => {\n const nextValue = value || undefined\n const nextTeamId = value || null\n setValue(nextValue)\n setSelectedTeamId(nextTeamId)\n if (!setFormValue) return\n const roleIds = Array.isArray(values?.roleIds)\n ? values?.roleIds.filter((item): item is string => typeof item === 'string')\n : []\n const allowedRoleIds = buildAllowedRoleIdSet(roles, nextTeamId)\n const nextRoleIds = roleIds.filter((roleId) => allowedRoleIds.has(roleId))\n if (nextRoleIds.length !== roleIds.length) {\n setFormValue('roleIds', nextRoleIds)\n }\n }}\n disabled={disabled}\n >\n <SelectTrigger data-crud-focus-target=\"\">\n <SelectValue placeholder={translate('ui.forms.select.emptyOption', '\u2014')} />\n </SelectTrigger>\n <SelectContent>\n {teamOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n },\n },\n {\n id: 'displayName',\n label: translate('staff.teamMembers.form.fields.displayName', 'Display name'),\n type: 'text',\n required: true,\n },\n {\n id: 'description',\n label: translate('staff.teamMembers.form.fields.description', 'Description'),\n type: 'richtext',\n editor: 'html',\n },\n {\n id: 'roleIds',\n label: '',\n type: 'custom',\n component: ({ value, setValue, disabled }) => {\n const selectedValues = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-sm font-medium\">\n {translate('staff.teamMembers.form.fields.roles', 'Roles')}\n </span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => router.push(createRoleHref)}\n disabled={disabled}\n >\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {translate('staff.teamMembers.form.actions.defineRole', 'Define new role')}\n </Button>\n </div>\n <input\n className=\"w-full h-8 rounded border px-2 text-sm\"\n placeholder={translate('ui.forms.listbox.searchPlaceholder', 'Search...')}\n value={roleSearch}\n onChange={(event) => setRoleSearch(event.target.value)}\n data-crud-focus-target=\"\"\n disabled={disabled}\n />\n <div className=\"rounded border max-h-48 overflow-auto divide-y\">\n {filteredRoleOptions.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n return (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => {\n const next = new Set(selectedValues)\n if (isSelected) {\n next.delete(option.value)\n } else {\n next.add(option.value)\n }\n setValue(Array.from(next))\n }}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-muted ${isSelected ? 'bg-muted' : ''}`}\n disabled={disabled}\n >\n <span className=\"inline-flex items-center gap-2\">\n <input type=\"checkbox\" className=\"size-4\" readOnly checked={isSelected} />\n <span>{option.label}</span>\n </span>\n </button>\n )\n })}\n {!filteredRoleOptions.length ? (\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">\n {translate('ui.forms.listbox.noMatches', 'No matches')}\n </div>\n ) : null}\n </div>\n </div>\n )\n },\n },\n {\n id: 'isActive',\n label: translate('staff.teamMembers.form.fields.active', 'Active'),\n type: 'checkbox',\n },\n ]\n\n if (!tagsSection) {\n baseFields.splice(5, 0, {\n id: 'tags',\n label: translate('staff.teamMembers.form.fields.tags', 'Tags'),\n type: 'tags',\n placeholder: translate('staff.teamMembers.form.fields.tags.placeholder', 'Add tags'),\n })\n }\n\n return baseFields\n }, [\n createRoleHref,\n fetchUserOptions,\n filteredRoleOptions,\n roleSearch,\n roles,\n router,\n tagsSection,\n translate,\n teamOptions,\n userOptions,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => {\n const baseGroups: CrudFormGroup[] = [\n {\n id: 'details',\n column: 1,\n fields: ['userId', 'teamId', 'displayName', 'description', 'roleIds', 'isActive'],\n },\n {\n id: 'custom',\n title: translate('entities.customFields.title', 'Custom Attributes'),\n column: 2,\n kind: 'customFields',\n },\n ]\n\n if (tagsSection) {\n baseGroups.push({\n id: 'tags',\n column: 2,\n bare: true,\n component: () => (\n <TagsSection\n title={tagsSection.title}\n tags={tagsSection.tags}\n onChange={tagsSection.onChange}\n loadOptions={tagsSection.loadOptions}\n createTag={tagsSection.createTag}\n onSave={tagsSection.onSave}\n labels={tagsSection.labels}\n />\n ),\n })\n } else {\n baseGroups.splice(1, 0, {\n id: 'tags',\n title: translate('staff.teamMembers.form.fields.tags', 'Tags'),\n column: 2,\n fields: ['tags'],\n })\n }\n\n baseGroups.push({\n id: 'attachments',\n title: translate('attachments.library.title', 'Attachments'),\n column: 1,\n component: () => (\n <AttachmentsSection\n entityId={E.staff.staff_team_member}\n recordId={recordId}\n showHeader={false}\n />\n ),\n })\n\n return baseGroups\n }, [recordId, tagsSection, translate])\n\n return (\n <CrudForm<TeamMemberFormValues>\n embedded={embedded}\n title={title}\n backHref={backHref}\n cancelHref={cancelHref}\n versionHistory={initialValues.id\n ? { resourceKind: 'staff.teamMember', resourceId: String(initialValues.id) }\n : undefined}\n submitLabel={submitLabel}\n fields={fields}\n groups={groups}\n entityId={E.staff.staff_team_member}\n initialValues={initialValues}\n optimisticLockUpdatedAt={initialValues.updatedAt}\n onSubmit={onSubmit}\n onDelete={onDelete}\n isLoading={isLoading}\n loadingMessage={loadingMessage}\n />\n )\n}\n\nfunction mapTeamRole(item: Record<string, unknown>): TeamRoleRow | null {\n const id = typeof item.id === 'string' ? item.id : ''\n if (!id) return null\n const name = typeof item.name === 'string' && item.name.trim().length ? item.name.trim() : id\n const teamId = typeof item.teamId === 'string'\n ? item.teamId\n : typeof item.team_id === 'string'\n ? item.team_id\n : null\n return { id, name, teamId }\n}\n\nfunction filterRolesByTeam(roles: TeamRoleRow[], teamId: string | null): TeamRoleRow[] {\n if (!teamId) return roles.filter((role) => role.teamId == null)\n return roles.filter((role) => role.teamId == null || role.teamId === teamId)\n}\n\nfunction buildAllowedRoleIdSet(roles: TeamRoleRow[], teamId: string | null): Set<string> {\n return new Set(filterRolesByTeam(roles, teamId).map((role) => role.id))\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["value"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/staff/components/TeamRoleForm.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields/normalize'\nimport { AppearanceSelector } from '@open-mercato/core/modules/dictionaries/components/AppearanceSelector'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\nexport type TeamRoleFormValues = {\n id?: string\n teamId?: string | null\n name: string\n description?: string | null\n appearance?: { icon?: string | null; color?: string | null }\n} & Record<string, unknown>\n\nexport type TeamRoleOption = {\n id: string\n name: string\n}\n\nexport type TeamRoleFormProps = {\n title: string\n submitLabel?: string\n backHref: string\n cancelHref: string\n initialValues: TeamRoleFormValues\n teamOptions?: TeamRoleOption[]\n onSubmit: (values: TeamRoleFormValues) => Promise<void>\n onDelete?: () => Promise<void>\n isLoading?: boolean\n loadingMessage?: string\n extraActions?: React.ReactNode\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n const normalized = normalizeCustomFieldValues({ value })\n return normalized.value\n}\n\nexport const buildTeamRolePayload = (\n values: TeamRoleFormValues,\n options: { id?: string } = {},\n): Record<string, unknown> => {\n const name = typeof values.name === 'string' ? values.name.trim() : ''\n const description = typeof values.description === 'string' && values.description.trim().length\n ? values.description.trim()\n : null\n const teamId = typeof values.teamId === 'string' && values.teamId.trim().length ? values.teamId : null\n const appearance = values.appearance && typeof values.appearance === 'object'\n ? values.appearance as { icon?: string | null; color?: string | null }\n : {}\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n return {\n ...(options.id ? { id: options.id } : {}),\n teamId,\n name,\n description,\n appearanceIcon: appearance.icon ?? null,\n appearanceColor: appearance.color ?? null,\n ...(Object.keys(customFields).length ? { customFields } : {}),\n }\n}\n\nexport function TeamRoleForm(props: TeamRoleFormProps) {\n const {\n title,\n submitLabel,\n backHref,\n cancelHref,\n initialValues,\n teamOptions,\n onSubmit,\n onDelete,\n isLoading,\n loadingMessage,\n extraActions,\n } = props\n const t = useT()\n\n const appearanceLabels = React.useMemo(() => ({\n colorLabel: t('staff.teamRoles.form.appearance.colorLabel', 'Color'),\n colorHelp: t('staff.teamRoles.form.appearance.colorHelp', 'Pick a color for this team role.'),\n colorClearLabel: t('staff.teamRoles.form.appearance.colorClear', 'Clear color'),\n iconLabel: t('staff.teamRoles.form.appearance.iconLabel', 'Icon'),\n iconPlaceholder: t('staff.teamRoles.form.appearance.iconPlaceholder', 'Type an emoji or icon name'),\n iconPickerTriggerLabel: t('staff.teamRoles.form.appearance.iconPicker', 'Browse icons'),\n iconSearchPlaceholder: t('staff.teamRoles.form.appearance.iconSearch', 'Search icons or emojis\u2026'),\n iconSearchEmptyLabel: t('staff.teamRoles.form.appearance.iconSearchEmpty', 'No icons match your search'),\n iconSuggestionsLabel: t('staff.teamRoles.form.appearance.iconSuggestions', 'Suggestions'),\n iconClearLabel: t('staff.teamRoles.form.appearance.iconClear', 'Clear icon'),\n previewEmptyLabel: t('staff.teamRoles.form.appearance.previewEmpty', 'No appearance selected'),\n }), [t])\n\n const fields = React.useMemo<CrudField[]>(() => {\n const base: CrudField[] = []\n if (teamOptions && teamOptions.length) {\n base.push({\n id: 'teamId',\n label: t('staff.teamRoles.form.fields.team', 'Team'),\n type: 'select',\n listbox: true,\n options: [\n { value: '', label: t('staff.teamRoles.form.fields.team.unassigned', 'Unassigned') },\n ...teamOptions.map((team) => ({ value: team.id, label: team.name })),\n ],\n })\n }\n base.push(\n { id: 'name', label: t('staff.teamRoles.form.fields.name', 'Name'), type: 'text', required: true },\n { id: 'description', label: t('staff.teamRoles.form.fields.description', 'Description'), type: 'richtext', editor: 'html' },\n {\n id: 'appearance',\n label: t('staff.teamRoles.form.appearance.label', 'Appearance'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const current = value && typeof value === 'object'\n ? (value as { icon?: string | null; color?: string | null })\n : {}\n return (\n <AppearanceSelector\n icon={current.icon ?? null}\n color={current.color ?? null}\n onIconChange={(next) => setValue({ ...current, icon: next })}\n onColorChange={(next) => setValue({ ...current, color: next })}\n labels={appearanceLabels}\n />\n )\n },\n },\n )\n return base\n }, [appearanceLabels, t, teamOptions])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'details', fields: teamOptions && teamOptions.length ? ['teamId', 'name', 'description', 'appearance'] : ['name', 'description', 'appearance'] },\n { id: 'custom', title: t('entities.customFields.title', 'Custom Attributes'), column: 2, kind: 'customFields' },\n ], [t, teamOptions])\n\n return (\n <CrudForm<TeamRoleFormValues>\n title={title}\n backHref={backHref}\n cancelHref={cancelHref}\n versionHistory={initialValues.id\n ? { resourceKind: 'staff.teamRole', resourceId: String(initialValues.id) }\n : undefined}\n submitLabel={submitLabel}\n fields={fields}\n groups={groups}\n entityId={E.staff.staff_team_role}\n initialValues={initialValues}\n onSubmit={onSubmit}\n onDelete={onDelete}\n isLoading={isLoading}\n loadingMessage={loadingMessage}\n extraActions={extraActions}\n />\n )\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { normalizeCustomFieldValues } from '@open-mercato/shared/lib/custom-fields/normalize'\nimport { AppearanceSelector } from '@open-mercato/core/modules/dictionaries/components/AppearanceSelector'\nimport { E } from '#generated/entities.ids.generated'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\n\nexport type TeamRoleFormValues = {\n id?: string\n teamId?: string | null\n name: string\n description?: string | null\n appearance?: { icon?: string | null; color?: string | null }\n updatedAt?: string | null\n} & Record<string, unknown>\n\nexport type TeamRoleOption = {\n id: string\n name: string\n}\n\nexport type TeamRoleFormProps = {\n title: string\n submitLabel?: string\n backHref: string\n cancelHref: string\n initialValues: TeamRoleFormValues\n teamOptions?: TeamRoleOption[]\n onSubmit: (values: TeamRoleFormValues) => Promise<void>\n onDelete?: () => Promise<void>\n isLoading?: boolean\n loadingMessage?: string\n extraActions?: React.ReactNode\n}\n\nconst normalizeCustomFieldSubmitValue = (value: unknown): unknown => {\n const normalized = normalizeCustomFieldValues({ value })\n return normalized.value\n}\n\nexport const buildTeamRolePayload = (\n values: TeamRoleFormValues,\n options: { id?: string } = {},\n): Record<string, unknown> => {\n const name = typeof values.name === 'string' ? values.name.trim() : ''\n const description = typeof values.description === 'string' && values.description.trim().length\n ? values.description.trim()\n : null\n const teamId = typeof values.teamId === 'string' && values.teamId.trim().length ? values.teamId : null\n const appearance = values.appearance && typeof values.appearance === 'object'\n ? values.appearance as { icon?: string | null; color?: string | null }\n : {}\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n return {\n ...(options.id ? { id: options.id } : {}),\n teamId,\n name,\n description,\n appearanceIcon: appearance.icon ?? null,\n appearanceColor: appearance.color ?? null,\n ...(Object.keys(customFields).length ? { customFields } : {}),\n }\n}\n\nexport function TeamRoleForm(props: TeamRoleFormProps) {\n const {\n title,\n submitLabel,\n backHref,\n cancelHref,\n initialValues,\n teamOptions,\n onSubmit,\n onDelete,\n isLoading,\n loadingMessage,\n extraActions,\n } = props\n const t = useT()\n\n const appearanceLabels = React.useMemo(() => ({\n colorLabel: t('staff.teamRoles.form.appearance.colorLabel', 'Color'),\n colorHelp: t('staff.teamRoles.form.appearance.colorHelp', 'Pick a color for this team role.'),\n colorClearLabel: t('staff.teamRoles.form.appearance.colorClear', 'Clear color'),\n iconLabel: t('staff.teamRoles.form.appearance.iconLabel', 'Icon'),\n iconPlaceholder: t('staff.teamRoles.form.appearance.iconPlaceholder', 'Type an emoji or icon name'),\n iconPickerTriggerLabel: t('staff.teamRoles.form.appearance.iconPicker', 'Browse icons'),\n iconSearchPlaceholder: t('staff.teamRoles.form.appearance.iconSearch', 'Search icons or emojis\u2026'),\n iconSearchEmptyLabel: t('staff.teamRoles.form.appearance.iconSearchEmpty', 'No icons match your search'),\n iconSuggestionsLabel: t('staff.teamRoles.form.appearance.iconSuggestions', 'Suggestions'),\n iconClearLabel: t('staff.teamRoles.form.appearance.iconClear', 'Clear icon'),\n previewEmptyLabel: t('staff.teamRoles.form.appearance.previewEmpty', 'No appearance selected'),\n }), [t])\n\n const fields = React.useMemo<CrudField[]>(() => {\n const base: CrudField[] = []\n if (teamOptions && teamOptions.length) {\n base.push({\n id: 'teamId',\n label: t('staff.teamRoles.form.fields.team', 'Team'),\n type: 'select',\n listbox: true,\n options: [\n { value: '', label: t('staff.teamRoles.form.fields.team.unassigned', 'Unassigned') },\n ...teamOptions.map((team) => ({ value: team.id, label: team.name })),\n ],\n })\n }\n base.push(\n { id: 'name', label: t('staff.teamRoles.form.fields.name', 'Name'), type: 'text', required: true },\n { id: 'description', label: t('staff.teamRoles.form.fields.description', 'Description'), type: 'richtext', editor: 'html' },\n {\n id: 'appearance',\n label: t('staff.teamRoles.form.appearance.label', 'Appearance'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const current = value && typeof value === 'object'\n ? (value as { icon?: string | null; color?: string | null })\n : {}\n return (\n <AppearanceSelector\n icon={current.icon ?? null}\n color={current.color ?? null}\n onIconChange={(next) => setValue({ ...current, icon: next })}\n onColorChange={(next) => setValue({ ...current, color: next })}\n labels={appearanceLabels}\n />\n )\n },\n },\n )\n return base\n }, [appearanceLabels, t, teamOptions])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'details', fields: teamOptions && teamOptions.length ? ['teamId', 'name', 'description', 'appearance'] : ['name', 'description', 'appearance'] },\n { id: 'custom', title: t('entities.customFields.title', 'Custom Attributes'), column: 2, kind: 'customFields' },\n ], [t, teamOptions])\n\n return (\n <CrudForm<TeamRoleFormValues>\n title={title}\n backHref={backHref}\n cancelHref={cancelHref}\n versionHistory={initialValues.id\n ? { resourceKind: 'staff.teamRole', resourceId: String(initialValues.id) }\n : undefined}\n submitLabel={submitLabel}\n fields={fields}\n groups={groups}\n entityId={E.staff.staff_team_role}\n initialValues={initialValues}\n optimisticLockUpdatedAt={initialValues.updatedAt}\n onSubmit={onSubmit}\n onDelete={onDelete}\n isLoading={isLoading}\n loadingMessage={loadingMessage}\n extraActions={extraActions}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,6 +9,7 @@ import { LoadingMessage, ErrorMessage, TabEmptyState } from "@open-mercato/ui/ba
|
|
|
9
9
|
import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
|
|
10
10
|
import { createCrud, updateCrud, deleteCrud } from "@open-mercato/ui/backend/utils/crud";
|
|
11
11
|
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
12
|
+
import { surfaceRecordConflict } from "@open-mercato/ui/backend/conflicts";
|
|
12
13
|
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
13
14
|
import { useConfirmDialog } from "@open-mercato/ui/backend/confirm-dialog";
|
|
14
15
|
function JobHistorySection({ memberId }) {
|
|
@@ -31,6 +32,7 @@ function JobHistorySection({ memberId }) {
|
|
|
31
32
|
errorLoad: t("staff.teamMembers.detail.jobHistory.errorLoad", "Failed to load job history."),
|
|
32
33
|
errorSave: t("staff.teamMembers.detail.jobHistory.errorSave", "Failed to save job history."),
|
|
33
34
|
errorDelete: t("staff.teamMembers.detail.jobHistory.errorDelete", "Failed to delete job history."),
|
|
35
|
+
conflict: t("staff.teamMembers.detail.jobHistory.conflict", "This record was modified by someone else. Refresh and try again."),
|
|
34
36
|
loading: t("staff.teamMembers.detail.jobHistory.loading", "Loading job history..."),
|
|
35
37
|
saved: t("staff.teamMembers.detail.jobHistory.saved", "Job history saved."),
|
|
36
38
|
updated: t("staff.teamMembers.detail.jobHistory.updated", "Job history updated."),
|
|
@@ -106,7 +108,7 @@ function JobHistorySection({ memberId }) {
|
|
|
106
108
|
if (!memberId) return;
|
|
107
109
|
const payload = buildJobHistoryPayload(values);
|
|
108
110
|
if (dialogMode === "edit" && activeRecord) {
|
|
109
|
-
await updateCrud("staff/job-histories", { id: activeRecord.id, ...payload }, { errorMessage: labels.errorSave });
|
|
111
|
+
await updateCrud("staff/job-histories", { id: activeRecord.id, updatedAt: activeRecord.updatedAt, ...payload }, { errorMessage: labels.errorSave });
|
|
110
112
|
flash(labels.updated, "success");
|
|
111
113
|
} else {
|
|
112
114
|
await createCrud("staff/job-histories", { entityId: memberId, ...payload }, { errorMessage: labels.errorSave });
|
|
@@ -114,17 +116,26 @@ function JobHistorySection({ memberId }) {
|
|
|
114
116
|
}
|
|
115
117
|
closeDialog();
|
|
116
118
|
setReloadToken((prev) => prev + 1);
|
|
117
|
-
}, [activeRecord, closeDialog, dialogMode, labels.errorSave, labels.saved, labels.updated, memberId]);
|
|
119
|
+
}, [activeRecord, closeDialog, dialogMode, labels.conflict, labels.errorSave, labels.saved, labels.updated, memberId]);
|
|
118
120
|
const handleDelete = React.useCallback(async (record) => {
|
|
119
121
|
const confirmed = await confirmDialog({
|
|
120
122
|
title: labels.deleteConfirm,
|
|
121
123
|
variant: "destructive"
|
|
122
124
|
});
|
|
123
125
|
if (!confirmed) return;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
try {
|
|
127
|
+
await deleteCrud("staff/job-histories", {
|
|
128
|
+
id: record.id,
|
|
129
|
+
body: { id: record.id, updatedAt: record.updatedAt },
|
|
130
|
+
errorMessage: labels.errorDelete
|
|
131
|
+
});
|
|
132
|
+
flash(labels.deleted, "success");
|
|
133
|
+
setReloadToken((prev) => prev + 1);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (surfaceRecordConflict(error, t)) return;
|
|
136
|
+
flash(labels.errorDelete, "error");
|
|
137
|
+
}
|
|
138
|
+
}, [labels.deleteConfirm, labels.deleted, labels.errorDelete, confirmDialog, t]);
|
|
128
139
|
const dialogTitle = dialogMode === "edit" ? labels.edit : labels.add;
|
|
129
140
|
const initialValues = dialogMode === "edit" && activeRecord ? {
|
|
130
141
|
name: activeRecord.name,
|
|
@@ -177,6 +188,7 @@ function JobHistorySection({ memberId }) {
|
|
|
177
188
|
{
|
|
178
189
|
fields,
|
|
179
190
|
initialValues,
|
|
191
|
+
optimisticLockUpdatedAt: activeRecord?.updatedAt ?? null,
|
|
180
192
|
onSubmit: handleSubmit,
|
|
181
193
|
submitLabel: dialogMode === "edit" ? labels.update : labels.save,
|
|
182
194
|
extraActions: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", onClick: closeDialog, children: labels.cancel }),
|
|
@@ -202,7 +214,8 @@ function normalizeJobHistoryItems(items) {
|
|
|
202
214
|
companyName: typeof record.company_name === "string" ? record.company_name : typeof record.companyName === "string" ? record.companyName : null,
|
|
203
215
|
description: typeof record.description === "string" ? record.description : null,
|
|
204
216
|
startDate: typeof record.start_date === "string" ? record.start_date : typeof record.startDate === "string" ? record.startDate : null,
|
|
205
|
-
endDate: typeof record.end_date === "string" ? record.end_date : typeof record.endDate === "string" ? record.endDate : null
|
|
217
|
+
endDate: typeof record.end_date === "string" ? record.end_date : typeof record.endDate === "string" ? record.endDate : null,
|
|
218
|
+
updatedAt: typeof record.updated_at === "string" ? record.updated_at : typeof record.updatedAt === "string" ? record.updatedAt : void 0
|
|
206
219
|
};
|
|
207
220
|
}).filter((value) => value !== null);
|
|
208
221
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/staff/components/detail/JobHistorySection.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Plus } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { CrudForm, type CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { LoadingMessage, ErrorMessage, TabEmptyState } from '@open-mercato/ui/backend/detail'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\ntype JobHistoryRecord = {\n id: string\n name: string\n companyName: string | null\n description: string | null\n startDate: string | null\n endDate: string | null\n}\n\ntype JobHistoryResponse = {\n items?: Record<string, unknown>[]\n}\n\ntype JobHistoryFormValues = {\n name?: string\n companyName?: string\n description?: string\n startDate?: string\n endDate?: string\n}\n\nexport function JobHistorySection({ memberId }: { memberId: string | null }) {\n const t = useT()\n const { confirm: confirmDialog, ConfirmDialogElement } = useConfirmDialog()\n const [items, setItems] = React.useState<JobHistoryRecord[]>([])\n const [isLoading, setIsLoading] = React.useState(false)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n const [dialogMode, setDialogMode] = React.useState<'create' | 'edit'>('create')\n const [activeRecord, setActiveRecord] = React.useState<JobHistoryRecord | null>(null)\n const [reloadToken, setReloadToken] = React.useState(0)\n\n const labels = React.useMemo(() => ({\n title: t('staff.teamMembers.detail.jobHistory.title', 'Job history'),\n emptyTitle: t('staff.teamMembers.detail.jobHistory.emptyTitle', 'No job history yet'),\n emptyAction: t('staff.teamMembers.detail.jobHistory.emptyAction', 'Add job history'),\n add: t('staff.teamMembers.detail.jobHistory.add', 'Add job'),\n edit: t('staff.teamMembers.detail.jobHistory.edit', 'Edit job'),\n deleteConfirm: t('staff.teamMembers.detail.jobHistory.deleteConfirm', 'Delete this job history entry?'),\n errorLoad: t('staff.teamMembers.detail.jobHistory.errorLoad', 'Failed to load job history.'),\n errorSave: t('staff.teamMembers.detail.jobHistory.errorSave', 'Failed to save job history.'),\n errorDelete: t('staff.teamMembers.detail.jobHistory.errorDelete', 'Failed to delete job history.'),\n loading: t('staff.teamMembers.detail.jobHistory.loading', 'Loading job history...'),\n saved: t('staff.teamMembers.detail.jobHistory.saved', 'Job history saved.'),\n updated: t('staff.teamMembers.detail.jobHistory.updated', 'Job history updated.'),\n deleted: t('staff.teamMembers.detail.jobHistory.deleted', 'Job history deleted.'),\n present: t('staff.teamMembers.detail.jobHistory.present', 'Present'),\n unknownDate: t('staff.teamMembers.detail.jobHistory.unknownDate', 'Unknown date'),\n fields: {\n name: t('staff.teamMembers.detail.jobHistory.fields.name', 'Role / title'),\n companyName: t('staff.teamMembers.detail.jobHistory.fields.companyName', 'Company'),\n startDate: t('staff.teamMembers.detail.jobHistory.fields.startDate', 'From'),\n endDate: t('staff.teamMembers.detail.jobHistory.fields.endDate', 'To'),\n description: t('staff.teamMembers.detail.jobHistory.fields.description', 'Description'),\n },\n save: t('staff.teamMembers.detail.jobHistory.save', 'Save job'),\n update: t('staff.teamMembers.detail.jobHistory.update', 'Update job'),\n cancel: t('staff.teamMembers.detail.jobHistory.cancel', 'Cancel'),\n }), [t])\n\n const fields = React.useMemo<CrudField[]>(() => ([\n { id: 'name', label: labels.fields.name, type: 'text', required: true },\n { id: 'companyName', label: labels.fields.companyName, type: 'text' },\n { id: 'startDate', label: labels.fields.startDate, type: 'date', required: true, layout: 'half' },\n { id: 'endDate', label: labels.fields.endDate, type: 'date', layout: 'half' },\n { id: 'description', label: labels.fields.description, type: 'textarea' },\n ]), [labels.fields])\n\n const dateFormatter = React.useMemo(\n () => new Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'short', day: 'numeric' }),\n [],\n )\n\n const loadJobHistory = React.useCallback(async () => {\n if (!memberId) return\n setIsLoading(true)\n setLoadError(null)\n try {\n const params = new URLSearchParams({\n entityId: memberId,\n pageSize: '100',\n sortField: 'startDate',\n sortDir: 'desc',\n })\n const payload = await readApiResultOrThrow<JobHistoryResponse>(\n `/api/staff/job-histories?${params.toString()}`,\n undefined,\n { errorMessage: labels.errorLoad },\n )\n const records = normalizeJobHistoryItems(payload?.items)\n setItems(records)\n } catch (error) {\n const message = error instanceof Error ? error.message : labels.errorLoad\n setLoadError(message)\n } finally {\n setIsLoading(false)\n }\n }, [labels.errorLoad, memberId])\n\n React.useEffect(() => {\n void loadJobHistory()\n }, [loadJobHistory, reloadToken])\n\n const openCreateDialog = React.useCallback(() => {\n if (!memberId) return\n setDialogMode('create')\n setActiveRecord(null)\n setDialogOpen(true)\n }, [memberId])\n\n const openEditDialog = React.useCallback((record: JobHistoryRecord) => {\n setDialogMode('edit')\n setActiveRecord(record)\n setDialogOpen(true)\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialogOpen(false)\n setActiveRecord(null)\n }, [])\n\n const handleSubmit = React.useCallback(async (values: JobHistoryFormValues) => {\n if (!memberId) return\n const payload = buildJobHistoryPayload(values)\n if (dialogMode === 'edit' && activeRecord) {\n await updateCrud('staff/job-histories', { id: activeRecord.id, ...payload }, { errorMessage: labels.errorSave })\n flash(labels.updated, 'success')\n } else {\n await createCrud('staff/job-histories', { entityId: memberId, ...payload }, { errorMessage: labels.errorSave })\n flash(labels.saved, 'success')\n }\n closeDialog()\n setReloadToken((prev) => prev + 1)\n }, [activeRecord, closeDialog, dialogMode, labels.errorSave, labels.saved, labels.updated, memberId])\n\n const handleDelete = React.useCallback(async (record: JobHistoryRecord) => {\n const confirmed = await confirmDialog({\n title: labels.deleteConfirm,\n variant: 'destructive',\n })\n if (!confirmed) return\n await deleteCrud('staff/job-histories', { id: record.id, errorMessage: labels.errorDelete })\n flash(labels.deleted, 'success')\n setReloadToken((prev) => prev + 1)\n }, [labels.deleteConfirm, labels.deleted, labels.errorDelete, confirmDialog])\n\n const dialogTitle = dialogMode === 'edit' ? labels.edit : labels.add\n\n const initialValues = dialogMode === 'edit' && activeRecord\n ? {\n name: activeRecord.name,\n companyName: activeRecord.companyName ?? '',\n description: activeRecord.description ?? '',\n startDate: toDateInputValue(activeRecord.startDate) ?? '',\n endDate: toDateInputValue(activeRecord.endDate) ?? '',\n }\n : {\n name: '',\n companyName: '',\n description: '',\n startDate: '',\n endDate: '',\n }\n\n const hasItems = items.length > 0\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-foreground\">{labels.title}</h2>\n {hasItems ? (\n <Button type=\"button\" size=\"sm\" onClick={openCreateDialog} disabled={!memberId}>\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {labels.add}\n </Button>\n ) : null}\n </div>\n\n {isLoading ? (\n <LoadingMessage label={labels.loading} />\n ) : loadError ? (\n <ErrorMessage label={loadError} />\n ) : items.length === 0 ? (\n <TabEmptyState\n title={labels.emptyTitle}\n actionLabel={labels.emptyAction}\n onAction={openCreateDialog}\n disabled={!memberId}\n />\n ) : (\n <div className=\"space-y-3\">\n {items.map((record) => (\n <div key={record.id} className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <div className=\"text-base font-semibold text-foreground\">{record.name}</div>\n <div className=\"text-sm text-muted-foreground\">\n {formatDateRange(record, labels.present, labels.unknownDate, dateFormatter)}\n </div>\n {record.companyName ? (\n <div className=\"text-sm text-foreground\">{record.companyName}</div>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => openEditDialog(record)}>\n {labels.edit}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => handleDelete(record)}>\n {t('staff.teamMembers.actions.delete', 'Delete')}\n </Button>\n </div>\n </div>\n {record.description ? (\n <p className=\"mt-3 text-sm text-muted-foreground\">{record.description}</p>\n ) : null}\n </div>\n ))}\n </div>\n )}\n\n <Dialog open={dialogOpen} onOpenChange={(open) => (open ? setDialogOpen(true) : closeDialog())}>\n <DialogContent className=\"sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>{dialogTitle}</DialogTitle>\n </DialogHeader>\n <CrudForm<JobHistoryFormValues>\n fields={fields}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n submitLabel={dialogMode === 'edit' ? labels.update : labels.save}\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {labels.cancel}\n </Button>\n )}\n embedded\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </div>\n )\n}\n\nfunction normalizeJobHistoryItems(items?: Record<string, unknown>[]): JobHistoryRecord[] {\n if (!Array.isArray(items)) return []\n return items\n .map((item) => {\n if (!item || typeof item !== 'object') return null\n const record = item as Record<string, unknown>\n const rawId = record.id ?? record.job_history_id ?? null\n const id =\n typeof rawId === 'string'\n ? rawId\n : typeof rawId === 'number' || typeof rawId === 'bigint'\n ? String(rawId)\n : null\n if (!id) return null\n const name = typeof record.name === 'string' ? record.name : ''\n return {\n id,\n name,\n companyName: typeof record.company_name === 'string'\n ? record.company_name\n : typeof record.companyName === 'string'\n ? record.companyName\n : null,\n description: typeof record.description === 'string' ? record.description : null,\n startDate: typeof record.start_date === 'string'\n ? record.start_date\n : typeof record.startDate === 'string'\n ? record.startDate\n : null,\n endDate: typeof record.end_date === 'string'\n ? record.end_date\n : typeof record.endDate === 'string'\n ? record.endDate\n : null,\n }\n })\n .filter((value): value is JobHistoryRecord => value !== null)\n}\n\nfunction buildJobHistoryPayload(values: JobHistoryFormValues) {\n const payload: Record<string, unknown> = {\n name: values.name?.trim() ?? '',\n companyName: values.companyName?.trim() || null,\n description: values.description?.trim() || null,\n }\n if (values.startDate) payload.startDate = values.startDate\n if (values.endDate) payload.endDate = values.endDate\n return payload\n}\n\nimport { toDateInputValue } from '@open-mercato/shared/lib/date/format'\n\nfunction formatDateRange(\n record: JobHistoryRecord,\n presentLabel: string,\n unknownLabel: string,\n formatter: Intl.DateTimeFormat,\n): string {\n const start = record.startDate ? new Date(record.startDate) : null\n const end = record.endDate ? new Date(record.endDate) : null\n const startLabel = start && !Number.isNaN(start.getTime()) ? formatter.format(start) : unknownLabel\n const endLabel = end && !Number.isNaN(end.getTime()) ? formatter.format(end) : presentLabel\n return `${startLabel} \u2014 ${endLabel}`\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Plus } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { CrudForm, type CrudField } from '@open-mercato/ui/backend/CrudForm'\nimport { LoadingMessage, ErrorMessage, TabEmptyState } from '@open-mercato/ui/backend/detail'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud, deleteCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\n\ntype JobHistoryRecord = {\n id: string\n name: string\n companyName: string | null\n description: string | null\n startDate: string | null\n endDate: string | null\n updatedAt: string | undefined\n}\n\ntype JobHistoryResponse = {\n items?: Record<string, unknown>[]\n}\n\ntype JobHistoryFormValues = {\n name?: string\n companyName?: string\n description?: string\n startDate?: string\n endDate?: string\n}\n\nexport function JobHistorySection({ memberId }: { memberId: string | null }) {\n const t = useT()\n const { confirm: confirmDialog, ConfirmDialogElement } = useConfirmDialog()\n const [items, setItems] = React.useState<JobHistoryRecord[]>([])\n const [isLoading, setIsLoading] = React.useState(false)\n const [loadError, setLoadError] = React.useState<string | null>(null)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n const [dialogMode, setDialogMode] = React.useState<'create' | 'edit'>('create')\n const [activeRecord, setActiveRecord] = React.useState<JobHistoryRecord | null>(null)\n const [reloadToken, setReloadToken] = React.useState(0)\n\n const labels = React.useMemo(() => ({\n title: t('staff.teamMembers.detail.jobHistory.title', 'Job history'),\n emptyTitle: t('staff.teamMembers.detail.jobHistory.emptyTitle', 'No job history yet'),\n emptyAction: t('staff.teamMembers.detail.jobHistory.emptyAction', 'Add job history'),\n add: t('staff.teamMembers.detail.jobHistory.add', 'Add job'),\n edit: t('staff.teamMembers.detail.jobHistory.edit', 'Edit job'),\n deleteConfirm: t('staff.teamMembers.detail.jobHistory.deleteConfirm', 'Delete this job history entry?'),\n errorLoad: t('staff.teamMembers.detail.jobHistory.errorLoad', 'Failed to load job history.'),\n errorSave: t('staff.teamMembers.detail.jobHistory.errorSave', 'Failed to save job history.'),\n errorDelete: t('staff.teamMembers.detail.jobHistory.errorDelete', 'Failed to delete job history.'),\n conflict: t('staff.teamMembers.detail.jobHistory.conflict', 'This record was modified by someone else. Refresh and try again.'),\n loading: t('staff.teamMembers.detail.jobHistory.loading', 'Loading job history...'),\n saved: t('staff.teamMembers.detail.jobHistory.saved', 'Job history saved.'),\n updated: t('staff.teamMembers.detail.jobHistory.updated', 'Job history updated.'),\n deleted: t('staff.teamMembers.detail.jobHistory.deleted', 'Job history deleted.'),\n present: t('staff.teamMembers.detail.jobHistory.present', 'Present'),\n unknownDate: t('staff.teamMembers.detail.jobHistory.unknownDate', 'Unknown date'),\n fields: {\n name: t('staff.teamMembers.detail.jobHistory.fields.name', 'Role / title'),\n companyName: t('staff.teamMembers.detail.jobHistory.fields.companyName', 'Company'),\n startDate: t('staff.teamMembers.detail.jobHistory.fields.startDate', 'From'),\n endDate: t('staff.teamMembers.detail.jobHistory.fields.endDate', 'To'),\n description: t('staff.teamMembers.detail.jobHistory.fields.description', 'Description'),\n },\n save: t('staff.teamMembers.detail.jobHistory.save', 'Save job'),\n update: t('staff.teamMembers.detail.jobHistory.update', 'Update job'),\n cancel: t('staff.teamMembers.detail.jobHistory.cancel', 'Cancel'),\n }), [t])\n\n const fields = React.useMemo<CrudField[]>(() => ([\n { id: 'name', label: labels.fields.name, type: 'text', required: true },\n { id: 'companyName', label: labels.fields.companyName, type: 'text' },\n { id: 'startDate', label: labels.fields.startDate, type: 'date', required: true, layout: 'half' },\n { id: 'endDate', label: labels.fields.endDate, type: 'date', layout: 'half' },\n { id: 'description', label: labels.fields.description, type: 'textarea' },\n ]), [labels.fields])\n\n const dateFormatter = React.useMemo(\n () => new Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'short', day: 'numeric' }),\n [],\n )\n\n const loadJobHistory = React.useCallback(async () => {\n if (!memberId) return\n setIsLoading(true)\n setLoadError(null)\n try {\n const params = new URLSearchParams({\n entityId: memberId,\n pageSize: '100',\n sortField: 'startDate',\n sortDir: 'desc',\n })\n const payload = await readApiResultOrThrow<JobHistoryResponse>(\n `/api/staff/job-histories?${params.toString()}`,\n undefined,\n { errorMessage: labels.errorLoad },\n )\n const records = normalizeJobHistoryItems(payload?.items)\n setItems(records)\n } catch (error) {\n const message = error instanceof Error ? error.message : labels.errorLoad\n setLoadError(message)\n } finally {\n setIsLoading(false)\n }\n }, [labels.errorLoad, memberId])\n\n React.useEffect(() => {\n void loadJobHistory()\n }, [loadJobHistory, reloadToken])\n\n const openCreateDialog = React.useCallback(() => {\n if (!memberId) return\n setDialogMode('create')\n setActiveRecord(null)\n setDialogOpen(true)\n }, [memberId])\n\n const openEditDialog = React.useCallback((record: JobHistoryRecord) => {\n setDialogMode('edit')\n setActiveRecord(record)\n setDialogOpen(true)\n }, [])\n\n const closeDialog = React.useCallback(() => {\n setDialogOpen(false)\n setActiveRecord(null)\n }, [])\n\n const handleSubmit = React.useCallback(async (values: JobHistoryFormValues) => {\n if (!memberId) return\n const payload = buildJobHistoryPayload(values)\n if (dialogMode === 'edit' && activeRecord) {\n // Let any error (including the optimistic-lock 409) propagate so the\n // enclosing CrudForm surfaces the unified \"Record changed\" conflict bar\n // via surfaceRecordConflict. Catching it here and routing it to a flash\n // toast would hide the conflict bar (see TC-LOCK-OSS-036).\n await updateCrud('staff/job-histories', { id: activeRecord.id, updatedAt: activeRecord.updatedAt, ...payload }, { errorMessage: labels.errorSave })\n flash(labels.updated, 'success')\n } else {\n await createCrud('staff/job-histories', { entityId: memberId, ...payload }, { errorMessage: labels.errorSave })\n flash(labels.saved, 'success')\n }\n closeDialog()\n setReloadToken((prev) => prev + 1)\n }, [activeRecord, closeDialog, dialogMode, labels.conflict, labels.errorSave, labels.saved, labels.updated, memberId])\n\n const handleDelete = React.useCallback(async (record: JobHistoryRecord) => {\n const confirmed = await confirmDialog({\n title: labels.deleteConfirm,\n variant: 'destructive',\n })\n if (!confirmed) return\n try {\n await deleteCrud('staff/job-histories', {\n id: record.id,\n body: { id: record.id, updatedAt: record.updatedAt },\n errorMessage: labels.errorDelete,\n })\n flash(labels.deleted, 'success')\n setReloadToken((prev) => prev + 1)\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n flash(labels.errorDelete, 'error')\n }\n }, [labels.deleteConfirm, labels.deleted, labels.errorDelete, confirmDialog, t])\n\n const dialogTitle = dialogMode === 'edit' ? labels.edit : labels.add\n\n const initialValues = dialogMode === 'edit' && activeRecord\n ? {\n name: activeRecord.name,\n companyName: activeRecord.companyName ?? '',\n description: activeRecord.description ?? '',\n startDate: toDateInputValue(activeRecord.startDate) ?? '',\n endDate: toDateInputValue(activeRecord.endDate) ?? '',\n }\n : {\n name: '',\n companyName: '',\n description: '',\n startDate: '',\n endDate: '',\n }\n\n const hasItems = items.length > 0\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <h2 className=\"text-lg font-semibold text-foreground\">{labels.title}</h2>\n {hasItems ? (\n <Button type=\"button\" size=\"sm\" onClick={openCreateDialog} disabled={!memberId}>\n <Plus className=\"mr-2 h-4 w-4\" aria-hidden />\n {labels.add}\n </Button>\n ) : null}\n </div>\n\n {isLoading ? (\n <LoadingMessage label={labels.loading} />\n ) : loadError ? (\n <ErrorMessage label={loadError} />\n ) : items.length === 0 ? (\n <TabEmptyState\n title={labels.emptyTitle}\n actionLabel={labels.emptyAction}\n onAction={openCreateDialog}\n disabled={!memberId}\n />\n ) : (\n <div className=\"space-y-3\">\n {items.map((record) => (\n <div key={record.id} className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <div className=\"text-base font-semibold text-foreground\">{record.name}</div>\n <div className=\"text-sm text-muted-foreground\">\n {formatDateRange(record, labels.present, labels.unknownDate, dateFormatter)}\n </div>\n {record.companyName ? (\n <div className=\"text-sm text-foreground\">{record.companyName}</div>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => openEditDialog(record)}>\n {labels.edit}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => handleDelete(record)}>\n {t('staff.teamMembers.actions.delete', 'Delete')}\n </Button>\n </div>\n </div>\n {record.description ? (\n <p className=\"mt-3 text-sm text-muted-foreground\">{record.description}</p>\n ) : null}\n </div>\n ))}\n </div>\n )}\n\n <Dialog open={dialogOpen} onOpenChange={(open) => (open ? setDialogOpen(true) : closeDialog())}>\n <DialogContent className=\"sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>{dialogTitle}</DialogTitle>\n </DialogHeader>\n <CrudForm<JobHistoryFormValues>\n fields={fields}\n initialValues={initialValues}\n optimisticLockUpdatedAt={activeRecord?.updatedAt ?? null}\n onSubmit={handleSubmit}\n submitLabel={dialogMode === 'edit' ? labels.update : labels.save}\n extraActions={(\n <Button type=\"button\" variant=\"ghost\" onClick={closeDialog}>\n {labels.cancel}\n </Button>\n )}\n embedded\n />\n </DialogContent>\n </Dialog>\n {ConfirmDialogElement}\n </div>\n )\n}\n\nfunction normalizeJobHistoryItems(items?: Record<string, unknown>[]): JobHistoryRecord[] {\n if (!Array.isArray(items)) return []\n return items\n .map((item) => {\n if (!item || typeof item !== 'object') return null\n const record = item as Record<string, unknown>\n const rawId = record.id ?? record.job_history_id ?? null\n const id =\n typeof rawId === 'string'\n ? rawId\n : typeof rawId === 'number' || typeof rawId === 'bigint'\n ? String(rawId)\n : null\n if (!id) return null\n const name = typeof record.name === 'string' ? record.name : ''\n return {\n id,\n name,\n companyName: typeof record.company_name === 'string'\n ? record.company_name\n : typeof record.companyName === 'string'\n ? record.companyName\n : null,\n description: typeof record.description === 'string' ? record.description : null,\n startDate: typeof record.start_date === 'string'\n ? record.start_date\n : typeof record.startDate === 'string'\n ? record.startDate\n : null,\n endDate: typeof record.end_date === 'string'\n ? record.end_date\n : typeof record.endDate === 'string'\n ? record.endDate\n : null,\n updatedAt: typeof record.updated_at === 'string'\n ? record.updated_at\n : typeof record.updatedAt === 'string'\n ? record.updatedAt\n : undefined,\n }\n })\n .filter((value): value is JobHistoryRecord => value !== null)\n}\n\nfunction buildJobHistoryPayload(values: JobHistoryFormValues) {\n const payload: Record<string, unknown> = {\n name: values.name?.trim() ?? '',\n companyName: values.companyName?.trim() || null,\n description: values.description?.trim() || null,\n }\n if (values.startDate) payload.startDate = values.startDate\n if (values.endDate) payload.endDate = values.endDate\n return payload\n}\n\nimport { toDateInputValue } from '@open-mercato/shared/lib/date/format'\n\nfunction formatDateRange(\n record: JobHistoryRecord,\n presentLabel: string,\n unknownLabel: string,\n formatter: Intl.DateTimeFormat,\n): string {\n const start = record.startDate ? new Date(record.startDate) : null\n const end = record.endDate ? new Date(record.endDate) : null\n const startLabel = start && !Number.isNaN(start.getTime()) ? formatter.format(start) : unknownLabel\n const endLabel = end && !Number.isNaN(end.getTime()) ? formatter.format(end) : presentLabel\n return `${startLabel} \u2014 ${endLabel}`\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,6 +5,10 @@ const projectColorSchema = z.string().refine(
|
|
|
5
5
|
{ message: "Invalid project color key." }
|
|
6
6
|
);
|
|
7
7
|
const tagsSchema = z.array(z.string().min(1)).optional().default([]);
|
|
8
|
+
const optimisticUpdatedAtSchema = z.string().refine(
|
|
9
|
+
(value) => !Number.isNaN(new Date(value).getTime()),
|
|
10
|
+
{ message: "Invalid datetime" }
|
|
11
|
+
);
|
|
8
12
|
const scopedCreateFields = {
|
|
9
13
|
tenantId: z.string().uuid(),
|
|
10
14
|
organizationId: z.string().uuid()
|
|
@@ -86,7 +90,8 @@ const staffTeamMemberJobHistoryCreateSchema = z.object({
|
|
|
86
90
|
endDate: z.coerce.date().optional().nullable()
|
|
87
91
|
});
|
|
88
92
|
const staffTeamMemberJobHistoryUpdateSchema = z.object({
|
|
89
|
-
id: z.string().uuid()
|
|
93
|
+
id: z.string().uuid(),
|
|
94
|
+
updatedAt: optimisticUpdatedAtSchema.optional()
|
|
90
95
|
}).merge(staffTeamMemberJobHistoryCreateSchema.partial());
|
|
91
96
|
const staffTeamMemberCommentCreateSchema = z.object({
|
|
92
97
|
...scopedCreateFields,
|
|
@@ -264,6 +269,7 @@ const staffMyProjectVisibilityUpdateSchema = z.object({
|
|
|
264
269
|
showInGrid: z.boolean()
|
|
265
270
|
});
|
|
266
271
|
export {
|
|
272
|
+
optimisticUpdatedAtSchema,
|
|
267
273
|
staffLeaveRequestCreateSchema,
|
|
268
274
|
staffLeaveRequestDecisionSchema,
|
|
269
275
|
staffLeaveRequestUpdateSchema,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/staff/data/validators.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { PROJECT_COLOR_KEYS } from '../lib/timesheets-ui/colors'\n\nconst projectColorSchema = z\n .string()\n .refine(\n (value) => (PROJECT_COLOR_KEYS as readonly string[]).includes(value),\n { message: 'Invalid project color key.' },\n )\n\nconst tagsSchema = z.array(z.string().min(1)).optional().default([])\n\nconst scopedCreateFields = {\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n}\n\nconst scopedUpdateFields = {\n id: z.string().uuid(),\n}\n\nexport const staffTeamCreateSchema = z.object({\n ...scopedCreateFields,\n name: z.string().min(1),\n description: z.string().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamUpdateSchema = z.object({\n ...scopedUpdateFields,\n name: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamRoleCreateSchema = z.object({\n ...scopedCreateFields,\n teamId: z.string().uuid().optional().nullable(),\n name: z.string().min(1),\n description: z.string().optional().nullable(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamRoleUpdateSchema = z.object({\n ...scopedUpdateFields,\n teamId: z.string().uuid().optional().nullable(),\n name: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamMemberCreateSchema = z.object({\n ...scopedCreateFields,\n teamId: z.string().uuid().optional().nullable(),\n displayName: z.string().min(1),\n description: z.string().optional().nullable(),\n userId: z.string().uuid().optional().nullable(),\n roleIds: z.array(z.string().uuid()).optional().default([]),\n tags: tagsSchema,\n availabilityRuleSetId: z.string().uuid().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamMemberUpdateSchema = z.object({\n ...scopedUpdateFields,\n teamId: z.string().uuid().optional().nullable(),\n displayName: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n userId: z.string().uuid().optional().nullable(),\n roleIds: z.array(z.string().uuid()).optional(),\n tags: z.array(z.string().min(1)).optional(),\n availabilityRuleSetId: z.string().uuid().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamMemberActivityCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n activityType: z.string().min(1).max(100),\n subject: z.string().max(200).optional(),\n body: z.string().max(8000).optional(),\n occurredAt: z.coerce.date().optional(),\n authorUserId: z.string().uuid().optional(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamMemberActivityUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberActivityCreateSchema.partial())\n\nexport const staffTeamMemberJobHistoryCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n name: z.string().min(1).max(200),\n companyName: z.string().max(200).optional().nullable(),\n description: z.string().max(2000).optional().nullable(),\n startDate: z.coerce.date(),\n endDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTeamMemberJobHistoryUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberJobHistoryCreateSchema.partial())\n\nexport const staffTeamMemberCommentCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n body: z.string().min(1).max(8000),\n authorUserId: z.string().uuid().optional(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamMemberCommentUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberCommentCreateSchema.partial())\n\nexport const staffTeamMemberAddressCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n name: z.string().max(150).optional(),\n purpose: z.string().max(150).optional(),\n companyName: z.string().max(200).optional(),\n addressLine1: z.string().min(1).max(300),\n addressLine2: z.string().max(300).optional(),\n buildingNumber: z.string().max(50).optional(),\n flatNumber: z.string().max(50).optional(),\n city: z.string().max(150).optional(),\n region: z.string().max(150).optional(),\n postalCode: z.string().max(30).optional(),\n country: z.string().max(150).optional(),\n latitude: z.coerce.number().optional(),\n longitude: z.coerce.number().optional(),\n isPrimary: z.boolean().optional(),\n})\n\nexport const staffTeamMemberAddressUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberAddressCreateSchema.partial())\n\nexport const staffTeamMemberTagAssignmentSchema = z.object({\n ...scopedCreateFields,\n memberId: z.string().uuid(),\n tag: z.string().min(1),\n})\n\nconst staffLeaveRequestStatusSchema = z.enum(['pending', 'approved', 'rejected'])\n\nconst validateStaffLeaveRequestDateRange = (\n value: { startDate?: Date; endDate?: Date },\n ctx: z.RefinementCtx,\n) => {\n if (!value.startDate || !value.endDate) return\n if (value.endDate < value.startDate) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'End date must be after start date.',\n path: ['endDate'],\n })\n }\n}\n\nexport const staffLeaveRequestCreateSchema = z\n .object({\n ...scopedCreateFields,\n memberId: z.string().uuid(),\n timezone: z.string().min(1),\n startDate: z.coerce.date(),\n endDate: z.coerce.date(),\n unavailabilityReasonEntryId: z.string().uuid().optional().nullable(),\n unavailabilityReasonValue: z.string().trim().min(1).max(150).optional().nullable(),\n note: z.string().max(2000).optional().nullable(),\n submittedByUserId: z.string().uuid().optional().nullable(),\n })\n .superRefine(validateStaffLeaveRequestDateRange)\n\nexport const staffLeaveRequestUpdateSchema = z\n .object({\n ...scopedUpdateFields,\n timezone: z.string().min(1).optional(),\n memberId: z.string().uuid().optional(),\n startDate: z.coerce.date().optional(),\n endDate: z.coerce.date().optional(),\n unavailabilityReasonEntryId: z.string().uuid().optional().nullable(),\n unavailabilityReasonValue: z.string().trim().min(1).max(150).optional().nullable(),\n note: z.string().max(2000).optional().nullable(),\n })\n .superRefine(validateStaffLeaveRequestDateRange)\n\nexport const staffLeaveRequestDecisionSchema = z.object({\n id: z.string().uuid(),\n decisionComment: z.string().max(2000).optional().nullable(),\n decidedByUserId: z.string().uuid().optional().nullable(),\n})\n\nexport const staffTeamMemberSelfCreateSchema = z.object({\n ...scopedCreateFields,\n displayName: z.string().min(1),\n description: z.string().max(2000).optional().nullable(),\n})\n\nexport type StaffTeamCreateInput = z.infer<typeof staffTeamCreateSchema>\nexport type StaffTeamUpdateInput = z.infer<typeof staffTeamUpdateSchema>\nexport type StaffTeamRoleCreateInput = z.infer<typeof staffTeamRoleCreateSchema>\nexport type StaffTeamRoleUpdateInput = z.infer<typeof staffTeamRoleUpdateSchema>\nexport type StaffTeamMemberCreateInput = z.infer<typeof staffTeamMemberCreateSchema>\nexport type StaffTeamMemberUpdateInput = z.infer<typeof staffTeamMemberUpdateSchema>\nexport type StaffTeamMemberTagAssignmentInput = z.infer<typeof staffTeamMemberTagAssignmentSchema>\nexport type StaffTeamMemberActivityCreateInput = z.infer<typeof staffTeamMemberActivityCreateSchema>\nexport type StaffTeamMemberActivityUpdateInput = z.infer<typeof staffTeamMemberActivityUpdateSchema>\nexport type StaffTeamMemberJobHistoryCreateInput = z.infer<typeof staffTeamMemberJobHistoryCreateSchema>\nexport type StaffTeamMemberJobHistoryUpdateInput = z.infer<typeof staffTeamMemberJobHistoryUpdateSchema>\nexport type StaffTeamMemberCommentCreateInput = z.infer<typeof staffTeamMemberCommentCreateSchema>\nexport type StaffTeamMemberCommentUpdateInput = z.infer<typeof staffTeamMemberCommentUpdateSchema>\nexport type StaffTeamMemberAddressCreateInput = z.infer<typeof staffTeamMemberAddressCreateSchema>\nexport type StaffTeamMemberAddressUpdateInput = z.infer<typeof staffTeamMemberAddressUpdateSchema>\nexport type StaffLeaveRequestStatus = z.infer<typeof staffLeaveRequestStatusSchema>\nexport type StaffLeaveRequestCreateInput = z.infer<typeof staffLeaveRequestCreateSchema>\nexport type StaffLeaveRequestUpdateInput = z.infer<typeof staffLeaveRequestUpdateSchema>\nexport type StaffLeaveRequestDecisionInput = z.infer<typeof staffLeaveRequestDecisionSchema>\nexport type StaffTeamMemberSelfCreateInput = z.infer<typeof staffTeamMemberSelfCreateSchema>\n\n// --- Timesheets validators (Phase 1) ---\n\nconst timeEntrySourceSchema = z.enum(['manual', 'timer', 'kiosk', 'mobile'])\nconst timeProjectStatusSchema = z.enum(['active', 'on_hold', 'completed'])\nconst timeProjectMemberStatusSchema = z.enum(['active', 'inactive'])\nconst timeEntrySegmentTypeSchema = z.enum(['work', 'break'])\nconst projectCodeSchema = z.string().min(1).max(50).regex(/^[a-zA-Z0-9-]+$/)\n\nexport const staffTimeEntryCreateSchema = z.object({\n ...scopedCreateFields,\n staffMemberId: z.string().uuid(),\n date: z.coerce.date(),\n durationMinutes: z.number().int().min(0).max(1440),\n startedAt: z.coerce.date().optional().nullable(),\n endedAt: z.coerce.date().optional().nullable(),\n timeProjectId: z.string().uuid().optional().nullable(),\n customerId: z.string().uuid().optional().nullable(),\n dealId: z.string().uuid().optional().nullable(),\n orderId: z.string().uuid().optional().nullable(),\n notes: z.string().max(2000).optional().nullable(),\n source: timeEntrySourceSchema.optional().default('manual'),\n})\n\nexport const staffTimeEntryUpdateSchema = z.object({\n ...scopedUpdateFields,\n date: z.coerce.date().optional(),\n durationMinutes: z.number().int().min(0).max(1440).optional(),\n timeProjectId: z.string().uuid().optional().nullable(),\n customerId: z.string().uuid().optional().nullable(),\n dealId: z.string().uuid().optional().nullable(),\n orderId: z.string().uuid().optional().nullable(),\n notes: z.string().max(2000).optional().nullable(),\n})\n\nexport const staffTimeEntryBulkItemSchema = z.object({\n id: z.string().uuid().optional().nullable(),\n date: z.coerce.date(),\n timeProjectId: z.string().uuid(),\n durationMinutes: z.number().int().min(0).max(1440),\n notes: z.string().max(2000).optional().nullable(),\n})\n\nexport const staffTimeEntryBulkSaveSchema = z.object({\n entries: z.array(staffTimeEntryBulkItemSchema).min(1).max(200),\n})\n\nexport const staffTimeEntrySegmentCreateSchema = z.object({\n ...scopedCreateFields,\n timeEntryId: z.string().uuid(),\n startedAt: z.coerce.date(),\n endedAt: z.coerce.date().optional().nullable(),\n segmentType: timeEntrySegmentTypeSchema.optional().default('work'),\n})\n\nexport const staffTimeEntrySegmentUpdateSchema = z.object({\n ...scopedUpdateFields,\n startedAt: z.coerce.date().optional(),\n endedAt: z.coerce.date().optional().nullable(),\n segmentType: timeEntrySegmentTypeSchema.optional(),\n})\n\nexport const staffTimeProjectCreateSchema = z.object({\n ...scopedCreateFields,\n name: z.string().min(1).max(255),\n customerId: z.string().uuid().optional().nullable(),\n code: projectCodeSchema,\n description: z.string().max(2000).optional().nullable(),\n projectType: z.string().max(100).optional().nullable(),\n color: projectColorSchema.optional().nullable(),\n status: timeProjectStatusSchema.optional().default('active'),\n ownerUserId: z.string().uuid().optional().nullable(),\n costCenter: z.string().max(100).optional().nullable(),\n startDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTimeProjectUpdateSchema = z.object({\n ...scopedUpdateFields,\n name: z.string().min(1).max(255).optional(),\n customerId: z.string().uuid().optional().nullable(),\n code: projectCodeSchema.optional(),\n description: z.string().max(2000).optional().nullable(),\n projectType: z.string().max(100).optional().nullable(),\n color: projectColorSchema.optional().nullable(),\n status: timeProjectStatusSchema.optional(),\n ownerUserId: z.string().uuid().optional().nullable(),\n costCenter: z.string().max(100).optional().nullable(),\n startDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTimeProjectMemberAssignSchema = z.object({\n ...scopedCreateFields,\n timeProjectId: z.string().uuid(),\n staffMemberId: z.string().uuid(),\n role: z.string().max(100).optional().nullable(),\n status: timeProjectMemberStatusSchema.optional().default('active'),\n assignedStartDate: z.coerce.date(),\n assignedEndDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTimeProjectMemberUpdateSchema = z.object({\n ...scopedUpdateFields,\n role: z.string().max(100).optional().nullable(),\n status: timeProjectMemberStatusSchema.optional(),\n assignedEndDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffMyProjectVisibilityUpdateSchema = z.object({\n showInGrid: z.boolean(),\n})\n\nexport type StaffTimeEntryCreateInput = z.infer<typeof staffTimeEntryCreateSchema>\nexport type StaffTimeEntryUpdateInput = z.infer<typeof staffTimeEntryUpdateSchema>\nexport type StaffTimeEntryBulkSaveInput = z.infer<typeof staffTimeEntryBulkSaveSchema>\nexport type StaffTimeEntrySegmentCreateInput = z.infer<typeof staffTimeEntrySegmentCreateSchema>\nexport type StaffTimeEntrySegmentUpdateInput = z.infer<typeof staffTimeEntrySegmentUpdateSchema>\nexport type StaffTimeProjectCreateInput = z.infer<typeof staffTimeProjectCreateSchema>\nexport type StaffTimeProjectUpdateInput = z.infer<typeof staffTimeProjectUpdateSchema>\nexport type StaffTimeProjectMemberAssignInput = z.infer<typeof staffTimeProjectMemberAssignSchema>\nexport type StaffTimeProjectMemberUpdateInput = z.infer<typeof staffTimeProjectMemberUpdateSchema>\nexport type StaffMyProjectVisibilityUpdateInput = z.infer<typeof staffMyProjectVisibilityUpdateSchema>\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { PROJECT_COLOR_KEYS } from '../lib/timesheets-ui/colors'\n\nconst projectColorSchema = z\n .string()\n .refine(\n (value) => (PROJECT_COLOR_KEYS as readonly string[]).includes(value),\n { message: 'Invalid project color key.' },\n )\n\nconst tagsSchema = z.array(z.string().min(1)).optional().default([])\n\nexport const optimisticUpdatedAtSchema = z.string().refine(\n (value) => !Number.isNaN(new Date(value).getTime()),\n { message: 'Invalid datetime' },\n)\n\nconst scopedCreateFields = {\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n}\n\nconst scopedUpdateFields = {\n id: z.string().uuid(),\n}\n\nexport const staffTeamCreateSchema = z.object({\n ...scopedCreateFields,\n name: z.string().min(1),\n description: z.string().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamUpdateSchema = z.object({\n ...scopedUpdateFields,\n name: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamRoleCreateSchema = z.object({\n ...scopedCreateFields,\n teamId: z.string().uuid().optional().nullable(),\n name: z.string().min(1),\n description: z.string().optional().nullable(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamRoleUpdateSchema = z.object({\n ...scopedUpdateFields,\n teamId: z.string().uuid().optional().nullable(),\n name: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamMemberCreateSchema = z.object({\n ...scopedCreateFields,\n teamId: z.string().uuid().optional().nullable(),\n displayName: z.string().min(1),\n description: z.string().optional().nullable(),\n userId: z.string().uuid().optional().nullable(),\n roleIds: z.array(z.string().uuid()).optional().default([]),\n tags: tagsSchema,\n availabilityRuleSetId: z.string().uuid().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamMemberUpdateSchema = z.object({\n ...scopedUpdateFields,\n teamId: z.string().uuid().optional().nullable(),\n displayName: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n userId: z.string().uuid().optional().nullable(),\n roleIds: z.array(z.string().uuid()).optional(),\n tags: z.array(z.string().min(1)).optional(),\n availabilityRuleSetId: z.string().uuid().optional().nullable(),\n isActive: z.boolean().optional(),\n})\n\nexport const staffTeamMemberActivityCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n activityType: z.string().min(1).max(100),\n subject: z.string().max(200).optional(),\n body: z.string().max(8000).optional(),\n occurredAt: z.coerce.date().optional(),\n authorUserId: z.string().uuid().optional(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamMemberActivityUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberActivityCreateSchema.partial())\n\nexport const staffTeamMemberJobHistoryCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n name: z.string().min(1).max(200),\n companyName: z.string().max(200).optional().nullable(),\n description: z.string().max(2000).optional().nullable(),\n startDate: z.coerce.date(),\n endDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTeamMemberJobHistoryUpdateSchema = z\n .object({\n id: z.string().uuid(),\n updatedAt: optimisticUpdatedAtSchema.optional(),\n })\n .merge(staffTeamMemberJobHistoryCreateSchema.partial())\n\nexport const staffTeamMemberCommentCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n body: z.string().min(1).max(8000),\n authorUserId: z.string().uuid().optional(),\n appearanceIcon: z.string().trim().max(100).optional().nullable(),\n appearanceColor: z\n .string()\n .trim()\n .regex(/^#([0-9a-fA-F]{6})$/)\n .optional()\n .nullable(),\n})\n\nexport const staffTeamMemberCommentUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberCommentCreateSchema.partial())\n\nexport const staffTeamMemberAddressCreateSchema = z.object({\n ...scopedCreateFields,\n entityId: z.string().uuid(),\n name: z.string().max(150).optional(),\n purpose: z.string().max(150).optional(),\n companyName: z.string().max(200).optional(),\n addressLine1: z.string().min(1).max(300),\n addressLine2: z.string().max(300).optional(),\n buildingNumber: z.string().max(50).optional(),\n flatNumber: z.string().max(50).optional(),\n city: z.string().max(150).optional(),\n region: z.string().max(150).optional(),\n postalCode: z.string().max(30).optional(),\n country: z.string().max(150).optional(),\n latitude: z.coerce.number().optional(),\n longitude: z.coerce.number().optional(),\n isPrimary: z.boolean().optional(),\n})\n\nexport const staffTeamMemberAddressUpdateSchema = z\n .object({\n id: z.string().uuid(),\n })\n .merge(staffTeamMemberAddressCreateSchema.partial())\n\nexport const staffTeamMemberTagAssignmentSchema = z.object({\n ...scopedCreateFields,\n memberId: z.string().uuid(),\n tag: z.string().min(1),\n})\n\nconst staffLeaveRequestStatusSchema = z.enum(['pending', 'approved', 'rejected'])\n\nconst validateStaffLeaveRequestDateRange = (\n value: { startDate?: Date; endDate?: Date },\n ctx: z.RefinementCtx,\n) => {\n if (!value.startDate || !value.endDate) return\n if (value.endDate < value.startDate) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'End date must be after start date.',\n path: ['endDate'],\n })\n }\n}\n\nexport const staffLeaveRequestCreateSchema = z\n .object({\n ...scopedCreateFields,\n memberId: z.string().uuid(),\n timezone: z.string().min(1),\n startDate: z.coerce.date(),\n endDate: z.coerce.date(),\n unavailabilityReasonEntryId: z.string().uuid().optional().nullable(),\n unavailabilityReasonValue: z.string().trim().min(1).max(150).optional().nullable(),\n note: z.string().max(2000).optional().nullable(),\n submittedByUserId: z.string().uuid().optional().nullable(),\n })\n .superRefine(validateStaffLeaveRequestDateRange)\n\nexport const staffLeaveRequestUpdateSchema = z\n .object({\n ...scopedUpdateFields,\n timezone: z.string().min(1).optional(),\n memberId: z.string().uuid().optional(),\n startDate: z.coerce.date().optional(),\n endDate: z.coerce.date().optional(),\n unavailabilityReasonEntryId: z.string().uuid().optional().nullable(),\n unavailabilityReasonValue: z.string().trim().min(1).max(150).optional().nullable(),\n note: z.string().max(2000).optional().nullable(),\n })\n .superRefine(validateStaffLeaveRequestDateRange)\n\nexport const staffLeaveRequestDecisionSchema = z.object({\n id: z.string().uuid(),\n decisionComment: z.string().max(2000).optional().nullable(),\n decidedByUserId: z.string().uuid().optional().nullable(),\n})\n\nexport const staffTeamMemberSelfCreateSchema = z.object({\n ...scopedCreateFields,\n displayName: z.string().min(1),\n description: z.string().max(2000).optional().nullable(),\n})\n\nexport type StaffTeamCreateInput = z.infer<typeof staffTeamCreateSchema>\nexport type StaffTeamUpdateInput = z.infer<typeof staffTeamUpdateSchema>\nexport type StaffTeamRoleCreateInput = z.infer<typeof staffTeamRoleCreateSchema>\nexport type StaffTeamRoleUpdateInput = z.infer<typeof staffTeamRoleUpdateSchema>\nexport type StaffTeamMemberCreateInput = z.infer<typeof staffTeamMemberCreateSchema>\nexport type StaffTeamMemberUpdateInput = z.infer<typeof staffTeamMemberUpdateSchema>\nexport type StaffTeamMemberTagAssignmentInput = z.infer<typeof staffTeamMemberTagAssignmentSchema>\nexport type StaffTeamMemberActivityCreateInput = z.infer<typeof staffTeamMemberActivityCreateSchema>\nexport type StaffTeamMemberActivityUpdateInput = z.infer<typeof staffTeamMemberActivityUpdateSchema>\nexport type StaffTeamMemberJobHistoryCreateInput = z.infer<typeof staffTeamMemberJobHistoryCreateSchema>\nexport type StaffTeamMemberJobHistoryUpdateInput = z.infer<typeof staffTeamMemberJobHistoryUpdateSchema>\nexport type StaffTeamMemberCommentCreateInput = z.infer<typeof staffTeamMemberCommentCreateSchema>\nexport type StaffTeamMemberCommentUpdateInput = z.infer<typeof staffTeamMemberCommentUpdateSchema>\nexport type StaffTeamMemberAddressCreateInput = z.infer<typeof staffTeamMemberAddressCreateSchema>\nexport type StaffTeamMemberAddressUpdateInput = z.infer<typeof staffTeamMemberAddressUpdateSchema>\nexport type StaffLeaveRequestStatus = z.infer<typeof staffLeaveRequestStatusSchema>\nexport type StaffLeaveRequestCreateInput = z.infer<typeof staffLeaveRequestCreateSchema>\nexport type StaffLeaveRequestUpdateInput = z.infer<typeof staffLeaveRequestUpdateSchema>\nexport type StaffLeaveRequestDecisionInput = z.infer<typeof staffLeaveRequestDecisionSchema>\nexport type StaffTeamMemberSelfCreateInput = z.infer<typeof staffTeamMemberSelfCreateSchema>\n\n// --- Timesheets validators (Phase 1) ---\n\nconst timeEntrySourceSchema = z.enum(['manual', 'timer', 'kiosk', 'mobile'])\nconst timeProjectStatusSchema = z.enum(['active', 'on_hold', 'completed'])\nconst timeProjectMemberStatusSchema = z.enum(['active', 'inactive'])\nconst timeEntrySegmentTypeSchema = z.enum(['work', 'break'])\nconst projectCodeSchema = z.string().min(1).max(50).regex(/^[a-zA-Z0-9-]+$/)\n\nexport const staffTimeEntryCreateSchema = z.object({\n ...scopedCreateFields,\n staffMemberId: z.string().uuid(),\n date: z.coerce.date(),\n durationMinutes: z.number().int().min(0).max(1440),\n startedAt: z.coerce.date().optional().nullable(),\n endedAt: z.coerce.date().optional().nullable(),\n timeProjectId: z.string().uuid().optional().nullable(),\n customerId: z.string().uuid().optional().nullable(),\n dealId: z.string().uuid().optional().nullable(),\n orderId: z.string().uuid().optional().nullable(),\n notes: z.string().max(2000).optional().nullable(),\n source: timeEntrySourceSchema.optional().default('manual'),\n})\n\nexport const staffTimeEntryUpdateSchema = z.object({\n ...scopedUpdateFields,\n date: z.coerce.date().optional(),\n durationMinutes: z.number().int().min(0).max(1440).optional(),\n timeProjectId: z.string().uuid().optional().nullable(),\n customerId: z.string().uuid().optional().nullable(),\n dealId: z.string().uuid().optional().nullable(),\n orderId: z.string().uuid().optional().nullable(),\n notes: z.string().max(2000).optional().nullable(),\n})\n\nexport const staffTimeEntryBulkItemSchema = z.object({\n id: z.string().uuid().optional().nullable(),\n date: z.coerce.date(),\n timeProjectId: z.string().uuid(),\n durationMinutes: z.number().int().min(0).max(1440),\n notes: z.string().max(2000).optional().nullable(),\n})\n\nexport const staffTimeEntryBulkSaveSchema = z.object({\n entries: z.array(staffTimeEntryBulkItemSchema).min(1).max(200),\n})\n\nexport const staffTimeEntrySegmentCreateSchema = z.object({\n ...scopedCreateFields,\n timeEntryId: z.string().uuid(),\n startedAt: z.coerce.date(),\n endedAt: z.coerce.date().optional().nullable(),\n segmentType: timeEntrySegmentTypeSchema.optional().default('work'),\n})\n\nexport const staffTimeEntrySegmentUpdateSchema = z.object({\n ...scopedUpdateFields,\n startedAt: z.coerce.date().optional(),\n endedAt: z.coerce.date().optional().nullable(),\n segmentType: timeEntrySegmentTypeSchema.optional(),\n})\n\nexport const staffTimeProjectCreateSchema = z.object({\n ...scopedCreateFields,\n name: z.string().min(1).max(255),\n customerId: z.string().uuid().optional().nullable(),\n code: projectCodeSchema,\n description: z.string().max(2000).optional().nullable(),\n projectType: z.string().max(100).optional().nullable(),\n color: projectColorSchema.optional().nullable(),\n status: timeProjectStatusSchema.optional().default('active'),\n ownerUserId: z.string().uuid().optional().nullable(),\n costCenter: z.string().max(100).optional().nullable(),\n startDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTimeProjectUpdateSchema = z.object({\n ...scopedUpdateFields,\n name: z.string().min(1).max(255).optional(),\n customerId: z.string().uuid().optional().nullable(),\n code: projectCodeSchema.optional(),\n description: z.string().max(2000).optional().nullable(),\n projectType: z.string().max(100).optional().nullable(),\n color: projectColorSchema.optional().nullable(),\n status: timeProjectStatusSchema.optional(),\n ownerUserId: z.string().uuid().optional().nullable(),\n costCenter: z.string().max(100).optional().nullable(),\n startDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTimeProjectMemberAssignSchema = z.object({\n ...scopedCreateFields,\n timeProjectId: z.string().uuid(),\n staffMemberId: z.string().uuid(),\n role: z.string().max(100).optional().nullable(),\n status: timeProjectMemberStatusSchema.optional().default('active'),\n assignedStartDate: z.coerce.date(),\n assignedEndDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffTimeProjectMemberUpdateSchema = z.object({\n ...scopedUpdateFields,\n role: z.string().max(100).optional().nullable(),\n status: timeProjectMemberStatusSchema.optional(),\n assignedEndDate: z.coerce.date().optional().nullable(),\n})\n\nexport const staffMyProjectVisibilityUpdateSchema = z.object({\n showInGrid: z.boolean(),\n})\n\nexport type StaffTimeEntryCreateInput = z.infer<typeof staffTimeEntryCreateSchema>\nexport type StaffTimeEntryUpdateInput = z.infer<typeof staffTimeEntryUpdateSchema>\nexport type StaffTimeEntryBulkSaveInput = z.infer<typeof staffTimeEntryBulkSaveSchema>\nexport type StaffTimeEntrySegmentCreateInput = z.infer<typeof staffTimeEntrySegmentCreateSchema>\nexport type StaffTimeEntrySegmentUpdateInput = z.infer<typeof staffTimeEntrySegmentUpdateSchema>\nexport type StaffTimeProjectCreateInput = z.infer<typeof staffTimeProjectCreateSchema>\nexport type StaffTimeProjectUpdateInput = z.infer<typeof staffTimeProjectUpdateSchema>\nexport type StaffTimeProjectMemberAssignInput = z.infer<typeof staffTimeProjectMemberAssignSchema>\nexport type StaffTimeProjectMemberUpdateInput = z.infer<typeof staffTimeProjectMemberUpdateSchema>\nexport type StaffMyProjectVisibilityUpdateInput = z.infer<typeof staffMyProjectVisibilityUpdateSchema>\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -12,7 +12,8 @@ function normalizeLeaveRequest(record) {
|
|
|
12
12
|
unavailabilityReasonValue: record.unavailabilityReasonValue ?? record.unavailability_reason_value ?? null,
|
|
13
13
|
note: record.note ?? null,
|
|
14
14
|
decisionComment: record.decisionComment ?? record.decision_comment ?? null,
|
|
15
|
-
decidedAt: record.decidedAt ?? record.decided_at ?? null
|
|
15
|
+
decidedAt: record.decidedAt ?? record.decided_at ?? null,
|
|
16
|
+
updatedAt: record.updatedAt ?? record.updated_at ?? null
|
|
16
17
|
};
|
|
17
18
|
}
|
|
18
19
|
function resolveStatusVariant(status) {
|