@burdenoff/microfe-theglobalfuel 2026.705.2 → 2026.705.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/theglobalfuel/TheGlobalFuelRoot.js +54 -46
- package/dist/theglobalfuel/TheGlobalFuelRoot.js.map +1 -1
- package/dist/theglobalfuel/TheGlobalFuelRoutes.js +10 -6
- package/dist/theglobalfuel/TheGlobalFuelRoutes.js.map +1 -1
- package/dist/theglobalfuel/components/DataTable.js +126 -58
- package/dist/theglobalfuel/components/DataTable.js.map +1 -1
- package/dist/theglobalfuel/components/EmptyState.js +4 -4
- package/dist/theglobalfuel/components/EmptyState.js.map +1 -1
- package/dist/theglobalfuel/components/MetricsCard.js +2 -2
- package/dist/theglobalfuel/components/MetricsCard.js.map +1 -1
- package/dist/theglobalfuel/components/WorldMap.js +115 -0
- package/dist/theglobalfuel/components/WorldMap.js.map +1 -0
- package/dist/theglobalfuel/components/index.js +9 -0
- package/dist/theglobalfuel/components/viz/AllocationBar.js +68 -0
- package/dist/theglobalfuel/components/viz/AllocationBar.js.map +1 -0
- package/dist/theglobalfuel/components/viz/AreaChart.js +102 -0
- package/dist/theglobalfuel/components/viz/AreaChart.js.map +1 -0
- package/dist/theglobalfuel/components/viz/AvatarStack.js +2 -0
- package/dist/theglobalfuel/components/viz/BarChart.js +4 -0
- package/dist/theglobalfuel/components/viz/CertificateCard.js +4 -0
- package/dist/theglobalfuel/components/viz/DonutChart.js +109 -0
- package/dist/theglobalfuel/components/viz/DonutChart.js.map +1 -0
- package/dist/theglobalfuel/components/viz/HBarFunnel.js +3 -0
- package/dist/theglobalfuel/components/viz/Heatmap.js +3 -0
- package/dist/theglobalfuel/components/viz/KanbanBoard.js +2 -0
- package/dist/theglobalfuel/components/viz/LineChart.js +4 -0
- package/dist/theglobalfuel/components/viz/OrgTree.js +2 -0
- package/dist/theglobalfuel/components/viz/PathSteps.js +68 -0
- package/dist/theglobalfuel/components/viz/PathSteps.js.map +1 -0
- package/dist/theglobalfuel/components/viz/ProgressRing.js +6 -0
- package/dist/theglobalfuel/components/viz/ProgressRing.js.map +1 -0
- package/dist/theglobalfuel/components/viz/RatingStars.js +3 -0
- package/dist/theglobalfuel/components/viz/SegmentedTabs.js +3 -0
- package/dist/theglobalfuel/components/viz/SkillBar.js +3 -0
- package/dist/theglobalfuel/components/viz/Sparkline.js +74 -0
- package/dist/theglobalfuel/components/viz/Sparkline.js.map +1 -0
- package/dist/theglobalfuel/components/viz/StatCard.js +3 -0
- package/dist/theglobalfuel/components/viz/StepProgress.js +64 -0
- package/dist/theglobalfuel/components/viz/StepProgress.js.map +1 -0
- package/dist/theglobalfuel/components/viz/Timeline.js +66 -0
- package/dist/theglobalfuel/components/viz/Timeline.js.map +1 -0
- package/dist/theglobalfuel/components/viz/index.js +23 -0
- package/dist/theglobalfuel/components/viz/lib/Avatar.js +1 -0
- package/dist/theglobalfuel/components/viz/lib/CartesianFrame.js +119 -0
- package/dist/theglobalfuel/components/viz/lib/CartesianFrame.js.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/ResponsiveSvg.js +35 -0
- package/dist/theglobalfuel/components/viz/lib/ResponsiveSvg.js.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/format.js +17 -0
- package/dist/theglobalfuel/components/viz/lib/format.js.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/geometry.js +61 -0
- package/dist/theglobalfuel/components/viz/lib/geometry.js.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/hooks.js +39 -0
- package/dist/theglobalfuel/components/viz/lib/hooks.js.map +1 -0
- package/dist/theglobalfuel/components/viz/lib/palette.js +27 -0
- package/dist/theglobalfuel/components/viz/lib/palette.js.map +1 -0
- package/dist/theglobalfuel/hooks/useCursorPager.js +6 -15
- package/dist/theglobalfuel/hooks/useCursorPager.js.map +1 -1
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +431 -316
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
- package/dist/theglobalfuel/pages/assets/AssetsPage.js +99 -99
- package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/compliance/CompliancePage.js +250 -250
- package/dist/theglobalfuel/pages/compliance/CompliancePage.js.map +1 -1
- package/dist/theglobalfuel/pages/contracts/ContractsPage.js +2 -2
- package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +525 -227
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +255 -206
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/inventory/InventoryPage.js +60 -60
- package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
- package/dist/theglobalfuel/pages/production/ProductionPage.js +2 -2
- package/dist/theglobalfuel/pages/production/ProductionPage.js.map +1 -1
- package/dist/theglobalfuel/pages/provenance/ProvenancePage.js +465 -0
- package/dist/theglobalfuel/pages/provenance/ProvenancePage.js.map +1 -0
- package/dist/theglobalfuel/pages/reserves/ReservesPage.js +152 -152
- package/dist/theglobalfuel/pages/reserves/ReservesPage.js.map +1 -1
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +356 -227
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetDetailPage.tsx"],"sourcesContent":["/**\n * Asset detail — lifecycle, production capture, reserve estimates, emissions,\n * tags & discussion for a single resource asset.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theAsset` (+ nested productionRecords / reserveEstimates) and\n * `theListEmissionRecords`; writes `theRecordProduction`,\n * `theCreateReserveEstimate`, `theTransitionAsset` and `theRetireAsset`. Child\n * creates invalidate the asset query in the hooks, so we just close the dialog\n * and let it refetch. No mock data.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Archive,\n Gauge,\n Percent,\n Fuel,\n CalendarClock,\n MapPin,\n Activity,\n Layers,\n Factory,\n Tag,\n MessageSquare,\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 {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n Tabs,\n type TabItem,\n Section,\n LoadingView,\n ErrorView,\n EmptyState,\n MetricsCard,\n TheTags,\n TheDiscussion,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAsset,\n useTheEmissionRecords,\n useTheRecordProduction,\n useTheCreateReserveEstimate,\n useTheTransitionAsset,\n useTheRetireAsset,\n useNotify,\n} from '../../hooks';\nimport {\n formatDate,\n formatVolume,\n formatPercent,\n formatEnumLabel,\n formatCoords,\n formatNumber,\n formatTonnesCo2e,\n formatRelativeTime,\n toBackendDate,\n ASSET_TRANSITIONS,\n nextStatuses,\n} from '../../utils';\nimport type {\n TheAssetStatus,\n TheUnit,\n TheReserveCategory,\n TheProductionRecord,\n TheReserveEstimate,\n TheEmissionRecord,\n} from '../../types';\n\ntype AssetTab = 'production' | 'reserves' | 'emissions' | 'tags' | 'discussion';\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst RESERVE_CATEGORIES: TheReserveCategory[] = [\n 'PROVED',\n 'PROBABLE',\n 'POSSIBLE',\n 'CONTINGENT',\n 'PROSPECTIVE',\n];\n\nconst today = (): string => new Date().toISOString().slice(0, 10);\n\ninterface ProductionFormState {\n periodStart: string;\n periodEnd: string;\n volume: string;\n unit: TheUnit;\n grade: string;\n downtimeHours: string;\n notes: string;\n}\n\ninterface ReserveFormState {\n category: TheReserveCategory;\n asOfDate: string;\n recoverable: string;\n recoveryFactor: string;\n unit: TheUnit;\n methodology: string;\n notes: string;\n}\n\nexport function AssetDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n\n const { data: asset, isLoading, isError, refetch } = useTheAsset(id);\n const emissions = useTheEmissionRecords({ assetId: id });\n\n const transitionAsset = useTheTransitionAsset();\n const retireAsset = useTheRetireAsset();\n const recordProduction = useTheRecordProduction();\n const createReserve = useTheCreateReserveEstimate();\n\n const [activeTab, setActiveTab] = useState<AssetTab>('production');\n const [error, setError] = useState<string | null>(null);\n\n const [productionOpen, setProductionOpen] = useState(false);\n const [productionForm, setProductionForm] = useState<ProductionFormState>({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n\n const [reserveOpen, setReserveOpen] = useState(false);\n const [reserveForm, setReserveForm] = useState<ReserveFormState>({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n\n if (isLoading) {\n return (\n <PageLayout title=\"Asset\">\n <LoadingView label=\"Loading asset…\" />\n </PageLayout>\n );\n }\n if (isError || !asset) {\n return (\n <PageLayout\n title=\"Asset\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This asset could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"Asset not found\"\n description=\"This asset may have been retired or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('assets')}>Back to assets</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const productionRows = asset.productionRecords ?? [];\n const reserveRows = asset.reserveEstimates ?? [];\n const emissionRows = emissions.data?.items ?? [];\n const isRetired = asset.status === 'RETIRED';\n // Only the legal next states from the svc state machine — never all statuses.\n const transitionOptions = nextStatuses(ASSET_TRANSITIONS, asset.status);\n\n const openProduction = () => {\n setError(null);\n setProductionForm({\n periodStart: today(),\n periodEnd: today(),\n volume: '',\n unit: asset.capacityUnit,\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n setProductionOpen(true);\n };\n\n const openReserve = () => {\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: today(),\n recoverable: '',\n recoveryFactor: '',\n unit: asset.capacityUnit,\n methodology: '',\n notes: '',\n });\n setReserveOpen(true);\n };\n\n const closeProduction = () => {\n setProductionOpen(false);\n setError(null);\n setProductionForm({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n };\n\n const closeReserve = () => {\n setReserveOpen(false);\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n };\n\n const handleTransition = async (next: TheAssetStatus) => {\n if (!id || next === asset.status) return;\n setError(null);\n try {\n await transitionAsset.mutateAsync({ id, status: next });\n notify.success(`Status changed to ${formatEnumLabel(next)}`);\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to change asset status.');\n }\n };\n\n const handleRetire = async () => {\n if (!id) return;\n if (!window.confirm(`Retire ${asset.name}? This marks the asset as decommissioned.`)) return;\n setError(null);\n try {\n await retireAsset.mutateAsync(id);\n notify.success('Asset retired');\n navigateTo('assets');\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to retire asset.');\n }\n };\n\n const handleRecordProduction = async () => {\n const periodStart = toBackendDate(productionForm.periodStart);\n const periodEnd = toBackendDate(productionForm.periodEnd);\n if (!id || !periodStart || !periodEnd) {\n setError('Period start and period end are required.');\n return;\n }\n const volume = Number(productionForm.volume);\n if (!productionForm.volume || !Number.isFinite(volume) || volume <= 0) {\n const msg = 'Volume must be greater than zero.';\n setError(msg);\n notify.error(msg);\n return;\n }\n setError(null);\n try {\n await recordProduction.mutateAsync({\n assetId: id,\n periodStart,\n periodEnd,\n volume,\n unit: productionForm.unit,\n grade: productionForm.grade ? Number(productionForm.grade) : null,\n downtimeHours: productionForm.downtimeHours ? Number(productionForm.downtimeHours) : null,\n notes: productionForm.notes.trim() || null,\n });\n notify.success('Production recorded');\n closeProduction();\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to record production.');\n }\n };\n\n const handleCreateReserve = async () => {\n const asOfDate = toBackendDate(reserveForm.asOfDate);\n if (!id || !asOfDate) {\n setError('As-of date is required.');\n return;\n }\n const recoverable = Number(reserveForm.recoverable);\n if (!reserveForm.recoverable || !Number.isFinite(recoverable) || recoverable <= 0) {\n const msg = 'Recoverable volume must be greater than zero.';\n setError(msg);\n notify.error(msg);\n return;\n }\n setError(null);\n try {\n await createReserve.mutateAsync({\n assetId: id,\n category: reserveForm.category,\n asOfDate,\n recoverable,\n recoveryFactor: reserveForm.recoveryFactor ? Number(reserveForm.recoveryFactor) : null,\n unit: reserveForm.unit,\n methodology: reserveForm.methodology.trim() || null,\n notes: reserveForm.notes.trim() || null,\n });\n notify.success('Reserve estimate added');\n closeReserve();\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to add reserve estimate.');\n }\n };\n\n // ── Columns ─────────────────────────────────────────────────────────────────\n const productionColumns: Column<TheProductionRecord>[] = [\n {\n key: 'period',\n header: 'Period',\n sortValue: (r) => new Date(r.periodEnd || r.createdAt).getTime(),\n render: (r) => (\n <span className=\"font-medium text-text-primary\">\n {formatDate(r.periodStart)} – {formatDate(r.periodEnd)}\n </span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (r) => r.volume,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.volume, r.unit)}\n </span>\n ),\n },\n {\n key: 'grade',\n header: 'Grade',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.grade != null ? (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.grade)}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'downtime',\n header: 'Downtime',\n align: 'right',\n hideOnMobile: true,\n sortValue: (r) => r.downtimeHours,\n render: (r) => (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.downtimeHours)} h</span>\n ),\n },\n {\n key: 'notes',\n header: 'Notes',\n hideOnMobile: true,\n render: (r) =>\n r.notes ? (\n <span className=\"block max-w-[16rem] truncate text-text-secondary\">{r.notes}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const reserveColumns: Column<TheReserveEstimate>[] = [\n { key: 'category', header: 'Category', render: (r) => <StatusBadge status={r.category} /> },\n {\n key: 'asOf',\n header: 'As of',\n render: (r) => <span className=\"text-text-secondary\">{formatDate(r.asOfDate)}</span>,\n },\n {\n key: 'recoverable',\n header: 'Recoverable',\n align: 'right',\n sortValue: (r) => r.recoverable,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.recoverable, r.unit)}\n </span>\n ),\n },\n {\n key: 'recoveryFactor',\n header: 'Recovery factor',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.recoveryFactor != null ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(r.recoveryFactor)}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'methodology',\n header: 'Methodology',\n hideOnMobile: true,\n render: (r) =>\n r.methodology ? (\n <span className=\"block max-w-[14rem] truncate text-text-secondary\">{r.methodology}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'added',\n header: 'Added',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const emissionColumns: Column<TheEmissionRecord>[] = [\n { key: 'scope', header: 'Scope', render: (e) => <StatusBadge status={e.scope} /> },\n {\n key: 'co2e',\n header: 'CO₂e',\n align: 'right',\n sortValue: (e) => e.co2eTonnes,\n render: (e) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatTonnesCo2e(e.co2eTonnes)}\n </span>\n ),\n },\n {\n key: 'period',\n header: 'Period',\n hideOnMobile: true,\n render: (e) => (\n <span className=\"text-text-secondary\">\n {formatDate(e.periodStart)} – {formatDate(e.periodEnd)}\n </span>\n ),\n },\n {\n key: 'source',\n header: 'Source',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-secondary\">{e.source ?? '—'}</span>,\n },\n {\n key: 'verified',\n header: 'Verified',\n render: (e) =>\n e.verified ? (\n <span className=\"text-sm font-medium text-status-success-text\">Verified</span>\n ) : (\n <span className=\"text-sm text-text-tertiary\">Unverified</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-tertiary\">{formatRelativeTime(e.createdAt)}</span>,\n },\n ];\n\n const tabs: TabItem<AssetTab>[] = [\n {\n value: 'production',\n label: 'Production',\n icon: <Activity className=\"h-4 w-4\" />,\n count: productionRows.length,\n },\n {\n value: 'reserves',\n label: 'Reserves',\n icon: <Layers className=\"h-4 w-4\" />,\n count: reserveRows.length,\n },\n {\n value: 'emissions',\n label: 'Emissions',\n icon: <Factory className=\"h-4 w-4\" />,\n count: emissionRows.length,\n },\n { value: 'tags', label: 'Tags', icon: <Tag className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n return (\n <PageLayout\n title={asset.name}\n description={[asset.code, formatEnumLabel(asset.kind)].filter(Boolean).join(' · ')}\n actions={\n <>\n <StatusBadge status={asset.status} />\n {!isRetired && transitionOptions.length > 0 && (\n <Select\n value={asset.status}\n onValueChange={(v) => handleTransition(v as TheAssetStatus)}\n >\n <SelectTrigger className=\"h-9 w-44\" aria-label=\"Change asset status\">\n <SelectValue placeholder=\"Change status\" />\n </SelectTrigger>\n <SelectContent>\n {/* Current state — shown in the trigger, not itself a transition. */}\n <SelectItem value={asset.status} disabled>\n {formatEnumLabel(asset.status)}\n </SelectItem>\n {transitionOptions.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!isRetired && (\n <Button\n variant=\"ghost\"\n onClick={handleRetire}\n disabled={retireAsset.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Retire\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Metric strip */}\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5\">\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n label=\"Capacity\"\n />\n <MetricsCard\n icon={<Percent className=\"h-5 w-5\" />}\n value={formatPercent(asset.workingInterestPct)}\n label=\"Working interest\"\n />\n <MetricsCard\n icon={<Fuel className=\"h-5 w-5\" />}\n value={formatEnumLabel(asset.commodity)}\n label=\"Commodity\"\n />\n <MetricsCard\n icon={<CalendarClock className=\"h-5 w-5\" />}\n value={formatDate(asset.commissionedAt)}\n label=\"Commissioned\"\n />\n <MetricsCard\n icon={<MapPin className=\"h-5 w-5\" />}\n value={formatCoords(asset.latitude, asset.longitude)}\n label=\"Location\"\n footer={\n asset.location ? (\n <p className=\"truncate text-xs text-text-tertiary\">{asset.location}</p>\n ) : undefined\n }\n />\n </div>\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 {/* ── Production ──────────────────────────────────────────────────────── */}\n {activeTab === 'production' && (\n <Section\n title=\"Production\"\n description=\"Volumes produced per reporting period, with grade & downtime.\"\n action={\n <Button size=\"sm\" onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n >\n {productionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Activity className=\"h-10 w-10\" />}\n title=\"No production recorded\"\n description=\"Record a production period to start tracking volumes for this asset.\"\n action={\n <Button onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n />\n ) : (\n <DataTable\n columns={productionColumns}\n rows={productionRows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n )}\n </Section>\n )}\n\n {/* ── Reserves ────────────────────────────────────────────────────────── */}\n {activeTab === 'reserves' && (\n <Section\n title=\"Reserve estimates\"\n description=\"Recoverable volumes by SPE-PRMS reserve category & as-of date.\"\n action={\n <Button size=\"sm\" onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n >\n {reserveRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Layers className=\"h-10 w-10\" />}\n title=\"No reserve estimates\"\n description=\"Add a reserve estimate to record recoverable volumes for this asset.\"\n action={\n <Button onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n />\n ) : (\n <DataTable columns={reserveColumns} rows={reserveRows} rowKey={(r) => r.id} />\n )}\n </Section>\n )}\n\n {/* ── Emissions ───────────────────────────────────────────────────────── */}\n {activeTab === 'emissions' && (\n <Section\n title=\"Emissions\"\n description=\"GHG emission records attributed to this asset (Scope 1 / 2 / 3).\"\n >\n {emissions.isLoading ? (\n <LoadingView label=\"Loading emissions…\" />\n ) : emissions.isError ? (\n <ErrorView\n message=\"Couldn't load emission records.\"\n onRetry={() => emissions.refetch()}\n />\n ) : emissionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Factory className=\"h-10 w-10\" />}\n title=\"No emissions recorded\"\n description=\"Emission records attributed to this asset will appear here.\"\n />\n ) : (\n <DataTable columns={emissionColumns} rows={emissionRows} rowKey={(e) => e.id} />\n )}\n </Section>\n )}\n\n {/* ── Tags ────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <Section title=\"Tags\" description=\"Label this asset for search, grouping & reporting.\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-asset\" entityId={asset.id} />\n </GlassCard>\n </Section>\n )}\n\n {/* ── Discussion ──────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-8\">\n <TheDiscussion\n entityType=\"theglobalfuel-asset\"\n entityId={asset.id}\n title=\"Discussion\"\n description=\"Notes & coordination for this asset.\"\n />\n </div>\n )}\n\n {/* Record production dialog */}\n <ResponsiveDialog\n open={productionOpen}\n onOpenChange={(open) => (open ? setProductionOpen(true) : closeProduction())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Record production</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a production period for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"recordProductionForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleRecordProduction();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodStart\">Period start *</Label>\n <Input\n id=\"prodStart\"\n type=\"date\"\n value={productionForm.periodStart}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodStart: e.target.value })\n }\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodEnd\">Period end *</Label>\n <Input\n id=\"prodEnd\"\n type=\"date\"\n value={productionForm.periodEnd}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodEnd: e.target.value })\n }\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=\"prodVolume\">Volume *</Label>\n <Input\n id=\"prodVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.volume}\n onChange={(e) => setProductionForm({ ...productionForm, volume: e.target.value })}\n placeholder=\"118500\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodUnit\">Unit</Label>\n <Select\n value={productionForm.unit}\n onValueChange={(v) =>\n setProductionForm({ ...productionForm, unit: v as TheUnit })\n }\n >\n <SelectTrigger id=\"prodUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(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=\"prodGrade\">Grade</Label>\n <Input\n id=\"prodGrade\"\n type=\"number\"\n step=\"any\"\n value={productionForm.grade}\n onChange={(e) => setProductionForm({ ...productionForm, grade: e.target.value })}\n placeholder=\"Optional (e.g. API / assay)\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodDowntime\">Downtime (hours)</Label>\n <Input\n id=\"prodDowntime\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.downtimeHours}\n onChange={(e) =>\n setProductionForm({ ...productionForm, downtimeHours: e.target.value })\n }\n placeholder=\"0\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodNotes\">Notes</Label>\n <Textarea\n id=\"prodNotes\"\n rows={2}\n value={productionForm.notes}\n onChange={(e) => setProductionForm({ ...productionForm, notes: e.target.value })}\n placeholder=\"Optional context about this period.\"\n />\n </div>\n\n {error && productionOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeProduction}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"recordProductionForm\" disabled={recordProduction.isPending}>\n {recordProduction.isPending ? 'Recording…' : 'Record production'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add reserve estimate dialog */}\n <ResponsiveDialog\n open={reserveOpen}\n onOpenChange={(open) => (open ? setReserveOpen(true) : closeReserve())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add reserve estimate</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a recoverable-volume estimate for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"reserveEstimateForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleCreateReserve();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resCategory\">Category</Label>\n <Select\n value={reserveForm.category}\n onValueChange={(v) =>\n setReserveForm({ ...reserveForm, category: v as TheReserveCategory })\n }\n >\n <SelectTrigger id=\"resCategory\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RESERVE_CATEGORIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resAsOf\">As-of date *</Label>\n <Input\n id=\"resAsOf\"\n type=\"date\"\n value={reserveForm.asOfDate}\n onChange={(e) => setReserveForm({ ...reserveForm, asOfDate: e.target.value })}\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=\"resRecoverable\">Recoverable *</Label>\n <Input\n id=\"resRecoverable\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={reserveForm.recoverable}\n onChange={(e) => setReserveForm({ ...reserveForm, recoverable: e.target.value })}\n placeholder=\"2400000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resUnit\">Unit</Label>\n <Select\n value={reserveForm.unit}\n onValueChange={(v) => setReserveForm({ ...reserveForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"resUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resFactor\">Recovery factor (%)</Label>\n <Input\n id=\"resFactor\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={reserveForm.recoveryFactor}\n onChange={(e) =>\n setReserveForm({ ...reserveForm, recoveryFactor: e.target.value })\n }\n placeholder=\"35\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resMethodology\">Methodology</Label>\n <Input\n id=\"resMethodology\"\n value={reserveForm.methodology}\n onChange={(e) => setReserveForm({ ...reserveForm, methodology: e.target.value })}\n placeholder=\"Volumetric / material balance / decline curve\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resNotes\">Notes</Label>\n <Textarea\n id=\"resNotes\"\n rows={2}\n value={reserveForm.notes}\n onChange={(e) => setReserveForm({ ...reserveForm, notes: e.target.value })}\n placeholder=\"Optional context about this estimate.\"\n />\n </div>\n\n {error && reserveOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeReserve}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"reserveEstimateForm\" disabled={createReserve.isPending}>\n {createReserve.isPending ? 'Adding…' : 'Add estimate'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetDetailPage.tsx"],"sourcesContent":["/**\n * Asset detail — lifecycle, production capture, reserve estimates, emissions,\n * tags & discussion for a single resource asset.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theAsset` (+ nested productionRecords / reserveEstimates) and\n * `theListEmissionRecords`; writes `theRecordProduction`,\n * `theCreateReserveEstimate`, `theTransitionAsset` and `theRetireAsset`. Child\n * creates invalidate the asset query in the hooks, so we just close the dialog\n * and let it refetch. No mock data.\n */\n\nimport { useState, type ReactNode } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Archive,\n Gauge,\n Percent,\n Fuel,\n CalendarClock,\n MapPin,\n Activity,\n Layers,\n Factory,\n Tag,\n MessageSquare,\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 {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n Tabs,\n type TabItem,\n Section,\n LoadingView,\n ErrorView,\n EmptyState,\n MetricsCard,\n TheTags,\n TheDiscussion,\n WorldMap,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAsset,\n useTheEmissionRecords,\n useTheRecordProduction,\n useTheCreateReserveEstimate,\n useTheTransitionAsset,\n useTheRetireAsset,\n useNotify,\n} from '../../hooks';\nimport {\n formatDate,\n formatVolume,\n formatPercent,\n formatEnumLabel,\n formatCoords,\n formatNumber,\n formatTonnesCo2e,\n formatRelativeTime,\n toBackendDate,\n ASSET_TRANSITIONS,\n nextStatuses,\n} from '../../utils';\nimport type {\n TheAssetStatus,\n TheUnit,\n TheReserveCategory,\n TheProductionRecord,\n TheReserveEstimate,\n TheEmissionRecord,\n} from '../../types';\n\ntype AssetTab = 'production' | 'reserves' | 'emissions' | 'tags' | 'discussion';\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst RESERVE_CATEGORIES: TheReserveCategory[] = [\n 'PROVED',\n 'PROBABLE',\n 'POSSIBLE',\n 'CONTINGENT',\n 'PROSPECTIVE',\n];\n\nconst today = (): string => new Date().toISOString().slice(0, 10);\n\ninterface ProductionFormState {\n periodStart: string;\n periodEnd: string;\n volume: string;\n unit: TheUnit;\n grade: string;\n downtimeHours: string;\n notes: string;\n}\n\ninterface ReserveFormState {\n category: TheReserveCategory;\n asOfDate: string;\n recoverable: string;\n recoveryFactor: string;\n unit: TheUnit;\n methodology: string;\n notes: string;\n}\n\n/** A single label/value row in the asset details definition list. */\nfunction DetailItem({ label, value }: { label: string; value: ReactNode }) {\n return (\n <div className=\"flex flex-col gap-0.5 border-b border-border-seam/60 py-2.5 last:border-b-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">{label}</dt>\n <dd className=\"truncate text-sm text-text-primary\">{value}</dd>\n </div>\n );\n}\n\nexport function AssetDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n\n const { data: asset, isLoading, isError, refetch } = useTheAsset(id);\n const emissions = useTheEmissionRecords({ assetId: id });\n\n const transitionAsset = useTheTransitionAsset();\n const retireAsset = useTheRetireAsset();\n const recordProduction = useTheRecordProduction();\n const createReserve = useTheCreateReserveEstimate();\n\n const [activeTab, setActiveTab] = useState<AssetTab>('production');\n const [error, setError] = useState<string | null>(null);\n\n const [productionOpen, setProductionOpen] = useState(false);\n const [productionForm, setProductionForm] = useState<ProductionFormState>({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n\n const [reserveOpen, setReserveOpen] = useState(false);\n const [reserveForm, setReserveForm] = useState<ReserveFormState>({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n\n if (isLoading) {\n return (\n <PageLayout title=\"Asset\">\n <LoadingView label=\"Loading asset…\" />\n </PageLayout>\n );\n }\n if (isError || !asset) {\n return (\n <PageLayout\n title=\"Asset\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This asset could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"Asset not found\"\n description=\"This asset may have been retired or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('assets')}>Back to assets</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const productionRows = asset.productionRecords ?? [];\n const reserveRows = asset.reserveEstimates ?? [];\n const emissionRows = emissions.data?.items ?? [];\n const isRetired = asset.status === 'RETIRED';\n // Only the legal next states from the svc state machine — never all statuses.\n const transitionOptions = nextStatuses(ASSET_TRANSITIONS, asset.status);\n // Real coordinates → a tokenized locator; only plotted when both are present.\n const originPoint =\n typeof asset.latitude === 'number' && typeof asset.longitude === 'number'\n ? { lat: asset.latitude, lng: asset.longitude, label: asset.name, primary: true }\n : null;\n\n const openProduction = () => {\n setError(null);\n setProductionForm({\n periodStart: today(),\n periodEnd: today(),\n volume: '',\n unit: asset.capacityUnit,\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n setProductionOpen(true);\n };\n\n const openReserve = () => {\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: today(),\n recoverable: '',\n recoveryFactor: '',\n unit: asset.capacityUnit,\n methodology: '',\n notes: '',\n });\n setReserveOpen(true);\n };\n\n const closeProduction = () => {\n setProductionOpen(false);\n setError(null);\n setProductionForm({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n };\n\n const closeReserve = () => {\n setReserveOpen(false);\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n };\n\n const handleTransition = async (next: TheAssetStatus) => {\n if (!id || next === asset.status) return;\n setError(null);\n try {\n await transitionAsset.mutateAsync({ id, status: next });\n notify.success(`Status changed to ${formatEnumLabel(next)}`);\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to change asset status.');\n }\n };\n\n const handleRetire = async () => {\n if (!id) return;\n if (!window.confirm(`Retire ${asset.name}? This marks the asset as decommissioned.`)) return;\n setError(null);\n try {\n await retireAsset.mutateAsync(id);\n notify.success('Asset retired');\n navigateTo('assets');\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to retire asset.');\n }\n };\n\n const handleRecordProduction = async () => {\n const periodStart = toBackendDate(productionForm.periodStart);\n const periodEnd = toBackendDate(productionForm.periodEnd);\n if (!id || !periodStart || !periodEnd) {\n setError('Period start and period end are required.');\n return;\n }\n const volume = Number(productionForm.volume);\n if (!productionForm.volume || !Number.isFinite(volume) || volume <= 0) {\n const msg = 'Volume must be greater than zero.';\n setError(msg);\n notify.error(msg);\n return;\n }\n setError(null);\n try {\n await recordProduction.mutateAsync({\n assetId: id,\n periodStart,\n periodEnd,\n volume,\n unit: productionForm.unit,\n grade: productionForm.grade ? Number(productionForm.grade) : null,\n downtimeHours: productionForm.downtimeHours ? Number(productionForm.downtimeHours) : null,\n notes: productionForm.notes.trim() || null,\n });\n notify.success('Production recorded');\n closeProduction();\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to record production.');\n }\n };\n\n const handleCreateReserve = async () => {\n const asOfDate = toBackendDate(reserveForm.asOfDate);\n if (!id || !asOfDate) {\n setError('As-of date is required.');\n return;\n }\n const recoverable = Number(reserveForm.recoverable);\n if (!reserveForm.recoverable || !Number.isFinite(recoverable) || recoverable <= 0) {\n const msg = 'Recoverable volume must be greater than zero.';\n setError(msg);\n notify.error(msg);\n return;\n }\n setError(null);\n try {\n await createReserve.mutateAsync({\n assetId: id,\n category: reserveForm.category,\n asOfDate,\n recoverable,\n recoveryFactor: reserveForm.recoveryFactor ? Number(reserveForm.recoveryFactor) : null,\n unit: reserveForm.unit,\n methodology: reserveForm.methodology.trim() || null,\n notes: reserveForm.notes.trim() || null,\n });\n notify.success('Reserve estimate added');\n closeReserve();\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to add reserve estimate.');\n }\n };\n\n // ── Columns ─────────────────────────────────────────────────────────────────\n const productionColumns: Column<TheProductionRecord>[] = [\n {\n key: 'period',\n header: 'Period',\n sortValue: (r) => new Date(r.periodEnd || r.createdAt).getTime(),\n render: (r) => (\n <span className=\"font-medium text-text-primary\">\n {formatDate(r.periodStart)} – {formatDate(r.periodEnd)}\n </span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (r) => r.volume,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.volume, r.unit)}\n </span>\n ),\n },\n {\n key: 'grade',\n header: 'Grade',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.grade != null ? (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.grade)}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'downtime',\n header: 'Downtime',\n align: 'right',\n hideOnMobile: true,\n sortValue: (r) => r.downtimeHours,\n render: (r) => (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.downtimeHours)} h</span>\n ),\n },\n {\n key: 'notes',\n header: 'Notes',\n hideOnMobile: true,\n render: (r) =>\n r.notes ? (\n <span className=\"block max-w-[16rem] truncate text-text-secondary\">{r.notes}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const reserveColumns: Column<TheReserveEstimate>[] = [\n { key: 'category', header: 'Category', render: (r) => <StatusBadge status={r.category} /> },\n {\n key: 'asOf',\n header: 'As of',\n render: (r) => <span className=\"text-text-secondary\">{formatDate(r.asOfDate)}</span>,\n },\n {\n key: 'recoverable',\n header: 'Recoverable',\n align: 'right',\n sortValue: (r) => r.recoverable,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.recoverable, r.unit)}\n </span>\n ),\n },\n {\n key: 'recoveryFactor',\n header: 'Recovery factor',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.recoveryFactor != null ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(r.recoveryFactor)}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'methodology',\n header: 'Methodology',\n hideOnMobile: true,\n render: (r) =>\n r.methodology ? (\n <span className=\"block max-w-[14rem] truncate text-text-secondary\">{r.methodology}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'added',\n header: 'Added',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const emissionColumns: Column<TheEmissionRecord>[] = [\n { key: 'scope', header: 'Scope', render: (e) => <StatusBadge status={e.scope} /> },\n {\n key: 'co2e',\n header: 'CO₂e',\n align: 'right',\n sortValue: (e) => e.co2eTonnes,\n render: (e) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatTonnesCo2e(e.co2eTonnes)}\n </span>\n ),\n },\n {\n key: 'period',\n header: 'Period',\n hideOnMobile: true,\n render: (e) => (\n <span className=\"text-text-secondary\">\n {formatDate(e.periodStart)} – {formatDate(e.periodEnd)}\n </span>\n ),\n },\n {\n key: 'source',\n header: 'Source',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-secondary\">{e.source ?? '—'}</span>,\n },\n {\n key: 'verified',\n header: 'Verified',\n render: (e) =>\n e.verified ? (\n <span className=\"text-sm font-medium text-status-success-text\">Verified</span>\n ) : (\n <span className=\"text-sm text-text-tertiary\">Unverified</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-tertiary\">{formatRelativeTime(e.createdAt)}</span>,\n },\n ];\n\n const tabs: TabItem<AssetTab>[] = [\n {\n value: 'production',\n label: 'Production',\n icon: <Activity className=\"h-4 w-4\" />,\n count: productionRows.length,\n },\n {\n value: 'reserves',\n label: 'Reserves',\n icon: <Layers className=\"h-4 w-4\" />,\n count: reserveRows.length,\n },\n {\n value: 'emissions',\n label: 'Emissions',\n icon: <Factory className=\"h-4 w-4\" />,\n count: emissionRows.length,\n },\n { value: 'tags', label: 'Tags', icon: <Tag className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n return (\n <PageLayout\n title={asset.name}\n description={[asset.code, formatEnumLabel(asset.kind)].filter(Boolean).join(' · ')}\n actions={\n <>\n <StatusBadge status={asset.status} />\n {!isRetired && transitionOptions.length > 0 && (\n <Select\n value={asset.status}\n onValueChange={(v) => handleTransition(v as TheAssetStatus)}\n >\n <SelectTrigger className=\"h-9 w-44\" aria-label=\"Change asset status\">\n <SelectValue placeholder=\"Change status\" />\n </SelectTrigger>\n <SelectContent>\n {/* Current state — shown in the trigger, not itself a transition. */}\n <SelectItem value={asset.status} disabled>\n {formatEnumLabel(asset.status)}\n </SelectItem>\n {transitionOptions.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!isRetired && (\n <Button\n variant=\"ghost\"\n onClick={handleRetire}\n disabled={retireAsset.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Retire\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Metric strip */}\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5\">\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n label=\"Capacity\"\n />\n <MetricsCard\n icon={<Percent className=\"h-5 w-5\" />}\n value={formatPercent(asset.workingInterestPct)}\n label=\"Working interest\"\n />\n <MetricsCard\n icon={<Fuel className=\"h-5 w-5\" />}\n value={formatEnumLabel(asset.commodity)}\n label=\"Commodity\"\n />\n <MetricsCard\n icon={<CalendarClock className=\"h-5 w-5\" />}\n value={formatDate(asset.commissionedAt)}\n label=\"Commissioned\"\n />\n <MetricsCard\n icon={<MapPin className=\"h-5 w-5\" />}\n value={formatCoords(asset.latitude, asset.longitude)}\n label=\"Location\"\n footer={\n asset.location ? (\n <p className=\"truncate text-xs text-text-tertiary\">{asset.location}</p>\n ) : undefined\n }\n />\n </div>\n\n {/* Details + location — full real-field surface alongside a locator map */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <GlassCard treatment=\"glass\" className=\"p-6 lg:col-span-2\">\n <h2 className=\"mb-2 text-base font-semibold text-text-primary\">Asset details</h2>\n <dl className=\"grid grid-cols-1 gap-x-8 sm:grid-cols-2\">\n <DetailItem label=\"Asset code\" value={asset.code || '—'} />\n <DetailItem label=\"Kind\" value={formatEnumLabel(asset.kind)} />\n <DetailItem label=\"Commodity\" value={formatEnumLabel(asset.commodity)} />\n <DetailItem label=\"Status\" value={<StatusBadge status={asset.status} />} />\n <DetailItem\n label=\"Capacity / day\"\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n />\n <DetailItem label=\"Working interest\" value={formatPercent(asset.workingInterestPct)} />\n <DetailItem\n label=\"Operator lead\"\n value={\n asset.operatorLeadId ? (\n <span className=\"font-mono text-xs\" title={asset.operatorLeadId}>\n {asset.operatorLeadId}\n </span>\n ) : (\n '—'\n )\n }\n />\n <DetailItem label=\"Location\" value={asset.location || '—'} />\n <DetailItem label=\"Coordinates\" value={formatCoords(asset.latitude, asset.longitude)} />\n <DetailItem label=\"Commissioned\" value={formatDate(asset.commissionedAt)} />\n <DetailItem label=\"Decommissioned\" value={formatDate(asset.decommissionedAt)} />\n <DetailItem\n label=\"Registered\"\n value={\n <span title={formatDate(asset.createdAt)}>\n {formatRelativeTime(asset.createdAt)}\n </span>\n }\n />\n <DetailItem\n label=\"Last updated\"\n value={\n <span title={formatDate(asset.updatedAt)}>\n {formatRelativeTime(asset.updatedAt)}\n </span>\n }\n />\n </dl>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-3 p-6\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-accent\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Location</h2>\n </div>\n {originPoint ? (\n <WorldMap points={[originPoint]} />\n ) : (\n <div className=\"flex flex-1 items-center justify-center rounded-xl border border-dashed border-border-seam py-10 text-center text-sm text-text-secondary\">\n No coordinates recorded for this asset.\n </div>\n )}\n {asset.location && <p className=\"text-xs text-text-tertiary\">{asset.location}</p>}\n </GlassCard>\n </div>\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 {/* ── Production ──────────────────────────────────────────────────────── */}\n {activeTab === 'production' && (\n <Section\n title=\"Production\"\n description=\"Volumes produced per reporting period, with grade & downtime.\"\n action={\n <Button size=\"sm\" onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n >\n {productionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Activity className=\"h-10 w-10\" />}\n title=\"No production recorded\"\n description=\"Record a production period to start tracking volumes for this asset.\"\n action={\n <Button onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n />\n ) : (\n <DataTable\n columns={productionColumns}\n rows={productionRows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n )}\n </Section>\n )}\n\n {/* ── Reserves ────────────────────────────────────────────────────────── */}\n {activeTab === 'reserves' && (\n <Section\n title=\"Reserve estimates\"\n description=\"Recoverable volumes by SPE-PRMS reserve category & as-of date.\"\n action={\n <Button size=\"sm\" onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n >\n {reserveRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Layers className=\"h-10 w-10\" />}\n title=\"No reserve estimates\"\n description=\"Add a reserve estimate to record recoverable volumes for this asset.\"\n action={\n <Button onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n />\n ) : (\n <DataTable columns={reserveColumns} rows={reserveRows} rowKey={(r) => r.id} />\n )}\n </Section>\n )}\n\n {/* ── Emissions ───────────────────────────────────────────────────────── */}\n {activeTab === 'emissions' && (\n <Section\n title=\"Emissions\"\n description=\"GHG emission records attributed to this asset (Scope 1 / 2 / 3).\"\n >\n {emissions.isLoading ? (\n <LoadingView label=\"Loading emissions…\" />\n ) : emissions.isError ? (\n <ErrorView\n message=\"Couldn't load emission records.\"\n onRetry={() => emissions.refetch()}\n />\n ) : emissionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Factory className=\"h-10 w-10\" />}\n title=\"No emissions recorded\"\n description=\"Emission records attributed to this asset will appear here.\"\n />\n ) : (\n <DataTable columns={emissionColumns} rows={emissionRows} rowKey={(e) => e.id} />\n )}\n </Section>\n )}\n\n {/* ── Tags ────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <Section title=\"Tags\" description=\"Label this asset for search, grouping & reporting.\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-asset\" entityId={asset.id} />\n </GlassCard>\n </Section>\n )}\n\n {/* ── Discussion ──────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-8\">\n <TheDiscussion\n entityType=\"theglobalfuel-asset\"\n entityId={asset.id}\n title=\"Discussion\"\n description=\"Notes & coordination for this asset.\"\n />\n </div>\n )}\n\n {/* Record production dialog */}\n <ResponsiveDialog\n open={productionOpen}\n onOpenChange={(open) => (open ? setProductionOpen(true) : closeProduction())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Record production</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a production period for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"recordProductionForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleRecordProduction();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodStart\">Period start *</Label>\n <Input\n id=\"prodStart\"\n type=\"date\"\n value={productionForm.periodStart}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodStart: e.target.value })\n }\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodEnd\">Period end *</Label>\n <Input\n id=\"prodEnd\"\n type=\"date\"\n value={productionForm.periodEnd}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodEnd: e.target.value })\n }\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=\"prodVolume\">Volume *</Label>\n <Input\n id=\"prodVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.volume}\n onChange={(e) => setProductionForm({ ...productionForm, volume: e.target.value })}\n placeholder=\"118500\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodUnit\">Unit</Label>\n <Select\n value={productionForm.unit}\n onValueChange={(v) =>\n setProductionForm({ ...productionForm, unit: v as TheUnit })\n }\n >\n <SelectTrigger id=\"prodUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(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=\"prodGrade\">Grade</Label>\n <Input\n id=\"prodGrade\"\n type=\"number\"\n step=\"any\"\n value={productionForm.grade}\n onChange={(e) => setProductionForm({ ...productionForm, grade: e.target.value })}\n placeholder=\"Optional (e.g. API / assay)\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodDowntime\">Downtime (hours)</Label>\n <Input\n id=\"prodDowntime\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.downtimeHours}\n onChange={(e) =>\n setProductionForm({ ...productionForm, downtimeHours: e.target.value })\n }\n placeholder=\"0\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodNotes\">Notes</Label>\n <Textarea\n id=\"prodNotes\"\n rows={2}\n value={productionForm.notes}\n onChange={(e) => setProductionForm({ ...productionForm, notes: e.target.value })}\n placeholder=\"Optional context about this period.\"\n />\n </div>\n\n {error && productionOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeProduction}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"recordProductionForm\" disabled={recordProduction.isPending}>\n {recordProduction.isPending ? 'Recording…' : 'Record production'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add reserve estimate dialog */}\n <ResponsiveDialog\n open={reserveOpen}\n onOpenChange={(open) => (open ? setReserveOpen(true) : closeReserve())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add reserve estimate</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a recoverable-volume estimate for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"reserveEstimateForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleCreateReserve();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resCategory\">Category</Label>\n <Select\n value={reserveForm.category}\n onValueChange={(v) =>\n setReserveForm({ ...reserveForm, category: v as TheReserveCategory })\n }\n >\n <SelectTrigger id=\"resCategory\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RESERVE_CATEGORIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resAsOf\">As-of date *</Label>\n <Input\n id=\"resAsOf\"\n type=\"date\"\n value={reserveForm.asOfDate}\n onChange={(e) => setReserveForm({ ...reserveForm, asOfDate: e.target.value })}\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=\"resRecoverable\">Recoverable *</Label>\n <Input\n id=\"resRecoverable\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={reserveForm.recoverable}\n onChange={(e) => setReserveForm({ ...reserveForm, recoverable: e.target.value })}\n placeholder=\"2400000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resUnit\">Unit</Label>\n <Select\n value={reserveForm.unit}\n onValueChange={(v) => setReserveForm({ ...reserveForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"resUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resFactor\">Recovery factor (%)</Label>\n <Input\n id=\"resFactor\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={reserveForm.recoveryFactor}\n onChange={(e) =>\n setReserveForm({ ...reserveForm, recoveryFactor: e.target.value })\n }\n placeholder=\"35\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resMethodology\">Methodology</Label>\n <Input\n id=\"resMethodology\"\n value={reserveForm.methodology}\n onChange={(e) => setReserveForm({ ...reserveForm, methodology: e.target.value })}\n placeholder=\"Volumetric / material balance / decline curve\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resNotes\">Notes</Label>\n <Textarea\n id=\"resNotes\"\n rows={2}\n value={reserveForm.notes}\n onChange={(e) => setReserveForm({ ...reserveForm, notes: e.target.value })}\n placeholder=\"Optional context about this estimate.\"\n />\n </div>\n\n {error && reserveOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeReserve}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"reserveEstimateForm\" disabled={createReserve.isPending}>\n {createReserve.isPending ? 'Adding…' : 'Add estimate'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|