@burdenoff/microfe-theglobalfuel 2026.704.1 → 2026.705.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/theglobalfuel/components/DataTable.js +37 -27
- package/dist/theglobalfuel/components/DataTable.js.map +1 -1
- package/dist/theglobalfuel/hooks/index.js +1 -0
- package/dist/theglobalfuel/hooks/useNotify.js +19 -0
- package/dist/theglobalfuel/hooks/useNotify.js.map +1 -0
- package/dist/theglobalfuel/hooks/useTheFiles.js +4 -1
- package/dist/theglobalfuel/hooks/useTheFiles.js.map +1 -1
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js +59 -31
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js.map +1 -1
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +367 -321
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
- package/dist/theglobalfuel/pages/assets/AssetsPage.js +66 -54
- package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/compliance/CompliancePage.js +346 -182
- package/dist/theglobalfuel/pages/compliance/CompliancePage.js.map +1 -1
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js +418 -390
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js.map +1 -1
- package/dist/theglobalfuel/pages/contracts/ContractsPage.js +238 -230
- package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +5 -3
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +201 -177
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
- package/dist/theglobalfuel/pages/inventory/InventoryPage.js +271 -238
- package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
- package/dist/theglobalfuel/pages/production/ProductionPage.js +185 -177
- package/dist/theglobalfuel/pages/production/ProductionPage.js.map +1 -1
- package/dist/theglobalfuel/pages/reserves/ReservesPage.js +160 -138
- package/dist/theglobalfuel/pages/reserves/ReservesPage.js.map +1 -1
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +250 -198
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
- package/dist/theglobalfuel/utils/cn.js +2 -2
- package/dist/theglobalfuel/utils/formatters.js +6 -1
- package/dist/theglobalfuel/utils/formatters.js.map +1 -1
- package/dist/theglobalfuel/utils/transitions.js +70 -0
- package/dist/theglobalfuel/utils/transitions.js.map +1 -0
- package/package.json +1 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
- package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts +0 -5
- package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts.map +0 -1
- package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts +0 -4
- package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts.map +0 -1
- package/dist/theglobalfuel/components/DataTable.d.ts +0 -28
- package/dist/theglobalfuel/components/DataTable.d.ts.map +0 -1
- package/dist/theglobalfuel/components/EmptyState.d.ts +0 -18
- package/dist/theglobalfuel/components/EmptyState.d.ts.map +0 -1
- package/dist/theglobalfuel/components/EvidenceUpload.d.ts +0 -14
- package/dist/theglobalfuel/components/EvidenceUpload.d.ts.map +0 -1
- package/dist/theglobalfuel/components/FileLink.d.ts +0 -15
- package/dist/theglobalfuel/components/FileLink.d.ts.map +0 -1
- package/dist/theglobalfuel/components/FilterTabs.d.ts +0 -18
- package/dist/theglobalfuel/components/FilterTabs.d.ts.map +0 -1
- package/dist/theglobalfuel/components/MetricsCard.d.ts +0 -23
- package/dist/theglobalfuel/components/MetricsCard.d.ts.map +0 -1
- package/dist/theglobalfuel/components/MiniBar.d.ts +0 -16
- package/dist/theglobalfuel/components/MiniBar.d.ts.map +0 -1
- package/dist/theglobalfuel/components/PageLayout.d.ts +0 -16
- package/dist/theglobalfuel/components/PageLayout.d.ts.map +0 -1
- package/dist/theglobalfuel/components/Pagination.d.ts +0 -22
- package/dist/theglobalfuel/components/Pagination.d.ts.map +0 -1
- package/dist/theglobalfuel/components/StateViews.d.ts +0 -24
- package/dist/theglobalfuel/components/StateViews.d.ts.map +0 -1
- package/dist/theglobalfuel/components/StatusBadge.d.ts +0 -9
- package/dist/theglobalfuel/components/StatusBadge.d.ts.map +0 -1
- package/dist/theglobalfuel/components/Tabs.d.ts +0 -17
- package/dist/theglobalfuel/components/Tabs.d.ts.map +0 -1
- package/dist/theglobalfuel/components/TheDiscussion.d.ts +0 -18
- package/dist/theglobalfuel/components/TheDiscussion.d.ts.map +0 -1
- package/dist/theglobalfuel/components/TheTags.d.ts +0 -17
- package/dist/theglobalfuel/components/TheTags.d.ts.map +0 -1
- package/dist/theglobalfuel/components/index.d.ts +0 -19
- package/dist/theglobalfuel/components/index.d.ts.map +0 -1
- package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts +0 -16
- package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts.map +0 -1
- package/dist/theglobalfuel/context/index.d.ts +0 -6
- package/dist/theglobalfuel/context/index.d.ts.map +0 -1
- package/dist/theglobalfuel/hooks/index.d.ts +0 -10
- package/dist/theglobalfuel/hooks/index.d.ts.map +0 -1
- package/dist/theglobalfuel/hooks/useCursorPager.d.ts +0 -33
- package/dist/theglobalfuel/hooks/useCursorPager.d.ts.map +0 -1
- package/dist/theglobalfuel/hooks/useTheComments.d.ts +0 -36
- package/dist/theglobalfuel/hooks/useTheComments.d.ts.map +0 -1
- package/dist/theglobalfuel/hooks/useTheFiles.d.ts +0 -47
- package/dist/theglobalfuel/hooks/useTheFiles.d.ts.map +0 -1
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts +0 -75
- package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts.map +0 -1
- package/dist/theglobalfuel/hooks/useTheTags.d.ts +0 -44
- package/dist/theglobalfuel/hooks/useTheTags.d.ts.map +0 -1
- package/dist/theglobalfuel/index.d.ts +0 -9
- package/dist/theglobalfuel/index.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts +0 -13
- package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts +0 -10
- package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts +0 -11
- package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts +0 -9
- package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts +0 -8
- package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts +0 -13
- package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts +0 -12
- package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts +0 -11
- package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/production/ProductionPage.d.ts +0 -11
- package/dist/theglobalfuel/pages/production/ProductionPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts +0 -10
- package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts.map +0 -1
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts +0 -10
- package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts.map +0 -1
- package/dist/theglobalfuel/types/index.d.ts +0 -376
- package/dist/theglobalfuel/types/index.d.ts.map +0 -1
- package/dist/theglobalfuel/utils/cn.d.ts +0 -4
- package/dist/theglobalfuel/utils/cn.d.ts.map +0 -1
- package/dist/theglobalfuel/utils/formatters.d.ts +0 -36
- package/dist/theglobalfuel/utils/formatters.d.ts.map +0 -1
- package/dist/theglobalfuel/utils/i18n.d.ts +0 -6
- package/dist/theglobalfuel/utils/i18n.d.ts.map +0 -1
- package/dist/theglobalfuel/utils/index.d.ts +0 -9
- package/dist/theglobalfuel/utils/index.d.ts.map +0 -1
- package/dist/theglobalfuel/utils/navigation.d.ts +0 -14
- package/dist/theglobalfuel/utils/navigation.d.ts.map +0 -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} from '../../hooks';\nimport {\n formatDate,\n formatVolume,\n formatPercent,\n formatEnumLabel,\n formatCoords,\n formatNumber,\n formatTonnesCo2e,\n formatRelativeTime,\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\n// Lifecycle transitions offered in the header Select — RETIRED is a terminal\n// state driven by the dedicated Retire action, not this control.\nconst TRANSITION_STATUSES: TheAssetStatus[] = [\n 'EXPLORATION',\n 'APPRAISAL',\n 'DEVELOPMENT',\n 'PRODUCING',\n 'SUSPENDED',\n 'DECOMMISSIONING',\n];\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\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\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 handleTransition = async (next: TheAssetStatus) => {\n if (!id || next === asset.status) return;\n setError(null);\n try {\n await transitionAsset.mutateAsync({ id, status: next });\n } catch (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 navigateTo('assets');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to retire asset.');\n }\n };\n\n const handleRecordProduction = async () => {\n if (!id || !productionForm.periodStart || !productionForm.periodEnd || !productionForm.volume) {\n setError('Period start, period end and volume are required.');\n return;\n }\n setError(null);\n try {\n await recordProduction.mutateAsync({\n assetId: id,\n periodStart: new Date(productionForm.periodStart).toISOString(),\n periodEnd: new Date(productionForm.periodEnd).toISOString(),\n volume: Number(productionForm.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 setProductionOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to record production.');\n }\n };\n\n const handleCreateReserve = async () => {\n if (!id || !reserveForm.asOfDate || !reserveForm.recoverable) {\n setError('As-of date and recoverable volume are required.');\n return;\n }\n setError(null);\n try {\n await createReserve.mutateAsync({\n assetId: id,\n category: reserveForm.category,\n asOfDate: new Date(reserveForm.asOfDate).toISOString(),\n recoverable: Number(reserveForm.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 setReserveOpen(false);\n } catch (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 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 && (\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 {TRANSITION_STATUSES.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 open={productionOpen} onOpenChange={setProductionOpen}>\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 <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=\"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 </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setProductionOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleRecordProduction} 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 open={reserveOpen} onOpenChange={setReserveOpen}>\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 <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=\"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 </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setReserveOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleCreateReserve} 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 } 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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"}
|
|
@@ -8,13 +8,14 @@ import { EmptyState as ae } from "../../components/EmptyState.js";
|
|
|
8
8
|
import "../../context/index.js";
|
|
9
9
|
import { useTheAssets as oe, useTheCreateAsset as a } from "../../hooks/useTheGlobalFuelApi.js";
|
|
10
10
|
import { useCursorPager as o } from "../../hooks/useCursorPager.js";
|
|
11
|
+
import { useNotify as s } from "../../hooks/useNotify.js";
|
|
11
12
|
import "../../hooks/index.js";
|
|
12
|
-
import { FilterTabs as
|
|
13
|
-
import { Pagination as
|
|
13
|
+
import { FilterTabs as c } from "../../components/FilterTabs.js";
|
|
14
|
+
import { Pagination as l } from "../../components/Pagination.js";
|
|
14
15
|
import "../../components/index.js";
|
|
15
|
-
import { useMemo as
|
|
16
|
-
import { Fuel as
|
|
17
|
-
import { Fragment as
|
|
16
|
+
import { useMemo as u, useState as d } from "react";
|
|
17
|
+
import { Fuel as f, MapPin as se, Plus as p } from "lucide-react";
|
|
18
|
+
import { Fragment as ce, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
18
19
|
import { Button as g, Input as _, Label as v, ResponsiveDialog as y, ResponsiveDialogContent as b, ResponsiveDialogDescription as x, ResponsiveDialogFooter as S, ResponsiveDialogHeader as C, ResponsiveDialogTitle as w, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k } from "@burdenoff/fe-libs/ui";
|
|
19
20
|
//#region src/theglobalfuel/pages/assets/AssetsPage.tsx
|
|
20
21
|
var A = [
|
|
@@ -99,15 +100,15 @@ var A = [
|
|
|
99
100
|
workingInterestPct: ""
|
|
100
101
|
};
|
|
101
102
|
function I() {
|
|
102
|
-
let { navigateTo: I } = e(),
|
|
103
|
-
status:
|
|
104
|
-
commodity:
|
|
105
|
-
kind:
|
|
103
|
+
let { navigateTo: I } = e(), L = s(), [R, z] = d("ALL"), [B, V] = d("ALL"), [H, le] = d("ALL"), U = o(), [W, G] = d(!1), [K, q] = d(F), [J, Y] = d(null), { data: X, isLoading: ue, isError: de, refetch: fe } = oe({
|
|
104
|
+
status: R === "ALL" ? void 0 : R,
|
|
105
|
+
commodity: B === "ALL" ? void 0 : B,
|
|
106
|
+
kind: H === "ALL" ? void 0 : H,
|
|
106
107
|
pagination: {
|
|
107
108
|
limit: P,
|
|
108
109
|
cursor: U.cursor
|
|
109
110
|
}
|
|
110
|
-
}), Z = a(), Q =
|
|
111
|
+
}), Z = a(), Q = u(() => X?.items ?? [], [X]), pe = R !== "ALL" || B !== "ALL" || H !== "ALL", me = [
|
|
111
112
|
{
|
|
112
113
|
key: "name",
|
|
113
114
|
header: "Asset",
|
|
@@ -115,7 +116,7 @@ function I() {
|
|
|
115
116
|
className: "flex items-center gap-3",
|
|
116
117
|
children: [/* @__PURE__ */ m("span", {
|
|
117
118
|
className: "grid size-9 shrink-0 place-items-center rounded-lg bg-bg-sunken text-text-secondary",
|
|
118
|
-
children: /* @__PURE__ */ m(
|
|
119
|
+
children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
|
|
119
120
|
}), /* @__PURE__ */ h("div", {
|
|
120
121
|
className: "min-w-0",
|
|
121
122
|
children: [/* @__PURE__ */ m("p", {
|
|
@@ -182,7 +183,7 @@ function I() {
|
|
|
182
183
|
hideOnMobile: !0,
|
|
183
184
|
render: (e) => e.location ? /* @__PURE__ */ h("span", {
|
|
184
185
|
className: "inline-flex items-center gap-1.5 text-text-secondary",
|
|
185
|
-
children: [/* @__PURE__ */ m(
|
|
186
|
+
children: [/* @__PURE__ */ m(se, { className: "h-3.5 w-3.5 shrink-0 text-text-tertiary" }), e.location]
|
|
186
187
|
}) : /* @__PURE__ */ m("span", {
|
|
187
188
|
className: "text-text-tertiary",
|
|
188
189
|
children: "—"
|
|
@@ -200,6 +201,30 @@ function I() {
|
|
|
200
201
|
}
|
|
201
202
|
], $ = () => {
|
|
202
203
|
q(F), Y(null);
|
|
204
|
+
}, he = async () => {
|
|
205
|
+
if (!K.name.trim()) {
|
|
206
|
+
Y("Asset name is required.");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
Y(null);
|
|
210
|
+
try {
|
|
211
|
+
let e = await Z.mutateAsync({
|
|
212
|
+
name: K.name.trim(),
|
|
213
|
+
code: K.code.trim() || null,
|
|
214
|
+
commodity: K.commodity,
|
|
215
|
+
kind: K.kind,
|
|
216
|
+
status: K.status,
|
|
217
|
+
location: K.location.trim() || null,
|
|
218
|
+
latitude: K.latitude ? Number(K.latitude) : null,
|
|
219
|
+
longitude: K.longitude ? Number(K.longitude) : null,
|
|
220
|
+
capacityPerDay: K.capacityPerDay ? Number(K.capacityPerDay) : null,
|
|
221
|
+
capacityUnit: K.capacityUnit,
|
|
222
|
+
workingInterestPct: K.workingInterestPct ? Number(K.workingInterestPct) : null
|
|
223
|
+
});
|
|
224
|
+
L.success("Asset created"), G(!1), $(), I(`assets/${e.id}`);
|
|
225
|
+
} catch (e) {
|
|
226
|
+
L.fromError(e), Y(e instanceof Error ? e.message : "Failed to create asset.");
|
|
227
|
+
}
|
|
203
228
|
};
|
|
204
229
|
return /* @__PURE__ */ h(t, {
|
|
205
230
|
title: "Assets",
|
|
@@ -212,20 +237,21 @@ function I() {
|
|
|
212
237
|
/* @__PURE__ */ h("div", {
|
|
213
238
|
className: "mb-5 flex flex-wrap items-center gap-3",
|
|
214
239
|
children: [
|
|
215
|
-
/* @__PURE__ */ m(
|
|
240
|
+
/* @__PURE__ */ m(c, {
|
|
216
241
|
options: A,
|
|
217
|
-
value:
|
|
242
|
+
value: R,
|
|
218
243
|
onChange: (e) => {
|
|
219
|
-
|
|
244
|
+
z(e), U.reset();
|
|
220
245
|
}
|
|
221
246
|
}),
|
|
222
247
|
/* @__PURE__ */ h(T, {
|
|
223
|
-
value:
|
|
248
|
+
value: B,
|
|
224
249
|
onValueChange: (e) => {
|
|
225
|
-
|
|
250
|
+
V(e), U.reset();
|
|
226
251
|
},
|
|
227
252
|
children: [/* @__PURE__ */ m(O, {
|
|
228
253
|
className: "w-48",
|
|
254
|
+
"aria-label": "Filter by commodity",
|
|
229
255
|
children: /* @__PURE__ */ m(k, { placeholder: "All commodities" })
|
|
230
256
|
}), /* @__PURE__ */ h(E, { children: [/* @__PURE__ */ m(D, {
|
|
231
257
|
value: "ALL",
|
|
@@ -236,12 +262,13 @@ function I() {
|
|
|
236
262
|
}, e))] })]
|
|
237
263
|
}),
|
|
238
264
|
/* @__PURE__ */ h(T, {
|
|
239
|
-
value:
|
|
265
|
+
value: H,
|
|
240
266
|
onValueChange: (e) => {
|
|
241
|
-
|
|
267
|
+
le(e), U.reset();
|
|
242
268
|
},
|
|
243
269
|
children: [/* @__PURE__ */ m(O, {
|
|
244
270
|
className: "w-48",
|
|
271
|
+
"aria-label": "Filter by kind",
|
|
245
272
|
children: /* @__PURE__ */ m(k, { placeholder: "All kinds" })
|
|
246
273
|
}), /* @__PURE__ */ h(E, { children: [/* @__PURE__ */ m(D, {
|
|
247
274
|
value: "ALL",
|
|
@@ -253,24 +280,25 @@ function I() {
|
|
|
253
280
|
})
|
|
254
281
|
]
|
|
255
282
|
}),
|
|
256
|
-
|
|
283
|
+
ue ? /* @__PURE__ */ m(i, { label: "Loading assets…" }) : de ? /* @__PURE__ */ m(ie, {
|
|
257
284
|
message: "Couldn't load assets.",
|
|
258
|
-
onRetry: () =>
|
|
285
|
+
onRetry: () => fe()
|
|
259
286
|
}) : Q.length === 0 ? /* @__PURE__ */ m(ae, {
|
|
260
287
|
illustration: "empty-data",
|
|
261
|
-
icon: /* @__PURE__ */ m(
|
|
288
|
+
icon: /* @__PURE__ */ m(f, { className: "h-10 w-10" }),
|
|
262
289
|
title: "No assets yet",
|
|
263
|
-
description:
|
|
290
|
+
description: pe ? "No assets match these filters." : "Register your first resource asset to start tracking production, reserves & emissions.",
|
|
264
291
|
action: /* @__PURE__ */ h(g, {
|
|
265
292
|
onClick: () => G(!0),
|
|
266
293
|
children: [/* @__PURE__ */ m(p, { className: "mr-1.5 h-4 w-4" }), " New asset"]
|
|
267
294
|
})
|
|
268
|
-
}) : /* @__PURE__ */ h(
|
|
269
|
-
columns:
|
|
295
|
+
}) : /* @__PURE__ */ h(ce, { children: [/* @__PURE__ */ m(re, {
|
|
296
|
+
columns: me,
|
|
270
297
|
rows: Q,
|
|
271
298
|
rowKey: (e) => e.id,
|
|
272
|
-
onRowClick: (e) => I(`assets/${e.id}`)
|
|
273
|
-
|
|
299
|
+
onRowClick: (e) => I(`assets/${e.id}`),
|
|
300
|
+
rowLabel: (e) => `Open ${e.name}`
|
|
301
|
+
}), /* @__PURE__ */ m(l, {
|
|
274
302
|
page: U.page,
|
|
275
303
|
pageSize: P,
|
|
276
304
|
itemCount: Q.length,
|
|
@@ -284,7 +312,11 @@ function I() {
|
|
|
284
312
|
},
|
|
285
313
|
children: /* @__PURE__ */ h(b, { children: [
|
|
286
314
|
/* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(w, { children: "New asset" }), /* @__PURE__ */ m(x, { children: "Register a resource asset — a field, well, mine, plant, terminal or pipeline." })] }),
|
|
287
|
-
/* @__PURE__ */ h("
|
|
315
|
+
/* @__PURE__ */ h("form", {
|
|
316
|
+
id: "createAssetForm",
|
|
317
|
+
onSubmit: (e) => {
|
|
318
|
+
e.preventDefault(), he();
|
|
319
|
+
},
|
|
288
320
|
className: "grid gap-4 py-2",
|
|
289
321
|
children: [
|
|
290
322
|
/* @__PURE__ */ h("div", {
|
|
@@ -505,34 +537,14 @@ function I() {
|
|
|
505
537
|
}),
|
|
506
538
|
/* @__PURE__ */ h(S, { children: [/* @__PURE__ */ m(g, {
|
|
507
539
|
variant: "outline",
|
|
508
|
-
|
|
540
|
+
type: "button",
|
|
541
|
+
onClick: () => {
|
|
542
|
+
G(!1), $();
|
|
543
|
+
},
|
|
509
544
|
children: "Cancel"
|
|
510
545
|
}), /* @__PURE__ */ m(g, {
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
Y("Asset name is required.");
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
Y(null);
|
|
517
|
-
try {
|
|
518
|
-
let e = await Z.mutateAsync({
|
|
519
|
-
name: K.name.trim(),
|
|
520
|
-
code: K.code.trim() || null,
|
|
521
|
-
commodity: K.commodity,
|
|
522
|
-
kind: K.kind,
|
|
523
|
-
status: K.status,
|
|
524
|
-
location: K.location.trim() || null,
|
|
525
|
-
latitude: K.latitude ? Number(K.latitude) : null,
|
|
526
|
-
longitude: K.longitude ? Number(K.longitude) : null,
|
|
527
|
-
capacityPerDay: K.capacityPerDay ? Number(K.capacityPerDay) : null,
|
|
528
|
-
capacityUnit: K.capacityUnit,
|
|
529
|
-
workingInterestPct: K.workingInterestPct ? Number(K.workingInterestPct) : null
|
|
530
|
-
});
|
|
531
|
-
G(!1), $(), I(`assets/${e.id}`);
|
|
532
|
-
} catch (e) {
|
|
533
|
-
Y(e instanceof Error ? e.message : "Failed to create asset.");
|
|
534
|
-
}
|
|
535
|
-
},
|
|
546
|
+
type: "submit",
|
|
547
|
+
form: "createAssetForm",
|
|
536
548
|
disabled: Z.isPending,
|
|
537
549
|
children: Z.isPending ? "Creating…" : "Create asset"
|
|
538
550
|
})] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetsPage.tsx"],"sourcesContent":["/**\n * Assets — the resource registry: list, filter & register energy/mineral assets.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theListAssets` (cursor-paginated) with status / commodity / kind\n * filters; writes `theCreateAsset`. Rows drill into `assets/:id`. No mock data —\n * every field comes from the `wspace-theglobalfuel-svc` GraphQL contract.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Fuel, MapPin } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\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 FilterTabs,\n type FilterOption,\n LoadingView,\n ErrorView,\n EmptyState,\n Pagination,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport { useTheAssets, useTheCreateAsset, useCursorPager } from '../../hooks';\nimport { formatEnumLabel, formatVolume, formatPercent, formatRelativeTime } from '../../utils';\nimport type {\n TheAsset,\n TheAssetKind,\n TheAssetStatus,\n TheCommodityType,\n TheUnit,\n} from '../../types';\n\nconst STATUS_FILTERS: FilterOption<TheAssetStatus | 'ALL'>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'EXPLORATION', label: 'Exploration' },\n { value: 'APPRAISAL', label: 'Appraisal' },\n { value: 'DEVELOPMENT', label: 'Development' },\n { value: 'PRODUCING', label: 'Producing' },\n { value: 'SUSPENDED', label: 'Suspended' },\n { value: 'DECOMMISSIONING', label: 'Decommissioning' },\n { value: 'RETIRED', label: 'Retired' },\n];\n\nconst ASSET_KINDS: TheAssetKind[] = [\n 'OIL_FIELD',\n 'GAS_FIELD',\n 'WELL',\n 'MINE',\n 'QUARRY',\n 'REFINERY',\n 'PROCESSING_PLANT',\n 'POWER_PLANT',\n 'SOLAR_FARM',\n 'WIND_FARM',\n 'STORAGE_TERMINAL',\n 'PIPELINE',\n];\n\nconst COMMODITIES: TheCommodityType[] = [\n 'CRUDE_OIL',\n 'NATURAL_GAS',\n 'LNG',\n 'COAL',\n 'ELECTRICITY',\n 'HYDROGEN',\n 'BIOFUEL',\n 'IRON_ORE',\n 'COPPER',\n 'BAUXITE',\n 'GOLD',\n 'LITHIUM',\n 'RARE_EARTH',\n];\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst PAGE_SIZE = 25;\n\ninterface CreateFormState {\n name: string;\n code: string;\n commodity: TheCommodityType;\n kind: TheAssetKind;\n status: TheAssetStatus;\n location: string;\n latitude: string;\n longitude: string;\n capacityPerDay: string;\n capacityUnit: TheUnit;\n workingInterestPct: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n name: '',\n code: '',\n commodity: 'CRUDE_OIL',\n kind: 'OIL_FIELD',\n status: 'EXPLORATION',\n location: '',\n latitude: '',\n longitude: '',\n capacityPerDay: '',\n capacityUnit: 'BARRELS',\n workingInterestPct: '',\n};\n\nexport function AssetsPage() {\n const { navigateTo } = useTheGlobalFuel();\n const [status, setStatus] = useState<TheAssetStatus | 'ALL'>('ALL');\n const [commodity, setCommodity] = useState<TheCommodityType | 'ALL'>('ALL');\n const [kind, setKind] = useState<TheAssetKind | 'ALL'>('ALL');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useTheAssets({\n status: status === 'ALL' ? undefined : status,\n commodity: commodity === 'ALL' ? undefined : commodity,\n kind: kind === 'ALL' ? undefined : kind,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n const createAsset = useTheCreateAsset();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n const filtersActive = status !== 'ALL' || commodity !== 'ALL' || kind !== 'ALL';\n\n const columns: Column<TheAsset>[] = [\n {\n key: 'name',\n header: 'Asset',\n render: (a) => (\n <div className=\"flex items-center gap-3\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Fuel className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold text-text-primary\">{a.name}</p>\n {a.code && <p className=\"truncate text-xs text-text-tertiary\">{a.code}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'kind',\n header: 'Kind',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.kind)}</span>,\n },\n {\n key: 'commodity',\n header: 'Commodity',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.commodity)}</span>,\n },\n { key: 'status', header: 'Status', render: (a) => <StatusBadge status={a.status} /> },\n {\n key: 'capacity',\n header: 'Capacity',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.capacityPerDay,\n render: (a) =>\n a.capacityPerDay > 0 ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatVolume(a.capacityPerDay, a.capacityUnit)}/day\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'workingInterest',\n header: 'Working interest',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.workingInterestPct,\n render: (a) => (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(a.workingInterestPct)}\n </span>\n ),\n },\n {\n key: 'location',\n header: 'Location',\n hideOnMobile: true,\n render: (a) =>\n a.location ? (\n <span className=\"inline-flex items-center gap-1.5 text-text-secondary\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {a.location}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-tertiary\">{formatRelativeTime(a.updatedAt)}</span>,\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.name.trim()) {\n setFormError('Asset name is required.');\n return;\n }\n setFormError(null);\n try {\n const created = await createAsset.mutateAsync({\n name: form.name.trim(),\n code: form.code.trim() || null,\n commodity: form.commodity,\n kind: form.kind,\n status: form.status,\n location: form.location.trim() || null,\n latitude: form.latitude ? Number(form.latitude) : null,\n longitude: form.longitude ? Number(form.longitude) : null,\n capacityPerDay: form.capacityPerDay ? Number(form.capacityPerDay) : null,\n capacityUnit: form.capacityUnit,\n workingInterestPct: form.workingInterestPct ? Number(form.workingInterestPct) : null,\n });\n setDialogOpen(false);\n resetForm();\n navigateTo(`assets/${created.id}`);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to create asset.');\n }\n };\n\n return (\n <PageLayout\n title=\"Assets\"\n description=\"Resource registry — fields, wells, mines, plants, terminals & pipelines across every commodity.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs\n options={STATUS_FILTERS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n pager.reset();\n }}\n />\n <Select\n value={commodity}\n onValueChange={(v) => {\n setCommodity(v as TheCommodityType | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\">\n <SelectValue placeholder=\"All commodities\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All commodities</SelectItem>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={kind}\n onValueChange={(v) => {\n setKind(v as TheAssetKind | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\">\n <SelectValue placeholder=\"All kinds\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All kinds</SelectItem>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading assets…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load assets.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"No assets yet\"\n description={\n filtersActive\n ? 'No assets match these filters.'\n : 'Register your first resource asset to start tracking production, reserves & emissions.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(a) => a.id}\n onRowClick={(a) => navigateTo(`assets/${a.id}`)}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo?.cursor)}\n />\n </>\n )}\n\n {/* New asset dialog */}\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a resource asset — a field, well, mine, plant, terminal or pipeline.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetName\">Name *</Label>\n <Input\n id=\"assetName\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n placeholder=\"Rumaila North Field\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetCode\">Code</Label>\n <Input\n id=\"assetCode\"\n value={form.code}\n onChange={(e) => setForm({ ...form, code: e.target.value })}\n placeholder=\"AST-RMB-N\"\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=\"assetCommodity\">Commodity *</Label>\n <Select\n value={form.commodity}\n onValueChange={(v) => setForm({ ...form, commodity: v as TheCommodityType })}\n >\n <SelectTrigger id=\"assetCommodity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COMMODITIES.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=\"assetKind\">Kind</Label>\n <Select\n value={form.kind}\n onValueChange={(v) => setForm({ ...form, kind: v as TheAssetKind })}\n >\n <SelectTrigger id=\"assetKind\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetStatus\">Status</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setForm({ ...form, status: v as TheAssetStatus })}\n >\n <SelectTrigger id=\"assetStatus\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUS_FILTERS.filter((o) => o.value !== 'ALL').map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLocation\">Location</Label>\n <Input\n id=\"assetLocation\"\n value={form.location}\n onChange={(e) => setForm({ ...form, location: e.target.value })}\n placeholder=\"Basra, Iraq\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLat\">Latitude</Label>\n <Input\n id=\"assetLat\"\n type=\"number\"\n step=\"any\"\n value={form.latitude}\n onChange={(e) => setForm({ ...form, latitude: e.target.value })}\n placeholder=\"30.5085\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLng\">Longitude</Label>\n <Input\n id=\"assetLng\"\n type=\"number\"\n step=\"any\"\n value={form.longitude}\n onChange={(e) => setForm({ ...form, longitude: e.target.value })}\n placeholder=\"47.7804\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5 sm:col-span-1\">\n <Label htmlFor=\"assetCapacity\">Capacity / day</Label>\n <Input\n id=\"assetCapacity\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.capacityPerDay}\n onChange={(e) => setForm({ ...form, capacityPerDay: e.target.value })}\n placeholder=\"120000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetUnit\">Capacity unit</Label>\n <Select\n value={form.capacityUnit}\n onValueChange={(v) => setForm({ ...form, capacityUnit: v as TheUnit })}\n >\n <SelectTrigger id=\"assetUnit\">\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=\"assetWi\">Working interest (%)</Label>\n <Input\n id=\"assetWi\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={form.workingInterestPct}\n onChange={(e) => setForm({ ...form, workingInterestPct: e.target.value })}\n placeholder=\"47.5\"\n />\n </div>\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setDialogOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleCreate} disabled={createAsset.isPending}>\n {createAsset.isPending ? 'Creating…' : 'Create asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetsPage.tsx"],"sourcesContent":["/**\n * Assets — the resource registry: list, filter & register energy/mineral assets.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theListAssets` (cursor-paginated) with status / commodity / kind\n * filters; writes `theCreateAsset`. Rows drill into `assets/:id`. No mock data —\n * every field comes from the `wspace-theglobalfuel-svc` GraphQL contract.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Fuel, MapPin } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\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 FilterTabs,\n type FilterOption,\n LoadingView,\n ErrorView,\n EmptyState,\n Pagination,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport { useTheAssets, useTheCreateAsset, useCursorPager, useNotify } from '../../hooks';\nimport { formatEnumLabel, formatVolume, formatPercent, formatRelativeTime } from '../../utils';\nimport type {\n TheAsset,\n TheAssetKind,\n TheAssetStatus,\n TheCommodityType,\n TheUnit,\n} from '../../types';\n\nconst STATUS_FILTERS: FilterOption<TheAssetStatus | 'ALL'>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'EXPLORATION', label: 'Exploration' },\n { value: 'APPRAISAL', label: 'Appraisal' },\n { value: 'DEVELOPMENT', label: 'Development' },\n { value: 'PRODUCING', label: 'Producing' },\n { value: 'SUSPENDED', label: 'Suspended' },\n { value: 'DECOMMISSIONING', label: 'Decommissioning' },\n { value: 'RETIRED', label: 'Retired' },\n];\n\nconst ASSET_KINDS: TheAssetKind[] = [\n 'OIL_FIELD',\n 'GAS_FIELD',\n 'WELL',\n 'MINE',\n 'QUARRY',\n 'REFINERY',\n 'PROCESSING_PLANT',\n 'POWER_PLANT',\n 'SOLAR_FARM',\n 'WIND_FARM',\n 'STORAGE_TERMINAL',\n 'PIPELINE',\n];\n\nconst COMMODITIES: TheCommodityType[] = [\n 'CRUDE_OIL',\n 'NATURAL_GAS',\n 'LNG',\n 'COAL',\n 'ELECTRICITY',\n 'HYDROGEN',\n 'BIOFUEL',\n 'IRON_ORE',\n 'COPPER',\n 'BAUXITE',\n 'GOLD',\n 'LITHIUM',\n 'RARE_EARTH',\n];\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst PAGE_SIZE = 25;\n\ninterface CreateFormState {\n name: string;\n code: string;\n commodity: TheCommodityType;\n kind: TheAssetKind;\n status: TheAssetStatus;\n location: string;\n latitude: string;\n longitude: string;\n capacityPerDay: string;\n capacityUnit: TheUnit;\n workingInterestPct: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n name: '',\n code: '',\n commodity: 'CRUDE_OIL',\n kind: 'OIL_FIELD',\n status: 'EXPLORATION',\n location: '',\n latitude: '',\n longitude: '',\n capacityPerDay: '',\n capacityUnit: 'BARRELS',\n workingInterestPct: '',\n};\n\nexport function AssetsPage() {\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n const [status, setStatus] = useState<TheAssetStatus | 'ALL'>('ALL');\n const [commodity, setCommodity] = useState<TheCommodityType | 'ALL'>('ALL');\n const [kind, setKind] = useState<TheAssetKind | 'ALL'>('ALL');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useTheAssets({\n status: status === 'ALL' ? undefined : status,\n commodity: commodity === 'ALL' ? undefined : commodity,\n kind: kind === 'ALL' ? undefined : kind,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n const createAsset = useTheCreateAsset();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n const filtersActive = status !== 'ALL' || commodity !== 'ALL' || kind !== 'ALL';\n\n const columns: Column<TheAsset>[] = [\n {\n key: 'name',\n header: 'Asset',\n render: (a) => (\n <div className=\"flex items-center gap-3\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Fuel className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold text-text-primary\">{a.name}</p>\n {a.code && <p className=\"truncate text-xs text-text-tertiary\">{a.code}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'kind',\n header: 'Kind',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.kind)}</span>,\n },\n {\n key: 'commodity',\n header: 'Commodity',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.commodity)}</span>,\n },\n { key: 'status', header: 'Status', render: (a) => <StatusBadge status={a.status} /> },\n {\n key: 'capacity',\n header: 'Capacity',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.capacityPerDay,\n render: (a) =>\n a.capacityPerDay > 0 ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatVolume(a.capacityPerDay, a.capacityUnit)}/day\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'workingInterest',\n header: 'Working interest',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.workingInterestPct,\n render: (a) => (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(a.workingInterestPct)}\n </span>\n ),\n },\n {\n key: 'location',\n header: 'Location',\n hideOnMobile: true,\n render: (a) =>\n a.location ? (\n <span className=\"inline-flex items-center gap-1.5 text-text-secondary\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {a.location}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-tertiary\">{formatRelativeTime(a.updatedAt)}</span>,\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.name.trim()) {\n setFormError('Asset name is required.');\n return;\n }\n setFormError(null);\n try {\n const created = await createAsset.mutateAsync({\n name: form.name.trim(),\n code: form.code.trim() || null,\n commodity: form.commodity,\n kind: form.kind,\n status: form.status,\n location: form.location.trim() || null,\n latitude: form.latitude ? Number(form.latitude) : null,\n longitude: form.longitude ? Number(form.longitude) : null,\n capacityPerDay: form.capacityPerDay ? Number(form.capacityPerDay) : null,\n capacityUnit: form.capacityUnit,\n workingInterestPct: form.workingInterestPct ? Number(form.workingInterestPct) : null,\n });\n notify.success('Asset created');\n setDialogOpen(false);\n resetForm();\n navigateTo(`assets/${created.id}`);\n } catch (err) {\n notify.fromError(err);\n setFormError(err instanceof Error ? err.message : 'Failed to create asset.');\n }\n };\n\n return (\n <PageLayout\n title=\"Assets\"\n description=\"Resource registry — fields, wells, mines, plants, terminals & pipelines across every commodity.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs\n options={STATUS_FILTERS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n pager.reset();\n }}\n />\n <Select\n value={commodity}\n onValueChange={(v) => {\n setCommodity(v as TheCommodityType | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\" aria-label=\"Filter by commodity\">\n <SelectValue placeholder=\"All commodities\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All commodities</SelectItem>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={kind}\n onValueChange={(v) => {\n setKind(v as TheAssetKind | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\" aria-label=\"Filter by kind\">\n <SelectValue placeholder=\"All kinds\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All kinds</SelectItem>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading assets…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load assets.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"No assets yet\"\n description={\n filtersActive\n ? 'No assets match these filters.'\n : 'Register your first resource asset to start tracking production, reserves & emissions.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(a) => a.id}\n onRowClick={(a) => navigateTo(`assets/${a.id}`)}\n rowLabel={(a) => `Open ${a.name}`}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo?.cursor)}\n />\n </>\n )}\n\n {/* New asset dialog */}\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a resource asset — a field, well, mine, plant, terminal or pipeline.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"createAssetForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleCreate();\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=\"assetName\">Name *</Label>\n <Input\n id=\"assetName\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n placeholder=\"Rumaila North Field\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetCode\">Code</Label>\n <Input\n id=\"assetCode\"\n value={form.code}\n onChange={(e) => setForm({ ...form, code: e.target.value })}\n placeholder=\"AST-RMB-N\"\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=\"assetCommodity\">Commodity *</Label>\n <Select\n value={form.commodity}\n onValueChange={(v) => setForm({ ...form, commodity: v as TheCommodityType })}\n >\n <SelectTrigger id=\"assetCommodity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COMMODITIES.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=\"assetKind\">Kind</Label>\n <Select\n value={form.kind}\n onValueChange={(v) => setForm({ ...form, kind: v as TheAssetKind })}\n >\n <SelectTrigger id=\"assetKind\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetStatus\">Status</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setForm({ ...form, status: v as TheAssetStatus })}\n >\n <SelectTrigger id=\"assetStatus\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUS_FILTERS.filter((o) => o.value !== 'ALL').map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLocation\">Location</Label>\n <Input\n id=\"assetLocation\"\n value={form.location}\n onChange={(e) => setForm({ ...form, location: e.target.value })}\n placeholder=\"Basra, Iraq\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLat\">Latitude</Label>\n <Input\n id=\"assetLat\"\n type=\"number\"\n step=\"any\"\n value={form.latitude}\n onChange={(e) => setForm({ ...form, latitude: e.target.value })}\n placeholder=\"30.5085\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLng\">Longitude</Label>\n <Input\n id=\"assetLng\"\n type=\"number\"\n step=\"any\"\n value={form.longitude}\n onChange={(e) => setForm({ ...form, longitude: e.target.value })}\n placeholder=\"47.7804\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5 sm:col-span-1\">\n <Label htmlFor=\"assetCapacity\">Capacity / day</Label>\n <Input\n id=\"assetCapacity\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.capacityPerDay}\n onChange={(e) => setForm({ ...form, capacityPerDay: e.target.value })}\n placeholder=\"120000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetUnit\">Capacity unit</Label>\n <Select\n value={form.capacityUnit}\n onValueChange={(v) => setForm({ ...form, capacityUnit: v as TheUnit })}\n >\n <SelectTrigger id=\"assetUnit\">\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=\"assetWi\">Working interest (%)</Label>\n <Input\n id=\"assetWi\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={form.workingInterestPct}\n onChange={(e) => setForm({ ...form, workingInterestPct: e.target.value })}\n placeholder=\"47.5\"\n />\n </div>\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n type=\"button\"\n onClick={() => {\n setDialogOpen(false);\n resetForm();\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" form=\"createAssetForm\" disabled={createAsset.isPending}>\n {createAsset.isPending ? 'Creating…' : 'Create asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|