@burdenoff/microfe-theglobalfuel 2026.705.5 → 2026.709.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.
- package/README.md +3 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -1
- package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts +5 -0
- package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts.map +1 -0
- package/dist/theglobalfuel/TheGlobalFuelRoot.js +106 -104
- package/dist/theglobalfuel/TheGlobalFuelRoot.js.map +1 -1
- package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts +4 -0
- package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts.map +1 -0
- package/dist/theglobalfuel/TheGlobalFuelRoutes.js +60 -38
- package/dist/theglobalfuel/TheGlobalFuelRoutes.js.map +1 -1
- package/dist/theglobalfuel/components/DataTable.d.ts +30 -0
- package/dist/theglobalfuel/components/DataTable.d.ts.map +1 -0
- package/dist/theglobalfuel/components/DataTable.js.map +1 -1
- package/dist/theglobalfuel/components/EmptyState.d.ts +18 -0
- package/dist/theglobalfuel/components/EmptyState.d.ts.map +1 -0
- package/dist/theglobalfuel/components/EvidenceUpload.d.ts +14 -0
- package/dist/theglobalfuel/components/EvidenceUpload.d.ts.map +1 -0
- package/dist/theglobalfuel/components/FileLink.d.ts +15 -0
- package/dist/theglobalfuel/components/FileLink.d.ts.map +1 -0
- package/dist/theglobalfuel/components/FilterTabs.d.ts +18 -0
- package/dist/theglobalfuel/components/FilterTabs.d.ts.map +1 -0
- package/dist/theglobalfuel/components/MetricsCard.d.ts +23 -0
- package/dist/theglobalfuel/components/MetricsCard.d.ts.map +1 -0
- package/dist/theglobalfuel/components/MiniBar.d.ts +16 -0
- package/dist/theglobalfuel/components/MiniBar.d.ts.map +1 -0
- package/dist/theglobalfuel/components/PageLayout.d.ts +18 -0
- package/dist/theglobalfuel/components/PageLayout.d.ts.map +1 -0
- package/dist/theglobalfuel/components/PageLayout.js +2 -1
- package/dist/theglobalfuel/components/PageLayout.js.map +1 -1
- package/dist/theglobalfuel/components/Pagination.d.ts +22 -0
- package/dist/theglobalfuel/components/Pagination.d.ts.map +1 -0
- package/dist/theglobalfuel/components/StateViews.d.ts +24 -0
- package/dist/theglobalfuel/components/StateViews.d.ts.map +1 -0
- package/dist/theglobalfuel/components/StatusBadge.d.ts +9 -0
- package/dist/theglobalfuel/components/StatusBadge.d.ts.map +1 -0
- package/dist/theglobalfuel/components/Tabs.d.ts +17 -0
- package/dist/theglobalfuel/components/Tabs.d.ts.map +1 -0
- package/dist/theglobalfuel/components/TheDiscussion.d.ts +18 -0
- package/dist/theglobalfuel/components/TheDiscussion.d.ts.map +1 -0
- package/dist/theglobalfuel/components/TheTags.d.ts +17 -0
- package/dist/theglobalfuel/components/TheTags.d.ts.map +1 -0
- package/dist/theglobalfuel/components/WorldMap.d.ts +18 -0
- package/dist/theglobalfuel/components/WorldMap.d.ts.map +1 -0
- package/dist/theglobalfuel/components/WorldMap.js.map +1 -1
- package/dist/theglobalfuel/components/index.d.ts +21 -0
- package/dist/theglobalfuel/components/index.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/AllocationBar.d.ts +21 -0
- package/dist/theglobalfuel/components/viz/AllocationBar.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/AreaChart.d.ts +18 -0
- package/dist/theglobalfuel/components/viz/AreaChart.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/AvatarStack.d.ts +13 -0
- package/dist/theglobalfuel/components/viz/AvatarStack.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/BarChart.d.ts +17 -0
- package/dist/theglobalfuel/components/viz/BarChart.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/CertificateCard.d.ts +14 -0
- package/dist/theglobalfuel/components/viz/CertificateCard.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/DonutChart.d.ts +20 -0
- package/dist/theglobalfuel/components/viz/DonutChart.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/HBarFunnel.d.ts +17 -0
- package/dist/theglobalfuel/components/viz/HBarFunnel.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/Heatmap.d.ts +26 -0
- package/dist/theglobalfuel/components/viz/Heatmap.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/KanbanBoard.d.ts +17 -0
- package/dist/theglobalfuel/components/viz/KanbanBoard.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/LineChart.d.ts +20 -0
- package/dist/theglobalfuel/components/viz/LineChart.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/OrgTree.d.ts +14 -0
- package/dist/theglobalfuel/components/viz/OrgTree.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/PathSteps.d.ts +17 -0
- package/dist/theglobalfuel/components/viz/PathSteps.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/ProgressRing.d.ts +20 -0
- package/dist/theglobalfuel/components/viz/ProgressRing.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/RatingStars.d.ts +14 -0
- package/dist/theglobalfuel/components/viz/RatingStars.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/SegmentedTabs.d.ts +26 -0
- package/dist/theglobalfuel/components/viz/SegmentedTabs.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/SkillBar.d.ts +17 -0
- package/dist/theglobalfuel/components/viz/SkillBar.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/Sparkline.d.ts +16 -0
- package/dist/theglobalfuel/components/viz/Sparkline.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/StatCard.d.ts +22 -0
- package/dist/theglobalfuel/components/viz/StatCard.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/StepProgress.d.ts +17 -0
- package/dist/theglobalfuel/components/viz/StepProgress.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/Timeline.d.ts +21 -0
- package/dist/theglobalfuel/components/viz/Timeline.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/index.d.ts +35 -0
- package/dist/theglobalfuel/components/viz/index.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/Avatar.d.ts +15 -0
- package/dist/theglobalfuel/components/viz/lib/Avatar.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/CartesianFrame.d.ts +44 -0
- package/dist/theglobalfuel/components/viz/lib/CartesianFrame.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/ResponsiveSvg.d.ts +27 -0
- package/dist/theglobalfuel/components/viz/lib/ResponsiveSvg.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/format.d.ts +10 -0
- package/dist/theglobalfuel/components/viz/lib/format.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/geometry.d.ts +41 -0
- package/dist/theglobalfuel/components/viz/lib/geometry.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/hooks.d.ts +18 -0
- package/dist/theglobalfuel/components/viz/lib/hooks.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/palette.d.ts +31 -0
- package/dist/theglobalfuel/components/viz/lib/palette.d.ts.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/types.d.ts +27 -0
- package/dist/theglobalfuel/components/viz/lib/types.d.ts.map +1 -0
- package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts +16 -0
- package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts.map +1 -0
- package/dist/theglobalfuel/context/index.d.ts +6 -0
- package/dist/theglobalfuel/context/index.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/index.d.ts +15 -0
- package/dist/theglobalfuel/hooks/index.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/index.js +4 -0
- package/dist/theglobalfuel/hooks/useCursorPager.d.ts +26 -0
- package/dist/theglobalfuel/hooks/useCursorPager.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useNotify.d.ts +23 -0
- package/dist/theglobalfuel/hooks/useNotify.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheAnalytics.d.ts +38 -0
- package/dist/theglobalfuel/hooks/useTheAnalytics.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheAnalytics.js +46 -0
- package/dist/theglobalfuel/hooks/useTheAnalytics.js.map +1 -0
- package/dist/theglobalfuel/hooks/useTheComments.d.ts +36 -0
- package/dist/theglobalfuel/hooks/useTheComments.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheFiles.d.ts +47 -0
- package/dist/theglobalfuel/hooks/useTheFiles.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts +79 -0
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js +2 -9
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js.map +1 -1
- package/dist/theglobalfuel/hooks/useTheNativeControls.d.ts +20 -0
- package/dist/theglobalfuel/hooks/useTheNativeControls.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheNativeControls.js +22 -0
- package/dist/theglobalfuel/hooks/useTheNativeControls.js.map +1 -0
- package/dist/theglobalfuel/hooks/useThePageView.d.ts +10 -0
- package/dist/theglobalfuel/hooks/useThePageView.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useThePageView.js +13 -0
- package/dist/theglobalfuel/hooks/useThePageView.js.map +1 -0
- package/dist/theglobalfuel/hooks/useTheTags.d.ts +44 -0
- package/dist/theglobalfuel/hooks/useTheTags.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheTranslation.d.ts +4 -0
- package/dist/theglobalfuel/hooks/useTheTranslation.d.ts.map +1 -0
- package/dist/theglobalfuel/hooks/useTheTranslation.js +12 -0
- package/dist/theglobalfuel/hooks/useTheTranslation.js.map +1 -0
- package/dist/theglobalfuel/index.d.ts +11 -0
- package/dist/theglobalfuel/index.d.ts.map +1 -0
- package/dist/theglobalfuel/index.js +2 -0
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts +13 -0
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +395 -353
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
- package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts +10 -0
- package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/assets/AssetsPage.js +152 -146
- package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts +11 -0
- package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/compliance/CompliancePage.js +233 -229
- package/dist/theglobalfuel/pages/compliance/CompliancePage.js.map +1 -1
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts +9 -0
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js +410 -389
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js.map +1 -1
- package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts +8 -0
- package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/contracts/ContractsPage.js +237 -231
- package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts +17 -0
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +255 -250
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts +13 -0
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +154 -150
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts +11 -0
- package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/inventory/InventoryPage.js +151 -147
- package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
- package/dist/theglobalfuel/pages/production/ProductionPage.d.ts +11 -0
- package/dist/theglobalfuel/pages/production/ProductionPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/production/ProductionPage.js +175 -171
- package/dist/theglobalfuel/pages/production/ProductionPage.js.map +1 -1
- package/dist/theglobalfuel/pages/provenance/ProvenancePage.d.ts +23 -0
- package/dist/theglobalfuel/pages/provenance/ProvenancePage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/provenance/ProvenancePage.js +153 -146
- package/dist/theglobalfuel/pages/provenance/ProvenancePage.js.map +1 -1
- package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts +10 -0
- package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/reserves/ReservesPage.js +168 -164
- package/dist/theglobalfuel/pages/reserves/ReservesPage.js.map +1 -1
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts +11 -0
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts.map +1 -0
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +179 -175
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
- package/dist/theglobalfuel/services/assistantApi.d.ts +25 -0
- package/dist/theglobalfuel/services/assistantApi.d.ts.map +1 -0
- package/dist/theglobalfuel/services/assistantApi.js +225 -0
- package/dist/theglobalfuel/services/assistantApi.js.map +1 -0
- package/dist/theglobalfuel/services/createSandboxAssistantTransport.d.ts +38 -0
- package/dist/theglobalfuel/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/theglobalfuel/services/createSandboxAssistantTransport.js +120 -0
- package/dist/theglobalfuel/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/theglobalfuel/services/index.d.ts +7 -0
- package/dist/theglobalfuel/services/index.d.ts.map +1 -0
- package/dist/theglobalfuel/types/assistant.d.ts +65 -0
- package/dist/theglobalfuel/types/assistant.d.ts.map +1 -0
- package/dist/theglobalfuel/types/index.d.ts +376 -0
- package/dist/theglobalfuel/types/index.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/cn.d.ts +4 -0
- package/dist/theglobalfuel/utils/cn.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/formatters.d.ts +44 -0
- package/dist/theglobalfuel/utils/formatters.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/i18n.d.ts +5 -0
- package/dist/theglobalfuel/utils/i18n.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/i18n.js +15 -0
- package/dist/theglobalfuel/utils/i18n.js.map +1 -0
- package/dist/theglobalfuel/utils/index.d.ts +10 -0
- package/dist/theglobalfuel/utils/index.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/navigation.d.ts +14 -0
- package/dist/theglobalfuel/utils/navigation.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/pageContext.d.ts +26 -0
- package/dist/theglobalfuel/utils/pageContext.d.ts.map +1 -0
- package/dist/theglobalfuel/utils/pageContext.js +65 -0
- package/dist/theglobalfuel/utils/pageContext.js.map +1 -0
- package/dist/theglobalfuel/utils/transitions.d.ts +17 -0
- package/dist/theglobalfuel/utils/transitions.d.ts.map +1 -0
- package/package.json +5 -1
- package/dist/node_modules/clsx/dist/clsx.js +0 -18
- package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -1716
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.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 { 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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"}
|
|
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 { Pagination } from '../../components/Pagination';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheContract,\n useTheShipments,\n useTheUpdateContract,\n useTheTransitionContract,\n useTheScheduleShipment,\n useTheDeliverShipment,\n useNotify,\n useThePageView,\n useTheNativeControls,\n useCursorPager,\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 PAGE_SIZE = 25;\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 useThePageView('contract-detail');\n const { haptic } = useTheNativeControls();\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 shipmentPager = useCursorPager();\n const shipmentsQuery = useTheShipments(id, undefined, {\n limit: PAGE_SIZE,\n offset: shipmentPager.page * PAGE_SIZE,\n });\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\" dataTour=\"theglobalfuel-contract-detail-page\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !contract) {\n return (\n <PageLayout\n title=\"Contract\"\n dataTour=\"theglobalfuel-contract-detail-page\"\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 = shipmentsQuery.data?.items ?? [];\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 haptic('light');\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 dataTour=\"theglobalfuel-contract-detail-page\"\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 {shipmentsQuery.isLoading ? (\n <LoadingView label=\"Loading shipments…\" />\n ) : shipmentsQuery.isError ? (\n <ErrorView\n message=\"Couldn't load shipments.\"\n onRetry={() => shipmentsQuery.refetch()}\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 <>\n <DataTable columns={shipmentColumns} rows={shipments} rowKey={(s) => s.id} />\n <Pagination\n page={shipmentPager.page}\n pageSize={PAGE_SIZE}\n itemCount={shipments.length}\n hasMore={shipmentsQuery.data?.pageInfo?.hasMore ?? false}\n onPageChange={shipmentPager.onPageChange}\n />\n </>\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) =>\n setShipmentForm({ ...shipmentForm, reference: e.target.value })\n }\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) =>\n setEditForm({ ...editForm, contractedVolume: e.target.value })\n }\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) =>\n setEditForm({ ...editForm, deliveryLocation: e.target.value })\n }\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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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offtake contracts — list, filter, and create commodity purchase/sale contracts.
|
|
3
|
+
* @module theglobalfuel/pages/contracts
|
|
4
|
+
*
|
|
5
|
+
* Reads `theListContracts`; writes `theCreateContract`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ContractsPage(): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=ContractsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContractsPage.d.ts","sourceRoot":"","sources":["../../../../src/theglobalfuel/pages/contracts/ContractsPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2HH,wBAAgB,aAAa,gCAue5B"}
|