@open-mercato/core 0.5.1-develop.2953.6647bb2c43 → 0.5.1-develop.2964.d5ac4a6ebb
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/dist/helpers/integration/salesUi.js +25 -23
- package/dist/helpers/integration/salesUi.js.map +2 -2
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js +24 -24
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +15 -7
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +4 -6
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +26 -26
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/business_rules/components/ActionRow.js +36 -25
- package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
- package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionRow.js +19 -10
- package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
- package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
- package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
- package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
- 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 +4 -6
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/components/AddressEditor.js +24 -7
- package/dist/modules/customers/components/AddressEditor.js.map +2 -2
- package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
- package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -14
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js +16 -12
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
- package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js +18 -13
- package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
- package/dist/modules/entities/components/EncryptionManager.js +23 -19
- package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
- package/dist/modules/feature_toggles/components/formConfig.js +17 -9
- package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
- package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
- package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
- package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
- package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
- package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
- package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +14 -9
- package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
- package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js +14 -6
- package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
- package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
- package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
- package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
- package/package.json +3 -3
- package/src/helpers/integration/salesUi.ts +40 -30
- package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
- package/src/modules/attachments/fields/attachment.tsx +4 -6
- package/src/modules/auth/backend/users/create/page.tsx +16 -20
- package/src/modules/business_rules/components/ActionRow.tsx +51 -32
- package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
- package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
- package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
- package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
- package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
- package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
- package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
- package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
- package/src/modules/customers/components/AddressEditor.tsx +30 -16
- package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
- package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
- package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
- package/src/modules/customers/components/detail/DealForm.tsx +33 -20
- package/src/modules/customers/components/formConfig.tsx +25 -17
- package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
- package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
- package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
- package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
- package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
- package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
- package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
- package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
- package/src/modules/entities/components/EncryptionManager.tsx +49 -33
- package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
- package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
- package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
- package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
- package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
- package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
- package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
- package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
- package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
- package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
- package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
- package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
- package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
- package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
- package/src/modules/workflows/components/StepsEditor.tsx +20 -10
- package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
- package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/sales/components/documents/SalesDocumentForm.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport { createCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryEntrySelect,\n type DictionaryOption,\n type DictionarySelectLabels,\n} from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { Building2, Mail, Plus, Store, UserRound } from 'lucide-react'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport {\n buildCompanyPayload,\n buildPersonPayload,\n createCompanyFormFields,\n createCompanyFormGroups,\n createCompanyFormSchema,\n createPersonFormFields,\n createPersonFormGroups,\n createPersonFormSchema,\n type CompanyFormValues,\n type PersonFormValues,\n} from '@open-mercato/core/modules/customers/components/formConfig'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n formatAddressString,\n type AddressFormatStrategy,\n type AddressValue,\n} from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'\n\ntype DocumentKind = 'quote' | 'order'\n\ntype AddressDraft = AddressEditorDraft\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = { id: string; label: string }\n\ntype AddressOption = {\n id: string\n label: string\n summary: string\n name?: string | null\n isPrimary: boolean\n value: AddressValue\n}\n\nexport type SalesDocumentFormValues = {\n documentKind: DocumentKind\n documentNumber?: string\n currencyCode: string\n channelId?: string | null\n customerEntityId?: string | null\n customerEmail?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n useCustomShipping?: boolean\n useCustomBilling?: boolean\n sameAsShipping?: boolean\n saveShippingAddress?: boolean\n saveBillingAddress?: boolean\n shippingAddressDraft?: AddressDraft\n billingAddressDraft?: AddressDraft\n comments?: string | null\n} & Record<string, unknown>\n\ntype InboxPreFill = {\n customerEntityId?: string\n currencyCode?: string\n channelId?: string\n comments?: string\n lineItems?: Record<string, unknown>[]\n}\n\ntype SalesDocumentFormProps = {\n onCreated: (params: { id: string; kind: DocumentKind }) => void\n isSubmitting?: boolean\n initialKind?: DocumentKind\n inboxPreFill?: InboxPreFill\n}\n\ntype Translator = (key: string, fallback?: string, params?: Record<string, string | number>) => string\n\ntype QuickCreatePayload = {\n id: string\n kind: 'person' | 'company'\n email?: string | null\n label: string\n subtitle?: string | null\n}\n\ntype CustomerQuickCreateProps = {\n t: Translator\n onCreated: (payload: QuickCreatePayload) => void\n}\n\nfunction CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [dialog, setDialog] = React.useState<'person' | 'company' | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n const { organizationId } = useOrganizationScopeDetail()\n const personSchema = React.useMemo(() => createPersonFormSchema(), [])\n const personFields = React.useMemo(() => createPersonFormFields(t), [t])\n const personGroups = React.useMemo(() => createPersonFormGroups(t), [t])\n const companySchema = React.useMemo(() => createCompanyFormSchema(), [])\n const companyFields = React.useMemo(() => createCompanyFormFields(t), [t])\n const companyGroups = React.useMemo(() => createCompanyFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!menuOpen) return\n const handleClick = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setMenuOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setFormError(null)\n setSaving(false)\n }, [])\n\n const handlePersonCreate = React.useCallback(\n async (values: PersonFormValues) => {\n setSaving(true)\n try {\n const payload = buildPersonPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.people.form.displayName.placeholder', 'New person')\n flash(t('sales.documents.form.customer.quick.personSuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'person',\n email: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n label: displayName,\n subtitle: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.person', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const handleCompanyCreate = React.useCallback(\n async (values: CompanyFormValues) => {\n setSaving(true)\n try {\n const payload = buildCompanyPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/companies', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.companies.form.displayName.placeholder', 'New company')\n const email = typeof values.primaryEmail === 'string' ? values.primaryEmail : null\n const domain =\n typeof values.domain === 'string' && values.domain.trim().length ? values.domain.trim() : null\n flash(t('sales.documents.form.customer.quick.companySuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'company',\n email,\n label: displayName,\n subtitle: domain || email || null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.company', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const renderMenu = () => (\n <div className=\"absolute right-0 z-dropdown mt-2 w-48 rounded border bg-popover p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('person')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <UserRound className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addPerson', 'Create person')}\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('company')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addCompany', 'Create company')}\n </button>\n </div>\n )\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"gap-2\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-expanded={menuOpen}\n >\n <Plus className=\"h-4 w-4\" />\n {t('sales.documents.form.customer.create', 'Create customer')}\n </Button>\n {menuOpen ? renderMenu() : null}\n\n <Dialog open={dialog === 'person'} onOpenChange={(open) => (open ? setDialog('person') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addPerson', 'Create person')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a person without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<PersonFormValues>\n embedded\n fields={personFields}\n groups={personGroups}\n schema={personSchema}\n initialValues={{ addresses: [] as PersonFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handlePersonCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog === 'company'} onOpenChange={(open) => (open ? setDialog('company') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addCompany', 'Create company')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a company without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<CompanyFormValues>\n embedded\n fields={companyFields}\n groups={companyGroups}\n schema={companySchema}\n initialValues={{ addresses: [] as CompanyFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handleCompanyCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction normalizeAddressDraft(draft?: AddressDraft | null): Record<string, unknown> | null {\n if (!draft) return null\n const normalized: Record<string, unknown> = {}\n const assign = (key: keyof AddressDraft, target: string) => {\n const value = draft[key]\n if (typeof value === 'string' && value.trim().length) normalized[target] = value.trim()\n if (typeof value === 'boolean') normalized[target] = value\n }\n assign('name', 'name')\n assign('purpose', 'purpose')\n assign('companyName', 'companyName')\n assign('addressLine1', 'addressLine1')\n assign('addressLine2', 'addressLine2')\n assign('buildingNumber', 'buildingNumber')\n assign('flatNumber', 'flatNumber')\n assign('city', 'city')\n assign('region', 'region')\n assign('postalCode', 'postalCode')\n assign('country', 'country')\n assign('isPrimary', 'isPrimary')\n return Object.keys(normalized).length ? normalized : null\n}\n\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const [customers, setCustomers] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [channels, setChannels] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<AddressOption[]>([])\n const [addressesLoading, setAddressesLoading] = React.useState(false)\n const [addressesError, setAddressesError] = React.useState<string | null>(null)\n const [addressFormat, setAddressFormat] = React.useState<AddressFormatStrategy>('line_first')\n const [defaultCurrency, setDefaultCurrency] = React.useState<string>('USD')\n const addressRequestRef = React.useRef(0)\n const addressAbortRef = React.useRef<AbortController | null>(null)\n const addressTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n const currencyLabels = React.useMemo<DictionarySelectLabels>(() => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n addPrompt: t('sales.documents.form.currency.prompt', 'Currency code'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }), [t])\n const { data: currencyDictionary, refetch: refetchCurrencyDictionary } = useCurrencyDictionary()\n\n const fetchCurrencyOptions = React.useCallback(async (): Promise<DictionaryOption[]> => {\n try {\n const source = currencyDictionary ?? (await refetchCurrencyDictionary())\n if (source && Array.isArray(source.entries)) {\n return source.entries.map((entry) => ({\n value: entry.value,\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }\n return []\n } catch (err) {\n console.error('sales.documents.currency', err)\n return []\n }\n }, [currencyDictionary, refetchCurrencyDictionary])\n\n const loadCustomers = React.useCallback(async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomers(merged)\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n }, [t])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customers.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomers((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customers],\n )\n\n const loadChannels = React.useCallback(async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) setChannels(options)\n return options\n } else {\n setChannels([])\n return []\n }\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n setChannels([])\n return []\n } finally {\n setChannelLoading(false)\n }\n }, [])\n\n const loadDefaultCurrency = React.useCallback(async () => {\n try {\n const call = await apiCall<{ items?: Array<{ currency_code?: string | null }> }>(\n '/api/catalog/price-kinds?isPromotion=false&isActive=true&pageSize=1'\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const code = call.result.items[0]?.currency_code\n if (typeof code === 'string' && code.trim().length) {\n setDefaultCurrency(code.trim().toUpperCase())\n }\n }\n } catch (err) {\n console.error('sales.documents.loadDefaultCurrency', err)\n }\n }, [])\n\n const loadAddresses = React.useCallback(async (customerId?: string | null): Promise<AddressOption[]> => {\n addressRequestRef.current += 1\n const requestId = addressRequestRef.current\n\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n\n if (!customerId) {\n setAddressesError(null)\n setAddressOptions([])\n setAddressesLoading(false)\n return []\n }\n setAddressesLoading(true)\n setAddressesError(null)\n setAddressOptions([])\n const controller = new AbortController()\n addressAbortRef.current = controller\n addressTimeoutRef.current = setTimeout(() => controller.abort(), 12_000)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50', entityId: customerId })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/customers/addresses?${params.toString()}`,\n { signal: controller.signal },\n { fallback: { items: [] } }\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items.reduce<AddressOption[]>((acc, item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return acc\n const value: AddressValue = {\n addressLine1: typeof item.address_line1 === 'string' ? item.address_line1 : null,\n addressLine2: typeof item.address_line2 === 'string' ? item.address_line2 : null,\n buildingNumber: typeof item.building_number === 'string' ? item.building_number : null,\n flatNumber: typeof item.flat_number === 'string' ? item.flat_number : null,\n city: typeof item.city === 'string' ? item.city : null,\n region: typeof item.region === 'string' ? item.region : null,\n postalCode: typeof item.postal_code === 'string' ? item.postal_code : null,\n country: typeof item.country === 'string' ? item.country : null,\n companyName: typeof item.company_name === 'string' ? item.company_name : null,\n }\n const name = typeof item.name === 'string' ? item.name.trim() : ''\n const summary = formatAddressString(value, addressFormat)\n const label = name || summary || id\n const isPrimary = item.is_primary === true\n acc.push({ id, label, summary, value, name: name || null, isPrimary })\n return acc\n }, [])\n if (addressRequestRef.current === requestId) {\n setAddressOptions(options)\n }\n return options\n } else {\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } catch (err) {\n if ((err as DOMException)?.name !== 'AbortError') {\n console.error('sales.documents.loadAddresses', err)\n }\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n if ((err as DOMException)?.name !== 'AbortError') {\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } finally {\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current === controller) {\n addressAbortRef.current = null\n }\n if (addressRequestRef.current === requestId) {\n setAddressesLoading(false)\n }\n }\n return []\n }, [addressFormat, t])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n loadChannels().catch(() => {})\n loadDefaultCurrency().catch(() => {})\n }, [loadChannels, loadCustomers, loadDefaultCurrency])\n\n React.useEffect(\n () => () => {\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n },\n [],\n )\n\n React.useEffect(() => {\n setAddressOptions((prev) =>\n prev.map((entry) => {\n const summary = formatAddressString(entry.value, addressFormat)\n const label = (entry.name && entry.name.trim().length ? entry.name : '') || summary || entry.id\n return { ...entry, summary, label }\n }),\n )\n }, [addressFormat])\n\n React.useEffect(() => {\n let cancelled = false\n async function fetchAddressFormat() {\n try {\n const call = await apiCall<{ addressFormat?: string }>('/api/customers/settings/address-format')\n const format = typeof call.result?.addressFormat === 'string' ? call.result.addressFormat : null\n if (!cancelled && (format === 'street_first' || format === 'line_first')) {\n setAddressFormat(format)\n }\n } catch (err) {\n console.error('sales.documents.addressFormat', err)\n } finally {\n }\n }\n fetchAddressFormat().catch(() => {})\n return () => {\n cancelled = true\n }\n }, [])\n\n const resetAddressFormState = React.useCallback(\n (updateValue: (key: string, value: unknown) => void) => {\n updateValue('shippingAddressId', null)\n updateValue('billingAddressId', null)\n updateValue('shippingAddressDraft', undefined)\n updateValue('billingAddressDraft', undefined)\n updateValue('useCustomShipping', false)\n updateValue('useCustomBilling', false)\n updateValue('saveShippingAddress', false)\n updateValue('saveBillingAddress', false)\n updateValue('sameAsShipping', true)\n },\n [],\n )\n\n function DocumentNumberField({ value, setValue, values }: CrudCustomFieldRenderProps) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const kind: DocumentKind = formValues.documentKind === 'order' ? 'order' : 'quote'\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const autoValueRef = React.useRef<string | null>(null)\n const lastKindRef = React.useRef<DocumentKind | null>(null)\n\n const requestNumber = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const call = await apiCall<{ number?: string; error?: string }>('/api/sales/document-numbers', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n const nextNumber = typeof call.result?.number === 'string' ? call.result.number : null\n if (call.ok && nextNumber) {\n autoValueRef.current = nextNumber\n lastKindRef.current = kind\n setValue(nextNumber)\n } else {\n setError(call.result?.error || t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n }\n } catch (err) {\n console.error('sales.documents.generateNumber', err)\n setError(t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n } finally {\n setLoading(false)\n }\n }, [kind, setValue, t])\n\n React.useEffect(() => {\n const current = typeof value === 'string' ? value.trim() : ''\n if (!current.length && !lastKindRef.current) {\n void requestNumber()\n } else {\n lastKindRef.current = kind\n }\n }, [kind, requestNumber, value])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex w-full flex-col gap-2 md:flex-row md:items-center md:gap-3\">\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n disabled={loading}\n spellCheck={false}\n className=\"w-full md:flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" onClick={requestNumber} disabled={loading}>\n {loading\n ? t('sales.documents.form.numberLoading', 'Generating\u2026')\n : t('sales.documents.form.numberRefresh', 'Generate')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.form.numberHintOrder', 'Format applies to orders and uses the configured counter.')\n : t('sales.documents.form.numberHintQuote', 'Format applies to quotes and uses the configured counter.')}\n </p>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n }\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'documentKind',\n label: '',\n type: 'custom',\n required: false,\n component: ({ value, setValue }) => {\n const current = value === 'order' ? 'order' : 'quote'\n const label = t('sales.documents.form.kind', 'Document type')\n return (\n <div className=\"space-y-2 pt-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">{label}</div>\n <div className=\"inline-flex rounded-lg border bg-background p-1 shadow-sm\">\n {(['quote', 'order'] as DocumentKind[]).map((kind) => (\n <Button\n key={kind}\n type=\"button\"\n variant={current === kind ? 'default' : 'ghost'}\n onClick={() => setValue(kind)}\n >\n {t(`sales.documents.form.kind.${kind}`, kind.charAt(0).toUpperCase() + kind.slice(1))}\n </Button>\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'sales.documents.form.kind.hint',\n \"Please select which kind of sales document you want to create. When creating Quotes - it's kind of Shopping cart or Request for negotiation and could be converted to regular order later\",\n )}\n </p>\n </div>\n )\n },\n },\n {\n id: 'documentNumber',\n label: t('sales.documents.form.number', 'Document number'),\n type: 'custom',\n required: true,\n component: DocumentNumberField,\n },\n {\n id: 'currencyCode',\n label: t('sales.documents.form.currency', 'Currency'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? '')}\n fetchOptions={fetchCurrencyOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={currencyLabels}\n />\n ),\n },\n {\n id: 'channelId',\n label: t('sales.documents.form.channel', 'Sales channel'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n fetchItems={async (query) => {\n const options = await loadChannels(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'shippingAddressSection',\n label: '',\n type: 'custom',\n component: ({ values, setFormValue }) => {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomShipping === true\n const selectedId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : ''\n const draft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const customerId = typeof formValues.customerEntityId === 'string' ? formValues.customerEntityId : null\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.shipping.title', 'Shipping address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {customerRequired\n ? t('sales.documents.form.address.customerRequired', 'Select customer first or define custom address')\n : t('sales.documents.form.shipping.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomShipping', checked)}\n />\n <span>{t('sales.documents.form.shipping.custom', 'Define new address')}</span>\n </label>\n </div>\n {!useCustom ? (\n <select\n className=\"w-full rounded border px-2 py-2 text-sm\"\n value={selectedId}\n onChange={(evt) => updateValue('shippingAddressId', evt.target.value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <option value=\"\">\n {addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')}\n </option>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <option key={addr.id} value={addr.id}>{optionLabel}</option>\n )\n })}\n </select>\n ) : null}\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('shippingAddressDraft', next)}\n hidePrimaryToggle\n />\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Switch\n checked={formValues.saveShippingAddress === true}\n onCheckedChange={(checked) => updateValue('saveShippingAddress', checked)}\n />\n {t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n </label>\n </div>\n ) : null}\n {addressesError && customerId ? (\n <div className=\"flex items-start justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n <span className=\"flex-1\">{addressesError}</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => loadAddresses(customerId)}\n disabled={addressesLoading}\n className=\"shrink-0\"\n >\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n </div>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'billingAddressSection',\n label: '',\n type: 'custom',\n component: function BillingAddressSectionField({ values, setFormValue }) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomBilling === true\n const selectedId = typeof formValues.billingAddressId === 'string' ? formValues.billingAddressId : ''\n const draft = (formValues.billingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const sameAsShipping = formValues.sameAsShipping !== false\n const shippingId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : null\n const shippingDraft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const shippingDraftKey = JSON.stringify(shippingDraft)\n const billingDraftKey = JSON.stringify(draft)\n const useCustomShipping = formValues.useCustomShipping === true\n\n React.useEffect(() => {\n if (!sameAsShipping) return\n if ((formValues.billingAddressId ?? null) !== shippingId) {\n updateValue('billingAddressId', shippingId)\n }\n if (useCustomShipping !== (formValues.useCustomBilling === true)) {\n updateValue('useCustomBilling', useCustomShipping)\n }\n if (useCustomShipping && shippingDraftKey !== billingDraftKey) {\n updateValue('billingAddressDraft', shippingDraft)\n }\n }, [\n billingDraftKey,\n sameAsShipping,\n updateValue,\n shippingDraft,\n shippingDraftKey,\n shippingId,\n useCustomShipping,\n formValues.billingAddressId,\n formValues.useCustomBilling,\n ])\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.billing.title', 'Billing address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {sameAsShipping\n ? t('sales.documents.form.address.sameAsShippingHint', 'Billing will mirror the shipping address. Uncheck to edit.')\n : t('sales.documents.form.billing.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={sameAsShipping}\n onCheckedChange={(checked) => {\n updateValue('sameAsShipping', checked)\n if (checked) {\n updateValue('useCustomBilling', useCustomShipping)\n updateValue('billingAddressId', shippingId)\n updateValue('billingAddressDraft', shippingDraft)\n }\n }}\n />\n <span>{t('sales.documents.form.address.sameAsShipping', 'Same as shipping')}</span>\n </label>\n </div>\n\n {!sameAsShipping ? (\n <>\n {!useCustom ? (\n <select\n className=\"w-full rounded border px-2 py-2 text-sm\"\n value={selectedId}\n onChange={(evt) => updateValue('billingAddressId', evt.target.value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <option value=\"\">\n {addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')}\n </option>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <option key={addr.id} value={addr.id}>{optionLabel}</option>\n )\n })}\n </select>\n ) : null}\n\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomBilling', checked)}\n disabled={false}\n />\n <span>{t('sales.documents.form.shipping.custom', 'Define new address')}</span>\n </label>\n\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('billingAddressDraft', next)}\n hidePrimaryToggle\n />\n <label className=\"col-span-2 flex items-center gap-2 text-sm\">\n <Switch\n checked={formValues.saveBillingAddress === true}\n onCheckedChange={(checked) => updateValue('saveBillingAddress', checked)}\n />\n {t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n </label>\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'infoNote',\n label: '',\n type: 'custom',\n component: () => (\n <div className=\"rounded-lg border bg-muted/50 p-3 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </div>\n ),\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n currencyLabels,\n fetchCurrencyOptions,\n loadAddresses,\n loadChannels,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'docType', title: '', column: 1, fields: ['documentKind', 'documentNumber'] },\n {\n id: 'customer',\n title: '',\n column: 1,\n fields: [],\n component: function CustomerGroupComponent({ values, setValue }) {\n const emailValue = typeof values.customerEmail === 'string' ? values.customerEmail : ''\n const { duplicate, checking } = useEmailDuplicateCheck(emailValue, {\n disabled: false,\n debounceMs: 400,\n matchMode: 'prefix',\n })\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-3\">\n <LookupSelect\n value={typeof values.customerEntityId === 'string' ? values.customerEntityId : null}\n onChange={(next) => {\n if (next !== values.customerEntityId) {\n resetAddressFormState(setValue)\n }\n setValue('customerEntityId', next)\n loadAddresses(next).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (next) {\n const match = customers.find((entry) => entry.id === next)\n const possibleEmail =\n typeof match?.primaryEmail === 'string' && match.primaryEmail.length\n ? match.primaryEmail\n : null\n if (possibleEmail) {\n setValue('customerEmail', possibleEmail)\n } else {\n fetchCustomerEmail(next, match?.kind)\n .then((email) => {\n if (email) setValue('customerEmail', email)\n })\n .catch(() => {})\n }\n }\n }}\n fetchItems={async (query) => {\n const options = await loadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n actionSlot={\n <CustomerQuickCreate\n t={t}\n onCreated={({ id, email, label, kind, subtitle }) => {\n // Seed the search box with the new customer's display name so it renders immediately\n customerQuerySetter.current?.(label)\n setCustomers((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: subtitle ?? undefined,\n kind,\n primaryEmail: email ?? null,\n }\n return [next, ...prev]\n })\n setValue('customerEntityId', id)\n resetAddressFormState(setValue)\n loadAddresses(id).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (email && !values.customerEmail) {\n setValue('customerEmail', email)\n }\n }}\n />\n }\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) => t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })}\n />\n </div>\n <div className=\"space-y-2\">\n <div className=\"relative\">\n <Mail className=\"pointer-events-none absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <input\n type=\"email\"\n className=\"w-full rounded border pl-8 pr-2 py-2 text-sm\"\n value={emailValue}\n onChange={(event) => setValue('customerEmail', event.target.value)}\n placeholder={t('sales.documents.form.email.placeholder', 'Email used for the document')}\n spellCheck={false}\n />\n </div>\n {duplicate ? (\n <div className=\"flex items-center justify-between rounded border bg-muted px-3 py-2 text-xs text-muted-foreground\">\n <span>\n {t('customers.people.form.emailDuplicateNotice', undefined, { name: duplicate.displayName })}\n </span>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className=\"px-4\"\n type=\"button\"\n disabled={values.customerEntityId === duplicate.id}\n aria-disabled={values.customerEntityId === duplicate.id}\n onClick={() => {\n setValue('customerEntityId', duplicate.id)\n resetAddressFormState(setValue)\n loadAddresses(duplicate.id)\n }}\n >\n {values.customerEntityId === duplicate.id\n ? t('sales.documents.form.email.alreadySelected', 'Selected customer')\n : t('sales.documents.form.email.selectCustomer', 'Select customer')}\n </Button>\n </div>\n ) : null}\n {!duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.form.emailChecking')}</p>\n ) : null}\n </div>\n </div>\n )\n },\n },\n { id: 'channels-comments', title: '', column: 1, fields: ['channelId', 'comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'shipping', title: '', column: 2, fields: ['shippingAddressSection'] },\n { id: 'billing', title: '', column: 2, fields: ['billingAddressSection'] },\n { id: 'custom', title: t('sales.documents.form.customFields', 'Custom fields'), column: 2, kind: 'customFields' },\n ], [\n customers,\n fetchCustomerEmail,\n loadAddresses,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const initialValues = React.useMemo<Partial<SalesDocumentFormValues>>(\n () => ({\n documentKind: initialKind === 'order' ? 'order' : 'quote',\n documentNumber: '',\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n channelId: inboxPreFill?.channelId || undefined,\n customerEntityId: inboxPreFill?.customerEntityId || undefined,\n comments: inboxPreFill?.comments || undefined,\n useCustomShipping: false,\n useCustomBilling: false,\n sameAsShipping: true,\n }),\n [initialKind, inboxPreFill, defaultCurrency]\n )\n\n // When inboxPreFill provides a customer, load their addresses on mount\n React.useEffect(() => {\n if (inboxPreFill?.customerEntityId) {\n loadAddresses(inboxPreFill.customerEntityId)\n }\n }, [inboxPreFill?.customerEntityId, loadAddresses])\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const safeValues = values ?? {}\n const customFields = collectCustomFieldValues(safeValues)\n const base = Object.fromEntries(\n Object.entries(safeValues).filter(([key]) => !key.startsWith('cf_') && !key.startsWith('cf:'))\n ) as SalesDocumentFormValues\n const documentKind: DocumentKind = base.documentKind === 'order' ? 'order' : 'quote'\n const payload: Record<string, unknown> = {\n currencyCode: typeof base.currencyCode === 'string' && base.currencyCode.trim().length\n ? base.currencyCode.trim().toUpperCase()\n : undefined,\n customerEntityId: base.customerEntityId || undefined,\n comments: base.comments ?? undefined,\n metadata: base.customerEmail ? { customerEmail: base.customerEmail } : undefined,\n }\n payload.channelId = base.channelId || undefined\n const documentNumber = typeof base.documentNumber === 'string' ? base.documentNumber.trim() : ''\n if (!documentNumber) {\n throw createCrudFormError(t('sales.documents.form.errors.numberRequired', 'Document number is required.'))\n }\n if (documentKind === 'order') {\n payload.orderNumber = documentNumber\n } else {\n payload.quoteNumber = documentNumber\n }\n const shippingSnapshot = base.useCustomShipping ? normalizeAddressDraft(base.shippingAddressDraft) : null\n let billingSnapshot = base.useCustomBilling ? normalizeAddressDraft(base.billingAddressDraft) : null\n const sameAsShipping = base.sameAsShipping !== false\n if (sameAsShipping) {\n if (shippingSnapshot) {\n billingSnapshot = shippingSnapshot\n } else if (!base.useCustomShipping) {\n payload.billingAddressId = base.shippingAddressId || undefined\n }\n }\n if (shippingSnapshot) {\n payload.shippingAddressSnapshot = shippingSnapshot\n payload.shippingAddressId = undefined\n }\n if (billingSnapshot) {\n payload.billingAddressSnapshot = billingSnapshot\n payload.billingAddressId = undefined\n }\n if (!base.useCustomShipping) payload.shippingAddressId = base.shippingAddressId || undefined\n if (!base.useCustomBilling && !sameAsShipping) payload.billingAddressId = base.billingAddressId || undefined\n\n try {\n let shippingId = payload.shippingAddressId as string | undefined\n let billingId = payload.billingAddressId as string | undefined\n if (base.customerEntityId && shippingSnapshot && base.saveShippingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: shippingSnapshot.addressLine1 ?? shippingSnapshot.name ?? 'Address',\n name: shippingSnapshot.name ?? undefined,\n addressLine2: shippingSnapshot.addressLine2 ?? undefined,\n buildingNumber: shippingSnapshot.buildingNumber ?? undefined,\n flatNumber: shippingSnapshot.flatNumber ?? undefined,\n city: shippingSnapshot.city ?? undefined,\n region: shippingSnapshot.region ?? undefined,\n postalCode: shippingSnapshot.postalCode ?? undefined,\n country: shippingSnapshot.country ?? undefined,\n purpose: shippingSnapshot.purpose ?? undefined,\n isPrimary: shippingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) shippingId = res.result.id\n }\n if (base.customerEntityId && billingSnapshot && base.saveBillingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: billingSnapshot.addressLine1 ?? billingSnapshot.name ?? 'Address',\n name: billingSnapshot.name ?? undefined,\n addressLine2: billingSnapshot.addressLine2 ?? undefined,\n buildingNumber: billingSnapshot.buildingNumber ?? undefined,\n flatNumber: billingSnapshot.flatNumber ?? undefined,\n city: billingSnapshot.city ?? undefined,\n region: billingSnapshot.region ?? undefined,\n postalCode: billingSnapshot.postalCode ?? undefined,\n country: billingSnapshot.country ?? undefined,\n purpose: billingSnapshot.purpose ?? undefined,\n isPrimary: billingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) billingId = res.result.id\n }\n if (!base.useCustomShipping && shippingId) payload.shippingAddressId = shippingId\n if (!base.useCustomBilling && !sameAsShipping && billingId) payload.billingAddressId = billingId\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const endpoint = documentKind === 'order' ? 'sales/orders' : 'sales/quotes'\n const { result } = await createCrud<{ id?: string; orderId?: string; quoteId?: string }>(endpoint, payload, {\n errorMessage: t('sales.documents.form.errors.submit', 'Failed to create document.'),\n })\n const newId =\n (result && typeof result.id === 'string' && result.id) ||\n (result && typeof result.orderId === 'string' && result.orderId) ||\n (result && typeof result.quoteId === 'string' && result.quoteId) ||\n null\n if (!newId) {\n throw createCrudFormError(t('sales.documents.form.errors.id', 'Document id missing after create.'))\n }\n flash(t('sales.documents.form.success', 'Sales document created.'), 'success')\n onCreated({ id: newId, kind: documentKind })\n } catch (err) {\n if (err instanceof Error) throw err\n throw createCrudFormError(t('sales.documents.form.errors.submit', 'Failed to create document.'))\n }\n },\n [onCreated, t],\n )\n\n const cancelHref = initialKind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n\n return (\n <CrudForm<SalesDocumentFormValues>\n title={t('sales.documents.form.title', 'Create sales document')}\n backHref={cancelHref}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n entityIds={[E.sales.sales_quote, E.sales.sales_order]}\n submitLabel={t('sales.documents.form.submit', 'Create')}\n cancelHref={cancelHref}\n onSubmit={handleSubmit}\n />\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { CrudForm, type CrudCustomFieldRenderProps, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'\nimport { LookupSelect, type LookupSelectItem } from '@open-mercato/ui/backend/inputs'\nimport { Input } from '@open-mercato/ui/primitives/input'\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 { SwitchField } from '@open-mercato/ui/primitives/switch-field'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@open-mercato/ui/primitives/dialog'\nimport { createCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n DictionaryEntrySelect,\n type DictionaryOption,\n type DictionarySelectLabels,\n} from '@open-mercato/core/modules/dictionaries/components/DictionaryEntrySelect'\nimport { Building2, Mail, Plus, Store, UserRound } from 'lucide-react'\nimport { useEmailDuplicateCheck } from '@open-mercato/core/modules/customers/backend/hooks/useEmailDuplicateCheck'\nimport { useCurrencyDictionary } from '@open-mercato/core/modules/customers/components/detail/hooks/useCurrencyDictionary'\nimport {\n buildCompanyPayload,\n buildPersonPayload,\n createCompanyFormFields,\n createCompanyFormGroups,\n createCompanyFormSchema,\n createPersonFormFields,\n createPersonFormGroups,\n createPersonFormSchema,\n type CompanyFormValues,\n type PersonFormValues,\n} from '@open-mercato/core/modules/customers/components/formConfig'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport {\n formatAddressString,\n type AddressFormatStrategy,\n type AddressValue,\n} from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { AddressEditor, type AddressEditorDraft } from '@open-mercato/core/modules/customers/components/AddressEditor'\n\ntype DocumentKind = 'quote' | 'order'\n\ntype AddressDraft = AddressEditorDraft\n\ntype CustomerOption = {\n id: string\n label: string\n subtitle?: string | null\n kind: 'person' | 'company'\n primaryEmail?: string | null\n}\n\ntype ChannelOption = { id: string; label: string }\n\ntype AddressOption = {\n id: string\n label: string\n summary: string\n name?: string | null\n isPrimary: boolean\n value: AddressValue\n}\n\nexport type SalesDocumentFormValues = {\n documentKind: DocumentKind\n documentNumber?: string\n currencyCode: string\n channelId?: string | null\n customerEntityId?: string | null\n customerEmail?: string | null\n shippingAddressId?: string | null\n billingAddressId?: string | null\n useCustomShipping?: boolean\n useCustomBilling?: boolean\n sameAsShipping?: boolean\n saveShippingAddress?: boolean\n saveBillingAddress?: boolean\n shippingAddressDraft?: AddressDraft\n billingAddressDraft?: AddressDraft\n comments?: string | null\n} & Record<string, unknown>\n\ntype InboxPreFill = {\n customerEntityId?: string\n currencyCode?: string\n channelId?: string\n comments?: string\n lineItems?: Record<string, unknown>[]\n}\n\ntype SalesDocumentFormProps = {\n onCreated: (params: { id: string; kind: DocumentKind }) => void\n isSubmitting?: boolean\n initialKind?: DocumentKind\n inboxPreFill?: InboxPreFill\n}\n\ntype Translator = (key: string, fallback?: string, params?: Record<string, string | number>) => string\n\ntype QuickCreatePayload = {\n id: string\n kind: 'person' | 'company'\n email?: string | null\n label: string\n subtitle?: string | null\n}\n\ntype CustomerQuickCreateProps = {\n t: Translator\n onCreated: (payload: QuickCreatePayload) => void\n}\n\nfunction CustomerQuickCreate({ t, onCreated }: CustomerQuickCreateProps) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [dialog, setDialog] = React.useState<'person' | 'company' | null>(null)\n const [saving, setSaving] = React.useState(false)\n const [formError, setFormError] = React.useState<string | null>(null)\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n const { organizationId } = useOrganizationScopeDetail()\n const personSchema = React.useMemo(() => createPersonFormSchema(), [])\n const personFields = React.useMemo(() => createPersonFormFields(t), [t])\n const personGroups = React.useMemo(() => createPersonFormGroups(t), [t])\n const companySchema = React.useMemo(() => createCompanyFormSchema(), [])\n const companyFields = React.useMemo(() => createCompanyFormFields(t), [t])\n const companyGroups = React.useMemo(() => createCompanyFormGroups(t), [t])\n\n React.useEffect(() => {\n if (!menuOpen) return\n const handleClick = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setMenuOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [menuOpen])\n\n const closeDialog = React.useCallback(() => {\n setDialog(null)\n setFormError(null)\n setSaving(false)\n }, [])\n\n const handlePersonCreate = React.useCallback(\n async (values: PersonFormValues) => {\n setSaving(true)\n try {\n const payload = buildPersonPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/people', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.people.form.displayName.placeholder', 'New person')\n flash(t('sales.documents.form.customer.quick.personSuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'person',\n email: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n label: displayName,\n subtitle: typeof values.primaryEmail === 'string' ? values.primaryEmail : null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.person', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const handleCompanyCreate = React.useCallback(\n async (values: CompanyFormValues) => {\n setSaving(true)\n try {\n const payload = buildCompanyPayload(values, organizationId)\n const { result } = await createCrud<{ id?: string; entityId?: string }>('customers/companies', payload, {\n errorMessage: t('sales.documents.form.customer.quick.error', 'Failed to create customer.'),\n })\n const id =\n (result && typeof result.entityId === 'string' && result.entityId) ||\n (result && typeof result.id === 'string' && result.id) ||\n null\n if (!id) throw new Error('Missing customer id')\n const displayName =\n typeof values.displayName === 'string' && values.displayName.trim().length\n ? values.displayName.trim()\n : t('customers.companies.form.displayName.placeholder', 'New company')\n const email = typeof values.primaryEmail === 'string' ? values.primaryEmail : null\n const domain =\n typeof values.domain === 'string' && values.domain.trim().length ? values.domain.trim() : null\n flash(t('sales.documents.form.customer.quick.companySuccess', 'Customer created.'), 'success')\n onCreated({\n id,\n kind: 'company',\n email,\n label: displayName,\n subtitle: domain || email || null,\n })\n closeDialog()\n } catch (err) {\n console.error('sales.documents.quickCreate.company', err)\n const message =\n err instanceof Error && err.message\n ? err.message\n : t('sales.documents.form.customer.quick.error', 'Failed to create customer.')\n setFormError(message)\n throw err\n } finally {\n setSaving(false)\n }\n },\n [closeDialog, onCreated, organizationId, t],\n )\n\n const renderMenu = () => (\n <div className=\"absolute right-0 z-dropdown mt-2 w-48 rounded border bg-popover p-1 shadow-lg\">\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('person')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <UserRound className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addPerson', 'Create person')}\n </button>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 rounded px-2 py-2 text-sm hover:bg-muted\"\n onClick={() => {\n setDialog('company')\n setMenuOpen(false)\n setFormError(null)\n }}\n >\n <Building2 className=\"h-4 w-4 text-muted-foreground\" />\n {t('sales.documents.form.customer.addCompany', 'Create company')}\n </button>\n </div>\n )\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"gap-2\"\n onClick={() => setMenuOpen((open) => !open)}\n aria-expanded={menuOpen}\n >\n <Plus className=\"h-4 w-4\" />\n {t('sales.documents.form.customer.create', 'Create customer')}\n </Button>\n {menuOpen ? renderMenu() : null}\n\n <Dialog open={dialog === 'person'} onOpenChange={(open) => (open ? setDialog('person') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addPerson', 'Create person')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a person without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<PersonFormValues>\n embedded\n fields={personFields}\n groups={personGroups}\n schema={personSchema}\n initialValues={{ addresses: [] as PersonFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handlePersonCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_person_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n <Dialog open={dialog === 'company'} onOpenChange={(open) => (open ? setDialog('company') : closeDialog())}>\n <DialogContent className=\"sm:max-w-5xl max-h-[90vh] overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>{t('sales.documents.form.customer.addCompany', 'Create company')}</DialogTitle>\n <DialogDescription>\n {t('sales.documents.form.customer.quick.dialogDescription', 'Add a company without leaving this form.')}\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-2\">\n {formError ? <p className=\"text-sm text-destructive\">{formError}</p> : null}\n <div\n onSubmit={(event) => {\n event.stopPropagation()\n if (typeof (event as any).nativeEvent?.stopImmediatePropagation === 'function') {\n (event as any).nativeEvent.stopImmediatePropagation()\n }\n }}\n >\n <CrudForm<CompanyFormValues>\n embedded\n fields={companyFields}\n groups={companyGroups}\n schema={companySchema}\n initialValues={{ addresses: [] as CompanyFormValues['addresses'] }}\n submitLabel={t('common.save', 'Save')}\n cancelHref={undefined}\n onSubmit={(values) => handleCompanyCreate(values)}\n entityIds={[E.customers.customer_entity, E.customers.customer_company_profile]}\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\nfunction parseCustomerOptions(items: unknown[], kind: 'person' | 'company'): CustomerOption[] {\n const parsed: CustomerOption[] = []\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue\n const record = item as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id : null\n if (!id) continue\n const displayName =\n typeof record.display_name === 'string'\n ? record.display_name\n : typeof record.name === 'string'\n ? record.name\n : null\n const email = typeof record.primary_email === 'string' ? record.primary_email : null\n const domain = typeof record.primary_domain === 'string' ? record.primary_domain : null\n const label = displayName ?? (email ?? domain ?? id)\n const subtitle = kind === 'person' ? email : domain ?? email\n parsed.push({ id, label: `${label}`, subtitle, kind, primaryEmail: email })\n }\n return parsed\n}\n\nfunction normalizeAddressDraft(draft?: AddressDraft | null): Record<string, unknown> | null {\n if (!draft) return null\n const normalized: Record<string, unknown> = {}\n const assign = (key: keyof AddressDraft, target: string) => {\n const value = draft[key]\n if (typeof value === 'string' && value.trim().length) normalized[target] = value.trim()\n if (typeof value === 'boolean') normalized[target] = value\n }\n assign('name', 'name')\n assign('purpose', 'purpose')\n assign('companyName', 'companyName')\n assign('addressLine1', 'addressLine1')\n assign('addressLine2', 'addressLine2')\n assign('buildingNumber', 'buildingNumber')\n assign('flatNumber', 'flatNumber')\n assign('city', 'city')\n assign('region', 'region')\n assign('postalCode', 'postalCode')\n assign('country', 'country')\n assign('isPrimary', 'isPrimary')\n return Object.keys(normalized).length ? normalized : null\n}\n\nexport function SalesDocumentForm({ onCreated, isSubmitting = false, initialKind, inboxPreFill }: SalesDocumentFormProps) {\n const t = useT()\n const [customers, setCustomers] = React.useState<CustomerOption[]>([])\n const [customerLoading, setCustomerLoading] = React.useState(false)\n const [channels, setChannels] = React.useState<ChannelOption[]>([])\n const [channelLoading, setChannelLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<AddressOption[]>([])\n const [addressesLoading, setAddressesLoading] = React.useState(false)\n const [addressesError, setAddressesError] = React.useState<string | null>(null)\n const [addressFormat, setAddressFormat] = React.useState<AddressFormatStrategy>('line_first')\n const [defaultCurrency, setDefaultCurrency] = React.useState<string>('USD')\n const addressRequestRef = React.useRef(0)\n const addressAbortRef = React.useRef<AbortController | null>(null)\n const addressTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const customerQuerySetter = React.useRef<((value: string) => void) | null>(null)\n const currencyLabels = React.useMemo<DictionarySelectLabels>(() => ({\n placeholder: t('sales.documents.form.currency.placeholder', 'Select currency'),\n addLabel: t('sales.documents.form.currency.add', 'Add currency'),\n addPrompt: t('sales.documents.form.currency.prompt', 'Currency code'),\n dialogTitle: t('sales.documents.form.currency.dialogTitle', 'Add currency'),\n valueLabel: t('sales.documents.form.currency.valueLabel', 'Currency code'),\n valuePlaceholder: t('sales.documents.form.currency.valuePlaceholder', 'e.g. USD'),\n labelLabel: t('sales.documents.form.currency.labelLabel', 'Label'),\n labelPlaceholder: t('sales.documents.form.currency.labelPlaceholder', 'Display name'),\n emptyError: t('sales.documents.form.currency.emptyError', 'Currency code is required'),\n cancelLabel: t('sales.documents.form.currency.cancel', 'Cancel'),\n saveLabel: t('sales.documents.form.currency.save', 'Save'),\n saveShortcutHint: '\u2318/Ctrl + Enter',\n successCreateLabel: t('sales.documents.form.currency.created', 'Currency saved.'),\n errorLoad: t('sales.documents.form.currency.errorLoad', 'Failed to load currencies.'),\n errorSave: t('sales.documents.form.currency.errorSave', 'Failed to save currency.'),\n loadingLabel: t('sales.documents.form.currency.loading', 'Loading currencies\u2026'),\n manageTitle: t('sales.documents.form.currency.manage', 'Manage currency dictionary'),\n }), [t])\n const { data: currencyDictionary, refetch: refetchCurrencyDictionary } = useCurrencyDictionary()\n\n const fetchCurrencyOptions = React.useCallback(async (): Promise<DictionaryOption[]> => {\n try {\n const source = currencyDictionary ?? (await refetchCurrencyDictionary())\n if (source && Array.isArray(source.entries)) {\n return source.entries.map((entry) => ({\n value: entry.value,\n label: entry.label,\n color: entry.color ?? null,\n icon: entry.icon ?? null,\n }))\n }\n return []\n } catch (err) {\n console.error('sales.documents.currency', err)\n return []\n }\n }, [currencyDictionary, refetchCurrencyDictionary])\n\n const loadCustomers = React.useCallback(async (query?: string) => {\n setCustomerLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const [people, companies] = await Promise.all([\n apiCall<{ items?: unknown[] }>(`/api/customers/people?${params.toString()}`),\n apiCall<{ items?: unknown[] }>(`/api/customers/companies?${params.toString()}`),\n ])\n const peopleItems = Array.isArray(people.result?.items) ? people.result?.items ?? [] : []\n const companyItems = Array.isArray(companies.result?.items) ? companies.result?.items ?? [] : []\n const merged = [...parseCustomerOptions(peopleItems, 'person'), ...parseCustomerOptions(companyItems, 'company')]\n setCustomers(merged)\n return merged\n } catch (err) {\n console.error('sales.documents.loadCustomers', err)\n flash(t('sales.documents.form.errors.customers', 'Failed to load customers.'), 'error')\n return []\n } finally {\n setCustomerLoading(false)\n }\n }, [t])\n\n const fetchCustomerEmail = React.useCallback(\n async (id: string, kindHint?: 'person' | 'company'): Promise<string | null> => {\n try {\n const kind = kindHint ?? customers.find((item) => item.id === id)?.kind ?? null\n const endpoint = kind === 'company' ? '/api/customers/companies' : '/api/customers/people'\n const params = new URLSearchParams({ id, pageSize: '1', page: '1' })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(`${endpoint}?${params.toString()}`)\n if (!call.ok || !Array.isArray(call.result?.items) || !call.result.items.length) return null\n const item = call.result.items[0]\n const email =\n (typeof item?.primary_email === 'string' && item.primary_email) ||\n (typeof (item as any)?.primaryEmail === 'string' && (item as any).primaryEmail) ||\n null\n if (email) {\n setCustomers((prev) =>\n prev.map((entry) => (entry.id === id ? { ...entry, primaryEmail: email } : entry))\n )\n }\n return email ?? null\n } catch (err) {\n console.error('sales.documents.fetchCustomerEmail', err)\n return null\n }\n },\n [customers],\n )\n\n const loadChannels = React.useCallback(async (query?: string) => {\n setChannelLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '20' })\n if (query && query.trim().length) params.set('search', query.trim())\n const call = await apiCall<{ items?: Array<{ id?: string; name?: string; code?: string | null }> }>(\n `/api/sales/channels?${params.toString()}`\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items\n .map((item) => {\n const id = typeof item?.id === 'string' ? item.id : null\n if (!id) return null\n const label = typeof item?.name === 'string' && item.name.trim().length ? item.name : id\n const code = typeof item?.code === 'string' && item.code.trim().length ? item.code : null\n return { id, label: code ? `${label} (${code})` : label }\n })\n .filter((opt): opt is ChannelOption => !!opt)\n if (!query) setChannels(options)\n return options\n } else {\n setChannels([])\n return []\n }\n } catch (err) {\n console.error('sales.documents.loadChannels', err)\n setChannels([])\n return []\n } finally {\n setChannelLoading(false)\n }\n }, [])\n\n const loadDefaultCurrency = React.useCallback(async () => {\n try {\n const call = await apiCall<{ items?: Array<{ currency_code?: string | null }> }>(\n '/api/catalog/price-kinds?isPromotion=false&isActive=true&pageSize=1'\n )\n if (call.ok && Array.isArray(call.result?.items) && call.result.items.length) {\n const code = call.result.items[0]?.currency_code\n if (typeof code === 'string' && code.trim().length) {\n setDefaultCurrency(code.trim().toUpperCase())\n }\n }\n } catch (err) {\n console.error('sales.documents.loadDefaultCurrency', err)\n }\n }, [])\n\n const loadAddresses = React.useCallback(async (customerId?: string | null): Promise<AddressOption[]> => {\n addressRequestRef.current += 1\n const requestId = addressRequestRef.current\n\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n\n if (!customerId) {\n setAddressesError(null)\n setAddressOptions([])\n setAddressesLoading(false)\n return []\n }\n setAddressesLoading(true)\n setAddressesError(null)\n setAddressOptions([])\n const controller = new AbortController()\n addressAbortRef.current = controller\n addressTimeoutRef.current = setTimeout(() => controller.abort(), 12_000)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50', entityId: customerId })\n const call = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/customers/addresses?${params.toString()}`,\n { signal: controller.signal },\n { fallback: { items: [] } }\n )\n if (call.ok && Array.isArray(call.result?.items)) {\n const options = call.result.items.reduce<AddressOption[]>((acc, item) => {\n const id = typeof item.id === 'string' ? item.id : null\n if (!id) return acc\n const value: AddressValue = {\n addressLine1: typeof item.address_line1 === 'string' ? item.address_line1 : null,\n addressLine2: typeof item.address_line2 === 'string' ? item.address_line2 : null,\n buildingNumber: typeof item.building_number === 'string' ? item.building_number : null,\n flatNumber: typeof item.flat_number === 'string' ? item.flat_number : null,\n city: typeof item.city === 'string' ? item.city : null,\n region: typeof item.region === 'string' ? item.region : null,\n postalCode: typeof item.postal_code === 'string' ? item.postal_code : null,\n country: typeof item.country === 'string' ? item.country : null,\n companyName: typeof item.company_name === 'string' ? item.company_name : null,\n }\n const name = typeof item.name === 'string' ? item.name.trim() : ''\n const summary = formatAddressString(value, addressFormat)\n const label = name || summary || id\n const isPrimary = item.is_primary === true\n acc.push({ id, label, summary, value, name: name || null, isPrimary })\n return acc\n }, [])\n if (addressRequestRef.current === requestId) {\n setAddressOptions(options)\n }\n return options\n } else {\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } catch (err) {\n if ((err as DOMException)?.name !== 'AbortError') {\n console.error('sales.documents.loadAddresses', err)\n }\n if (addressRequestRef.current === requestId) {\n setAddressOptions([])\n if ((err as DOMException)?.name !== 'AbortError') {\n setAddressesError(\n t('sales.documents.detail.addresses.loadError', 'Failed to load addresses.')\n )\n }\n }\n } finally {\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n if (addressAbortRef.current === controller) {\n addressAbortRef.current = null\n }\n if (addressRequestRef.current === requestId) {\n setAddressesLoading(false)\n }\n }\n return []\n }, [addressFormat, t])\n\n React.useEffect(() => {\n loadCustomers().catch(() => {})\n loadChannels().catch(() => {})\n loadDefaultCurrency().catch(() => {})\n }, [loadChannels, loadCustomers, loadDefaultCurrency])\n\n React.useEffect(\n () => () => {\n if (addressAbortRef.current) {\n addressAbortRef.current.abort()\n addressAbortRef.current = null\n }\n if (addressTimeoutRef.current) {\n clearTimeout(addressTimeoutRef.current)\n addressTimeoutRef.current = null\n }\n },\n [],\n )\n\n React.useEffect(() => {\n setAddressOptions((prev) =>\n prev.map((entry) => {\n const summary = formatAddressString(entry.value, addressFormat)\n const label = (entry.name && entry.name.trim().length ? entry.name : '') || summary || entry.id\n return { ...entry, summary, label }\n }),\n )\n }, [addressFormat])\n\n React.useEffect(() => {\n let cancelled = false\n async function fetchAddressFormat() {\n try {\n const call = await apiCall<{ addressFormat?: string }>('/api/customers/settings/address-format')\n const format = typeof call.result?.addressFormat === 'string' ? call.result.addressFormat : null\n if (!cancelled && (format === 'street_first' || format === 'line_first')) {\n setAddressFormat(format)\n }\n } catch (err) {\n console.error('sales.documents.addressFormat', err)\n } finally {\n }\n }\n fetchAddressFormat().catch(() => {})\n return () => {\n cancelled = true\n }\n }, [])\n\n const resetAddressFormState = React.useCallback(\n (updateValue: (key: string, value: unknown) => void) => {\n updateValue('shippingAddressId', null)\n updateValue('billingAddressId', null)\n updateValue('shippingAddressDraft', undefined)\n updateValue('billingAddressDraft', undefined)\n updateValue('useCustomShipping', false)\n updateValue('useCustomBilling', false)\n updateValue('saveShippingAddress', false)\n updateValue('saveBillingAddress', false)\n updateValue('sameAsShipping', true)\n },\n [],\n )\n\n function DocumentNumberField({ value, setValue, values }: CrudCustomFieldRenderProps) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const kind: DocumentKind = formValues.documentKind === 'order' ? 'order' : 'quote'\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n const autoValueRef = React.useRef<string | null>(null)\n const lastKindRef = React.useRef<DocumentKind | null>(null)\n\n const requestNumber = React.useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const call = await apiCall<{ number?: string; error?: string }>('/api/sales/document-numbers', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ kind }),\n })\n const nextNumber = typeof call.result?.number === 'string' ? call.result.number : null\n if (call.ok && nextNumber) {\n autoValueRef.current = nextNumber\n lastKindRef.current = kind\n setValue(nextNumber)\n } else {\n setError(call.result?.error || t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n }\n } catch (err) {\n console.error('sales.documents.generateNumber', err)\n setError(t('sales.documents.form.errors.numberGenerate', 'Could not generate a document number.'))\n } finally {\n setLoading(false)\n }\n }, [kind, setValue, t])\n\n React.useEffect(() => {\n const current = typeof value === 'string' ? value.trim() : ''\n if (!current.length && !lastKindRef.current) {\n void requestNumber()\n } else {\n lastKindRef.current = kind\n }\n }, [kind, requestNumber, value])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex w-full flex-col gap-2 md:flex-row md:items-center md:gap-3\">\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n disabled={loading}\n spellCheck={false}\n className=\"w-full md:flex-1\"\n />\n <Button type=\"button\" variant=\"outline\" onClick={requestNumber} disabled={loading}>\n {loading\n ? t('sales.documents.form.numberLoading', 'Generating\u2026')\n : t('sales.documents.form.numberRefresh', 'Generate')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {kind === 'order'\n ? t('sales.documents.form.numberHintOrder', 'Format applies to orders and uses the configured counter.')\n : t('sales.documents.form.numberHintQuote', 'Format applies to quotes and uses the configured counter.')}\n </p>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n )\n }\n\n const fields = React.useMemo<CrudField[]>(() => [\n {\n id: 'documentKind',\n label: '',\n type: 'custom',\n required: false,\n component: ({ value, setValue }) => {\n const current = value === 'order' ? 'order' : 'quote'\n const label = t('sales.documents.form.kind', 'Document type')\n return (\n <div className=\"space-y-2 pt-0\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-foreground\">{label}</div>\n <div className=\"inline-flex rounded-lg border bg-background p-1 shadow-sm\">\n {(['quote', 'order'] as DocumentKind[]).map((kind) => (\n <Button\n key={kind}\n type=\"button\"\n variant={current === kind ? 'default' : 'ghost'}\n onClick={() => setValue(kind)}\n >\n {t(`sales.documents.form.kind.${kind}`, kind.charAt(0).toUpperCase() + kind.slice(1))}\n </Button>\n ))}\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'sales.documents.form.kind.hint',\n \"Please select which kind of sales document you want to create. When creating Quotes - it's kind of Shopping cart or Request for negotiation and could be converted to regular order later\",\n )}\n </p>\n </div>\n )\n },\n },\n {\n id: 'documentNumber',\n label: t('sales.documents.form.number', 'Document number'),\n type: 'custom',\n required: true,\n component: DocumentNumberField,\n },\n {\n id: 'currencyCode',\n label: t('sales.documents.form.currency', 'Currency'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <DictionaryEntrySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={(next) => setValue(next ?? '')}\n fetchOptions={fetchCurrencyOptions}\n allowInlineCreate={false}\n manageHref=\"/backend/config/dictionaries?key=currency\"\n selectClassName=\"w-full\"\n labels={currencyLabels}\n />\n ),\n },\n {\n id: 'channelId',\n label: t('sales.documents.form.channel', 'Sales channel'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <LookupSelect\n value={typeof value === 'string' ? value : null}\n onChange={(next) => setValue(next)}\n fetchItems={async (query) => {\n const options = await loadChannels(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n icon: <Store className=\"h-5 w-5 text-muted-foreground\" />,\n }))\n }}\n searchPlaceholder={t('sales.documents.form.channel.placeholder', 'Select a channel')}\n loadingLabel={t('sales.documents.form.channel.loading', 'Loading channels\u2026')}\n emptyLabel={t('sales.documents.form.channel.empty', 'No channels found.')}\n selectedHintLabel={(id) => t('sales.documents.form.channel.selected', 'Selected channel: {{id}}', { id })}\n />\n ),\n },\n {\n id: 'shippingAddressSection',\n label: '',\n type: 'custom',\n component: ({ values, setFormValue }) => {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomShipping === true\n const selectedId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : ''\n const draft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const customerId = typeof formValues.customerEntityId === 'string' ? formValues.customerEntityId : null\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.shipping.title', 'Shipping address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {customerRequired\n ? t('sales.documents.form.address.customerRequired', 'Select customer first or define custom address')\n : t('sales.documents.form.shipping.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <SwitchField\n label={t('sales.documents.form.shipping.custom', 'Define new address')}\n flip\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomShipping', checked)}\n />\n </div>\n {!useCustom ? (\n <Select\n value={selectedId || undefined}\n onValueChange={(value) => updateValue('shippingAddressId', value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')\n }\n />\n </SelectTrigger>\n <SelectContent>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <SelectItem key={addr.id} value={addr.id}>{optionLabel}</SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : null}\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('shippingAddressDraft', next)}\n hidePrimaryToggle\n />\n <SwitchField\n containerClassName=\"col-span-2\"\n label={t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n flip\n checked={formValues.saveShippingAddress === true}\n onCheckedChange={(checked) => updateValue('saveShippingAddress', checked)}\n />\n </div>\n ) : null}\n {addressesError && customerId ? (\n <div className=\"flex items-start justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n <span className=\"flex-1\">{addressesError}</span>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => loadAddresses(customerId)}\n disabled={addressesLoading}\n className=\"shrink-0\"\n >\n {t('sales.documents.detail.retry', 'Try again')}\n </Button>\n </div>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'billingAddressSection',\n label: '',\n type: 'custom',\n component: function BillingAddressSectionField({ values, setFormValue }) {\n const formValues = (values ?? {}) as Partial<SalesDocumentFormValues>\n const updateValue = setFormValue ?? (() => {})\n const useCustom = formValues.useCustomBilling === true\n const selectedId = typeof formValues.billingAddressId === 'string' ? formValues.billingAddressId : ''\n const draft = (formValues.billingAddressDraft ?? {}) as AddressDraft\n const customerRequired = !formValues.customerEntityId\n const sameAsShipping = formValues.sameAsShipping !== false\n const shippingId = typeof formValues.shippingAddressId === 'string' ? formValues.shippingAddressId : null\n const shippingDraft = (formValues.shippingAddressDraft ?? {}) as AddressDraft\n const shippingDraftKey = JSON.stringify(shippingDraft)\n const billingDraftKey = JSON.stringify(draft)\n const useCustomShipping = formValues.useCustomShipping === true\n\n React.useEffect(() => {\n if (!sameAsShipping) return\n if ((formValues.billingAddressId ?? null) !== shippingId) {\n updateValue('billingAddressId', shippingId)\n }\n if (useCustomShipping !== (formValues.useCustomBilling === true)) {\n updateValue('useCustomBilling', useCustomShipping)\n }\n if (useCustomShipping && shippingDraftKey !== billingDraftKey) {\n updateValue('billingAddressDraft', shippingDraft)\n }\n }, [\n billingDraftKey,\n sameAsShipping,\n updateValue,\n shippingDraft,\n shippingDraftKey,\n shippingId,\n useCustomShipping,\n formValues.billingAddressId,\n formValues.useCustomBilling,\n ])\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex flex-col gap-1 md:flex-row md:items-center md:justify-between\">\n <div>\n <p className=\"text-base font-semibold\">\n {t('sales.documents.form.billing.title', 'Billing address')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {sameAsShipping\n ? t('sales.documents.form.address.sameAsShippingHint', 'Billing will mirror the shipping address. Uncheck to edit.')\n : t('sales.documents.form.billing.hint', 'Select an address or define a new one.')}\n </p>\n </div>\n <SwitchField\n label={t('sales.documents.form.address.sameAsShipping', 'Same as shipping')}\n flip\n checked={sameAsShipping}\n onCheckedChange={(checked) => {\n updateValue('sameAsShipping', checked)\n if (checked) {\n updateValue('useCustomBilling', useCustomShipping)\n updateValue('billingAddressId', shippingId)\n updateValue('billingAddressDraft', shippingDraft)\n }\n }}\n />\n </div>\n\n {!sameAsShipping ? (\n <>\n {!useCustom ? (\n <Select\n value={selectedId || undefined}\n onValueChange={(value) => updateValue('billingAddressId', value || null)}\n disabled={addressesLoading || customerRequired}\n >\n <SelectTrigger>\n <SelectValue\n placeholder={\n addressesLoading\n ? t('sales.documents.form.address.loading', 'Loading addresses\u2026')\n : t('sales.documents.form.address.placeholder', 'Select address')\n }\n />\n </SelectTrigger>\n <SelectContent>\n {addressOptions.map((addr) => {\n const optionLabel = addr.summary ? `${addr.label} \u2014 ${addr.summary}` : addr.label\n return (\n <SelectItem key={addr.id} value={addr.id}>{optionLabel}</SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n ) : null}\n\n <SwitchField\n label={t('sales.documents.form.shipping.custom', 'Define new address')}\n flip\n checked={useCustom}\n onCheckedChange={(checked) => updateValue('useCustomBilling', checked)}\n disabled={false}\n />\n\n {useCustom ? (\n <div className=\"space-y-3\">\n <AddressEditor\n value={draft}\n format={addressFormat}\n t={t}\n onChange={(next) => updateValue('billingAddressDraft', next)}\n hidePrimaryToggle\n />\n <SwitchField\n containerClassName=\"col-span-2\"\n label={t('sales.documents.form.address.saveToCustomer', 'Save this address to the customer')}\n flip\n checked={formValues.saveBillingAddress === true}\n onCheckedChange={(checked) => updateValue('saveBillingAddress', checked)}\n />\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n },\n },\n {\n id: 'comments',\n label: t('sales.documents.form.comments', 'Comments'),\n type: 'textarea',\n },\n {\n id: 'infoNote',\n label: '',\n type: 'custom',\n component: () => (\n <div className=\"rounded-lg border bg-muted/50 p-3 text-sm text-muted-foreground\">\n {t('sales.documents.form.nextStep', 'After creation you will add items, prices, and fulfillment details.')}\n </div>\n ),\n },\n ], [\n addressFormat,\n addressOptions,\n addressesError,\n addressesLoading,\n currencyLabels,\n fetchCurrencyOptions,\n loadAddresses,\n loadChannels,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n { id: 'docType', title: '', column: 1, fields: ['documentKind', 'documentNumber'] },\n {\n id: 'customer',\n title: '',\n column: 1,\n fields: [],\n component: function CustomerGroupComponent({ values, setValue }) {\n const emailValue = typeof values.customerEmail === 'string' ? values.customerEmail : ''\n const { duplicate, checking } = useEmailDuplicateCheck(emailValue, {\n disabled: false,\n debounceMs: 400,\n matchMode: 'prefix',\n })\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-3\">\n <LookupSelect\n value={typeof values.customerEntityId === 'string' ? values.customerEntityId : null}\n onChange={(next) => {\n if (next !== values.customerEntityId) {\n resetAddressFormState(setValue)\n }\n setValue('customerEntityId', next)\n loadAddresses(next).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (next) {\n const match = customers.find((entry) => entry.id === next)\n const possibleEmail =\n typeof match?.primaryEmail === 'string' && match.primaryEmail.length\n ? match.primaryEmail\n : null\n if (possibleEmail) {\n setValue('customerEmail', possibleEmail)\n } else {\n fetchCustomerEmail(next, match?.kind)\n .then((email) => {\n if (email) setValue('customerEmail', email)\n })\n .catch(() => {})\n }\n }\n }}\n fetchItems={async (query) => {\n const options = await loadCustomers(query)\n return options.map<LookupSelectItem>((opt) => ({\n id: opt.id,\n title: opt.label,\n subtitle: opt.subtitle ?? undefined,\n icon:\n opt.kind === 'person' ? (\n <UserRound className=\"h-5 w-5 text-muted-foreground\" />\n ) : (\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n ),\n }))\n }}\n actionSlot={\n <CustomerQuickCreate\n t={t}\n onCreated={({ id, email, label, kind, subtitle }) => {\n // Seed the search box with the new customer's display name so it renders immediately\n customerQuerySetter.current?.(label)\n setCustomers((prev) => {\n const exists = prev.some((entry) => entry.id === id)\n if (exists) return prev\n const next: CustomerOption = {\n id,\n label,\n subtitle: subtitle ?? undefined,\n kind,\n primaryEmail: email ?? null,\n }\n return [next, ...prev]\n })\n setValue('customerEntityId', id)\n resetAddressFormState(setValue)\n loadAddresses(id).then((addrs) => {\n const primary = addrs.find((addr) => addr.isPrimary)\n if (primary) {\n setValue('shippingAddressId', primary.id)\n }\n }).catch((err) => { console.error('sales.documents.autoSelectAddress', err) })\n if (email && !values.customerEmail) {\n setValue('customerEmail', email)\n }\n }}\n />\n }\n onReady={({ setQuery }) => {\n customerQuerySetter.current = setQuery\n }}\n searchPlaceholder={t('sales.documents.form.customer.placeholder', 'Search customers\u2026')}\n loadingLabel={t('sales.documents.form.customer.loading', 'Loading customers\u2026')}\n emptyLabel={t('sales.documents.form.customer.empty', 'No customers found.')}\n selectedHintLabel={(id) => t('sales.documents.form.customer.selected', 'Selected customer: {{id}}', { id })}\n />\n </div>\n <div className=\"space-y-2\">\n <Input\n type=\"email\"\n leftIcon={<Mail />}\n value={emailValue}\n onChange={(event) => setValue('customerEmail', event.target.value)}\n placeholder={t('sales.documents.form.email.placeholder', 'Email used for the document')}\n spellCheck={false}\n />\n {duplicate ? (\n <div className=\"flex items-center justify-between rounded border bg-muted px-3 py-2 text-xs text-muted-foreground\">\n <span>\n {t('customers.people.form.emailDuplicateNotice', undefined, { name: duplicate.displayName })}\n </span>\n <Button\n size=\"sm\"\n variant=\"secondary\"\n className=\"px-4\"\n type=\"button\"\n disabled={values.customerEntityId === duplicate.id}\n aria-disabled={values.customerEntityId === duplicate.id}\n onClick={() => {\n setValue('customerEntityId', duplicate.id)\n resetAddressFormState(setValue)\n loadAddresses(duplicate.id)\n }}\n >\n {values.customerEntityId === duplicate.id\n ? t('sales.documents.form.email.alreadySelected', 'Selected customer')\n : t('sales.documents.form.email.selectCustomer', 'Select customer')}\n </Button>\n </div>\n ) : null}\n {!duplicate && checking ? (\n <p className=\"text-xs text-muted-foreground\">{t('customers.people.form.emailChecking')}</p>\n ) : null}\n </div>\n </div>\n )\n },\n },\n { id: 'channels-comments', title: '', column: 1, fields: ['channelId', 'comments'] },\n { id: 'currency', title: '', column: 2, fields: ['currencyCode'] },\n { id: 'shipping', title: '', column: 2, fields: ['shippingAddressSection'] },\n { id: 'billing', title: '', column: 2, fields: ['billingAddressSection'] },\n { id: 'custom', title: t('sales.documents.form.customFields', 'Custom fields'), column: 2, kind: 'customFields' },\n ], [\n customers,\n fetchCustomerEmail,\n loadAddresses,\n loadCustomers,\n resetAddressFormState,\n t,\n ])\n\n const initialValues = React.useMemo<Partial<SalesDocumentFormValues>>(\n () => ({\n documentKind: initialKind === 'order' ? 'order' : 'quote',\n documentNumber: '',\n currencyCode: inboxPreFill?.currencyCode || defaultCurrency,\n channelId: inboxPreFill?.channelId || undefined,\n customerEntityId: inboxPreFill?.customerEntityId || undefined,\n comments: inboxPreFill?.comments || undefined,\n useCustomShipping: false,\n useCustomBilling: false,\n sameAsShipping: true,\n }),\n [initialKind, inboxPreFill, defaultCurrency]\n )\n\n // When inboxPreFill provides a customer, load their addresses on mount\n React.useEffect(() => {\n if (inboxPreFill?.customerEntityId) {\n loadAddresses(inboxPreFill.customerEntityId)\n }\n }, [inboxPreFill?.customerEntityId, loadAddresses])\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const safeValues = values ?? {}\n const customFields = collectCustomFieldValues(safeValues)\n const base = Object.fromEntries(\n Object.entries(safeValues).filter(([key]) => !key.startsWith('cf_') && !key.startsWith('cf:'))\n ) as SalesDocumentFormValues\n const documentKind: DocumentKind = base.documentKind === 'order' ? 'order' : 'quote'\n const payload: Record<string, unknown> = {\n currencyCode: typeof base.currencyCode === 'string' && base.currencyCode.trim().length\n ? base.currencyCode.trim().toUpperCase()\n : undefined,\n customerEntityId: base.customerEntityId || undefined,\n comments: base.comments ?? undefined,\n metadata: base.customerEmail ? { customerEmail: base.customerEmail } : undefined,\n }\n payload.channelId = base.channelId || undefined\n const documentNumber = typeof base.documentNumber === 'string' ? base.documentNumber.trim() : ''\n if (!documentNumber) {\n throw createCrudFormError(t('sales.documents.form.errors.numberRequired', 'Document number is required.'))\n }\n if (documentKind === 'order') {\n payload.orderNumber = documentNumber\n } else {\n payload.quoteNumber = documentNumber\n }\n const shippingSnapshot = base.useCustomShipping ? normalizeAddressDraft(base.shippingAddressDraft) : null\n let billingSnapshot = base.useCustomBilling ? normalizeAddressDraft(base.billingAddressDraft) : null\n const sameAsShipping = base.sameAsShipping !== false\n if (sameAsShipping) {\n if (shippingSnapshot) {\n billingSnapshot = shippingSnapshot\n } else if (!base.useCustomShipping) {\n payload.billingAddressId = base.shippingAddressId || undefined\n }\n }\n if (shippingSnapshot) {\n payload.shippingAddressSnapshot = shippingSnapshot\n payload.shippingAddressId = undefined\n }\n if (billingSnapshot) {\n payload.billingAddressSnapshot = billingSnapshot\n payload.billingAddressId = undefined\n }\n if (!base.useCustomShipping) payload.shippingAddressId = base.shippingAddressId || undefined\n if (!base.useCustomBilling && !sameAsShipping) payload.billingAddressId = base.billingAddressId || undefined\n\n try {\n let shippingId = payload.shippingAddressId as string | undefined\n let billingId = payload.billingAddressId as string | undefined\n if (base.customerEntityId && shippingSnapshot && base.saveShippingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: shippingSnapshot.addressLine1 ?? shippingSnapshot.name ?? 'Address',\n name: shippingSnapshot.name ?? undefined,\n addressLine2: shippingSnapshot.addressLine2 ?? undefined,\n buildingNumber: shippingSnapshot.buildingNumber ?? undefined,\n flatNumber: shippingSnapshot.flatNumber ?? undefined,\n city: shippingSnapshot.city ?? undefined,\n region: shippingSnapshot.region ?? undefined,\n postalCode: shippingSnapshot.postalCode ?? undefined,\n country: shippingSnapshot.country ?? undefined,\n purpose: shippingSnapshot.purpose ?? undefined,\n isPrimary: shippingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) shippingId = res.result.id\n }\n if (base.customerEntityId && billingSnapshot && base.saveBillingAddress) {\n const res = await createCrud<{ id?: string }>('customers/addresses', {\n entityId: base.customerEntityId,\n addressLine1: billingSnapshot.addressLine1 ?? billingSnapshot.name ?? 'Address',\n name: billingSnapshot.name ?? undefined,\n addressLine2: billingSnapshot.addressLine2 ?? undefined,\n buildingNumber: billingSnapshot.buildingNumber ?? undefined,\n flatNumber: billingSnapshot.flatNumber ?? undefined,\n city: billingSnapshot.city ?? undefined,\n region: billingSnapshot.region ?? undefined,\n postalCode: billingSnapshot.postalCode ?? undefined,\n country: billingSnapshot.country ?? undefined,\n purpose: billingSnapshot.purpose ?? undefined,\n isPrimary: billingSnapshot.isPrimary ?? undefined,\n })\n if (res?.result?.id) billingId = res.result.id\n }\n if (!base.useCustomShipping && shippingId) payload.shippingAddressId = shippingId\n if (!base.useCustomBilling && !sameAsShipping && billingId) payload.billingAddressId = billingId\n if (Object.keys(customFields).length) payload.customFields = customFields\n\n const endpoint = documentKind === 'order' ? 'sales/orders' : 'sales/quotes'\n const { result } = await createCrud<{ id?: string; orderId?: string; quoteId?: string }>(endpoint, payload, {\n errorMessage: t('sales.documents.form.errors.submit', 'Failed to create document.'),\n })\n const newId =\n (result && typeof result.id === 'string' && result.id) ||\n (result && typeof result.orderId === 'string' && result.orderId) ||\n (result && typeof result.quoteId === 'string' && result.quoteId) ||\n null\n if (!newId) {\n throw createCrudFormError(t('sales.documents.form.errors.id', 'Document id missing after create.'))\n }\n flash(t('sales.documents.form.success', 'Sales document created.'), 'success')\n onCreated({ id: newId, kind: documentKind })\n } catch (err) {\n if (err instanceof Error) throw err\n throw createCrudFormError(t('sales.documents.form.errors.submit', 'Failed to create document.'))\n }\n },\n [onCreated, t],\n )\n\n const cancelHref = initialKind === 'order' ? '/backend/sales/orders' : '/backend/sales/quotes'\n\n return (\n <CrudForm<SalesDocumentFormValues>\n title={t('sales.documents.form.title', 'Create sales document')}\n backHref={cancelHref}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n entityIds={[E.sales.sales_quote, E.sales.sales_order]}\n submitLabel={t('sales.documents.form.submit', 'Create')}\n cancelHref={cancelHref}\n onSubmit={handleSubmit}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["item"]
|
|
7
7
|
}
|
|
@@ -3,6 +3,14 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import Link from "next/link";
|
|
5
5
|
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
6
|
+
import { Input } from "@open-mercato/ui/primitives/input";
|
|
7
|
+
import {
|
|
8
|
+
Select,
|
|
9
|
+
SelectContent,
|
|
10
|
+
SelectItem,
|
|
11
|
+
SelectTrigger,
|
|
12
|
+
SelectValue
|
|
13
|
+
} from "@open-mercato/ui/primitives/select";
|
|
6
14
|
import { Spinner } from "@open-mercato/ui/primitives/spinner";
|
|
7
15
|
import { Badge } from "@open-mercato/ui/primitives/badge";
|
|
8
16
|
import { formatRelativeTime } from "@open-mercato/shared/lib/time";
|
|
@@ -92,13 +100,13 @@ const SalesNewOrdersWidget = ({
|
|
|
92
100
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
93
101
|
/* @__PURE__ */ jsx("label", { htmlFor: "sales-new-orders-page-size", className: "text-xs font-semibold uppercase text-muted-foreground", children: translate("sales.widgets.newOrders.settings.pageSize", "Number of Orders") }),
|
|
94
102
|
/* @__PURE__ */ jsx(
|
|
95
|
-
|
|
103
|
+
Input,
|
|
96
104
|
{
|
|
97
105
|
id: "sales-new-orders-page-size",
|
|
98
106
|
type: "number",
|
|
99
107
|
min: 1,
|
|
100
108
|
max: 20,
|
|
101
|
-
className: "w-24
|
|
109
|
+
className: "w-24",
|
|
102
110
|
value: hydrated.pageSize,
|
|
103
111
|
onChange: (event) => {
|
|
104
112
|
const next = Number(event.target.value);
|
|
@@ -112,19 +120,20 @@ const SalesNewOrdersWidget = ({
|
|
|
112
120
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
113
121
|
/* @__PURE__ */ jsx("label", { htmlFor: "sales-new-orders-date-period", className: "text-xs font-semibold uppercase text-muted-foreground", children: translate("sales.widgets.newOrders.settings.datePeriod", "Date Period") }),
|
|
114
122
|
/* @__PURE__ */ jsxs(
|
|
115
|
-
|
|
123
|
+
Select,
|
|
116
124
|
{
|
|
117
|
-
id: "sales-new-orders-date-period",
|
|
118
125
|
value: hydrated.datePeriod,
|
|
119
|
-
|
|
120
|
-
onSettingsChange?.({ ...hydrated, datePeriod:
|
|
126
|
+
onValueChange: (value) => {
|
|
127
|
+
onSettingsChange?.({ ...hydrated, datePeriod: value });
|
|
121
128
|
},
|
|
122
|
-
className: "w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
123
129
|
children: [
|
|
124
|
-
/* @__PURE__ */ jsx(
|
|
125
|
-
/* @__PURE__ */
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
/* @__PURE__ */ jsx(SelectTrigger, { id: "sales-new-orders-date-period", size: "sm", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
131
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
132
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "last24h", children: translate("sales.widgets.newOrders.settings.last24h", "Last 24 hours") }),
|
|
133
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "last7d", children: translate("sales.widgets.newOrders.settings.last7d", "Last 7 days") }),
|
|
134
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "last30d", children: translate("sales.widgets.newOrders.settings.last30d", "Last 30 days") }),
|
|
135
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "custom", children: translate("sales.widgets.newOrders.settings.custom", "Custom range") })
|
|
136
|
+
] })
|
|
128
137
|
]
|
|
129
138
|
}
|
|
130
139
|
)
|