@burdenoff/microfe-theglobalfuel 2026.704.1 → 2026.705.2

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 (133) hide show
  1. package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
  2. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  3. package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
  4. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  5. package/dist/theglobalfuel/components/DataTable.js +37 -27
  6. package/dist/theglobalfuel/components/DataTable.js.map +1 -1
  7. package/dist/theglobalfuel/hooks/index.js +1 -0
  8. package/dist/theglobalfuel/hooks/useNotify.js +19 -0
  9. package/dist/theglobalfuel/hooks/useNotify.js.map +1 -0
  10. package/dist/theglobalfuel/hooks/useTheFiles.js +4 -1
  11. package/dist/theglobalfuel/hooks/useTheFiles.js.map +1 -1
  12. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js +59 -31
  13. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js.map +1 -1
  14. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +367 -321
  15. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
  16. package/dist/theglobalfuel/pages/assets/AssetsPage.js +66 -54
  17. package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
  18. package/dist/theglobalfuel/pages/compliance/CompliancePage.js +346 -182
  19. package/dist/theglobalfuel/pages/compliance/CompliancePage.js.map +1 -1
  20. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js +418 -390
  21. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js.map +1 -1
  22. package/dist/theglobalfuel/pages/contracts/ContractsPage.js +238 -230
  23. package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
  24. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +5 -3
  25. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
  26. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +201 -177
  27. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
  28. package/dist/theglobalfuel/pages/inventory/InventoryPage.js +271 -238
  29. package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
  30. package/dist/theglobalfuel/pages/production/ProductionPage.js +185 -177
  31. package/dist/theglobalfuel/pages/production/ProductionPage.js.map +1 -1
  32. package/dist/theglobalfuel/pages/reserves/ReservesPage.js +160 -138
  33. package/dist/theglobalfuel/pages/reserves/ReservesPage.js.map +1 -1
  34. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +250 -198
  35. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
  36. package/dist/theglobalfuel/utils/cn.js +2 -2
  37. package/dist/theglobalfuel/utils/formatters.js +6 -1
  38. package/dist/theglobalfuel/utils/formatters.js.map +1 -1
  39. package/dist/theglobalfuel/utils/transitions.js +70 -0
  40. package/dist/theglobalfuel/utils/transitions.js.map +1 -0
  41. package/package.json +1 -1
  42. package/dist/dev/main.d.ts +0 -2
  43. package/dist/dev/main.d.ts.map +0 -1
  44. package/dist/index.d.ts +0 -2
  45. package/dist/index.d.ts.map +0 -1
  46. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
  47. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
  48. package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts +0 -5
  49. package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts.map +0 -1
  50. package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts +0 -4
  51. package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts.map +0 -1
  52. package/dist/theglobalfuel/components/DataTable.d.ts +0 -28
  53. package/dist/theglobalfuel/components/DataTable.d.ts.map +0 -1
  54. package/dist/theglobalfuel/components/EmptyState.d.ts +0 -18
  55. package/dist/theglobalfuel/components/EmptyState.d.ts.map +0 -1
  56. package/dist/theglobalfuel/components/EvidenceUpload.d.ts +0 -14
  57. package/dist/theglobalfuel/components/EvidenceUpload.d.ts.map +0 -1
  58. package/dist/theglobalfuel/components/FileLink.d.ts +0 -15
  59. package/dist/theglobalfuel/components/FileLink.d.ts.map +0 -1
  60. package/dist/theglobalfuel/components/FilterTabs.d.ts +0 -18
  61. package/dist/theglobalfuel/components/FilterTabs.d.ts.map +0 -1
  62. package/dist/theglobalfuel/components/MetricsCard.d.ts +0 -23
  63. package/dist/theglobalfuel/components/MetricsCard.d.ts.map +0 -1
  64. package/dist/theglobalfuel/components/MiniBar.d.ts +0 -16
  65. package/dist/theglobalfuel/components/MiniBar.d.ts.map +0 -1
  66. package/dist/theglobalfuel/components/PageLayout.d.ts +0 -16
  67. package/dist/theglobalfuel/components/PageLayout.d.ts.map +0 -1
  68. package/dist/theglobalfuel/components/Pagination.d.ts +0 -22
  69. package/dist/theglobalfuel/components/Pagination.d.ts.map +0 -1
  70. package/dist/theglobalfuel/components/StateViews.d.ts +0 -24
  71. package/dist/theglobalfuel/components/StateViews.d.ts.map +0 -1
  72. package/dist/theglobalfuel/components/StatusBadge.d.ts +0 -9
  73. package/dist/theglobalfuel/components/StatusBadge.d.ts.map +0 -1
  74. package/dist/theglobalfuel/components/Tabs.d.ts +0 -17
  75. package/dist/theglobalfuel/components/Tabs.d.ts.map +0 -1
  76. package/dist/theglobalfuel/components/TheDiscussion.d.ts +0 -18
  77. package/dist/theglobalfuel/components/TheDiscussion.d.ts.map +0 -1
  78. package/dist/theglobalfuel/components/TheTags.d.ts +0 -17
  79. package/dist/theglobalfuel/components/TheTags.d.ts.map +0 -1
  80. package/dist/theglobalfuel/components/index.d.ts +0 -19
  81. package/dist/theglobalfuel/components/index.d.ts.map +0 -1
  82. package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts +0 -16
  83. package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts.map +0 -1
  84. package/dist/theglobalfuel/context/index.d.ts +0 -6
  85. package/dist/theglobalfuel/context/index.d.ts.map +0 -1
  86. package/dist/theglobalfuel/hooks/index.d.ts +0 -10
  87. package/dist/theglobalfuel/hooks/index.d.ts.map +0 -1
  88. package/dist/theglobalfuel/hooks/useCursorPager.d.ts +0 -33
  89. package/dist/theglobalfuel/hooks/useCursorPager.d.ts.map +0 -1
  90. package/dist/theglobalfuel/hooks/useTheComments.d.ts +0 -36
  91. package/dist/theglobalfuel/hooks/useTheComments.d.ts.map +0 -1
  92. package/dist/theglobalfuel/hooks/useTheFiles.d.ts +0 -47
  93. package/dist/theglobalfuel/hooks/useTheFiles.d.ts.map +0 -1
  94. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts +0 -75
  95. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts.map +0 -1
  96. package/dist/theglobalfuel/hooks/useTheTags.d.ts +0 -44
  97. package/dist/theglobalfuel/hooks/useTheTags.d.ts.map +0 -1
  98. package/dist/theglobalfuel/index.d.ts +0 -9
  99. package/dist/theglobalfuel/index.d.ts.map +0 -1
  100. package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts +0 -13
  101. package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts.map +0 -1
  102. package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts +0 -10
  103. package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts.map +0 -1
  104. package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts +0 -11
  105. package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts.map +0 -1
  106. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts +0 -9
  107. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts.map +0 -1
  108. package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts +0 -8
  109. package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts.map +0 -1
  110. package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts +0 -13
  111. package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts.map +0 -1
  112. package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts +0 -12
  113. package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts.map +0 -1
  114. package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts +0 -11
  115. package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts.map +0 -1
  116. package/dist/theglobalfuel/pages/production/ProductionPage.d.ts +0 -11
  117. package/dist/theglobalfuel/pages/production/ProductionPage.d.ts.map +0 -1
  118. package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts +0 -10
  119. package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts.map +0 -1
  120. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts +0 -10
  121. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts.map +0 -1
  122. package/dist/theglobalfuel/types/index.d.ts +0 -376
  123. package/dist/theglobalfuel/types/index.d.ts.map +0 -1
  124. package/dist/theglobalfuel/utils/cn.d.ts +0 -4
  125. package/dist/theglobalfuel/utils/cn.d.ts.map +0 -1
  126. package/dist/theglobalfuel/utils/formatters.d.ts +0 -36
  127. package/dist/theglobalfuel/utils/formatters.d.ts.map +0 -1
  128. package/dist/theglobalfuel/utils/i18n.d.ts +0 -6
  129. package/dist/theglobalfuel/utils/i18n.d.ts.map +0 -1
  130. package/dist/theglobalfuel/utils/index.d.ts +0 -9
  131. package/dist/theglobalfuel/utils/index.d.ts.map +0 -1
  132. package/dist/theglobalfuel/utils/navigation.d.ts +0 -14
  133. package/dist/theglobalfuel/utils/navigation.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ContractDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/contracts/ContractDetailPage.tsx"],"sourcesContent":["/**\n * Contract detail — headline economics, delivery progress, shipments & collaboration.\n * @module theglobalfuel/pages/contracts\n *\n * Reads `theContract` (+ nested shipments); writes `theUpdateContract`,\n * `theTransitionContract`, `theScheduleShipment`, `theDeliverShipment`.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Pencil,\n Ship,\n Building2,\n Coins,\n Package,\n Gauge,\n MapPin,\n Calendar,\n CheckCircle2,\n Tag as TagIcon,\n MessageSquare,\n FileSignature,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { Tabs, type TabItem } from '../../components/Tabs';\nimport { LoadingView, ErrorView, Section } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { MiniBar } from '../../components/MiniBar';\nimport { FileLink } from '../../components/FileLink';\nimport { TheTags } from '../../components/TheTags';\nimport { TheDiscussion } from '../../components/TheDiscussion';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheContract,\n useTheUpdateContract,\n useTheTransitionContract,\n useTheScheduleShipment,\n useTheDeliverShipment,\n} from '../../hooks';\nimport {\n formatDate,\n formatEnumLabel,\n formatMoney,\n formatUnit,\n formatVolume,\n} from '../../utils/formatters';\nimport type {\n TheShipment,\n TheContractStatus,\n ThePricingBasis,\n TheTransportMode,\n TheUnit,\n} from '../../types';\n\nconst CONTRACT_STATUSES: TheContractStatus[] = [\n 'DRAFT',\n 'NEGOTIATION',\n 'SIGNED',\n 'ACTIVE',\n 'COMPLETED',\n 'SUSPENDED',\n 'TERMINATED',\n];\nconst PRICING_BASES: ThePricingBasis[] = ['FIXED', 'INDEX_LINKED', 'FORMULA', 'SPOT'];\nconst TRANSPORT_MODES: TheTransportMode[] = [\n 'PIPELINE',\n 'TANKER',\n 'VESSEL_BULK',\n 'RAIL',\n 'TRUCK',\n 'GRID',\n];\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\n/** Shipment states that are still \"open\" — eligible to be marked delivered. */\nconst OPEN_SHIPMENT_STATES = new Set(['SCHEDULED', 'LOADING', 'IN_TRANSIT']);\n\nconst clampPercent = (value: number): number => Math.max(0, Math.min(100, value));\n\n/** ISO datetime → the `YYYY-MM-DD` a native date input expects (empty if unset). */\nconst toDateInput = (iso: string | null | undefined): string => (iso ? iso.slice(0, 10) : '');\n\ntype DetailTab = 'shipments' | 'tags' | 'discussion';\n\ninterface EditFormState {\n counterparty: string;\n pricingBasis: ThePricingBasis;\n pricePerUnit: string;\n priceIndex: string;\n currency: string;\n contractedVolume: string;\n unit: TheUnit;\n deliveryLocation: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\ninterface ShipmentFormState {\n reference: string;\n mode: TheTransportMode;\n carrier: string;\n origin: string;\n destination: string;\n volume: string;\n unit: TheUnit;\n scheduledAt: string;\n notes: string;\n}\n\nconst emptyShipmentForm = (unit: TheUnit): ShipmentFormState => ({\n reference: '',\n mode: 'VESSEL_BULK',\n carrier: '',\n origin: '',\n destination: '',\n volume: '',\n unit,\n scheduledAt: '',\n notes: '',\n});\n\nexport function ContractDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const { data: contract, isLoading, isError, refetch } = useTheContract(id);\n\n const updateContract = useTheUpdateContract();\n const transitionContract = useTheTransitionContract();\n const scheduleShipment = useTheScheduleShipment();\n const deliverShipment = useTheDeliverShipment();\n\n const [activeTab, setActiveTab] = useState<DetailTab>('shipments');\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<EditFormState | null>(null);\n const [shipmentOpen, setShipmentOpen] = useState(false);\n const [shipmentForm, setShipmentForm] = useState<ShipmentFormState>(emptyShipmentForm('BARRELS'));\n const [error, setError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Contract\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !contract) {\n return (\n <PageLayout\n title=\"Contract\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This contract could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<FileSignature className=\"h-10 w-10\" />}\n title=\"Contract not found\"\n description=\"This contract may have been removed or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('contracts')}>Back to contracts</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const shipments = contract.shipments ?? [];\n const deliveredPct =\n contract.contractedVolume > 0\n ? clampPercent((contract.deliveredVolume / contract.contractedVolume) * 100)\n : 0;\n\n const openEdit = () => {\n setEditForm({\n counterparty: contract.counterparty,\n pricingBasis: contract.pricingBasis,\n pricePerUnit: contract.pricePerUnit ? String(contract.pricePerUnit) : '',\n priceIndex: contract.priceIndex ?? '',\n currency: contract.currency,\n contractedVolume: contract.contractedVolume ? String(contract.contractedVolume) : '',\n unit: contract.unit,\n deliveryLocation: contract.deliveryLocation ?? '',\n startDate: toDateInput(contract.startDate),\n endDate: toDateInput(contract.endDate),\n notes: contract.notes ?? '',\n });\n setError(null);\n setEditOpen(true);\n };\n\n const openShipment = () => {\n setShipmentForm(emptyShipmentForm(contract.unit));\n setError(null);\n setShipmentOpen(true);\n };\n\n const handleTransition = (status: TheContractStatus) => {\n if (status === contract.status) return;\n setError(null);\n transitionContract.mutate(\n { id: contract.id, status },\n {\n onError: (err) =>\n setError(err instanceof Error ? err.message : 'Failed to update contract status.'),\n }\n );\n };\n\n const handleSaveEdit = async () => {\n if (!editForm) return;\n if (!editForm.counterparty.trim()) {\n setError('Counterparty is required.');\n return;\n }\n setError(null);\n try {\n await updateContract.mutateAsync({\n id: contract.id,\n input: {\n counterparty: editForm.counterparty.trim(),\n pricingBasis: editForm.pricingBasis,\n pricePerUnit: editForm.pricePerUnit ? Number(editForm.pricePerUnit) : null,\n priceIndex: editForm.priceIndex.trim() || null,\n currency: editForm.currency.trim() || 'USD',\n contractedVolume: editForm.contractedVolume ? Number(editForm.contractedVolume) : null,\n unit: editForm.unit,\n deliveryLocation: editForm.deliveryLocation.trim() || null,\n startDate: editForm.startDate ? new Date(editForm.startDate).toISOString() : null,\n endDate: editForm.endDate ? new Date(editForm.endDate).toISOString() : null,\n notes: editForm.notes.trim() || null,\n },\n });\n setEditOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update contract.');\n }\n };\n\n const handleScheduleShipment = async () => {\n if (!shipmentForm.reference.trim()) {\n setError('Shipment reference is required.');\n return;\n }\n if (!shipmentForm.volume) {\n setError('Shipment volume is required.');\n return;\n }\n setError(null);\n try {\n await scheduleShipment.mutateAsync({\n contractId: contract.id,\n reference: shipmentForm.reference.trim(),\n mode: shipmentForm.mode,\n carrier: shipmentForm.carrier.trim() || null,\n origin: shipmentForm.origin.trim() || null,\n destination: shipmentForm.destination.trim() || null,\n volume: Number(shipmentForm.volume),\n unit: shipmentForm.unit,\n scheduledAt: shipmentForm.scheduledAt\n ? new Date(shipmentForm.scheduledAt).toISOString()\n : null,\n notes: shipmentForm.notes.trim() || null,\n });\n setShipmentOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to schedule shipment.');\n }\n };\n\n const handleDeliver = (shipmentId: string) => {\n setError(null);\n deliverShipment.mutate(shipmentId, {\n onError: (err) =>\n setError(err instanceof Error ? err.message : 'Failed to mark shipment delivered.'),\n });\n };\n\n const shipmentColumns: Column<TheShipment>[] = [\n {\n key: 'reference',\n header: 'Shipment',\n render: (s) => (\n <div>\n <p className=\"font-medium text-text-primary\">{s.reference}</p>\n <p className=\"text-xs text-text-tertiary\">{formatEnumLabel(s.mode)}</p>\n </div>\n ),\n },\n { key: 'status', header: 'Status', render: (s) => <StatusBadge status={s.status} /> },\n {\n key: 'carrier',\n header: 'Carrier',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-secondary\">{s.carrier ?? '—'}</span>,\n },\n {\n key: 'route',\n header: 'Route',\n hideOnMobile: true,\n render: (s) =>\n s.origin || s.destination ? (\n <span className=\"text-text-secondary\">\n {s.origin ?? '—'} <span className=\"text-text-tertiary\">→</span> {s.destination ?? '—'}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (s) => s.volume,\n render: (s) => (\n <span className=\"tabular-nums text-text-secondary\">{formatVolume(s.volume, s.unit)}</span>\n ),\n },\n {\n key: 'schedule',\n header: 'Scheduled',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-tertiary\">{formatDate(s.scheduledAt)}</span>,\n },\n {\n key: 'document',\n header: 'Document',\n hideOnMobile: true,\n render: (s) =>\n s.document?.id ? (\n <FileLink fileId={s.document.id} />\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'action',\n header: '',\n align: 'right',\n render: (s) =>\n OPEN_SHIPMENT_STATES.has(s.status) ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleDeliver(s.id)}\n disabled={deliverShipment.isPending}\n >\n <CheckCircle2 className=\"mr-1.5 h-4 w-4\" /> Mark delivered\n </Button>\n ) : null,\n },\n ];\n\n const tabs: TabItem<DetailTab>[] = [\n {\n value: 'shipments',\n label: 'Shipments',\n icon: <Ship className=\"h-4 w-4\" />,\n count: shipments.length,\n },\n { value: 'tags', label: 'Tags', icon: <TagIcon className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n const term =\n contract.startDate || contract.endDate\n ? `${formatDate(contract.startDate)} – ${formatDate(contract.endDate)}`\n : '—';\n\n return (\n <PageLayout\n title={contract.reference}\n description={`${contract.counterparty} · ${formatEnumLabel(contract.commodity)}`}\n actions={\n <>\n <StatusBadge status={contract.status} />\n <Select\n value={contract.status}\n onValueChange={(v) => handleTransition(v as TheContractStatus)}\n >\n <SelectTrigger className=\"h-9 w-40\" aria-label=\"Change contract status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CONTRACT_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit\n </Button>\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Headline metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Building2 className=\"h-5 w-5\" />}\n value={contract.counterparty}\n label=\"Counterparty\"\n featured\n />\n <MetricsCard\n icon={<Package className=\"h-5 w-5\" />}\n value={formatEnumLabel(contract.commodity)}\n label=\"Commodity & side\"\n footer={<StatusBadge status={contract.side} />}\n />\n <MetricsCard\n icon={<Coins className=\"h-5 w-5\" />}\n value={formatMoney(contract.pricePerUnit, contract.currency)}\n label={`Price per ${formatUnit(contract.unit)}`}\n footer={<StatusBadge status={contract.pricingBasis} />}\n />\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={formatVolume(contract.deliveredVolume, contract.unit)}\n label={`of ${formatVolume(contract.contractedVolume, contract.unit)} delivered`}\n footer={\n <div className=\"space-y-2\">\n <MiniBar value={deliveredPct} barClassName=\"bg-[var(--color-status-success-text)]\" />\n <p className=\"text-xs tabular-nums text-text-tertiary\">\n {Math.round(deliveredPct)}% fulfilled\n </p>\n </div>\n }\n />\n </div>\n\n {/* Overview */}\n <GlassCard treatment=\"glass\" className=\"mt-4 p-6\">\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3 lg:grid-cols-4\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Pricing basis</dt>\n <dd className=\"mt-1\">\n <StatusBadge status={contract.pricingBasis} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Price index</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.priceIndex ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Currency</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.currency}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery location</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary\">\n {contract.deliveryLocation ? (\n <>\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {contract.deliveryLocation}\n </>\n ) : (\n '—'\n )}\n </dd>\n </div>\n <div className=\"col-span-2\">\n <dt className=\"text-xs text-text-tertiary\">Term</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary tabular-nums\">\n <Calendar className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {term}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Signed</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.signedAt)}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Created</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.createdAt)}</dd>\n </div>\n </dl>\n {contract.notes && (\n <p className=\"mt-5 rounded-lg bg-bg-sunken/60 p-3 text-sm text-text-secondary\">\n {contract.notes}\n </p>\n )}\n </GlassCard>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Shipments ─────────────────────────────────────────────────────────── */}\n {activeTab === 'shipments' && (\n <div className=\"mt-6\">\n <Section\n title=\"Shipments\"\n description=\"Physical movements delivering against this contract's volume.\"\n action={\n <Button size=\"sm\" onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n >\n {shipments.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Ship className=\"h-10 w-10\" />}\n title=\"No shipments scheduled\"\n description=\"Schedule a shipment to start delivering against this contract.\"\n action={\n <Button onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n />\n ) : (\n <DataTable columns={shipmentColumns} rows={shipments} rowKey={(s) => s.id} />\n )}\n </Section>\n </div>\n )}\n\n {/* ── Tags ──────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <div className=\"mt-6\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-contract\" entityId={contract.id} />\n </GlassCard>\n </div>\n )}\n\n {/* ── Discussion ────────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-6\">\n <TheDiscussion\n entityType=\"theglobalfuel-contract\"\n entityId={contract.id}\n description=\"Coordinate negotiation, delivery and settlement with your team.\"\n />\n </div>\n )}\n\n {/* Schedule shipment dialog */}\n <ResponsiveDialog open={shipmentOpen} onOpenChange={setShipmentOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Schedule shipment</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a physical movement delivering against {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipReference\">Reference *</Label>\n <Input\n id=\"shipReference\"\n value={shipmentForm.reference}\n onChange={(e) => setShipmentForm({ ...shipmentForm, reference: e.target.value })}\n placeholder=\"SHP-2026-0031\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipMode\">Mode</Label>\n <Select\n value={shipmentForm.mode}\n onValueChange={(v) =>\n setShipmentForm({ ...shipmentForm, mode: v as TheTransportMode })\n }\n >\n <SelectTrigger id=\"shipMode\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSPORT_MODES.map((m) => (\n <SelectItem key={m} value={m}>\n {formatEnumLabel(m)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipCarrier\">Carrier</Label>\n <Input\n id=\"shipCarrier\"\n value={shipmentForm.carrier}\n onChange={(e) => setShipmentForm({ ...shipmentForm, carrier: e.target.value })}\n placeholder=\"Maersk Tankers\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipOrigin\">Origin</Label>\n <Input\n id=\"shipOrigin\"\n value={shipmentForm.origin}\n onChange={(e) => setShipmentForm({ ...shipmentForm, origin: e.target.value })}\n placeholder=\"Ras Tanura\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipDestination\">Destination</Label>\n <Input\n id=\"shipDestination\"\n value={shipmentForm.destination}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, destination: e.target.value })\n }\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipVolume\">Volume *</Label>\n <Input\n id=\"shipVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={shipmentForm.volume}\n onChange={(e) => setShipmentForm({ ...shipmentForm, volume: e.target.value })}\n placeholder=\"50000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipUnit\">Unit</Label>\n <Select\n value={shipmentForm.unit}\n onValueChange={(v) => setShipmentForm({ ...shipmentForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"shipUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipScheduled\">Scheduled at</Label>\n <Input\n id=\"shipScheduled\"\n type=\"date\"\n value={shipmentForm.scheduledAt}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, scheduledAt: e.target.value })\n }\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipNotes\">Notes</Label>\n <Textarea\n id=\"shipNotes\"\n rows={2}\n value={shipmentForm.notes}\n onChange={(e) => setShipmentForm({ ...shipmentForm, notes: e.target.value })}\n placeholder=\"Optional context about this shipment.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShipmentOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleScheduleShipment} disabled={scheduleShipment.isPending}>\n {scheduleShipment.isPending ? 'Scheduling…' : 'Schedule shipment'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit contract dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the commercial terms of {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n {editForm && (\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCounterparty\">Counterparty *</Label>\n <Input\n id=\"editCounterparty\"\n value={editForm.counterparty}\n onChange={(e) => setEditForm({ ...editForm, counterparty: e.target.value })}\n placeholder=\"Vitol S.A.\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPricingBasis\">Pricing basis</Label>\n <Select\n value={editForm.pricingBasis}\n onValueChange={(v) =>\n setEditForm({ ...editForm, pricingBasis: v as ThePricingBasis })\n }\n >\n <SelectTrigger id=\"editPricingBasis\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRICING_BASES.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPriceIndex\">Price index</Label>\n <Input\n id=\"editPriceIndex\"\n value={editForm.priceIndex}\n onChange={(e) => setEditForm({ ...editForm, priceIndex: e.target.value })}\n placeholder=\"Brent, TTF, Henry Hub\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPrice\">Price / unit</Label>\n <Input\n id=\"editPrice\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.pricePerUnit}\n onChange={(e) => setEditForm({ ...editForm, pricePerUnit: e.target.value })}\n placeholder=\"82.50\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCurrency\">Currency</Label>\n <Input\n id=\"editCurrency\"\n value={editForm.currency}\n onChange={(e) => setEditForm({ ...editForm, currency: e.target.value })}\n placeholder=\"USD\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editUnit\">Unit</Label>\n <Select\n value={editForm.unit}\n onValueChange={(v) => setEditForm({ ...editForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"editUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editVolume\">Contracted volume</Label>\n <Input\n id=\"editVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.contractedVolume}\n onChange={(e) => setEditForm({ ...editForm, contractedVolume: e.target.value })}\n placeholder=\"500000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editLocation\">Delivery location</Label>\n <Input\n id=\"editLocation\"\n value={editForm.deliveryLocation}\n onChange={(e) => setEditForm({ ...editForm, deliveryLocation: e.target.value })}\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editStart\">Start date</Label>\n <Input\n id=\"editStart\"\n type=\"date\"\n value={editForm.startDate}\n onChange={(e) => setEditForm({ ...editForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editEnd\">End date</Label>\n <Input\n id=\"editEnd\"\n type=\"date\"\n value={editForm.endDate}\n onChange={(e) => setEditForm({ ...editForm, endDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editNotes\">Notes</Label>\n <Textarea\n id=\"editNotes\"\n rows={2}\n value={editForm.notes}\n onChange={(e) => setEditForm({ ...editForm, notes: e.target.value })}\n placeholder=\"Optional context about this contract.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n )}\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleSaveEdit} disabled={updateContract.isPending}>\n {updateContract.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ContractDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/contracts/ContractDetailPage.tsx"],"sourcesContent":["/**\n * Contract detail — headline economics, delivery progress, shipments & collaboration.\n * @module theglobalfuel/pages/contracts\n *\n * Reads `theContract` (+ nested shipments); writes `theUpdateContract`,\n * `theTransitionContract`, `theScheduleShipment`, `theDeliverShipment`.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Pencil,\n Ship,\n Building2,\n Coins,\n Package,\n Gauge,\n MapPin,\n Calendar,\n CheckCircle2,\n Tag as TagIcon,\n MessageSquare,\n FileSignature,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { Tabs, type TabItem } from '../../components/Tabs';\nimport { LoadingView, ErrorView, Section } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { MiniBar } from '../../components/MiniBar';\nimport { FileLink } from '../../components/FileLink';\nimport { EvidenceUpload } from '../../components/EvidenceUpload';\nimport { TheTags } from '../../components/TheTags';\nimport { TheDiscussion } from '../../components/TheDiscussion';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheContract,\n useTheUpdateContract,\n useTheTransitionContract,\n useTheScheduleShipment,\n useTheDeliverShipment,\n useNotify,\n type UploadedTheFile,\n} from '../../hooks';\nimport {\n formatDate,\n formatEnumLabel,\n formatMoney,\n formatUnit,\n formatVolume,\n} from '../../utils/formatters';\nimport { CONTRACT_TRANSITIONS, nextStatuses, toBackendDate } from '../../utils';\nimport type {\n TheShipment,\n TheContractStatus,\n ThePricingBasis,\n TheTransportMode,\n TheUnit,\n} from '../../types';\n\nconst PRICING_BASES: ThePricingBasis[] = ['FIXED', 'INDEX_LINKED', 'FORMULA', 'SPOT'];\nconst TRANSPORT_MODES: TheTransportMode[] = [\n 'PIPELINE',\n 'TANKER',\n 'VESSEL_BULK',\n 'RAIL',\n 'TRUCK',\n 'GRID',\n];\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\n/** Shipment states that are still \"open\" — eligible to be marked delivered. */\nconst OPEN_SHIPMENT_STATES = new Set(['SCHEDULED', 'LOADING', 'IN_TRANSIT']);\n\nconst clampPercent = (value: number): number => Math.max(0, Math.min(100, value));\n\n/** ISO datetime → the `YYYY-MM-DD` a native date input expects (empty if unset). */\nconst toDateInput = (iso: string | null | undefined): string => (iso ? iso.slice(0, 10) : '');\n\ntype DetailTab = 'shipments' | 'tags' | 'discussion';\n\ninterface EditFormState {\n counterparty: string;\n pricingBasis: ThePricingBasis;\n pricePerUnit: string;\n priceIndex: string;\n currency: string;\n contractedVolume: string;\n unit: TheUnit;\n deliveryLocation: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\ninterface ShipmentFormState {\n reference: string;\n mode: TheTransportMode;\n carrier: string;\n origin: string;\n destination: string;\n volume: string;\n unit: TheUnit;\n scheduledAt: string;\n notes: string;\n}\n\nconst emptyShipmentForm = (unit: TheUnit): ShipmentFormState => ({\n reference: '',\n mode: 'VESSEL_BULK',\n carrier: '',\n origin: '',\n destination: '',\n volume: '',\n unit,\n scheduledAt: '',\n notes: '',\n});\n\nexport function ContractDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n const { data: contract, isLoading, isError, refetch } = useTheContract(id);\n\n const updateContract = useTheUpdateContract();\n const transitionContract = useTheTransitionContract();\n const scheduleShipment = useTheScheduleShipment();\n const deliverShipment = useTheDeliverShipment();\n\n const [activeTab, setActiveTab] = useState<DetailTab>('shipments');\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<EditFormState | null>(null);\n const [shipmentOpen, setShipmentOpen] = useState(false);\n const [shipmentForm, setShipmentForm] = useState<ShipmentFormState>(emptyShipmentForm('BARRELS'));\n const [docFile, setDocFile] = useState<UploadedTheFile | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Contract\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !contract) {\n return (\n <PageLayout\n title=\"Contract\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This contract could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<FileSignature className=\"h-10 w-10\" />}\n title=\"Contract not found\"\n description=\"This contract may have been removed or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('contracts')}>Back to contracts</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const shipments = contract.shipments ?? [];\n const deliveredPct =\n contract.contractedVolume > 0\n ? clampPercent((contract.deliveredVolume / contract.contractedVolume) * 100)\n : 0;\n // Only offer legal next states so the backend never rejects the transition.\n const contractNext = nextStatuses(CONTRACT_TRANSITIONS, contract.status);\n\n const openEdit = () => {\n setEditForm({\n counterparty: contract.counterparty,\n pricingBasis: contract.pricingBasis,\n pricePerUnit: contract.pricePerUnit ? String(contract.pricePerUnit) : '',\n priceIndex: contract.priceIndex ?? '',\n currency: contract.currency,\n contractedVolume: contract.contractedVolume ? String(contract.contractedVolume) : '',\n unit: contract.unit,\n deliveryLocation: contract.deliveryLocation ?? '',\n startDate: toDateInput(contract.startDate),\n endDate: toDateInput(contract.endDate),\n notes: contract.notes ?? '',\n });\n setError(null);\n setEditOpen(true);\n };\n\n const openShipment = () => {\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n setShipmentOpen(true);\n };\n\n const handleTransition = (status: TheContractStatus) => {\n if (status === contract.status) return;\n setError(null);\n transitionContract.mutate(\n { id: contract.id, status },\n {\n onSuccess: () => notify.success('Contract status updated'),\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update contract status.');\n notify.fromError(err);\n },\n }\n );\n };\n\n const handleSaveEdit = async () => {\n if (!editForm) return;\n if (!editForm.counterparty.trim()) {\n setError('Counterparty is required.');\n return;\n }\n setError(null);\n try {\n await updateContract.mutateAsync({\n id: contract.id,\n input: {\n counterparty: editForm.counterparty.trim(),\n pricingBasis: editForm.pricingBasis,\n pricePerUnit: editForm.pricePerUnit ? Number(editForm.pricePerUnit) : null,\n priceIndex: editForm.priceIndex.trim() || null,\n currency: editForm.currency.trim().toUpperCase() || 'USD',\n contractedVolume: editForm.contractedVolume ? Number(editForm.contractedVolume) : null,\n unit: editForm.unit,\n deliveryLocation: editForm.deliveryLocation.trim() || null,\n startDate: toBackendDate(editForm.startDate) ?? null,\n endDate: toBackendDate(editForm.endDate) ?? null,\n notes: editForm.notes.trim() || null,\n },\n });\n notify.success('Contract updated');\n setEditOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update contract.');\n notify.fromError(err);\n }\n };\n\n const handleScheduleShipment = async () => {\n if (!shipmentForm.reference.trim()) {\n setError('Shipment reference is required.');\n return;\n }\n const volume = Number(shipmentForm.volume);\n if (!shipmentForm.volume || Number.isNaN(volume) || volume <= 0) {\n setError('Enter a volume greater than zero.');\n notify.error('Enter a volume greater than zero.');\n return;\n }\n setError(null);\n try {\n await scheduleShipment.mutateAsync({\n contractId: contract.id,\n reference: shipmentForm.reference.trim(),\n mode: shipmentForm.mode,\n carrier: shipmentForm.carrier.trim() || null,\n origin: shipmentForm.origin.trim() || null,\n destination: shipmentForm.destination.trim() || null,\n volume,\n unit: shipmentForm.unit,\n scheduledAt: toBackendDate(shipmentForm.scheduledAt) ?? null,\n documentFileId: docFile?.fileId ?? null,\n notes: shipmentForm.notes.trim() || null,\n });\n notify.success('Shipment scheduled');\n setShipmentOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to schedule shipment.');\n notify.fromError(err);\n }\n };\n\n const handleDeliver = (shipmentId: string) => {\n setError(null);\n deliverShipment.mutate(shipmentId, {\n onSuccess: () => notify.success('Shipment delivered'),\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to mark shipment delivered.');\n notify.fromError(err);\n },\n });\n };\n\n const shipmentColumns: Column<TheShipment>[] = [\n {\n key: 'reference',\n header: 'Shipment',\n render: (s) => (\n <div>\n <p className=\"font-medium text-text-primary\">{s.reference}</p>\n <p className=\"text-xs text-text-tertiary\">{formatEnumLabel(s.mode)}</p>\n </div>\n ),\n },\n { key: 'status', header: 'Status', render: (s) => <StatusBadge status={s.status} /> },\n {\n key: 'carrier',\n header: 'Carrier',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-secondary\">{s.carrier ?? '—'}</span>,\n },\n {\n key: 'route',\n header: 'Route',\n hideOnMobile: true,\n render: (s) =>\n s.origin || s.destination ? (\n <span className=\"text-text-secondary\">\n {s.origin ?? '—'} <span className=\"text-text-tertiary\">→</span> {s.destination ?? '—'}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (s) => s.volume,\n render: (s) => (\n <span className=\"tabular-nums text-text-secondary\">{formatVolume(s.volume, s.unit)}</span>\n ),\n },\n {\n key: 'schedule',\n header: 'Scheduled',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-tertiary\">{formatDate(s.scheduledAt)}</span>,\n },\n {\n key: 'document',\n header: 'Document',\n hideOnMobile: true,\n render: (s) =>\n s.document?.id ? (\n <FileLink fileId={s.document.id} />\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'action',\n header: '',\n align: 'right',\n render: (s) =>\n OPEN_SHIPMENT_STATES.has(s.status) ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleDeliver(s.id)}\n disabled={deliverShipment.isPending}\n >\n <CheckCircle2 className=\"mr-1.5 h-4 w-4\" /> Mark delivered\n </Button>\n ) : null,\n },\n ];\n\n const tabs: TabItem<DetailTab>[] = [\n {\n value: 'shipments',\n label: 'Shipments',\n icon: <Ship className=\"h-4 w-4\" />,\n count: shipments.length,\n },\n { value: 'tags', label: 'Tags', icon: <TagIcon className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n const term =\n contract.startDate || contract.endDate\n ? `${formatDate(contract.startDate)} – ${formatDate(contract.endDate)}`\n : '—';\n\n return (\n <PageLayout\n title={contract.reference}\n description={`${contract.counterparty} · ${formatEnumLabel(contract.commodity)}`}\n actions={\n <>\n <StatusBadge status={contract.status} />\n <Select\n value={contract.status}\n onValueChange={(v) => handleTransition(v as TheContractStatus)}\n disabled={contractNext.length === 0}\n >\n <SelectTrigger className=\"h-9 w-40\" aria-label=\"Change contract status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {/* Current status shown as the trigger value; disabled so it is not re-selected. */}\n <SelectItem value={contract.status} disabled>\n {formatEnumLabel(contract.status)}\n </SelectItem>\n {contractNext.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit\n </Button>\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Headline metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Building2 className=\"h-5 w-5\" />}\n value={contract.counterparty}\n label=\"Counterparty\"\n featured\n />\n <MetricsCard\n icon={<Package className=\"h-5 w-5\" />}\n value={formatEnumLabel(contract.commodity)}\n label=\"Commodity & side\"\n footer={<StatusBadge status={contract.side} />}\n />\n <MetricsCard\n icon={<Coins className=\"h-5 w-5\" />}\n value={formatMoney(contract.pricePerUnit, contract.currency)}\n label={`Price per ${formatUnit(contract.unit)}`}\n footer={<StatusBadge status={contract.pricingBasis} />}\n />\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={formatVolume(contract.deliveredVolume, contract.unit)}\n label={`of ${formatVolume(contract.contractedVolume, contract.unit)} delivered`}\n footer={\n <div className=\"space-y-2\">\n <MiniBar value={deliveredPct} barClassName=\"bg-[var(--color-status-success-text)]\" />\n <p className=\"text-xs tabular-nums text-text-tertiary\">\n {Math.round(deliveredPct)}% fulfilled\n </p>\n </div>\n }\n />\n </div>\n\n {/* Overview */}\n <GlassCard treatment=\"glass\" className=\"mt-4 p-6\">\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3 lg:grid-cols-4\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Pricing basis</dt>\n <dd className=\"mt-1\">\n <StatusBadge status={contract.pricingBasis} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Price index</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.priceIndex ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Currency</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.currency}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery location</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary\">\n {contract.deliveryLocation ? (\n <>\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {contract.deliveryLocation}\n </>\n ) : (\n '—'\n )}\n </dd>\n </div>\n <div className=\"col-span-2\">\n <dt className=\"text-xs text-text-tertiary\">Term</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary tabular-nums\">\n <Calendar className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {term}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Signed</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.signedAt)}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Created</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.createdAt)}</dd>\n </div>\n </dl>\n {contract.notes && (\n <p className=\"mt-5 rounded-lg bg-bg-sunken/60 p-3 text-sm text-text-secondary\">\n {contract.notes}\n </p>\n )}\n </GlassCard>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Shipments ─────────────────────────────────────────────────────────── */}\n {activeTab === 'shipments' && (\n <div className=\"mt-6\">\n <Section\n title=\"Shipments\"\n description=\"Physical movements delivering against this contract's volume.\"\n action={\n <Button size=\"sm\" onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n >\n {shipments.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Ship className=\"h-10 w-10\" />}\n title=\"No shipments scheduled\"\n description=\"Schedule a shipment to start delivering against this contract.\"\n action={\n <Button onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n />\n ) : (\n <DataTable columns={shipmentColumns} rows={shipments} rowKey={(s) => s.id} />\n )}\n </Section>\n </div>\n )}\n\n {/* ── Tags ──────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <div className=\"mt-6\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-contract\" entityId={contract.id} />\n </GlassCard>\n </div>\n )}\n\n {/* ── Discussion ────────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-6\">\n <TheDiscussion\n entityType=\"theglobalfuel-contract\"\n entityId={contract.id}\n description=\"Coordinate negotiation, delivery and settlement with your team.\"\n />\n </div>\n )}\n\n {/* Schedule shipment dialog */}\n <ResponsiveDialog\n open={shipmentOpen}\n onOpenChange={(open) => {\n setShipmentOpen(open);\n if (!open) {\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n }\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Schedule shipment</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a physical movement delivering against {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleScheduleShipment();\n }}\n >\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipReference\">Reference *</Label>\n <Input\n id=\"shipReference\"\n value={shipmentForm.reference}\n onChange={(e) => setShipmentForm({ ...shipmentForm, reference: e.target.value })}\n placeholder=\"SHP-2026-0031\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipMode\">Mode</Label>\n <Select\n value={shipmentForm.mode}\n onValueChange={(v) =>\n setShipmentForm({ ...shipmentForm, mode: v as TheTransportMode })\n }\n >\n <SelectTrigger id=\"shipMode\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSPORT_MODES.map((m) => (\n <SelectItem key={m} value={m}>\n {formatEnumLabel(m)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipCarrier\">Carrier</Label>\n <Input\n id=\"shipCarrier\"\n value={shipmentForm.carrier}\n onChange={(e) => setShipmentForm({ ...shipmentForm, carrier: e.target.value })}\n placeholder=\"Maersk Tankers\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipOrigin\">Origin</Label>\n <Input\n id=\"shipOrigin\"\n value={shipmentForm.origin}\n onChange={(e) => setShipmentForm({ ...shipmentForm, origin: e.target.value })}\n placeholder=\"Ras Tanura\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipDestination\">Destination</Label>\n <Input\n id=\"shipDestination\"\n value={shipmentForm.destination}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, destination: e.target.value })\n }\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipVolume\">Volume *</Label>\n <Input\n id=\"shipVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={shipmentForm.volume}\n onChange={(e) => setShipmentForm({ ...shipmentForm, volume: e.target.value })}\n placeholder=\"50000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipUnit\">Unit</Label>\n <Select\n value={shipmentForm.unit}\n onValueChange={(v) => setShipmentForm({ ...shipmentForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"shipUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipScheduled\">Scheduled at</Label>\n <Input\n id=\"shipScheduled\"\n type=\"date\"\n value={shipmentForm.scheduledAt}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, scheduledAt: e.target.value })\n }\n />\n </div>\n </div>\n\n <EvidenceUpload\n id=\"ship-doc\"\n label=\"Bill of lading / document\"\n value={docFile}\n onChange={setDocFile}\n accept=\"image/*,application/pdf\"\n hint=\"Attach the bill of lading or shipping document (PDF or image).\"\n />\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipNotes\">Notes</Label>\n <Textarea\n id=\"shipNotes\"\n rows={2}\n value={shipmentForm.notes}\n onChange={(e) => setShipmentForm({ ...shipmentForm, notes: e.target.value })}\n placeholder=\"Optional context about this shipment.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setShipmentOpen(false);\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={scheduleShipment.isPending}>\n {scheduleShipment.isPending ? 'Scheduling…' : 'Schedule shipment'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit contract dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the commercial terms of {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleSaveEdit();\n }}\n >\n {editForm && (\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCounterparty\">Counterparty *</Label>\n <Input\n id=\"editCounterparty\"\n value={editForm.counterparty}\n onChange={(e) => setEditForm({ ...editForm, counterparty: e.target.value })}\n placeholder=\"Vitol S.A.\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPricingBasis\">Pricing basis</Label>\n <Select\n value={editForm.pricingBasis}\n onValueChange={(v) =>\n setEditForm({ ...editForm, pricingBasis: v as ThePricingBasis })\n }\n >\n <SelectTrigger id=\"editPricingBasis\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRICING_BASES.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPriceIndex\">Price index</Label>\n <Input\n id=\"editPriceIndex\"\n value={editForm.priceIndex}\n onChange={(e) => setEditForm({ ...editForm, priceIndex: e.target.value })}\n placeholder=\"Brent, TTF, Henry Hub\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPrice\">Price / unit</Label>\n <Input\n id=\"editPrice\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.pricePerUnit}\n onChange={(e) => setEditForm({ ...editForm, pricePerUnit: e.target.value })}\n placeholder=\"82.50\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCurrency\">Currency</Label>\n <Input\n id=\"editCurrency\"\n value={editForm.currency}\n onChange={(e) => setEditForm({ ...editForm, currency: e.target.value })}\n placeholder=\"USD\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editUnit\">Unit</Label>\n <Select\n value={editForm.unit}\n onValueChange={(v) => setEditForm({ ...editForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"editUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editVolume\">Contracted volume</Label>\n <Input\n id=\"editVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.contractedVolume}\n onChange={(e) => setEditForm({ ...editForm, contractedVolume: e.target.value })}\n placeholder=\"500000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editLocation\">Delivery location</Label>\n <Input\n id=\"editLocation\"\n value={editForm.deliveryLocation}\n onChange={(e) => setEditForm({ ...editForm, deliveryLocation: e.target.value })}\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editStart\">Start date</Label>\n <Input\n id=\"editStart\"\n type=\"date\"\n value={editForm.startDate}\n onChange={(e) => setEditForm({ ...editForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editEnd\">End date</Label>\n <Input\n id=\"editEnd\"\n type=\"date\"\n value={editForm.endDate}\n onChange={(e) => setEditForm({ ...editForm, endDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editNotes\">Notes</Label>\n <Textarea\n id=\"editNotes\"\n rows={2}\n value={editForm.notes}\n onChange={(e) => setEditForm({ ...editForm, notes: e.target.value })}\n placeholder=\"Optional context about this contract.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n )}\n\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updateContract.isPending}>\n {updateContract.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}