@open-mercato/core 0.4.6-develop-e321a4e2a1 → 0.4.6-main-24e64eef39

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.
Files changed (180) hide show
  1. package/AGENTS.md +0 -22
  2. package/dist/modules/api_docs/frontend/docs/api/page.js +1 -1
  3. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  4. package/dist/modules/attachments/api/library/[id]/route.js +1 -0
  5. package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
  6. package/dist/modules/attachments/components/AttachmentLibrary.js +1 -1
  7. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  8. package/dist/modules/attachments/lib/partitionEnv.js +1 -1
  9. package/dist/modules/attachments/lib/partitionEnv.js.map +2 -2
  10. package/dist/modules/auth/backend/users/page.js +1 -1
  11. package/dist/modules/auth/backend/users/page.js.map +2 -2
  12. package/dist/modules/auth/cli.js +1 -1
  13. package/dist/modules/auth/cli.js.map +2 -2
  14. package/dist/modules/auth/commands/users.js +1 -1
  15. package/dist/modules/auth/commands/users.js.map +2 -2
  16. package/dist/modules/business_rules/components/utils/formHelpers.js +1 -1
  17. package/dist/modules/business_rules/components/utils/formHelpers.js.map +2 -2
  18. package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -1
  19. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  20. package/dist/modules/catalog/commands/products.js +1 -1
  21. package/dist/modules/catalog/commands/products.js.map +2 -2
  22. package/dist/modules/catalog/commands/shared.js +1 -1
  23. package/dist/modules/catalog/commands/shared.js.map +2 -2
  24. package/dist/modules/catalog/components/PriceKindSettings.js +1 -1
  25. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  26. package/dist/modules/catalog/components/products/productForm.js +1 -1
  27. package/dist/modules/catalog/components/products/productForm.js.map +2 -2
  28. package/dist/modules/configs/lib/upgrade-actions.js.map +1 -1
  29. package/dist/modules/currencies/services/providers/raiffeisen.js +1 -1
  30. package/dist/modules/currencies/services/providers/raiffeisen.js.map +2 -2
  31. package/dist/modules/customers/backend/customers/companies/page.js +3 -3
  32. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  33. package/dist/modules/customers/backend/customers/deals/page.js +3 -3
  34. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  35. package/dist/modules/customers/backend/customers/people/page.js +3 -3
  36. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  37. package/dist/modules/customers/cli.js +2 -2
  38. package/dist/modules/customers/cli.js.map +2 -2
  39. package/dist/modules/customers/lib/detailHelpers.js +1 -1
  40. package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
  41. package/dist/modules/entities/cli.js +1 -1
  42. package/dist/modules/entities/cli.js.map +2 -2
  43. package/dist/modules/entities/lib/field-definitions.js +1 -1
  44. package/dist/modules/entities/lib/field-definitions.js.map +2 -2
  45. package/dist/modules/entities/lib/install-from-ce.js +1 -1
  46. package/dist/modules/entities/lib/install-from-ce.js.map +2 -2
  47. package/dist/modules/inbox_ops/lib/emailParser.js +1 -1
  48. package/dist/modules/inbox_ops/lib/emailParser.js.map +2 -2
  49. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +0 -8
  50. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
  51. package/dist/modules/perspectives/services/perspectiveService.js +1 -1
  52. package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
  53. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -3
  54. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  55. package/dist/modules/query_index/components/QueryIndexesTable.js +7 -7
  56. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  57. package/dist/modules/query_index/lib/engine.js +1 -1
  58. package/dist/modules/query_index/lib/engine.js.map +2 -2
  59. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
  60. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  61. package/dist/modules/resources/backend/resources/resources/page.js +3 -3
  62. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  63. package/dist/modules/resources/commands/resources.js +1 -1
  64. package/dist/modules/resources/commands/resources.js.map +2 -2
  65. package/dist/modules/resources/lib/seeds.js +1 -1
  66. package/dist/modules/resources/lib/seeds.js.map +2 -2
  67. package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js +1 -1
  68. package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js.map +2 -2
  69. package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js +1 -1
  70. package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js.map +2 -2
  71. package/dist/modules/sales/backend/sales/channels/page.js +3 -3
  72. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  73. package/dist/modules/sales/commands/documents.js +2 -2
  74. package/dist/modules/sales/commands/documents.js.map +2 -2
  75. package/dist/modules/sales/components/channels/offerTableUtils.js +2 -3
  76. package/dist/modules/sales/components/channels/offerTableUtils.js.map +2 -2
  77. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +4 -4
  78. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  79. package/dist/modules/sales/components/documents/ShipmentDialog.js +1 -1
  80. package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
  81. package/dist/modules/sales/lib/shipments/snapshots.js.map +1 -1
  82. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -8
  83. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +2 -2
  84. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -8
  85. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +2 -2
  86. package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -3
  87. package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
  88. package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -3
  89. package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
  90. package/dist/modules/staff/backend/staff/team-members/page.js +3 -3
  91. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  92. package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
  93. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  94. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -3
  95. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  96. package/dist/modules/staff/backend/staff/teams/page.js +2 -2
  97. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  98. package/dist/modules/workflows/backend/instances/page.js +2 -2
  99. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  100. package/dist/modules/workflows/backend/tasks/page.js +1 -1
  101. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  102. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
  103. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  104. package/dist/modules/workflows/lib/graph-utils.js +1 -1
  105. package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
  106. package/package.json +2 -2
  107. package/src/modules/api_docs/frontend/docs/api/page.tsx +1 -1
  108. package/src/modules/attachments/api/library/[id]/route.ts +1 -0
  109. package/src/modules/attachments/components/AttachmentLibrary.tsx +1 -1
  110. package/src/modules/attachments/lib/partitionEnv.ts +1 -1
  111. package/src/modules/auth/backend/users/page.tsx +1 -1
  112. package/src/modules/auth/cli.ts +1 -1
  113. package/src/modules/auth/commands/users.ts +1 -1
  114. package/src/modules/business_rules/components/utils/formHelpers.ts +1 -1
  115. package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -1
  116. package/src/modules/catalog/commands/products.ts +1 -1
  117. package/src/modules/catalog/commands/shared.ts +1 -1
  118. package/src/modules/catalog/components/PriceKindSettings.tsx +1 -1
  119. package/src/modules/catalog/components/products/productForm.ts +1 -1
  120. package/src/modules/configs/lib/upgrade-actions.ts +1 -1
  121. package/src/modules/currencies/services/providers/raiffeisen.ts +1 -1
  122. package/src/modules/customers/backend/customers/companies/page.tsx +3 -3
  123. package/src/modules/customers/backend/customers/deals/page.tsx +3 -3
  124. package/src/modules/customers/backend/customers/people/page.tsx +3 -3
  125. package/src/modules/customers/cli.ts +2 -2
  126. package/src/modules/customers/lib/detailHelpers.ts +1 -1
  127. package/src/modules/entities/cli.ts +1 -1
  128. package/src/modules/entities/lib/field-definitions.ts +1 -1
  129. package/src/modules/entities/lib/install-from-ce.ts +1 -1
  130. package/src/modules/inbox_ops/lib/emailParser.ts +1 -1
  131. package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +0 -8
  132. package/src/modules/perspectives/services/perspectiveService.ts +1 -1
  133. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -3
  134. package/src/modules/query_index/components/QueryIndexesTable.tsx +7 -7
  135. package/src/modules/query_index/lib/engine.ts +1 -1
  136. package/src/modules/resources/backend/resources/resource-types/page.tsx +3 -2
  137. package/src/modules/resources/backend/resources/resources/page.tsx +3 -3
  138. package/src/modules/resources/commands/resources.ts +1 -1
  139. package/src/modules/resources/lib/seeds.ts +1 -1
  140. package/src/modules/sales/api/dashboard/widgets/new-orders/route.ts +1 -1
  141. package/src/modules/sales/api/dashboard/widgets/new-quotes/route.ts +1 -1
  142. package/src/modules/sales/backend/sales/channels/page.tsx +3 -3
  143. package/src/modules/sales/commands/documents.ts +2 -2
  144. package/src/modules/sales/components/channels/offerTableUtils.tsx +2 -3
  145. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +4 -4
  146. package/src/modules/sales/components/documents/ShipmentDialog.tsx +1 -1
  147. package/src/modules/sales/lib/shipments/snapshots.ts +1 -1
  148. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -8
  149. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -8
  150. package/src/modules/staff/backend/staff/leave-requests/page.tsx +3 -3
  151. package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +3 -3
  152. package/src/modules/staff/backend/staff/team-members/page.tsx +3 -3
  153. package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
  154. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -3
  155. package/src/modules/staff/backend/staff/teams/page.tsx +3 -2
  156. package/src/modules/workflows/backend/instances/page.tsx +2 -2
  157. package/src/modules/workflows/backend/tasks/page.tsx +1 -1
  158. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
  159. package/src/modules/workflows/lib/graph-utils.ts +1 -1
  160. package/dist/modules/integrations/acl.js +0 -8
  161. package/dist/modules/integrations/acl.js.map +0 -7
  162. package/dist/modules/integrations/data/enrichers.js +0 -72
  163. package/dist/modules/integrations/data/enrichers.js.map +0 -7
  164. package/dist/modules/integrations/data/entities.js +0 -63
  165. package/dist/modules/integrations/data/entities.js.map +0 -7
  166. package/dist/modules/integrations/index.js +0 -9
  167. package/dist/modules/integrations/index.js.map +0 -7
  168. package/dist/modules/integrations/setup.js +0 -13
  169. package/dist/modules/integrations/setup.js.map +0 -7
  170. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -69
  171. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +0 -7
  172. package/dist/modules/integrations/widgets/injection-table.js +0 -13
  173. package/dist/modules/integrations/widgets/injection-table.js.map +0 -7
  174. package/src/modules/integrations/acl.ts +0 -4
  175. package/src/modules/integrations/data/enrichers.ts +0 -98
  176. package/src/modules/integrations/data/entities.ts +0 -46
  177. package/src/modules/integrations/index.ts +0 -5
  178. package/src/modules/integrations/setup.ts +0 -11
  179. package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -94
  180. package/src/modules/integrations/widgets/injection-table.ts +0 -17
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/components/documents/ShipmentDialog.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\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 { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\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 { cn } from '@open-mercato/shared/lib/utils'\nimport { E } from '#generated/entities.ids.generated'\nimport { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatMoney, normalizeNumber } from './lineItemUtils'\nimport type { OrderLine, ShipmentRow } from './shipmentTypes'\nimport { formatAddressString, type AddressFormatStrategy, type AddressValue } from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n currencyCode: string | null\n baseRateNet: number | null\n baseRateGross: number | null\n minPrice: number | null\n avgPrice: number | null\n}\n\ntype ShipmentDialogProps = {\n open: boolean\n mode: 'create' | 'edit'\n shipment: ShipmentRow | null\n lines: OrderLine[]\n orderId: string\n currencyCode?: string | null\n organizationId: string | null\n tenantId: string | null\n computeAvailable: (lineId: string, excludeShipmentId?: string | null) => number\n shippingAddressSnapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null\n onClose: () => void\n onSaved: () => Promise<void>\n onAddComment?: (body: string) => Promise<void>\n}\n\ntype ShipmentAddressOption = {\n id: string\n label: string\n summary: string\n snapshot: NormalizedAddressSnapshot\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n}\n\nconst ADDRESS_SNAPSHOT_KEY = 'shipmentAddressSnapshot'\nconst ADDRESS_FORMAT: AddressFormatStrategy = 'line_first'\nconst SHIPPING_ADJUSTMENT_TOGGLE_ID = 'shipment-add-shipping-adjustment'\nconst SHIPPING_ADJUSTMENT_LABEL_ID = 'shipment-add-shipping-adjustment-label'\nconst SHIPPING_ADJUSTMENT_HELP_ID = 'shipment-add-shipping-adjustment-help'\n\ntype NormalizedAddressSnapshot = {\n id?: string\n documentAddressId?: string\n name?: string\n purpose?: string\n companyName?: string\n addressLine1?: string\n addressLine2?: string\n buildingNumber?: string\n flatNumber?: string\n city?: string\n region?: string\n postalCode?: string\n country?: string\n latitude?: number\n longitude?: number\n isPrimary?: boolean\n [key: string]: string | number | boolean | null | undefined\n}\n\nconst parseTrackingNumbers = (value: string | null | undefined): string[] =>\n (value ?? '')\n .split(/[\\n,]/g)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n\nconst normalizePrice = (value: unknown): number | null => {\n const parsed = normalizeNumber(value, NaN)\n if (!Number.isFinite(parsed)) return null\n if (parsed <= 0) return null\n return parsed\n}\n\nconst roundAmount = (value: number): number => Math.round((value + Number.EPSILON) * 100) / 100\n\nconst readStringField = (input: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = input[key]\n if (typeof value === 'string' && value.trim().length) return value.trim()\n }\n return null\n}\n\nconst normalizeAddressSnapshot = (\n input?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!input || typeof input !== 'object') return null\n const normalized: NormalizedAddressSnapshot = {}\n const assignString = (target: string, ...sourceKeys: string[]) => {\n const value = readStringField(input as Record<string, unknown>, sourceKeys)\n if (value) normalized[target] = value\n }\n const assignOther = (target: string, value: unknown) => {\n if (typeof value === 'boolean') {\n normalized[target] = value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n normalized[target] = value\n }\n }\n\n const id =\n readStringField(input as Record<string, unknown>, ['customerAddressId', 'customer_address_id']) ??\n readStringField(input as Record<string, unknown>, ['id'])\n if (id) normalized.id = id\n const documentAddressId = readStringField(input as Record<string, unknown>, ['documentAddressId', 'document_address_id'])\n if (documentAddressId && documentAddressId !== id) normalized.documentAddressId = documentAddressId\n\n assignString('name', 'name')\n assignString('purpose', 'purpose')\n assignString('companyName', 'companyName', 'company_name')\n assignString('addressLine1', 'addressLine1', 'address_line1')\n assignString('addressLine2', 'addressLine2', 'address_line2')\n assignString('buildingNumber', 'buildingNumber', 'building_number')\n assignString('flatNumber', 'flatNumber', 'flat_number')\n assignString('city', 'city')\n assignString('region', 'region')\n assignString('postalCode', 'postalCode', 'postal_code')\n assignString('country', 'country')\n assignOther('latitude', (input as any).latitude ?? null)\n assignOther('longitude', (input as any).longitude ?? null)\n assignOther('isPrimary', (input as any).isPrimary ?? (input as any).is_primary ?? false)\n\n return Object.keys(normalized).length ? normalized : null\n}\n\nconst mapSnapshotToAddressValue = (snapshot: NormalizedAddressSnapshot): AddressValue => ({\n addressLine1: readStringField(snapshot, ['addressLine1']),\n addressLine2: readStringField(snapshot, ['addressLine2']),\n buildingNumber: readStringField(snapshot, ['buildingNumber']),\n flatNumber: readStringField(snapshot, ['flatNumber']),\n city: readStringField(snapshot, ['city']),\n region: readStringField(snapshot, ['region']),\n postalCode: readStringField(snapshot, ['postalCode']),\n country: readStringField(snapshot, ['country']),\n companyName: readStringField(snapshot, ['companyName']),\n})\n\nconst snapshotKey = (snapshot?: NormalizedAddressSnapshot | null): string | null => {\n if (!snapshot || typeof snapshot !== 'object') return null\n const normalized: Record<string, unknown> = {}\n Object.keys(snapshot)\n .sort((a, b) => a.localeCompare(b))\n .forEach((key) => {\n normalized[key] = snapshot[key]\n })\n return JSON.stringify(normalized)\n}\n\nconst fallbackAddressId = (id?: string): string => id ?? 'address'\n\nconst buildAddressOption = (\n snapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null,\n opts?: { id?: string; label?: string },\n): ShipmentAddressOption | null => {\n const normalized = normalizeAddressSnapshot(snapshot)\n if (!normalized) return null\n const value = mapSnapshotToAddressValue(normalized)\n const summary = formatAddressString(value, ADDRESS_FORMAT)\n const label: string =\n (opts?.label ?? normalized.name ?? normalized.purpose ?? summary ?? normalized.companyName) ??\n fallbackAddressId(opts?.id)\n const normalizedId =\n (typeof normalized.documentAddressId === 'string' && normalized.documentAddressId) ||\n (typeof normalized.id === 'string' && normalized.id) ||\n null\n const id = opts?.id ?? normalizedId ?? fallbackAddressId(opts?.id)\n return {\n id,\n label: label || id,\n summary: summary || label || id,\n snapshot: normalized,\n }\n}\n\nconst dedupeAddressOptions = (options: ShipmentAddressOption[]): ShipmentAddressOption[] => {\n const seen = new Set<string>()\n return options.reduce<ShipmentAddressOption[]>((acc, option) => {\n const key = snapshotKey(option.snapshot) ?? option.id\n if (seen.has(key)) return acc\n seen.add(key)\n acc.push(option)\n return acc\n }, [])\n}\n\nconst extractShipmentAddressSnapshot = (\n metadata?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!metadata || typeof metadata !== 'object') return null\n const raw = (metadata as any)[ADDRESS_SNAPSHOT_KEY]\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null\n return normalizeAddressSnapshot(raw as Record<string, unknown>)\n}\n\nexport function ShipmentDialog({\n open,\n mode,\n shipment,\n lines,\n orderId,\n currencyCode,\n organizationId,\n tenantId,\n computeAvailable,\n shippingAddressSnapshot,\n onClose,\n onSaved,\n onAddComment,\n}: ShipmentDialogProps) {\n const t = useT()\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [shippingMethods, setShippingMethods] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<ShipmentAddressOption[]>([])\n const [addressLoading, setAddressLoading] = React.useState(false)\n const [addressError, setAddressError] = React.useState<string | null>(null)\n const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([])\n const [shipmentStatuses, setShipmentStatuses] = React.useState<StatusOption[]>([])\n const [documentStatusLoading, setDocumentStatusLoading] = React.useState(false)\n const [lineStatusLoading, setLineStatusLoading] = React.useState(false)\n const [shipmentStatusLoading, setShipmentStatusLoading] = React.useState(false)\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const itemErrorSetterRef = React.useRef<((errors: Record<string, string | undefined>) => void) | null>(null)\n\n const baseItems = React.useMemo(\n () =>\n lines.reduce<Record<string, string>>((acc, line) => {\n acc[line.id] = ''\n return acc\n }, {}),\n [lines],\n )\n\n const shipmentAddressSnapshot = React.useMemo(\n () => extractShipmentAddressSnapshot(shipment?.metadata),\n [shipment?.metadata],\n )\n\n const normalizedShippingAddressSnapshot = React.useMemo(\n () => normalizeAddressSnapshot(shippingAddressSnapshot ?? null),\n [shippingAddressSnapshot],\n )\n\n const shippingAddressOption = React.useMemo(\n () =>\n buildAddressOption(normalizedShippingAddressSnapshot ?? null, {\n id: 'shipping-address',\n label: t('sales.documents.shipments.shippingAddressLabel', 'Shipping address'),\n }),\n [normalizedShippingAddressSnapshot, t],\n )\n\n const shipmentAddressOption = React.useMemo(\n () =>\n buildAddressOption(shipmentAddressSnapshot ?? null, {\n id: 'shipment-address',\n label: t('sales.documents.shipments.shipmentAddressLabel', 'Shipment address'),\n }),\n [shipmentAddressSnapshot, t],\n )\n\n const baseAddressOptions = React.useMemo(\n () =>\n dedupeAddressOptions(\n [shippingAddressOption, shipmentAddressOption].filter(\n (entry): entry is ShipmentAddressOption => Boolean(entry),\n ),\n ),\n [shipmentAddressOption, shippingAddressOption],\n )\n\n const preferredAddressId = React.useMemo(() => {\n const shipmentKey = snapshotKey(shipmentAddressSnapshot)\n if (shipmentKey) {\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shipmentKey\n )\n if (match) return match.id\n }\n if (normalizedShippingAddressSnapshot) {\n const shippingKey = snapshotKey(normalizedShippingAddressSnapshot)\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shippingKey\n )\n if (match) return match.id\n }\n return baseAddressOptions[0]?.id ?? ''\n }, [baseAddressOptions, shipmentAddressSnapshot, normalizedShippingAddressSnapshot])\n\n const initialValues = React.useMemo(\n () => ({\n shipmentNumber: shipment?.shipmentNumber ?? '',\n carrierName: shipment?.carrierName ?? '',\n shippingMethodId: shipment?.shippingMethodId ?? '',\n shipmentAddressId: preferredAddressId,\n shippedAt: shipment?.shippedAt ? shipment.shippedAt.slice(0, 10) : '',\n deliveredAt: shipment?.deliveredAt ? shipment.deliveredAt.slice(0, 10) : '',\n trackingNumbers: shipment?.trackingNumbers?.join('\\n') ?? '',\n notes: shipment?.notes ?? '',\n statusEntryId: shipment?.statusEntryId ?? '',\n documentStatusEntryId: '',\n lineStatusEntryId: '',\n postComment: true,\n addShippingAdjustment: !shipment,\n items: lines.reduce<Record<string, string>>((acc, line) => {\n const found = shipment?.items.find((item) => item.orderLineId === line.id)\n acc[line.id] = found ? String(found.quantity) : ''\n return acc\n }, baseItems),\n ...extractCustomFieldValues(shipment),\n }),\n [\n baseItems,\n lines,\n mode,\n preferredAddressId,\n shipment?.carrierName,\n shipment?.customValues,\n shipment?.deliveredAt,\n shipment?.items,\n shipment?.metadata,\n shipment?.notes,\n shipment?.shipmentNumber,\n shipment?.shippedAt,\n shipment?.shippingMethodId,\n shipment?.statusEntryId,\n shipment?.trackingNumbers,\n shippingAddressSnapshot,\n shipmentAddressSnapshot,\n ],\n )\n\n const addressOptionsMap = React.useMemo(() => {\n const map = new Map<string, ShipmentAddressOption>()\n addressOptions.forEach((option) => map.set(option.id, option))\n return map\n }, [addressOptions])\n\n const registerItemErrors = React.useCallback((updater: (errors: Record<string, string | undefined>) => void) => {\n itemErrorSetterRef.current = updater\n }, [])\n\n const clearItemErrors = React.useCallback(() => {\n itemErrorSetterRef.current?.({})\n }, [])\n\n const ensureShippingMethodOption = React.useCallback(\n (option: ShippingMethodOption | null) => {\n if (!option) return\n setShippingMethods((prev) => {\n if (prev.some((entry) => entry.id === option.id)) return prev\n return [...prev, option]\n })\n },\n [],\n )\n\n const mapDocumentAddressOption = React.useCallback(\n (item: Record<string, unknown>): ShipmentAddressOption | null => {\n const snapshot = normalizeAddressSnapshot({\n documentAddressId: readStringField(item, ['id']),\n customerAddressId: readStringField(item, ['customer_address_id', 'customerAddressId']),\n name: readStringField(item, ['name']),\n purpose: readStringField(item, ['purpose']),\n companyName: readStringField(item, ['company_name', 'companyName']),\n addressLine1: readStringField(item, ['address_line1', 'addressLine1']),\n addressLine2: readStringField(item, ['address_line2', 'addressLine2']),\n buildingNumber: readStringField(item, ['building_number', 'buildingNumber']),\n flatNumber: readStringField(item, ['flat_number', 'flatNumber']),\n city: readStringField(item, ['city']),\n region: readStringField(item, ['region']),\n postalCode: readStringField(item, ['postal_code', 'postalCode']),\n country: readStringField(item, ['country']),\n })\n if (!snapshot) return null\n const label =\n snapshot.name ??\n snapshot.purpose ??\n t('sales.documents.shipments.addressFallback', 'Document address')\n const id =\n readStringField(item, ['id']) ??\n readStringField(item, ['customer_address_id', 'customerAddressId']) ??\n undefined\n return buildAddressOption(snapshot, { id, label })\n },\n [t],\n )\n\n const mergeAddressOptions = React.useCallback(\n (options: ShipmentAddressOption[]) =>\n setAddressOptions((prev) => dedupeAddressOptions([...prev, ...options])),\n [],\n )\n\n const loadAddressOptions = React.useCallback(async () => {\n setAddressLoading(true)\n try {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '100',\n documentId: orderId,\n documentKind: 'order',\n })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/document-addresses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((item) => mapDocumentAddressOption(item))\n .filter((entry): entry is ShipmentAddressOption => Boolean(entry))\n mergeAddressOptions(mapped)\n setAddressError(null)\n return mapped\n } catch (err) {\n console.error('sales.shipments.addresses.load', err)\n setAddressError(\n t('sales.documents.shipments.addressLoadError', 'Failed to load addresses.'),\n )\n return []\n } finally {\n setAddressLoading(false)\n }\n }, [mapDocumentAddressOption, mergeAddressOptions, orderId, t])\n\n const buildPriceSubtitle = React.useCallback(\n (option: ShippingMethodOption): string | undefined => {\n const currency = option.currencyCode ?? currencyCode ?? undefined\n const parts: string[] = []\n if (option.avgPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodAvg', 'Avg {{price}}', {\n price: formatMoney(option.avgPrice, currency ?? null),\n }),\n )\n }\n if (option.minPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodMin', 'Min {{price}}', {\n price: formatMoney(option.minPrice, currency ?? null),\n }),\n )\n }\n if (parts.length === 0) return undefined\n return parts.join(' \u00B7 ')\n },\n [currencyCode, t],\n )\n\n const mapShippingMethod = React.useCallback(\n (item: Record<string, unknown>): ShippingMethodOption | null => {\n const id = typeof item.id === 'string' ? item.id : null\n const name = typeof item.name === 'string' ? item.name : null\n const code = typeof (item as any).code === 'string' ? (item as any).code : null\n if (!id || !name) return null\n const baseRateNet = normalizePrice((item as any).baseRateNet ?? (item as any).base_rate_net)\n const baseRateGross = normalizePrice((item as any).baseRateGross ?? (item as any).base_rate_gross)\n const prices = [baseRateNet, baseRateGross].filter((value): value is number => Number.isFinite(value))\n const minPrice = prices.length ? Math.min(...prices) : null\n const avgPrice = prices.length ? prices.reduce((acc, value) => acc + value, 0) / prices.length : null\n return {\n id,\n name,\n code: code ?? id,\n currencyCode: typeof (item as any).currencyCode === 'string' ? (item as any).currencyCode : null,\n baseRateNet,\n baseRateGross,\n minPrice,\n avgPrice,\n }\n },\n [],\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string, opts?: { applyLoadingState?: boolean }): Promise<ShippingMethodOption[]> => {\n const applyLoadingState = opts?.applyLoadingState !== false\n if (applyLoadingState) setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim().length) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const options = items\n .map((item) => mapShippingMethod(item))\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) {\n setShippingMethods(options)\n }\n return options\n } catch (err) {\n console.error('sales.shipments.shipping-methods.load', err)\n return []\n } finally {\n if (applyLoadingState) setShippingMethodLoading(false)\n }\n },\n [mapShippingMethod],\n )\n\n const fetchShippingMethodItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!query || !query.trim()) {\n const options =\n shippingMethods.length > 0\n ? shippingMethods\n : await loadShippingMethods(undefined, { applyLoadingState: true })\n return options.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n }\n\n const options = await loadShippingMethods(query, { applyLoadingState: false })\n const needle = query?.trim().toLowerCase() ?? ''\n const filtered = options.filter(\n (opt) =>\n !needle ||\n opt.name.toLowerCase().includes(needle) ||\n opt.code.toLowerCase().includes(needle),\n )\n return filtered.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [buildPriceSubtitle, loadShippingMethods, shippingMethods],\n )\n\n const renderStatusIcon = React.useCallback(\n (color?: string | null) => (\n <span\n className=\"h-2.5 w-2.5 rounded-full border border-border/70\"\n style={color ? { backgroundColor: color, borderColor: color } : undefined}\n />\n ),\n [],\n )\n\n const loadDocumentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setDocumentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setDocumentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.shipments.statuses.load', err)\n setDocumentStatuses([])\n return []\n } finally {\n setDocumentStatusLoading(false)\n }\n }, [])\n\n const loadLineStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setLineStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-line-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setLineStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.shipments.line-statuses.load', err)\n setLineStatuses([])\n return []\n } finally {\n setLineStatusLoading(false)\n }\n }, [])\n\n const loadShipmentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setShipmentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipment-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setShipmentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.shipments.statuses.load', err)\n setShipmentStatuses([])\n return []\n } finally {\n setShipmentStatusLoading(false)\n }\n }, [])\n\n const fetchDocumentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n documentStatuses.length && !query ? documentStatuses : await loadDocumentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [documentStatuses, loadDocumentStatuses, renderStatusIcon],\n )\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options = lineStatuses.length && !query ? lineStatuses : await loadLineStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [lineStatuses, loadLineStatuses, renderStatusIcon],\n )\n\n const fetchShipmentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n shipmentStatuses.length && !query ? shipmentStatuses : await loadShipmentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [loadShipmentStatuses, renderStatusIcon, shipmentStatuses],\n )\n\n React.useEffect(() => {\n if (!open) return\n setFormResetKey((prev) => prev + 1)\n if (!shippingMethods.length) {\n void loadShippingMethods()\n }\n setAddressOptions(baseAddressOptions)\n setAddressError(null)\n if (!addressOptions.length) {\n void loadAddressOptions()\n }\n if (!shipmentStatuses.length) {\n void loadShipmentStatuses()\n }\n if (!documentStatuses.length && mode === 'create') {\n void loadDocumentStatuses()\n }\n if (!lineStatuses.length && mode === 'create') {\n void loadLineStatuses()\n }\n }, [\n addressOptions.length,\n baseAddressOptions,\n documentStatuses.length,\n loadAddressOptions,\n loadDocumentStatuses,\n loadShipmentStatuses,\n loadLineStatuses,\n loadShippingMethods,\n mode,\n open,\n lineStatuses.length,\n shipmentStatuses.length,\n shippingMethods.length,\n ])\n\n React.useEffect(() => {\n if (shipment?.shippingMethodId) {\n ensureShippingMethodOption(\n mapShippingMethod({\n id: shipment.shippingMethodId,\n name: shipment.shippingMethodName ?? shipment.shippingMethodCode ?? shipment.shippingMethodId,\n code: shipment.shippingMethodCode ?? shipment.shippingMethodId,\n currencyCode: currencyCode ?? null,\n }),\n )\n }\n }, [\n currencyCode,\n ensureShippingMethodOption,\n mapShippingMethod,\n shipment?.shippingMethodCode,\n shipment?.shippingMethodId,\n shipment?.shippingMethodName,\n ])\n\n React.useEffect(() => {\n if (!open) return\n mergeAddressOptions(baseAddressOptions)\n }, [baseAddressOptions, mergeAddressOptions, open])\n\n const fetchAddressItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!addressOptions.length && !addressLoading) {\n await loadAddressOptions()\n }\n const needle = query?.trim().toLowerCase() ?? ''\n return addressOptions\n .filter((option) => {\n if (!needle) return true\n return (\n option.label.toLowerCase().includes(needle) ||\n option.summary.toLowerCase().includes(needle)\n )\n })\n .map((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.summary,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <MapPin className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [addressLoading, addressOptions, loadAddressOptions],\n )\n\n const validateItems = React.useCallback(\n (itemsValue: unknown) => {\n const entries = Object.entries((itemsValue ?? {}) as Record<string, unknown>)\n .map(([lineId, value]) => ({ lineId, quantity: Number(value) }))\n .filter((entry) => Number.isFinite(entry.quantity) && entry.quantity > 0)\n if (!entries.length) {\n clearItemErrors()\n throw createCrudFormError(\n t('sales.documents.shipments.errorItems', 'Ship at least one line item.'),\n { items: t('sales.documents.shipments.errorItems', 'Ship at least one line item.') },\n )\n }\n const errors: Record<string, string> = {}\n entries.forEach((entry) => {\n const available = computeAvailable(entry.lineId, shipment?.id ?? null)\n if (entry.quantity > available + 1e-6) {\n errors[entry.lineId] = t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.')\n }\n })\n if (Object.keys(errors).length) {\n itemErrorSetterRef.current?.(errors)\n throw createCrudFormError(\n t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.'),\n { items: t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.') },\n )\n }\n clearItemErrors()\n return entries\n },\n [clearItemErrors, computeAvailable, shipment?.id, t],\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const shipmentNumber =\n typeof values.shipmentNumber === 'string' ? values.shipmentNumber.trim() : ''\n if (!shipmentNumber.length) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorNumber', 'Shipment number is required.'),\n { shipmentNumber: t('sales.documents.shipments.errorNumber', 'Shipment number is required.') },\n )\n }\n const shippingMethodId =\n typeof values.shippingMethodId === 'string' && values.shippingMethodId.trim().length\n ? values.shippingMethodId\n : ''\n if (!shippingMethodId) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.'),\n { shippingMethodId: t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.') },\n )\n }\n const items = validateItems(values.items)\n const shipmentAddressId =\n typeof values.shipmentAddressId === 'string' ? values.shipmentAddressId : ''\n const addressOption = shipmentAddressId\n ? addressOptionsMap.get(shipmentAddressId) ?? null\n : null\n const fallbackAddress = addressOptions.length === 1 ? addressOptions[0] : null\n const addressSnapshot = addressOption?.snapshot ?? fallbackAddress?.snapshot ?? null\n if (!addressSnapshot) {\n const message = addressOptions.length\n ? t('sales.documents.shipments.errorAddress', 'Select an address to ship to.')\n : t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )\n throw createCrudFormError(message, { shipmentAddressId: message })\n }\n const payload: Record<string, unknown> = {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n shipmentNumber,\n shippingMethodId,\n statusEntryId:\n typeof values.statusEntryId === 'string' && values.statusEntryId.trim().length\n ? values.statusEntryId\n : undefined,\n carrierName:\n typeof values.carrierName === 'string' && values.carrierName.trim().length\n ? values.carrierName.trim()\n : undefined,\n trackingNumbers: parseTrackingNumbers(\n typeof values.trackingNumbers === 'string' ? values.trackingNumbers : '',\n ),\n shippedAt:\n typeof values.shippedAt === 'string' && values.shippedAt.trim().length\n ? new Date(values.shippedAt)\n : undefined,\n deliveredAt:\n typeof values.deliveredAt === 'string' && values.deliveredAt.trim().length\n ? new Date(values.deliveredAt)\n : undefined,\n notes:\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : undefined,\n items: items.map((item) => ({\n orderLineId: item.lineId,\n quantity: item.quantity,\n })),\n }\n payload.shipmentAddressSnapshot = addressSnapshot\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n if (Object.keys(customFields).length) {\n payload.customFields = customFields\n }\n if (mode === 'create') {\n const documentStatusEntryId =\n typeof values.documentStatusEntryId === 'string' && values.documentStatusEntryId.trim().length\n ? values.documentStatusEntryId\n : null\n const lineStatusEntryId =\n typeof values.lineStatusEntryId === 'string' && values.lineStatusEntryId.trim().length\n ? values.lineStatusEntryId\n : null\n if (documentStatusEntryId) {\n payload.documentStatusEntryId = documentStatusEntryId\n }\n if (lineStatusEntryId) {\n payload.lineStatusEntryId = lineStatusEntryId\n }\n }\n\n const action = shipment?.id ? updateCrud : createCrud\n const result = await action(\n 'sales/shipments',\n shipment?.id ? { id: shipment.id, ...payload } : payload,\n {\n errorMessage: t('sales.documents.shipments.errorSave', 'Failed to save shipment.'),\n },\n )\n if (result.ok) {\n const shipmentId = ((result.result as any)?.id as string | undefined) ?? shipment?.id ?? null\n const shouldAddShippingAdjustment =\n mode === 'create' &&\n Boolean(values.addShippingAdjustment) &&\n shipmentId\n if (shouldAddShippingAdjustment) {\n const method = shippingMethods.find((entry) => entry.id === shippingMethodId) ?? null\n const totalQuantity = items.reduce((acc, item) => acc + item.quantity, 0)\n const unitGross =\n method?.baseRateGross ??\n method?.avgPrice ??\n method?.minPrice ??\n (method?.baseRateNet ?? null)\n const unitNet = method?.baseRateNet ?? null\n const amountGross =\n typeof unitGross === 'number' && Number.isFinite(unitGross) && totalQuantity > 0\n ? roundAmount(Math.max(unitGross * totalQuantity, 0))\n : null\n const amountNet =\n typeof unitNet === 'number' && Number.isFinite(unitNet) && totalQuantity > 0\n ? roundAmount(Math.max(unitNet * totalQuantity, 0))\n : null\n const currency =\n typeof method?.currencyCode === 'string' && method.currencyCode.trim().length\n ? method.currencyCode.trim().toUpperCase()\n : typeof currencyCode === 'string' && currencyCode.trim().length\n ? currencyCode.trim().toUpperCase()\n : null\n\n if (amountGross !== null || amountNet !== null) {\n try {\n await createCrud(\n 'sales/order-adjustments',\n {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n scope: 'order',\n kind: 'shipping',\n label:\n method?.name ??\n t('sales.documents.shipments.shippingAdjustmentLabel', 'Shipping cost'),\n code: shipmentNumber ? `ship-${shipmentNumber}` : undefined,\n amountGross: amountGross ?? undefined,\n amountNet: amountNet ?? undefined,\n currencyCode: currency ?? undefined,\n metadata: {\n shipmentId,\n shippingMethodId,\n calculation: 'per_item_base_rate',\n quantity: totalQuantity,\n },\n },\n {\n errorMessage: t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n },\n )\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n } catch (err) {\n console.warn('sales.shipments.adjustment.create', err)\n flash(\n t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n 'warning',\n )\n }\n }\n }\n if (values.postComment && onAddComment) {\n const lineTitles = items\n .map((item) => {\n const line = lines.find((entry) => entry.id === item.lineId)\n return `${item.quantity}\u00D7 ${line?.title ?? item.lineId}`\n })\n .join(', ')\n const commentNotes =\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : ''\n const label =\n shipmentNumber.length > 0\n ? `#${shipmentNumber}`\n : shipment?.id\n ? `#${shipment.id.slice(0, 6)}`\n : ''\n const noteParts = [\n t('sales.documents.shipments.comment', 'Shipment {{number}} updated: {{summary}}', {\n number: label || String((result.result as any)?.id ?? ''),\n summary: lineTitles,\n }),\n ]\n if (commentNotes) {\n noteParts.push(\n t('sales.documents.shipments.commentNotes', 'Notes: {{notes}}', { notes: commentNotes }),\n )\n }\n const note = noteParts.join('\\n\\n')\n try {\n await onAddComment(note)\n } catch (err) {\n console.warn('sales.shipments.comment', err)\n }\n }\n await onSaved()\n }\n },\n [\n currencyCode,\n lines,\n mode,\n onAddComment,\n onSaved,\n orderId,\n organizationId,\n shipment?.id,\n addressOptions,\n addressOptionsMap,\n shippingMethods,\n t,\n tenantId,\n validateItems,\n ],\n )\n\n const handleShortcutSubmit = React.useCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n const form = dialogContentRef.current?.querySelector('form')\n form?.requestSubmit()\n }\n }, [])\n\n const fields = React.useMemo<CrudField[]>(() => {\n const shippingAdjustmentLabel = t(\n 'sales.documents.shipments.addShippingAdjustment',\n 'Add shipping cost adjustment for this shipment',\n )\n const shippingAdjustmentHelp = t(\n 'sales.documents.shipments.addShippingAdjustmentHelp',\n 'Create a shipping adjustment using this carrier\u2019s calculated cost.',\n )\n function ShipmentItemsField({ value, setValue }: CrudCustomFieldRenderProps) {\n const quantities = (value as Record<string, string | number> | null) ?? {}\n const [lineErrors, setLineErrors] = React.useState<Record<string, string | undefined>>({})\n\n React.useEffect(() => {\n registerItemErrors(setLineErrors)\n return () => {\n if (itemErrorSetterRef.current === setLineErrors) {\n itemErrorSetterRef.current = null\n }\n }\n }, [])\n\n if (lines.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.shipments.noLines', 'No order lines available.')}\n </p>\n )\n }\n\n return (\n <div className=\"space-y-2 rounded-lg border p-3\">\n {lines.map((line) => {\n const available = computeAvailable(line.id, shipment?.id ?? null)\n const rawValue = quantities[line.id]\n const valueString =\n typeof rawValue === 'number'\n ? rawValue.toString()\n : typeof rawValue === 'string'\n ? rawValue\n : ''\n const disabled = available <= 0 && !valueString\n const lineError = lineErrors[line.id]\n return (\n <div\n key={line.id}\n className={cn(\n 'grid gap-3 md:grid-cols-[1fr,140px]',\n disabled ? 'opacity-60' : null,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {line.thumbnail ? (\n <img\n src={line.thumbnail}\n alt={line.title}\n className=\"h-12 w-12 rounded-md border object-cover\"\n />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md border bg-muted text-[10px] text-muted-foreground\">\n N/A\n </div>\n )}\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {line.lineNumber ? `#${line.lineNumber} \u00B7 ` : null}\n {line.title}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.shipments.available', '{{count}} available', {\n count: available,\n })}\n </p>\n </div>\n </div>\n <div className=\"space-y-1\">\n <Input\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n value={valueString}\n disabled={disabled}\n onChange={(event) => {\n const next = event.target.value\n setValue({ ...(quantities ?? {}), [line.id]: next })\n setLineErrors((prev) => ({ ...prev, [line.id]: undefined }))\n }}\n />\n {lineError ? <p className=\"text-xs text-destructive\">{lineError}</p> : null}\n </div>\n </div>\n )\n })}\n </div>\n )\n }\n\n function ShipmentAddressField({ value, setValue }: CrudCustomFieldRenderProps) {\n const currentValue = typeof value === 'string' ? value : ''\n React.useEffect(() => {\n if (!currentValue && addressOptions.length) {\n setValue(addressOptions[0].id)\n }\n }, [addressOptions, currentValue, setValue])\n const disabled = addressLoading || !addressOptions.length\n return (\n <div className=\"space-y-2\">\n <LookupSelect\n value={currentValue || null}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchAddressItems}\n placeholder={t('sales.documents.shipments.addressPlaceholder', 'Select address')}\n searchPlaceholder={t('sales.documents.shipments.addressSearch', 'Search address')}\n minQuery={0}\n disabled={disabled}\n loading={addressLoading}\n defaultOpen\n />\n {!addressLoading && !addressOptions.length ? (\n <p className=\"text-xs text-destructive\">\n {t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )}\n </p>\n ) : null}\n {addressError ? <p className=\"text-xs text-destructive\">{addressError}</p> : null}\n </div>\n )\n }\n\n const itemsField: CrudField = {\n id: 'items',\n label: t('sales.documents.shipments.items', 'Items to ship'),\n type: 'custom',\n component: ShipmentItemsField,\n }\n\n return [\n {\n id: 'shipmentNumber',\n label: t('sales.documents.shipments.number', 'Shipment number'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'carrierName',\n label: t('sales.documents.shipments.carrier', 'Carrier'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'shippingMethodId',\n label: t('sales.documents.shipments.shippingMethod', 'Shipping method'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShippingMethodItems}\n placeholder={t('sales.documents.shipments.shippingMethodPlaceholder', 'Select method')}\n loading={shippingMethodLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'statusEntryId',\n label: t('sales.documents.shipments.status', 'Shipment status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShipmentStatusItems}\n placeholder={t('sales.documents.shipments.statusPlaceholder', 'Select shipment status')}\n loading={shipmentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ...(mode === 'create'\n ? ([\n {\n id: 'documentStatusEntryId',\n label: t('sales.documents.status.changeDocument', 'Change order/quote status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchDocumentStatusItems}\n placeholder={t(\n 'sales.documents.status.documentPlaceholder',\n 'Select new order/quote status',\n )}\n loading={documentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'lineStatusEntryId',\n label: t('sales.documents.status.changeLine', 'Change order/quote item status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchLineStatusItems}\n placeholder={t(\n 'sales.documents.status.linePlaceholder',\n 'Select item status',\n )}\n loading={lineStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ] as CrudField[])\n : []),\n {\n id: 'shipmentAddressId',\n label: t('sales.documents.shipments.address', 'Ship to'),\n type: 'custom',\n required: true,\n component: ShipmentAddressField,\n },\n {\n id: 'shippedAt',\n label: t('sales.documents.shipments.shippedAt', 'Shipped date'),\n type: 'date',\n },\n {\n id: 'deliveredAt',\n label: t('sales.documents.shipments.deliveredAt', 'Delivered date'),\n type: 'date',\n },\n {\n id: 'trackingNumbers',\n label: t('sales.documents.shipments.trackingNumbers', 'Tracking numbers'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={2}\n placeholder={t(\n 'sales.documents.shipments.trackingPlaceholder',\n 'One per line or comma separated',\n )}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'notes',\n label: t('sales.documents.shipments.notes', 'Notes'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'addShippingAdjustment',\n label: shippingAdjustmentLabel,\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-start gap-2\">\n <Switch\n id={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n aria-labelledby={SHIPPING_ADJUSTMENT_LABEL_ID}\n aria-describedby={SHIPPING_ADJUSTMENT_HELP_ID}\n />\n <div className=\"space-y-1\">\n <Label\n htmlFor={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n id={SHIPPING_ADJUSTMENT_LABEL_ID}\n className=\"sr-only\"\n >\n {shippingAdjustmentLabel}\n </Label>\n <p id={SHIPPING_ADJUSTMENT_HELP_ID} className=\"text-xs text-muted-foreground\">\n {shippingAdjustmentHelp}\n </p>\n </div>\n </div>\n ),\n },\n itemsField,\n {\n id: 'postComment',\n label: t('sales.documents.shipments.addComment', 'Add note to comments'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"shipment-comment\"\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n />\n <Label htmlFor=\"shipment-comment\" className=\"cursor-pointer\">\n {t('sales.documents.shipments.addComment', 'Add note to comments')}\n </Label>\n </div>\n ),\n },\n ]\n }, [\n addressError,\n addressLoading,\n addressOptions,\n computeAvailable,\n documentStatusLoading,\n fetchAddressItems,\n fetchDocumentStatusItems,\n fetchLineStatusItems,\n fetchShipmentStatusItems,\n fetchShippingMethodItems,\n lineStatusLoading,\n lines,\n mode,\n registerItemErrors,\n shipment?.id,\n shipmentStatusLoading,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => {\n const base: CrudFormGroup[] = [\n {\n id: 'shipmentDetails',\n title: mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment'),\n column: 1,\n fields: ['shipmentNumber', 'carrierName', 'shippingMethodId', 'statusEntryId', 'shipmentAddressId'],\n },\n ]\n if (mode === 'create') {\n base.push({\n id: 'statusChanges',\n title: t('sales.documents.status.sectionTitle', 'Status changes'),\n column: 2,\n fields: ['documentStatusEntryId', 'lineStatusEntryId'],\n })\n }\n base.push(\n {\n id: 'tracking',\n title: t('sales.documents.shipments.trackingGroup', 'Tracking information'),\n column: 2,\n fields: ['shippedAt', 'deliveredAt', 'trackingNumbers', 'notes'],\n },\n {\n id: 'items',\n column: 1,\n fields: ['items', 'addShippingAdjustment', 'postComment'],\n },\n {\n id: 'shipmentCustomFields',\n title: t('entities.customFields.title', 'Custom fields'),\n column: 2,\n kind: 'customFields',\n },\n )\n return base\n },\n [mode, t],\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => (!next ? onClose() : undefined)}>\n <DialogContent\n ref={dialogContentRef}\n className=\"sm:max-w-5xl\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onClose()\n }\n handleShortcutSubmit(event)\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n key={formResetKey}\n embedded\n entityId={E.sales.sales_shipment}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n submitLabel={t('sales.documents.shipments.saveShortcut', 'Save (\u2318/Ctrl+Enter)')}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.shipments.loading', 'Loading shipments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n isLoading={shippingMethodLoading || addressLoading}\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { MapPin, Truck } from 'lucide-react'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\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 { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\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 { cn } from '@open-mercato/shared/lib/utils'\nimport { E } from '#generated/entities.ids.generated'\nimport { emitSalesDocumentTotalsRefresh } from '@open-mercato/core/modules/sales/lib/frontend/documentTotalsEvents'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { formatMoney, normalizeNumber } from './lineItemUtils'\nimport type { OrderLine, ShipmentRow } from './shipmentTypes'\nimport { formatAddressString, type AddressFormatStrategy, type AddressValue } from '@open-mercato/core/modules/customers/utils/addressFormat'\nimport { normalizeCustomFieldSubmitValue, extractCustomFieldValues } from './customFieldHelpers'\n\ntype ShippingMethodOption = {\n id: string\n name: string\n code: string\n currencyCode: string | null\n baseRateNet: number | null\n baseRateGross: number | null\n minPrice: number | null\n avgPrice: number | null\n}\n\ntype ShipmentDialogProps = {\n open: boolean\n mode: 'create' | 'edit'\n shipment: ShipmentRow | null\n lines: OrderLine[]\n orderId: string\n currencyCode?: string | null\n organizationId: string | null\n tenantId: string | null\n computeAvailable: (lineId: string, excludeShipmentId?: string | null) => number\n shippingAddressSnapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null\n onClose: () => void\n onSaved: () => Promise<void>\n onAddComment?: (body: string) => Promise<void>\n}\n\ntype ShipmentAddressOption = {\n id: string\n label: string\n summary: string\n snapshot: NormalizedAddressSnapshot\n}\n\ntype StatusOption = {\n id: string\n value: string\n label: string\n color: string | null\n}\n\nconst ADDRESS_SNAPSHOT_KEY = 'shipmentAddressSnapshot'\nconst ADDRESS_FORMAT: AddressFormatStrategy = 'line_first'\nconst SHIPPING_ADJUSTMENT_TOGGLE_ID = 'shipment-add-shipping-adjustment'\nconst SHIPPING_ADJUSTMENT_LABEL_ID = 'shipment-add-shipping-adjustment-label'\nconst SHIPPING_ADJUSTMENT_HELP_ID = 'shipment-add-shipping-adjustment-help'\n\ntype NormalizedAddressSnapshot = {\n id?: string\n documentAddressId?: string\n name?: string\n purpose?: string\n companyName?: string\n addressLine1?: string\n addressLine2?: string\n buildingNumber?: string\n flatNumber?: string\n city?: string\n region?: string\n postalCode?: string\n country?: string\n latitude?: number\n longitude?: number\n isPrimary?: boolean\n [key: string]: string | number | boolean | null | undefined\n}\n\nconst parseTrackingNumbers = (value: string | null | undefined): string[] =>\n (value ?? '')\n .split(/[\\n,]/g)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n\nconst normalizePrice = (value: unknown): number | null => {\n const parsed = normalizeNumber(value, NaN)\n if (!Number.isFinite(parsed)) return null\n if (parsed <= 0) return null\n return parsed\n}\n\nconst roundAmount = (value: number): number => Math.round((value + Number.EPSILON) * 100) / 100\n\nconst readStringField = (input: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = input[key]\n if (typeof value === 'string' && value.trim().length) return value.trim()\n }\n return null\n}\n\nconst normalizeAddressSnapshot = (\n input?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!input || typeof input !== 'object') return null\n const normalized: NormalizedAddressSnapshot = {}\n const assignString = (target: string, ...sourceKeys: string[]) => {\n const value = readStringField(input as Record<string, unknown>, sourceKeys)\n if (value) normalized[target] = value\n }\n const assignOther = (target: string, value: unknown) => {\n if (typeof value === 'boolean') {\n normalized[target] = value\n } else if (typeof value === 'number' && Number.isFinite(value)) {\n normalized[target] = value\n }\n }\n\n const id =\n readStringField(input as Record<string, unknown>, ['customerAddressId', 'customer_address_id']) ??\n readStringField(input as Record<string, unknown>, ['id'])\n if (id) normalized.id = id\n const documentAddressId = readStringField(input as Record<string, unknown>, ['documentAddressId', 'document_address_id'])\n if (documentAddressId && documentAddressId !== id) normalized.documentAddressId = documentAddressId\n\n assignString('name', 'name')\n assignString('purpose', 'purpose')\n assignString('companyName', 'companyName', 'company_name')\n assignString('addressLine1', 'addressLine1', 'address_line1')\n assignString('addressLine2', 'addressLine2', 'address_line2')\n assignString('buildingNumber', 'buildingNumber', 'building_number')\n assignString('flatNumber', 'flatNumber', 'flat_number')\n assignString('city', 'city')\n assignString('region', 'region')\n assignString('postalCode', 'postalCode', 'postal_code')\n assignString('country', 'country')\n assignOther('latitude', (input as any).latitude ?? null)\n assignOther('longitude', (input as any).longitude ?? null)\n assignOther('isPrimary', (input as any).isPrimary ?? (input as any).is_primary ?? false)\n\n return Object.keys(normalized).length ? normalized : null\n}\n\nconst mapSnapshotToAddressValue = (snapshot: NormalizedAddressSnapshot): AddressValue => ({\n addressLine1: readStringField(snapshot, ['addressLine1']),\n addressLine2: readStringField(snapshot, ['addressLine2']),\n buildingNumber: readStringField(snapshot, ['buildingNumber']),\n flatNumber: readStringField(snapshot, ['flatNumber']),\n city: readStringField(snapshot, ['city']),\n region: readStringField(snapshot, ['region']),\n postalCode: readStringField(snapshot, ['postalCode']),\n country: readStringField(snapshot, ['country']),\n companyName: readStringField(snapshot, ['companyName']),\n})\n\nconst snapshotKey = (snapshot?: NormalizedAddressSnapshot | null): string | null => {\n if (!snapshot || typeof snapshot !== 'object') return null\n const normalized: Record<string, unknown> = {}\n Object.keys(snapshot)\n .sort()\n .forEach((key) => {\n normalized[key] = snapshot[key]\n })\n return JSON.stringify(normalized)\n}\n\nconst fallbackAddressId = (id?: string): string => id ?? 'address'\n\nconst buildAddressOption = (\n snapshot?: NormalizedAddressSnapshot | Record<string, unknown> | null,\n opts?: { id?: string; label?: string },\n): ShipmentAddressOption | null => {\n const normalized = normalizeAddressSnapshot(snapshot)\n if (!normalized) return null\n const value = mapSnapshotToAddressValue(normalized)\n const summary = formatAddressString(value, ADDRESS_FORMAT)\n const label: string =\n (opts?.label ?? normalized.name ?? normalized.purpose ?? summary ?? normalized.companyName) ??\n fallbackAddressId(opts?.id)\n const normalizedId =\n (typeof normalized.documentAddressId === 'string' && normalized.documentAddressId) ||\n (typeof normalized.id === 'string' && normalized.id) ||\n null\n const id = opts?.id ?? normalizedId ?? fallbackAddressId(opts?.id)\n return {\n id,\n label: label || id,\n summary: summary || label || id,\n snapshot: normalized,\n }\n}\n\nconst dedupeAddressOptions = (options: ShipmentAddressOption[]): ShipmentAddressOption[] => {\n const seen = new Set<string>()\n return options.reduce<ShipmentAddressOption[]>((acc, option) => {\n const key = snapshotKey(option.snapshot) ?? option.id\n if (seen.has(key)) return acc\n seen.add(key)\n acc.push(option)\n return acc\n }, [])\n}\n\nconst extractShipmentAddressSnapshot = (\n metadata?: Record<string, unknown> | null,\n): NormalizedAddressSnapshot | null => {\n if (!metadata || typeof metadata !== 'object') return null\n const raw = (metadata as any)[ADDRESS_SNAPSHOT_KEY]\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null\n return normalizeAddressSnapshot(raw as Record<string, unknown>)\n}\n\nexport function ShipmentDialog({\n open,\n mode,\n shipment,\n lines,\n orderId,\n currencyCode,\n organizationId,\n tenantId,\n computeAvailable,\n shippingAddressSnapshot,\n onClose,\n onSaved,\n onAddComment,\n}: ShipmentDialogProps) {\n const t = useT()\n const [formResetKey, setFormResetKey] = React.useState(0)\n const [shippingMethods, setShippingMethods] = React.useState<ShippingMethodOption[]>([])\n const [shippingMethodLoading, setShippingMethodLoading] = React.useState(false)\n const [addressOptions, setAddressOptions] = React.useState<ShipmentAddressOption[]>([])\n const [addressLoading, setAddressLoading] = React.useState(false)\n const [addressError, setAddressError] = React.useState<string | null>(null)\n const [documentStatuses, setDocumentStatuses] = React.useState<StatusOption[]>([])\n const [lineStatuses, setLineStatuses] = React.useState<StatusOption[]>([])\n const [shipmentStatuses, setShipmentStatuses] = React.useState<StatusOption[]>([])\n const [documentStatusLoading, setDocumentStatusLoading] = React.useState(false)\n const [lineStatusLoading, setLineStatusLoading] = React.useState(false)\n const [shipmentStatusLoading, setShipmentStatusLoading] = React.useState(false)\n const dialogContentRef = React.useRef<HTMLDivElement | null>(null)\n const itemErrorSetterRef = React.useRef<((errors: Record<string, string | undefined>) => void) | null>(null)\n\n const baseItems = React.useMemo(\n () =>\n lines.reduce<Record<string, string>>((acc, line) => {\n acc[line.id] = ''\n return acc\n }, {}),\n [lines],\n )\n\n const shipmentAddressSnapshot = React.useMemo(\n () => extractShipmentAddressSnapshot(shipment?.metadata),\n [shipment?.metadata],\n )\n\n const normalizedShippingAddressSnapshot = React.useMemo(\n () => normalizeAddressSnapshot(shippingAddressSnapshot ?? null),\n [shippingAddressSnapshot],\n )\n\n const shippingAddressOption = React.useMemo(\n () =>\n buildAddressOption(normalizedShippingAddressSnapshot ?? null, {\n id: 'shipping-address',\n label: t('sales.documents.shipments.shippingAddressLabel', 'Shipping address'),\n }),\n [normalizedShippingAddressSnapshot, t],\n )\n\n const shipmentAddressOption = React.useMemo(\n () =>\n buildAddressOption(shipmentAddressSnapshot ?? null, {\n id: 'shipment-address',\n label: t('sales.documents.shipments.shipmentAddressLabel', 'Shipment address'),\n }),\n [shipmentAddressSnapshot, t],\n )\n\n const baseAddressOptions = React.useMemo(\n () =>\n dedupeAddressOptions(\n [shippingAddressOption, shipmentAddressOption].filter(\n (entry): entry is ShipmentAddressOption => Boolean(entry),\n ),\n ),\n [shipmentAddressOption, shippingAddressOption],\n )\n\n const preferredAddressId = React.useMemo(() => {\n const shipmentKey = snapshotKey(shipmentAddressSnapshot)\n if (shipmentKey) {\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shipmentKey\n )\n if (match) return match.id\n }\n if (normalizedShippingAddressSnapshot) {\n const shippingKey = snapshotKey(normalizedShippingAddressSnapshot)\n const match = baseAddressOptions.find(\n (option) => snapshotKey(option.snapshot) === shippingKey\n )\n if (match) return match.id\n }\n return baseAddressOptions[0]?.id ?? ''\n }, [baseAddressOptions, shipmentAddressSnapshot, normalizedShippingAddressSnapshot])\n\n const initialValues = React.useMemo(\n () => ({\n shipmentNumber: shipment?.shipmentNumber ?? '',\n carrierName: shipment?.carrierName ?? '',\n shippingMethodId: shipment?.shippingMethodId ?? '',\n shipmentAddressId: preferredAddressId,\n shippedAt: shipment?.shippedAt ? shipment.shippedAt.slice(0, 10) : '',\n deliveredAt: shipment?.deliveredAt ? shipment.deliveredAt.slice(0, 10) : '',\n trackingNumbers: shipment?.trackingNumbers?.join('\\n') ?? '',\n notes: shipment?.notes ?? '',\n statusEntryId: shipment?.statusEntryId ?? '',\n documentStatusEntryId: '',\n lineStatusEntryId: '',\n postComment: true,\n addShippingAdjustment: !shipment,\n items: lines.reduce<Record<string, string>>((acc, line) => {\n const found = shipment?.items.find((item) => item.orderLineId === line.id)\n acc[line.id] = found ? String(found.quantity) : ''\n return acc\n }, baseItems),\n ...extractCustomFieldValues(shipment),\n }),\n [\n baseItems,\n lines,\n mode,\n preferredAddressId,\n shipment?.carrierName,\n shipment?.customValues,\n shipment?.deliveredAt,\n shipment?.items,\n shipment?.metadata,\n shipment?.notes,\n shipment?.shipmentNumber,\n shipment?.shippedAt,\n shipment?.shippingMethodId,\n shipment?.statusEntryId,\n shipment?.trackingNumbers,\n shippingAddressSnapshot,\n shipmentAddressSnapshot,\n ],\n )\n\n const addressOptionsMap = React.useMemo(() => {\n const map = new Map<string, ShipmentAddressOption>()\n addressOptions.forEach((option) => map.set(option.id, option))\n return map\n }, [addressOptions])\n\n const registerItemErrors = React.useCallback((updater: (errors: Record<string, string | undefined>) => void) => {\n itemErrorSetterRef.current = updater\n }, [])\n\n const clearItemErrors = React.useCallback(() => {\n itemErrorSetterRef.current?.({})\n }, [])\n\n const ensureShippingMethodOption = React.useCallback(\n (option: ShippingMethodOption | null) => {\n if (!option) return\n setShippingMethods((prev) => {\n if (prev.some((entry) => entry.id === option.id)) return prev\n return [...prev, option]\n })\n },\n [],\n )\n\n const mapDocumentAddressOption = React.useCallback(\n (item: Record<string, unknown>): ShipmentAddressOption | null => {\n const snapshot = normalizeAddressSnapshot({\n documentAddressId: readStringField(item, ['id']),\n customerAddressId: readStringField(item, ['customer_address_id', 'customerAddressId']),\n name: readStringField(item, ['name']),\n purpose: readStringField(item, ['purpose']),\n companyName: readStringField(item, ['company_name', 'companyName']),\n addressLine1: readStringField(item, ['address_line1', 'addressLine1']),\n addressLine2: readStringField(item, ['address_line2', 'addressLine2']),\n buildingNumber: readStringField(item, ['building_number', 'buildingNumber']),\n flatNumber: readStringField(item, ['flat_number', 'flatNumber']),\n city: readStringField(item, ['city']),\n region: readStringField(item, ['region']),\n postalCode: readStringField(item, ['postal_code', 'postalCode']),\n country: readStringField(item, ['country']),\n })\n if (!snapshot) return null\n const label =\n snapshot.name ??\n snapshot.purpose ??\n t('sales.documents.shipments.addressFallback', 'Document address')\n const id =\n readStringField(item, ['id']) ??\n readStringField(item, ['customer_address_id', 'customerAddressId']) ??\n undefined\n return buildAddressOption(snapshot, { id, label })\n },\n [t],\n )\n\n const mergeAddressOptions = React.useCallback(\n (options: ShipmentAddressOption[]) =>\n setAddressOptions((prev) => dedupeAddressOptions([...prev, ...options])),\n [],\n )\n\n const loadAddressOptions = React.useCallback(async () => {\n setAddressLoading(true)\n try {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '100',\n documentId: orderId,\n documentKind: 'order',\n })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/document-addresses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((item) => mapDocumentAddressOption(item))\n .filter((entry): entry is ShipmentAddressOption => Boolean(entry))\n mergeAddressOptions(mapped)\n setAddressError(null)\n return mapped\n } catch (err) {\n console.error('sales.shipments.addresses.load', err)\n setAddressError(\n t('sales.documents.shipments.addressLoadError', 'Failed to load addresses.'),\n )\n return []\n } finally {\n setAddressLoading(false)\n }\n }, [mapDocumentAddressOption, mergeAddressOptions, orderId, t])\n\n const buildPriceSubtitle = React.useCallback(\n (option: ShippingMethodOption): string | undefined => {\n const currency = option.currencyCode ?? currencyCode ?? undefined\n const parts: string[] = []\n if (option.avgPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodAvg', 'Avg {{price}}', {\n price: formatMoney(option.avgPrice, currency ?? null),\n }),\n )\n }\n if (option.minPrice !== null) {\n parts.push(\n t('sales.documents.shipments.shippingMethodMin', 'Min {{price}}', {\n price: formatMoney(option.minPrice, currency ?? null),\n }),\n )\n }\n if (parts.length === 0) return undefined\n return parts.join(' \u00B7 ')\n },\n [currencyCode, t],\n )\n\n const mapShippingMethod = React.useCallback(\n (item: Record<string, unknown>): ShippingMethodOption | null => {\n const id = typeof item.id === 'string' ? item.id : null\n const name = typeof item.name === 'string' ? item.name : null\n const code = typeof (item as any).code === 'string' ? (item as any).code : null\n if (!id || !name) return null\n const baseRateNet = normalizePrice((item as any).baseRateNet ?? (item as any).base_rate_net)\n const baseRateGross = normalizePrice((item as any).baseRateGross ?? (item as any).base_rate_gross)\n const prices = [baseRateNet, baseRateGross].filter((value): value is number => Number.isFinite(value))\n const minPrice = prices.length ? Math.min(...prices) : null\n const avgPrice = prices.length ? prices.reduce((acc, value) => acc + value, 0) / prices.length : null\n return {\n id,\n name,\n code: code ?? id,\n currencyCode: typeof (item as any).currencyCode === 'string' ? (item as any).currencyCode : null,\n baseRateNet,\n baseRateGross,\n minPrice,\n avgPrice,\n }\n },\n [],\n )\n\n const loadShippingMethods = React.useCallback(\n async (query?: string, opts?: { applyLoadingState?: boolean }): Promise<ShippingMethodOption[]> => {\n const applyLoadingState = opts?.applyLoadingState !== false\n if (applyLoadingState) setShippingMethodLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '50' })\n if (query && query.trim().length) params.set('search', query.trim())\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipping-methods?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const options = items\n .map((item) => mapShippingMethod(item))\n .filter((entry): entry is ShippingMethodOption => !!entry)\n if (!query) {\n setShippingMethods(options)\n }\n return options\n } catch (err) {\n console.error('sales.shipments.shipping-methods.load', err)\n return []\n } finally {\n if (applyLoadingState) setShippingMethodLoading(false)\n }\n },\n [mapShippingMethod],\n )\n\n const fetchShippingMethodItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!query || !query.trim()) {\n const options =\n shippingMethods.length > 0\n ? shippingMethods\n : await loadShippingMethods(undefined, { applyLoadingState: true })\n return options.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n }\n\n const options = await loadShippingMethods(query, { applyLoadingState: false })\n const needle = query?.trim().toLowerCase() ?? ''\n const filtered = options.filter(\n (opt) =>\n !needle ||\n opt.name.toLowerCase().includes(needle) ||\n opt.code.toLowerCase().includes(needle),\n )\n return filtered.map((option) => ({\n id: option.id,\n title: option.name,\n subtitle: [option.code, buildPriceSubtitle(option)].filter(Boolean).join(' \u2022 ') || undefined,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <Truck className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [buildPriceSubtitle, loadShippingMethods, shippingMethods],\n )\n\n const renderStatusIcon = React.useCallback(\n (color?: string | null) => (\n <span\n className=\"h-2.5 w-2.5 rounded-full border border-border/70\"\n style={color ? { backgroundColor: color, borderColor: color } : undefined}\n />\n ),\n [],\n )\n\n const loadDocumentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setDocumentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setDocumentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.shipments.statuses.load', err)\n setDocumentStatuses([])\n return []\n } finally {\n setDocumentStatusLoading(false)\n }\n }, [])\n\n const loadLineStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setLineStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/order-line-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setLineStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.shipments.line-statuses.load', err)\n setLineStatuses([])\n return []\n } finally {\n setLineStatusLoading(false)\n }\n }, [])\n\n const loadShipmentStatuses = React.useCallback(async (): Promise<StatusOption[]> => {\n setShipmentStatusLoading(true)\n try {\n const params = new URLSearchParams({ page: '1', pageSize: '100' })\n const response = await apiCall<{ items?: Array<Record<string, unknown>> }>(\n `/api/sales/shipment-statuses?${params.toString()}`,\n undefined,\n { fallback: { items: [] } },\n )\n const items = Array.isArray(response.result?.items) ? response.result.items : []\n const mapped = items\n .map((entry) => {\n const id = typeof entry.id === 'string' ? entry.id : null\n const value = typeof entry.value === 'string' ? entry.value : null\n if (!id || !value) return null\n const label =\n typeof entry.label === 'string' && entry.label.trim().length\n ? entry.label\n : value\n const color =\n typeof entry.color === 'string' && entry.color.trim().length ? entry.color : null\n return { id, value, label, color }\n })\n .filter((entry): entry is StatusOption => Boolean(entry))\n setShipmentStatuses(mapped)\n return mapped\n } catch (err) {\n console.error('sales.shipments.statuses.load', err)\n setShipmentStatuses([])\n return []\n } finally {\n setShipmentStatusLoading(false)\n }\n }, [])\n\n const fetchDocumentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n documentStatuses.length && !query ? documentStatuses : await loadDocumentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [documentStatuses, loadDocumentStatuses, renderStatusIcon],\n )\n\n const fetchLineStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options = lineStatuses.length && !query ? lineStatuses : await loadLineStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [lineStatuses, loadLineStatuses, renderStatusIcon],\n )\n\n const fetchShipmentStatusItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n const options =\n shipmentStatuses.length && !query ? shipmentStatuses : await loadShipmentStatuses()\n const term = query?.trim().toLowerCase() ?? ''\n return options\n .filter(\n (option) =>\n !term.length ||\n option.label.toLowerCase().includes(term) ||\n option.value.toLowerCase().includes(term),\n )\n .map<LookupSelectItem>((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.value,\n icon: renderStatusIcon(option.color),\n }))\n },\n [loadShipmentStatuses, renderStatusIcon, shipmentStatuses],\n )\n\n React.useEffect(() => {\n if (!open) return\n setFormResetKey((prev) => prev + 1)\n if (!shippingMethods.length) {\n void loadShippingMethods()\n }\n setAddressOptions(baseAddressOptions)\n setAddressError(null)\n if (!addressOptions.length) {\n void loadAddressOptions()\n }\n if (!shipmentStatuses.length) {\n void loadShipmentStatuses()\n }\n if (!documentStatuses.length && mode === 'create') {\n void loadDocumentStatuses()\n }\n if (!lineStatuses.length && mode === 'create') {\n void loadLineStatuses()\n }\n }, [\n addressOptions.length,\n baseAddressOptions,\n documentStatuses.length,\n loadAddressOptions,\n loadDocumentStatuses,\n loadShipmentStatuses,\n loadLineStatuses,\n loadShippingMethods,\n mode,\n open,\n lineStatuses.length,\n shipmentStatuses.length,\n shippingMethods.length,\n ])\n\n React.useEffect(() => {\n if (shipment?.shippingMethodId) {\n ensureShippingMethodOption(\n mapShippingMethod({\n id: shipment.shippingMethodId,\n name: shipment.shippingMethodName ?? shipment.shippingMethodCode ?? shipment.shippingMethodId,\n code: shipment.shippingMethodCode ?? shipment.shippingMethodId,\n currencyCode: currencyCode ?? null,\n }),\n )\n }\n }, [\n currencyCode,\n ensureShippingMethodOption,\n mapShippingMethod,\n shipment?.shippingMethodCode,\n shipment?.shippingMethodId,\n shipment?.shippingMethodName,\n ])\n\n React.useEffect(() => {\n if (!open) return\n mergeAddressOptions(baseAddressOptions)\n }, [baseAddressOptions, mergeAddressOptions, open])\n\n const fetchAddressItems = React.useCallback(\n async (query?: string): Promise<LookupSelectItem[]> => {\n if (!addressOptions.length && !addressLoading) {\n await loadAddressOptions()\n }\n const needle = query?.trim().toLowerCase() ?? ''\n return addressOptions\n .filter((option) => {\n if (!needle) return true\n return (\n option.label.toLowerCase().includes(needle) ||\n option.summary.toLowerCase().includes(needle)\n )\n })\n .map((option) => ({\n id: option.id,\n title: option.label,\n subtitle: option.summary,\n icon: (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <MapPin className=\"h-4 w-4\" />\n </div>\n ),\n }))\n },\n [addressLoading, addressOptions, loadAddressOptions],\n )\n\n const validateItems = React.useCallback(\n (itemsValue: unknown) => {\n const entries = Object.entries((itemsValue ?? {}) as Record<string, unknown>)\n .map(([lineId, value]) => ({ lineId, quantity: Number(value) }))\n .filter((entry) => Number.isFinite(entry.quantity) && entry.quantity > 0)\n if (!entries.length) {\n clearItemErrors()\n throw createCrudFormError(\n t('sales.documents.shipments.errorItems', 'Ship at least one line item.'),\n { items: t('sales.documents.shipments.errorItems', 'Ship at least one line item.') },\n )\n }\n const errors: Record<string, string> = {}\n entries.forEach((entry) => {\n const available = computeAvailable(entry.lineId, shipment?.id ?? null)\n if (entry.quantity > available + 1e-6) {\n errors[entry.lineId] = t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.')\n }\n })\n if (Object.keys(errors).length) {\n itemErrorSetterRef.current?.(errors)\n throw createCrudFormError(\n t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.'),\n { items: t('sales.documents.shipments.errorQuantity', 'Quantity exceeds remaining available.') },\n )\n }\n clearItemErrors()\n return entries\n },\n [clearItemErrors, computeAvailable, shipment?.id, t],\n )\n\n const handleSubmit = React.useCallback(\n async (values: Record<string, unknown>) => {\n const shipmentNumber =\n typeof values.shipmentNumber === 'string' ? values.shipmentNumber.trim() : ''\n if (!shipmentNumber.length) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorNumber', 'Shipment number is required.'),\n { shipmentNumber: t('sales.documents.shipments.errorNumber', 'Shipment number is required.') },\n )\n }\n const shippingMethodId =\n typeof values.shippingMethodId === 'string' && values.shippingMethodId.trim().length\n ? values.shippingMethodId\n : ''\n if (!shippingMethodId) {\n throw createCrudFormError(\n t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.'),\n { shippingMethodId: t('sales.documents.shipments.errorShippingMethod', 'Select a shipping method.') },\n )\n }\n const items = validateItems(values.items)\n const shipmentAddressId =\n typeof values.shipmentAddressId === 'string' ? values.shipmentAddressId : ''\n const addressOption = shipmentAddressId\n ? addressOptionsMap.get(shipmentAddressId) ?? null\n : null\n const fallbackAddress = addressOptions.length === 1 ? addressOptions[0] : null\n const addressSnapshot = addressOption?.snapshot ?? fallbackAddress?.snapshot ?? null\n if (!addressSnapshot) {\n const message = addressOptions.length\n ? t('sales.documents.shipments.errorAddress', 'Select an address to ship to.')\n : t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )\n throw createCrudFormError(message, { shipmentAddressId: message })\n }\n const payload: Record<string, unknown> = {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n shipmentNumber,\n shippingMethodId,\n statusEntryId:\n typeof values.statusEntryId === 'string' && values.statusEntryId.trim().length\n ? values.statusEntryId\n : undefined,\n carrierName:\n typeof values.carrierName === 'string' && values.carrierName.trim().length\n ? values.carrierName.trim()\n : undefined,\n trackingNumbers: parseTrackingNumbers(\n typeof values.trackingNumbers === 'string' ? values.trackingNumbers : '',\n ),\n shippedAt:\n typeof values.shippedAt === 'string' && values.shippedAt.trim().length\n ? new Date(values.shippedAt)\n : undefined,\n deliveredAt:\n typeof values.deliveredAt === 'string' && values.deliveredAt.trim().length\n ? new Date(values.deliveredAt)\n : undefined,\n notes:\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : undefined,\n items: items.map((item) => ({\n orderLineId: item.lineId,\n quantity: item.quantity,\n })),\n }\n payload.shipmentAddressSnapshot = addressSnapshot\n const customFields = collectCustomFieldValues(values, { transform: normalizeCustomFieldSubmitValue })\n if (Object.keys(customFields).length) {\n payload.customFields = customFields\n }\n if (mode === 'create') {\n const documentStatusEntryId =\n typeof values.documentStatusEntryId === 'string' && values.documentStatusEntryId.trim().length\n ? values.documentStatusEntryId\n : null\n const lineStatusEntryId =\n typeof values.lineStatusEntryId === 'string' && values.lineStatusEntryId.trim().length\n ? values.lineStatusEntryId\n : null\n if (documentStatusEntryId) {\n payload.documentStatusEntryId = documentStatusEntryId\n }\n if (lineStatusEntryId) {\n payload.lineStatusEntryId = lineStatusEntryId\n }\n }\n\n const action = shipment?.id ? updateCrud : createCrud\n const result = await action(\n 'sales/shipments',\n shipment?.id ? { id: shipment.id, ...payload } : payload,\n {\n errorMessage: t('sales.documents.shipments.errorSave', 'Failed to save shipment.'),\n },\n )\n if (result.ok) {\n const shipmentId = ((result.result as any)?.id as string | undefined) ?? shipment?.id ?? null\n const shouldAddShippingAdjustment =\n mode === 'create' &&\n Boolean(values.addShippingAdjustment) &&\n shipmentId\n if (shouldAddShippingAdjustment) {\n const method = shippingMethods.find((entry) => entry.id === shippingMethodId) ?? null\n const totalQuantity = items.reduce((acc, item) => acc + item.quantity, 0)\n const unitGross =\n method?.baseRateGross ??\n method?.avgPrice ??\n method?.minPrice ??\n (method?.baseRateNet ?? null)\n const unitNet = method?.baseRateNet ?? null\n const amountGross =\n typeof unitGross === 'number' && Number.isFinite(unitGross) && totalQuantity > 0\n ? roundAmount(Math.max(unitGross * totalQuantity, 0))\n : null\n const amountNet =\n typeof unitNet === 'number' && Number.isFinite(unitNet) && totalQuantity > 0\n ? roundAmount(Math.max(unitNet * totalQuantity, 0))\n : null\n const currency =\n typeof method?.currencyCode === 'string' && method.currencyCode.trim().length\n ? method.currencyCode.trim().toUpperCase()\n : typeof currencyCode === 'string' && currencyCode.trim().length\n ? currencyCode.trim().toUpperCase()\n : null\n\n if (amountGross !== null || amountNet !== null) {\n try {\n await createCrud(\n 'sales/order-adjustments',\n {\n orderId,\n organizationId: organizationId ?? undefined,\n tenantId: tenantId ?? undefined,\n scope: 'order',\n kind: 'shipping',\n label:\n method?.name ??\n t('sales.documents.shipments.shippingAdjustmentLabel', 'Shipping cost'),\n code: shipmentNumber ? `ship-${shipmentNumber}` : undefined,\n amountGross: amountGross ?? undefined,\n amountNet: amountNet ?? undefined,\n currencyCode: currency ?? undefined,\n metadata: {\n shipmentId,\n shippingMethodId,\n calculation: 'per_item_base_rate',\n quantity: totalQuantity,\n },\n },\n {\n errorMessage: t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n },\n )\n emitSalesDocumentTotalsRefresh({ documentId: orderId, kind: 'order' })\n } catch (err) {\n console.warn('sales.shipments.adjustment.create', err)\n flash(\n t(\n 'sales.documents.shipments.shippingAdjustmentError',\n 'Failed to add shipping cost adjustment.',\n ),\n 'warning',\n )\n }\n }\n }\n if (values.postComment && onAddComment) {\n const lineTitles = items\n .map((item) => {\n const line = lines.find((entry) => entry.id === item.lineId)\n return `${item.quantity}\u00D7 ${line?.title ?? item.lineId}`\n })\n .join(', ')\n const commentNotes =\n typeof values.notes === 'string' && values.notes.trim().length\n ? values.notes.trim()\n : ''\n const label =\n shipmentNumber.length > 0\n ? `#${shipmentNumber}`\n : shipment?.id\n ? `#${shipment.id.slice(0, 6)}`\n : ''\n const noteParts = [\n t('sales.documents.shipments.comment', 'Shipment {{number}} updated: {{summary}}', {\n number: label || String((result.result as any)?.id ?? ''),\n summary: lineTitles,\n }),\n ]\n if (commentNotes) {\n noteParts.push(\n t('sales.documents.shipments.commentNotes', 'Notes: {{notes}}', { notes: commentNotes }),\n )\n }\n const note = noteParts.join('\\n\\n')\n try {\n await onAddComment(note)\n } catch (err) {\n console.warn('sales.shipments.comment', err)\n }\n }\n await onSaved()\n }\n },\n [\n currencyCode,\n lines,\n mode,\n onAddComment,\n onSaved,\n orderId,\n organizationId,\n shipment?.id,\n addressOptions,\n addressOptionsMap,\n shippingMethods,\n t,\n tenantId,\n validateItems,\n ],\n )\n\n const handleShortcutSubmit = React.useCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {\n event.preventDefault()\n const form = dialogContentRef.current?.querySelector('form')\n form?.requestSubmit()\n }\n }, [])\n\n const fields = React.useMemo<CrudField[]>(() => {\n const shippingAdjustmentLabel = t(\n 'sales.documents.shipments.addShippingAdjustment',\n 'Add shipping cost adjustment for this shipment',\n )\n const shippingAdjustmentHelp = t(\n 'sales.documents.shipments.addShippingAdjustmentHelp',\n 'Create a shipping adjustment using this carrier\u2019s calculated cost.',\n )\n function ShipmentItemsField({ value, setValue }: CrudCustomFieldRenderProps) {\n const quantities = (value as Record<string, string | number> | null) ?? {}\n const [lineErrors, setLineErrors] = React.useState<Record<string, string | undefined>>({})\n\n React.useEffect(() => {\n registerItemErrors(setLineErrors)\n return () => {\n if (itemErrorSetterRef.current === setLineErrors) {\n itemErrorSetterRef.current = null\n }\n }\n }, [])\n\n if (lines.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n {t('sales.documents.shipments.noLines', 'No order lines available.')}\n </p>\n )\n }\n\n return (\n <div className=\"space-y-2 rounded-lg border p-3\">\n {lines.map((line) => {\n const available = computeAvailable(line.id, shipment?.id ?? null)\n const rawValue = quantities[line.id]\n const valueString =\n typeof rawValue === 'number'\n ? rawValue.toString()\n : typeof rawValue === 'string'\n ? rawValue\n : ''\n const disabled = available <= 0 && !valueString\n const lineError = lineErrors[line.id]\n return (\n <div\n key={line.id}\n className={cn(\n 'grid gap-3 md:grid-cols-[1fr,140px]',\n disabled ? 'opacity-60' : null,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {line.thumbnail ? (\n <img\n src={line.thumbnail}\n alt={line.title}\n className=\"h-12 w-12 rounded-md border object-cover\"\n />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md border bg-muted text-[10px] text-muted-foreground\">\n N/A\n </div>\n )}\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {line.lineNumber ? `#${line.lineNumber} \u00B7 ` : null}\n {line.title}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('sales.documents.shipments.available', '{{count}} available', {\n count: available,\n })}\n </p>\n </div>\n </div>\n <div className=\"space-y-1\">\n <Input\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n value={valueString}\n disabled={disabled}\n onChange={(event) => {\n const next = event.target.value\n setValue({ ...(quantities ?? {}), [line.id]: next })\n setLineErrors((prev) => ({ ...prev, [line.id]: undefined }))\n }}\n />\n {lineError ? <p className=\"text-xs text-destructive\">{lineError}</p> : null}\n </div>\n </div>\n )\n })}\n </div>\n )\n }\n\n function ShipmentAddressField({ value, setValue }: CrudCustomFieldRenderProps) {\n const currentValue = typeof value === 'string' ? value : ''\n React.useEffect(() => {\n if (!currentValue && addressOptions.length) {\n setValue(addressOptions[0].id)\n }\n }, [addressOptions, currentValue, setValue])\n const disabled = addressLoading || !addressOptions.length\n return (\n <div className=\"space-y-2\">\n <LookupSelect\n value={currentValue || null}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchAddressItems}\n placeholder={t('sales.documents.shipments.addressPlaceholder', 'Select address')}\n searchPlaceholder={t('sales.documents.shipments.addressSearch', 'Search address')}\n minQuery={0}\n disabled={disabled}\n loading={addressLoading}\n defaultOpen\n />\n {!addressLoading && !addressOptions.length ? (\n <p className=\"text-xs text-destructive\">\n {t(\n 'sales.documents.shipments.addressMissing',\n 'Add an address to this document before creating a shipment.',\n )}\n </p>\n ) : null}\n {addressError ? <p className=\"text-xs text-destructive\">{addressError}</p> : null}\n </div>\n )\n }\n\n const itemsField: CrudField = {\n id: 'items',\n label: t('sales.documents.shipments.items', 'Items to ship'),\n type: 'custom',\n component: ShipmentItemsField,\n }\n\n return [\n {\n id: 'shipmentNumber',\n label: t('sales.documents.shipments.number', 'Shipment number'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'carrierName',\n label: t('sales.documents.shipments.carrier', 'Carrier'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Input\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'shippingMethodId',\n label: t('sales.documents.shipments.shippingMethod', 'Shipping method'),\n type: 'custom',\n required: true,\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShippingMethodItems}\n placeholder={t('sales.documents.shipments.shippingMethodPlaceholder', 'Select method')}\n loading={shippingMethodLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'statusEntryId',\n label: t('sales.documents.shipments.status', 'Shipment status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchShipmentStatusItems}\n placeholder={t('sales.documents.shipments.statusPlaceholder', 'Select shipment status')}\n loading={shipmentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ...(mode === 'create'\n ? ([\n {\n id: 'documentStatusEntryId',\n label: t('sales.documents.status.changeDocument', 'Change order/quote status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchDocumentStatusItems}\n placeholder={t(\n 'sales.documents.status.documentPlaceholder',\n 'Select new order/quote status',\n )}\n loading={documentStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n {\n id: 'lineStatusEntryId',\n label: t('sales.documents.status.changeLine', 'Change order/quote item status'),\n type: 'custom',\n component: ({ value, setValue }) => {\n const currentValue = typeof value === 'string' && value.length ? value : null\n return (\n <LookupSelect\n value={currentValue}\n onChange={(next) => setValue(next ?? '')}\n fetchItems={fetchLineStatusItems}\n placeholder={t(\n 'sales.documents.status.linePlaceholder',\n 'Select item status',\n )}\n loading={lineStatusLoading}\n minQuery={0}\n />\n )\n },\n },\n ] as CrudField[])\n : []),\n {\n id: 'shipmentAddressId',\n label: t('sales.documents.shipments.address', 'Ship to'),\n type: 'custom',\n required: true,\n component: ShipmentAddressField,\n },\n {\n id: 'shippedAt',\n label: t('sales.documents.shipments.shippedAt', 'Shipped date'),\n type: 'date',\n },\n {\n id: 'deliveredAt',\n label: t('sales.documents.shipments.deliveredAt', 'Delivered date'),\n type: 'date',\n },\n {\n id: 'trackingNumbers',\n label: t('sales.documents.shipments.trackingNumbers', 'Tracking numbers'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={2}\n placeholder={t(\n 'sales.documents.shipments.trackingPlaceholder',\n 'One per line or comma separated',\n )}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'notes',\n label: t('sales.documents.shipments.notes', 'Notes'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <Textarea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(event) => setValue(event.target.value)}\n />\n ),\n },\n {\n id: 'addShippingAdjustment',\n label: shippingAdjustmentLabel,\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-start gap-2\">\n <Switch\n id={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n aria-labelledby={SHIPPING_ADJUSTMENT_LABEL_ID}\n aria-describedby={SHIPPING_ADJUSTMENT_HELP_ID}\n />\n <div className=\"space-y-1\">\n <Label\n htmlFor={SHIPPING_ADJUSTMENT_TOGGLE_ID}\n id={SHIPPING_ADJUSTMENT_LABEL_ID}\n className=\"sr-only\"\n >\n {shippingAdjustmentLabel}\n </Label>\n <p id={SHIPPING_ADJUSTMENT_HELP_ID} className=\"text-xs text-muted-foreground\">\n {shippingAdjustmentHelp}\n </p>\n </div>\n </div>\n ),\n },\n itemsField,\n {\n id: 'postComment',\n label: t('sales.documents.shipments.addComment', 'Add note to comments'),\n type: 'custom',\n component: ({ value, setValue }) => (\n <div className=\"flex items-center gap-2\">\n <Switch\n id=\"shipment-comment\"\n checked={Boolean(value)}\n onCheckedChange={(checked) => setValue(Boolean(checked))}\n />\n <Label htmlFor=\"shipment-comment\" className=\"cursor-pointer\">\n {t('sales.documents.shipments.addComment', 'Add note to comments')}\n </Label>\n </div>\n ),\n },\n ]\n }, [\n addressError,\n addressLoading,\n addressOptions,\n computeAvailable,\n documentStatusLoading,\n fetchAddressItems,\n fetchDocumentStatusItems,\n fetchLineStatusItems,\n fetchShipmentStatusItems,\n fetchShippingMethodItems,\n lineStatusLoading,\n lines,\n mode,\n registerItemErrors,\n shipment?.id,\n shipmentStatusLoading,\n t,\n ])\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => {\n const base: CrudFormGroup[] = [\n {\n id: 'shipmentDetails',\n title: mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment'),\n column: 1,\n fields: ['shipmentNumber', 'carrierName', 'shippingMethodId', 'statusEntryId', 'shipmentAddressId'],\n },\n ]\n if (mode === 'create') {\n base.push({\n id: 'statusChanges',\n title: t('sales.documents.status.sectionTitle', 'Status changes'),\n column: 2,\n fields: ['documentStatusEntryId', 'lineStatusEntryId'],\n })\n }\n base.push(\n {\n id: 'tracking',\n title: t('sales.documents.shipments.trackingGroup', 'Tracking information'),\n column: 2,\n fields: ['shippedAt', 'deliveredAt', 'trackingNumbers', 'notes'],\n },\n {\n id: 'items',\n column: 1,\n fields: ['items', 'addShippingAdjustment', 'postComment'],\n },\n {\n id: 'shipmentCustomFields',\n title: t('entities.customFields.title', 'Custom fields'),\n column: 2,\n kind: 'customFields',\n },\n )\n return base\n },\n [mode, t],\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => (!next ? onClose() : undefined)}>\n <DialogContent\n ref={dialogContentRef}\n className=\"sm:max-w-5xl\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n onClose()\n }\n handleShortcutSubmit(event)\n }}\n >\n <DialogHeader>\n <DialogTitle>\n {mode === 'edit'\n ? t('sales.documents.shipments.editTitle', 'Edit shipment')\n : t('sales.documents.shipments.addTitle', 'Add shipment')}\n </DialogTitle>\n </DialogHeader>\n <CrudForm\n key={formResetKey}\n embedded\n entityId={E.sales.sales_shipment}\n fields={fields}\n groups={groups}\n initialValues={initialValues}\n submitLabel={t('sales.documents.shipments.saveShortcut', 'Save (\u2318/Ctrl+Enter)')}\n onSubmit={handleSubmit}\n loadingMessage={t('sales.documents.shipments.loading', 'Loading shipments\u2026')}\n customFieldsLoadingMessage={t('ui.forms.loading', 'Loading data...')}\n isLoading={shippingMethodLoading || addressLoading}\n />\n </DialogContent>\n </Dialog>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["options"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/lib/shipments/snapshots.ts"],
4
- "sourcesContent": ["import { randomUUID } from 'crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { SalesOrderLine, SalesShipment, SalesShipmentItem } from '../../data/entities'\nimport type { ShipmentItemSnapshot } from './types'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\n\nconst cloneJson = <T>(value: T): T => {\n if (value === null || value === undefined) return value\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nexport const coerceShipmentQuantity = (value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return 0\n}\n\nconst extractOrderLineId = (entry: SalesShipmentItem): string | null => {\n const raw =\n typeof entry.orderLine === 'string'\n ? entry.orderLine\n : entry.orderLine?.id ?? (entry as any).orderLineId ?? null\n return typeof raw === 'string' ? raw : null\n}\n\nconst ensureLineMap = async ( // NOSONAR \u2014 returns same Map ref but populated from DB between early return and final return\n em: EntityManager,\n items: SalesShipmentItem[],\n lineMap?: Map<string, SalesOrderLine>\n): Promise<Map<string, SalesOrderLine>> => {\n const map = lineMap ?? new Map<string, SalesOrderLine>()\n const missing: string[] = []\n items.forEach((item) => {\n const lineId = extractOrderLineId(item)\n if (!lineId || map.has(lineId)) return\n missing.push(lineId)\n })\n if (!missing.length) return map\n const lines = await em.find(SalesOrderLine, { id: { $in: missing } })\n lines.forEach((line) => map.set(line.id, line))\n return map\n}\n\nexport const buildShipmentItemSnapshots = (\n items: SalesShipmentItem[],\n options?: { lineMap?: Map<string, SalesOrderLine> }\n): ShipmentItemSnapshot[] => {\n const map = options?.lineMap ?? new Map<string, SalesOrderLine>()\n return items\n .map((item) => {\n const orderLineId = extractOrderLineId(item)\n if (!orderLineId) return null\n const line = map.get(orderLineId) ?? null\n const id = typeof item.id === 'string' ? item.id : randomUUID()\n const quantity = coerceShipmentQuantity(item.quantity)\n const metadata =\n item.metadata && typeof item.metadata === 'object' ? cloneJson(item.metadata) : null\n return {\n id,\n orderLineId,\n orderLineName: line?.name ?? null,\n orderLineNumber: line?.lineNumber ?? null,\n quantity,\n metadata,\n } satisfies ShipmentItemSnapshot\n })\n .filter((entry): entry is ShipmentItemSnapshot => Boolean(entry))\n}\n\nexport const readShipmentItemsSnapshot = (raw: unknown): ShipmentItemSnapshot[] => {\n if (!Array.isArray(raw)) return []\n return raw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const orderLineId =\n typeof (entry as any).orderLineId === 'string'\n ? (entry as any).orderLineId\n : typeof (entry as any).order_line_id === 'string'\n ? (entry as any).order_line_id\n : null\n if (!orderLineId) return null\n const quantity = coerceShipmentQuantity((entry as any).quantity)\n const orderLineNumberRaw = (entry as any).orderLineNumber ?? (entry as any).order_line_number\n const orderLineNumber =\n typeof orderLineNumberRaw === 'number' && Number.isFinite(orderLineNumberRaw)\n ? orderLineNumberRaw\n : typeof orderLineNumberRaw === 'string' && orderLineNumberRaw.trim().length\n ? Number(orderLineNumberRaw)\n : null\n const metadata =\n (entry as any).metadata && typeof (entry as any).metadata === 'object'\n ? cloneJson((entry as any).metadata as Record<string, unknown>)\n : null\n const orderLineName =\n typeof (entry as any).orderLineName === 'string'\n ? (entry as any).orderLineName\n : typeof (entry as any).order_line_name === 'string'\n ? (entry as any).order_line_name\n : null\n const id =\n typeof (entry as any).id === 'string' && (entry as any).id.length\n ? (entry as any).id\n : randomUUID()\n return {\n id,\n orderLineId,\n orderLineName,\n orderLineNumber: Number.isFinite(orderLineNumber) ? Number(orderLineNumber) : null,\n quantity,\n metadata,\n } satisfies ShipmentItemSnapshot\n })\n .filter((entry): entry is ShipmentItemSnapshot => Boolean(entry))\n}\n\nexport const refreshShipmentItemsSnapshot = async (\n em: EntityManager,\n shipment: SalesShipment,\n options?: { items?: SalesShipmentItem[]; lineMap?: Map<string, SalesOrderLine> }\n): Promise<ShipmentItemSnapshot[]> => {\n const items =\n options?.items ??\n (await findWithDecryption(\n em,\n SalesShipmentItem,\n { shipment },\n { populate: ['orderLine'] },\n { tenantId: shipment.tenantId ?? null, organizationId: shipment.organizationId ?? null },\n ))\n const map = await ensureLineMap(em, items, options?.lineMap)\n const snapshot = buildShipmentItemSnapshots(items, { lineMap: map })\n shipment.itemsSnapshot = snapshot.length ? snapshot : null\n return snapshot\n}\n\nexport type { ShipmentItemSnapshot } from './types'\n"],
4
+ "sourcesContent": ["import { randomUUID } from 'crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { SalesOrderLine, SalesShipment, SalesShipmentItem } from '../../data/entities'\nimport type { ShipmentItemSnapshot } from './types'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\n\nconst cloneJson = <T>(value: T): T => {\n if (value === null || value === undefined) return value\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nexport const coerceShipmentQuantity = (value: unknown): number => {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length) {\n const parsed = Number(value)\n if (!Number.isNaN(parsed)) return parsed\n }\n return 0\n}\n\nconst extractOrderLineId = (entry: SalesShipmentItem): string | null => {\n const raw =\n typeof entry.orderLine === 'string'\n ? entry.orderLine\n : entry.orderLine?.id ?? (entry as any).orderLineId ?? null\n return typeof raw === 'string' ? raw : null\n}\n\nconst ensureLineMap = async (\n em: EntityManager,\n items: SalesShipmentItem[],\n lineMap?: Map<string, SalesOrderLine>\n): Promise<Map<string, SalesOrderLine>> => {\n const map = lineMap ?? new Map<string, SalesOrderLine>()\n const missing: string[] = []\n items.forEach((item) => {\n const lineId = extractOrderLineId(item)\n if (!lineId || map.has(lineId)) return\n missing.push(lineId)\n })\n if (!missing.length) return map\n const lines = await em.find(SalesOrderLine, { id: { $in: missing } })\n lines.forEach((line) => map.set(line.id, line))\n return map\n}\n\nexport const buildShipmentItemSnapshots = (\n items: SalesShipmentItem[],\n options?: { lineMap?: Map<string, SalesOrderLine> }\n): ShipmentItemSnapshot[] => {\n const map = options?.lineMap ?? new Map<string, SalesOrderLine>()\n return items\n .map((item) => {\n const orderLineId = extractOrderLineId(item)\n if (!orderLineId) return null\n const line = map.get(orderLineId) ?? null\n const id = typeof item.id === 'string' ? item.id : randomUUID()\n const quantity = coerceShipmentQuantity(item.quantity)\n const metadata =\n item.metadata && typeof item.metadata === 'object' ? cloneJson(item.metadata) : null\n return {\n id,\n orderLineId,\n orderLineName: line?.name ?? null,\n orderLineNumber: line?.lineNumber ?? null,\n quantity,\n metadata,\n } satisfies ShipmentItemSnapshot\n })\n .filter((entry): entry is ShipmentItemSnapshot => Boolean(entry))\n}\n\nexport const readShipmentItemsSnapshot = (raw: unknown): ShipmentItemSnapshot[] => {\n if (!Array.isArray(raw)) return []\n return raw\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const orderLineId =\n typeof (entry as any).orderLineId === 'string'\n ? (entry as any).orderLineId\n : typeof (entry as any).order_line_id === 'string'\n ? (entry as any).order_line_id\n : null\n if (!orderLineId) return null\n const quantity = coerceShipmentQuantity((entry as any).quantity)\n const orderLineNumberRaw = (entry as any).orderLineNumber ?? (entry as any).order_line_number\n const orderLineNumber =\n typeof orderLineNumberRaw === 'number' && Number.isFinite(orderLineNumberRaw)\n ? orderLineNumberRaw\n : typeof orderLineNumberRaw === 'string' && orderLineNumberRaw.trim().length\n ? Number(orderLineNumberRaw)\n : null\n const metadata =\n (entry as any).metadata && typeof (entry as any).metadata === 'object'\n ? cloneJson((entry as any).metadata as Record<string, unknown>)\n : null\n const orderLineName =\n typeof (entry as any).orderLineName === 'string'\n ? (entry as any).orderLineName\n : typeof (entry as any).order_line_name === 'string'\n ? (entry as any).order_line_name\n : null\n const id =\n typeof (entry as any).id === 'string' && (entry as any).id.length\n ? (entry as any).id\n : randomUUID()\n return {\n id,\n orderLineId,\n orderLineName,\n orderLineNumber: Number.isFinite(orderLineNumber) ? Number(orderLineNumber) : null,\n quantity,\n metadata,\n } satisfies ShipmentItemSnapshot\n })\n .filter((entry): entry is ShipmentItemSnapshot => Boolean(entry))\n}\n\nexport const refreshShipmentItemsSnapshot = async (\n em: EntityManager,\n shipment: SalesShipment,\n options?: { items?: SalesShipmentItem[]; lineMap?: Map<string, SalesOrderLine> }\n): Promise<ShipmentItemSnapshot[]> => {\n const items =\n options?.items ??\n (await findWithDecryption(\n em,\n SalesShipmentItem,\n { shipment },\n { populate: ['orderLine'] },\n { tenantId: shipment.tenantId ?? null, organizationId: shipment.organizationId ?? null },\n ))\n const map = await ensureLineMap(em, items, options?.lineMap)\n const snapshot = buildShipmentItemSnapshots(items, { lineMap: map })\n shipment.itemsSnapshot = snapshot.length ? snapshot : null\n return snapshot\n}\n\nexport type { ShipmentItemSnapshot } from './types'\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -52,14 +52,6 @@ function SalesOrderCreatedRenderer({
52
52
  isUnread && "bg-blue-50/50 dark:bg-blue-950/20"
53
53
  ),
54
54
  onClick: handleView,
55
- onKeyDown: (e) => {
56
- if (e.key === "Enter" || e.key === " ") {
57
- e.preventDefault();
58
- handleView();
59
- }
60
- },
61
- role: "button",
62
- tabIndex: 0,
63
55
  children: [
64
56
  isUnread && /* @__PURE__ */ jsx("div", { className: "absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary" }),
65
57
  /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { ShoppingCart, ExternalLink, DollarSign, User, Calendar } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\nimport { formatMoney } from '../../components/documents/lineItemUtils'\nimport { useSalesDocumentTotals } from './useSalesDocumentTotals'\n\nfunction normalizeTotal(value?: string | null): string | null {\n if (!value) return null\n let trimmed = value.trim()\n if (trimmed.startsWith('(') && trimmed.endsWith(')')) {\n trimmed = trimmed.slice(1, -1).trim()\n }\n return trimmed.length ? trimmed : null\n}\n\nexport function SalesOrderCreatedRenderer({\n notification,\n onAction,\n onDismiss,\n actions = [],\n}: NotificationRendererProps) {\n const t = useT()\n const router = useRouter()\n const [executing, setExecuting] = React.useState(false)\n const isUnread = notification.status === 'unread'\n const orderNumber = notification.bodyVariables?.orderNumber ?? notification.titleVariables?.orderNumber\n const fallbackTotal =\n normalizeTotal(notification.bodyVariables?.totalAmount ?? null) ??\n normalizeTotal(notification.bodyVariables?.total ?? null)\n const { totals } = useSalesDocumentTotals('order', notification.sourceEntityId)\n\n const currentTotal =\n totals && typeof totals.grandTotalGrossAmount === 'number'\n ? formatMoney(totals.grandTotalGrossAmount, totals.currencyCode)\n : fallbackTotal\n\n const viewAction = actions.find((action) => action.id === 'view') ?? actions[0] ?? null\n\n const handleView = async () => {\n if (!viewAction) {\n if (notification.linkHref) router.push(notification.linkHref)\n return\n }\n setExecuting(true)\n try {\n await onAction(viewAction.id)\n } finally {\n setExecuting(false)\n }\n }\n\n return (\n <div\n className={cn(\n 'group relative px-4 py-3 hover:bg-muted/50 cursor-pointer transition-colors border-l-4 border-l-blue-500',\n isUnread && 'bg-blue-50/50 dark:bg-blue-950/20'\n )}\n onClick={handleView}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleView()\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {isUnread && (\n <div className=\"absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary\" />\n )}\n\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 mt-0.5\">\n <div className=\"h-10 w-10 rounded-lg bg-blue-100 dark:bg-blue-900/40 flex items-center justify-center\">\n <ShoppingCart className=\"h-5 w-5 text-blue-600 dark:text-blue-400\" />\n </div>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <h4 className={cn('text-sm font-medium', isUnread && 'font-semibold')}>\n {notification.title}\n </h4>\n {orderNumber && (\n <div className=\"flex items-center gap-1 mt-0.5\">\n <span className=\"text-xs font-mono text-muted-foreground bg-muted px-1.5 py-0.5 rounded\">\n #{orderNumber}\n </span>\n </div>\n )}\n </div>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatRelativeTime(notification.createdAt, { translate: t }) ?? ''}\n </span>\n </div>\n\n <div className=\"mt-2 flex items-center gap-4 text-xs text-muted-foreground\">\n {currentTotal && (\n <div className=\"flex items-center gap-1\">\n <DollarSign className=\"h-3 w-3\" />\n <span className=\"font-medium text-foreground\">{currentTotal}</span>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" />\n <span>{t('sales.notifications.renderer.assignedToYou', 'Assigned to you')}</span>\n </div>\n </div>\n\n <div className=\"mt-3 flex gap-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n handleView()\n }}\n disabled={executing || (!viewAction && !notification.linkHref)}\n className=\"gap-1\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n {t('sales.notifications.renderer.viewOrder', 'View Order')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n onDismiss()\n }}\n >\n {t('notifications.actions.dismiss', 'Dismiss')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SalesOrderCreatedRenderer\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { ShoppingCart, ExternalLink, DollarSign, User, Calendar } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { formatRelativeTime } from '@open-mercato/shared/lib/time'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { NotificationRendererProps } from '@open-mercato/shared/modules/notifications/types'\nimport { formatMoney } from '../../components/documents/lineItemUtils'\nimport { useSalesDocumentTotals } from './useSalesDocumentTotals'\n\nfunction normalizeTotal(value?: string | null): string | null {\n if (!value) return null\n let trimmed = value.trim()\n if (trimmed.startsWith('(') && trimmed.endsWith(')')) {\n trimmed = trimmed.slice(1, -1).trim()\n }\n return trimmed.length ? trimmed : null\n}\n\nexport function SalesOrderCreatedRenderer({\n notification,\n onAction,\n onDismiss,\n actions = [],\n}: NotificationRendererProps) {\n const t = useT()\n const router = useRouter()\n const [executing, setExecuting] = React.useState(false)\n const isUnread = notification.status === 'unread'\n const orderNumber = notification.bodyVariables?.orderNumber ?? notification.titleVariables?.orderNumber\n const fallbackTotal =\n normalizeTotal(notification.bodyVariables?.totalAmount ?? null) ??\n normalizeTotal(notification.bodyVariables?.total ?? null)\n const { totals } = useSalesDocumentTotals('order', notification.sourceEntityId)\n\n const currentTotal =\n totals && typeof totals.grandTotalGrossAmount === 'number'\n ? formatMoney(totals.grandTotalGrossAmount, totals.currencyCode)\n : fallbackTotal\n\n const viewAction = actions.find((action) => action.id === 'view') ?? actions[0] ?? null\n\n const handleView = async () => {\n if (!viewAction) {\n if (notification.linkHref) router.push(notification.linkHref)\n return\n }\n setExecuting(true)\n try {\n await onAction(viewAction.id)\n } finally {\n setExecuting(false)\n }\n }\n\n return (\n <div\n className={cn(\n 'group relative px-4 py-3 hover:bg-muted/50 cursor-pointer transition-colors border-l-4 border-l-blue-500',\n isUnread && 'bg-blue-50/50 dark:bg-blue-950/20'\n )}\n onClick={handleView}\n >\n {isUnread && (\n <div className=\"absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary\" />\n )}\n\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 mt-0.5\">\n <div className=\"h-10 w-10 rounded-lg bg-blue-100 dark:bg-blue-900/40 flex items-center justify-center\">\n <ShoppingCart className=\"h-5 w-5 text-blue-600 dark:text-blue-400\" />\n </div>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <h4 className={cn('text-sm font-medium', isUnread && 'font-semibold')}>\n {notification.title}\n </h4>\n {orderNumber && (\n <div className=\"flex items-center gap-1 mt-0.5\">\n <span className=\"text-xs font-mono text-muted-foreground bg-muted px-1.5 py-0.5 rounded\">\n #{orderNumber}\n </span>\n </div>\n )}\n </div>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {formatRelativeTime(notification.createdAt, { translate: t }) ?? ''}\n </span>\n </div>\n\n <div className=\"mt-2 flex items-center gap-4 text-xs text-muted-foreground\">\n {currentTotal && (\n <div className=\"flex items-center gap-1\">\n <DollarSign className=\"h-3 w-3\" />\n <span className=\"font-medium text-foreground\">{currentTotal}</span>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" />\n <span>{t('sales.notifications.renderer.assignedToYou', 'Assigned to you')}</span>\n </div>\n </div>\n\n <div className=\"mt-3 flex gap-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n handleView()\n }}\n disabled={executing || (!viewAction && !notification.linkHref)}\n className=\"gap-1\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n {t('sales.notifications.renderer.viewOrder', 'View Order')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation()\n onDismiss()\n }}\n >\n {t('notifications.actions.dismiss', 'Dismiss')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SalesOrderCreatedRenderer\n"],
5
+ "mappings": ";AAmEQ,cAkBU,YAlBV;AAjER,YAAY,WAAW;AACvB,SAAS,cAAc,cAAc,YAAY,MAAM,gBAAgB;AACvE,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC,SAAS,YAAY;AAErB,SAAS,mBAAmB;AAC5B,SAAS,8BAA8B;AAEvC,SAAS,eAAe,OAAsC;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,MAAM,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,cAAU,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,EACtC;AACA,SAAO,QAAQ,SAAS,UAAU;AACpC;AAEO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AACb,GAA8B;AAC5B,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,WAAW,aAAa,WAAW;AACzC,QAAM,cAAc,aAAa,eAAe,eAAe,aAAa,gBAAgB;AAC5F,QAAM,gBACJ,eAAe,aAAa,eAAe,eAAe,IAAI,KAC9D,eAAe,aAAa,eAAe,SAAS,IAAI;AAC1D,QAAM,EAAE,OAAO,IAAI,uBAAuB,SAAS,aAAa,cAAc;AAE9E,QAAM,eACJ,UAAU,OAAO,OAAO,0BAA0B,WAC9C,YAAY,OAAO,uBAAuB,OAAO,YAAY,IAC7D;AAEN,QAAM,aAAa,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,KAAK;AAEnF,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,YAAY;AACf,UAAI,aAAa,SAAU,QAAO,KAAK,aAAa,QAAQ;AAC5D;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,SAAS,WAAW,EAAE;AAAA,IAC9B,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MAER;AAAA,oBACC,oBAAC,SAAI,WAAU,8EAA6E;AAAA,QAG9F,qBAAC,SAAI,WAAU,cACb;AAAA,8BAAC,SAAI,WAAU,wBACb,8BAAC,SAAI,WAAU,yFACb,8BAAC,gBAAa,WAAU,4CAA2C,GACrE,GACF;AAAA,UAEA,qBAAC,SAAI,WAAU,kBACb;AAAA,iCAAC,SAAI,WAAU,0CACb;AAAA,mCAAC,SACC;AAAA,oCAAC,QAAG,WAAW,GAAG,uBAAuB,YAAY,eAAe,GACjE,uBAAa,OAChB;AAAA,gBACC,eACC,oBAAC,SAAI,WAAU,kCACb,+BAAC,UAAK,WAAU,0EAAyE;AAAA;AAAA,kBACrF;AAAA,mBACJ,GACF;AAAA,iBAEJ;AAAA,cACA,qBAAC,UAAK,WAAU,uEACd;AAAA,oCAAC,YAAS,WAAU,WAAU;AAAA,gBAC7B,mBAAmB,aAAa,WAAW,EAAE,WAAW,EAAE,CAAC,KAAK;AAAA,iBACnE;AAAA,eACF;AAAA,YAEA,qBAAC,SAAI,WAAU,8DACZ;AAAA,8BACC,qBAAC,SAAI,WAAU,2BACb;AAAA,oCAAC,cAAW,WAAU,WAAU;AAAA,gBAChC,oBAAC,UAAK,WAAU,+BAA+B,wBAAa;AAAA,iBAC9D;AAAA,cAEF,qBAAC,SAAI,WAAU,2BACb;AAAA,oCAAC,QAAK,WAAU,WAAU;AAAA,gBAC1B,oBAAC,UAAM,YAAE,8CAA8C,iBAAiB,GAAE;AAAA,iBAC5E;AAAA,eACF;AAAA,YAEA,qBAAC,SAAI,WAAU,mBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,+BAAW;AAAA,kBACb;AAAA,kBACA,UAAU,aAAc,CAAC,cAAc,CAAC,aAAa;AAAA,kBACrD,WAAU;AAAA,kBAEV;AAAA,wCAAC,gBAAa,WAAU,WAAU;AAAA,oBACjC,EAAE,0CAA0C,YAAY;AAAA;AAAA;AAAA,cAC3D;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,8BAAU;AAAA,kBACZ;AAAA,kBAEC,YAAE,iCAAiC,SAAS;AAAA;AAAA,cAC/C;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,oCAAQ;",
6
6
  "names": []
7
7
  }
@@ -52,14 +52,6 @@ function SalesQuoteCreatedRenderer({
52
52
  isUnread && "bg-amber-50/50 dark:bg-amber-950/20"
53
53
  ),
54
54
  onClick: handleView,
55
- onKeyDown: (e) => {
56
- if (e.key === "Enter" || e.key === " ") {
57
- e.preventDefault();
58
- handleView();
59
- }
60
- },
61
- role: "button",
62
- tabIndex: 0,
63
55
  children: [
64
56
  isUnread && /* @__PURE__ */ jsx("div", { className: "absolute left-1.5 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full bg-primary" }),
65
57
  /* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [