@burdenoff/microfe-theglobalfuel 2026.720.2 → 2026.801.1

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.
@@ -2,7 +2,7 @@ import { useTheGlobalFuel as e } from "./context/TheGlobalFuelContext.js";
2
2
  import { DashboardPage as t } from "./pages/dashboard/DashboardPage.js";
3
3
  import { Suspense as n, lazy as r } from "react";
4
4
  import { FeatureGate as i } from "@burdenoff/fe-libs/shared/feature-flags";
5
- import { Navigate as a, Route as o, Routes as s, useLocation as c } from "react-router-dom";
5
+ import { Navigate as a, Route as o, Routes as s, useLocation as c } from "react-router";
6
6
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
7
  import { Spinner as d } from "@burdenoff/fe-libs/ui";
8
8
  //#region src/theglobalfuel/TheGlobalFuelRoutes.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"TheGlobalFuelRoutes.js","names":[],"sources":["../../src/theglobalfuel/TheGlobalFuelRoutes.tsx"],"sourcesContent":["/**\n * TheGlobalFuel Routes\n * @module theglobalfuel\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `the*` backend capability.\n */\n\nimport { type FC, lazy, Suspense, type ReactNode } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTheGlobalFuel } from './context/TheGlobalFuelContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/dashboard/DashboardPage';\n\n// Registry — Assets, Production, Reserves\nconst AssetsPage = lazy(() =>\n import('./pages/assets/AssetsPage').then((m) => ({ default: m.AssetsPage }))\n);\nconst AssetDetailPage = lazy(() =>\n import('./pages/assets/AssetDetailPage').then((m) => ({ default: m.AssetDetailPage }))\n);\nconst ProductionPage = lazy(() =>\n import('./pages/production/ProductionPage').then((m) => ({ default: m.ProductionPage }))\n);\nconst ReservesPage = lazy(() =>\n import('./pages/reserves/ReservesPage').then((m) => ({ default: m.ReservesPage }))\n);\n\n// Commerce — Offtake Contracts, Shipments, Inventory\nconst ContractsPage = lazy(() =>\n import('./pages/contracts/ContractsPage').then((m) => ({ default: m.ContractsPage }))\n);\nconst ContractDetailPage = lazy(() =>\n import('./pages/contracts/ContractDetailPage').then((m) => ({ default: m.ContractDetailPage }))\n);\nconst ShipmentsPage = lazy(() =>\n import('./pages/shipments/ShipmentsPage').then((m) => ({ default: m.ShipmentsPage }))\n);\nconst InventoryPage = lazy(() =>\n import('./pages/inventory/InventoryPage').then((m) => ({ default: m.InventoryPage }))\n);\n\n// Sustainability — Emissions, Compliance\nconst EmissionsPage = lazy(() =>\n import('./pages/emissions/EmissionsPage').then((m) => ({ default: m.EmissionsPage }))\n);\nconst CompliancePage = lazy(() =>\n import('./pages/compliance/CompliancePage').then((m) => ({ default: m.CompliancePage }))\n);\nconst ProvenancePage = lazy(() =>\n import('./pages/provenance/ProvenancePage').then((m) => ({ default: m.ProvenancePage }))\n);\n\n// Cross-cutting operator surfaces — analytics, report extracts and exceptions.\nconst AnalyticsPage = lazy(() =>\n import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst ReportsPage = lazy(() =>\n import('./pages/reports/ReportsPage').then((m) => ({ default: m.ReportsPage }))\n);\nconst AlertsPage = lazy(() =>\n import('./pages/alerts/AlertsPage').then((m) => ({ default: m.AlertsPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex min-h-[400px] flex-col items-center justify-center gap-3 text-center p-6\">\n <p className=\"text-sm font-medium text-text-secondary\">This feature is not available.</p>\n <p className=\"text-xs text-text-tertiary\">Ask your workspace admin to enable it.</p>\n </div>\n );\n}\n\nfunction gated(flag: string, element: ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport const TheGlobalFuelRoutes: FC = () => {\n const { basePath, isStandalone } = useTheGlobalFuel();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={gated('theglobalfuel.dashboard', <DashboardPage />)} />\n\n <Route path=\"assets\" element={gated('theglobalfuel.assets', <AssetsPage />)} />\n <Route path=\"assets/:id\" element={gated('theglobalfuel.assets', <AssetDetailPage />)} />\n\n <Route\n path=\"production\"\n element={gated('theglobalfuel.production', <ProductionPage />)}\n />\n\n <Route path=\"reserves\" element={gated('theglobalfuel.reserves', <ReservesPage />)} />\n\n <Route path=\"contracts\" element={gated('theglobalfuel.contracts', <ContractsPage />)} />\n <Route\n path=\"contracts/:id\"\n element={gated('theglobalfuel.contracts', <ContractDetailPage />)}\n />\n\n <Route path=\"shipments\" element={gated('theglobalfuel.shipments', <ShipmentsPage />)} />\n\n <Route path=\"inventory\" element={gated('theglobalfuel.inventory', <InventoryPage />)} />\n\n <Route path=\"emissions\" element={gated('theglobalfuel.emissions', <EmissionsPage />)} />\n\n <Route\n path=\"compliance\"\n element={gated('theglobalfuel.compliance', <CompliancePage />)}\n />\n\n <Route\n path=\"provenance\"\n element={gated('theglobalfuel.provenance', <ProvenancePage />)}\n />\n\n <Route path=\"analytics\" element={gated('theglobalfuel.analytics', <AnalyticsPage />)} />\n\n <Route path=\"reports\" element={gated('theglobalfuel.reports', <ReportsPage />)} />\n\n <Route path=\"alerts\" element={gated('theglobalfuel.alerts', <AlertsPage />)} />\n\n {/* Unknown subpaths (e.g. /theglobalfuel/dashboard, stale bookmarks) canonicalize\n to the product root (the dashboard index). An absolute target avoids the\n self-referential `to=\"\"` loop that renders blank inside the nested Routes. */}\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"TheGlobalFuelRoutes.js","names":[],"sources":["../../src/theglobalfuel/TheGlobalFuelRoutes.tsx"],"sourcesContent":["/**\n * TheGlobalFuel Routes\n * @module theglobalfuel\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `the*` backend capability.\n */\n\nimport { type FC, lazy, Suspense, type ReactNode } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTheGlobalFuel } from './context/TheGlobalFuelContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/dashboard/DashboardPage';\n\n// Registry — Assets, Production, Reserves\nconst AssetsPage = lazy(() =>\n import('./pages/assets/AssetsPage').then((m) => ({ default: m.AssetsPage }))\n);\nconst AssetDetailPage = lazy(() =>\n import('./pages/assets/AssetDetailPage').then((m) => ({ default: m.AssetDetailPage }))\n);\nconst ProductionPage = lazy(() =>\n import('./pages/production/ProductionPage').then((m) => ({ default: m.ProductionPage }))\n);\nconst ReservesPage = lazy(() =>\n import('./pages/reserves/ReservesPage').then((m) => ({ default: m.ReservesPage }))\n);\n\n// Commerce — Offtake Contracts, Shipments, Inventory\nconst ContractsPage = lazy(() =>\n import('./pages/contracts/ContractsPage').then((m) => ({ default: m.ContractsPage }))\n);\nconst ContractDetailPage = lazy(() =>\n import('./pages/contracts/ContractDetailPage').then((m) => ({ default: m.ContractDetailPage }))\n);\nconst ShipmentsPage = lazy(() =>\n import('./pages/shipments/ShipmentsPage').then((m) => ({ default: m.ShipmentsPage }))\n);\nconst InventoryPage = lazy(() =>\n import('./pages/inventory/InventoryPage').then((m) => ({ default: m.InventoryPage }))\n);\n\n// Sustainability — Emissions, Compliance\nconst EmissionsPage = lazy(() =>\n import('./pages/emissions/EmissionsPage').then((m) => ({ default: m.EmissionsPage }))\n);\nconst CompliancePage = lazy(() =>\n import('./pages/compliance/CompliancePage').then((m) => ({ default: m.CompliancePage }))\n);\nconst ProvenancePage = lazy(() =>\n import('./pages/provenance/ProvenancePage').then((m) => ({ default: m.ProvenancePage }))\n);\n\n// Cross-cutting operator surfaces — analytics, report extracts and exceptions.\nconst AnalyticsPage = lazy(() =>\n import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst ReportsPage = lazy(() =>\n import('./pages/reports/ReportsPage').then((m) => ({ default: m.ReportsPage }))\n);\nconst AlertsPage = lazy(() =>\n import('./pages/alerts/AlertsPage').then((m) => ({ default: m.AlertsPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex min-h-[400px] flex-col items-center justify-center gap-3 text-center p-6\">\n <p className=\"text-sm font-medium text-text-secondary\">This feature is not available.</p>\n <p className=\"text-xs text-text-tertiary\">Ask your workspace admin to enable it.</p>\n </div>\n );\n}\n\nfunction gated(flag: string, element: ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport const TheGlobalFuelRoutes: FC = () => {\n const { basePath, isStandalone } = useTheGlobalFuel();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={gated('theglobalfuel.dashboard', <DashboardPage />)} />\n\n <Route path=\"assets\" element={gated('theglobalfuel.assets', <AssetsPage />)} />\n <Route path=\"assets/:id\" element={gated('theglobalfuel.assets', <AssetDetailPage />)} />\n\n <Route\n path=\"production\"\n element={gated('theglobalfuel.production', <ProductionPage />)}\n />\n\n <Route path=\"reserves\" element={gated('theglobalfuel.reserves', <ReservesPage />)} />\n\n <Route path=\"contracts\" element={gated('theglobalfuel.contracts', <ContractsPage />)} />\n <Route\n path=\"contracts/:id\"\n element={gated('theglobalfuel.contracts', <ContractDetailPage />)}\n />\n\n <Route path=\"shipments\" element={gated('theglobalfuel.shipments', <ShipmentsPage />)} />\n\n <Route path=\"inventory\" element={gated('theglobalfuel.inventory', <InventoryPage />)} />\n\n <Route path=\"emissions\" element={gated('theglobalfuel.emissions', <EmissionsPage />)} />\n\n <Route\n path=\"compliance\"\n element={gated('theglobalfuel.compliance', <CompliancePage />)}\n />\n\n <Route\n path=\"provenance\"\n element={gated('theglobalfuel.provenance', <ProvenancePage />)}\n />\n\n <Route path=\"analytics\" element={gated('theglobalfuel.analytics', <AnalyticsPage />)} />\n\n <Route path=\"reports\" element={gated('theglobalfuel.reports', <ReportsPage />)} />\n\n <Route path=\"alerts\" element={gated('theglobalfuel.alerts', <AlertsPage />)} />\n\n {/* Unknown subpaths (e.g. /theglobalfuel/dashboard, stale bookmarks) canonicalize\n to the product root (the dashboard index). An absolute target avoids the\n self-referential `to=\"\"` loop that renders blank inside the nested Routes. */}\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { joinPath as e } from "../utils/navigation.js";
2
2
  import { createContext as t, useCallback as n, useContext as r, useMemo as i } from "react";
3
- import { MemoryRouter as a, useNavigate as o } from "react-router-dom";
3
+ import { MemoryRouter as a, useNavigate as o } from "react-router";
4
4
  import { jsx as s } from "react/jsx-runtime";
5
5
  //#region src/theglobalfuel/context/TheGlobalFuelContext.tsx
6
6
  var c = t(null);
@@ -1 +1 @@
1
- {"version":3,"file":"TheGlobalFuelContext.js","names":[],"sources":["../../../src/theglobalfuel/context/TheGlobalFuelContext.tsx"],"sourcesContent":["/**\n * TheGlobalFuel Context Provider\n * @module theglobalfuel/context\n *\n * Splits standalone mode (wraps its own MemoryRouter + useNavigate) from\n * integrated mode (the host shell supplies `navigate`). Exposes gateway/auth\n * context + relative navigation helpers to every page.\n */\n\nimport type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router-dom';\nimport type { TheGlobalFuelRootProps } from '../types';\nimport { joinPath } from '../utils/navigation';\n\ninterface TheGlobalFuelContextValue extends Omit<\n TheGlobalFuelRootProps,\n 'registerNavItems' | 'registerFooterItems' | 'navigate'\n> {\n isStandalone: boolean;\n /** Shell's navigate function (only available in integrated mode). */\n navigate?: (path: string) => void;\n /** Navigate to a path relative to basePath. */\n navigateTo: (relativePath: string) => void;\n /** Get the full path for a relative path. */\n getPath: (relativePath: string) => string;\n}\n\nconst TheGlobalFuelContext = createContext<TheGlobalFuelContextValue | null>(null);\n\nexport function useTheGlobalFuel(): TheGlobalFuelContextValue {\n const context = useContext(TheGlobalFuelContext);\n if (!context) {\n throw new Error('useTheGlobalFuel must be used within an TheGlobalFuelProvider');\n }\n return context;\n}\n\ntype ProviderProps = Omit<TheGlobalFuelRootProps, 'registerNavItems' | 'registerFooterItems'> & {\n isStandalone: boolean;\n};\n\nconst StandaloneProviderInner: FC<PropsWithChildren<ProviderProps>> = ({\n children,\n basePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const routerNavigate = useRouterNavigate();\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n routerNavigate(joinPath(effectiveBasePath, relativePath));\n },\n [effectiveBasePath, routerNavigate]\n );\n\n const contextValue = useMemo<TheGlobalFuelContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate: undefined,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: true,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <TheGlobalFuelContext.Provider value={contextValue}>{children}</TheGlobalFuelContext.Provider>\n );\n};\n\nconst IntegratedProviderInner: FC<\n PropsWithChildren<ProviderProps & { navigate: (path: string) => void }>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n navigate(joinPath(effectiveBasePath, relativePath));\n },\n [effectiveBasePath, navigate]\n );\n\n const contextValue = useMemo<TheGlobalFuelContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: false,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <TheGlobalFuelContext.Provider value={contextValue}>{children}</TheGlobalFuelContext.Provider>\n );\n};\n\nexport const TheGlobalFuelProvider: FC<PropsWithChildren<TheGlobalFuelRootProps>> = (props) => {\n const { children, navigate } = props;\n const isStandalone = !navigate;\n\n if (isStandalone) {\n return (\n <MemoryRouter>\n <StandaloneProviderInner {...props} isStandalone={true}>\n {children}\n </StandaloneProviderInner>\n </MemoryRouter>\n );\n }\n\n return (\n <IntegratedProviderInner {...props} navigate={navigate} isStandalone={false}>\n {children}\n </IntegratedProviderInner>\n );\n};\n"],"mappings":";;;;;AA4BA,IAAM,IAAuB,EAAgD,KAAK;AAElF,SAAgB,IAA8C;CAC5D,IAAM,IAAU,EAAW,EAAqB;AAChD,KAAI,CAAC,EACH,OAAU,MAAM,gEAAgE;AAElF,QAAO;;AAOT,IAAM,KAAiE,EACrE,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAiB,GAAmB,EACpC,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AACxB,IAAe,EAAS,GAAmB,EAAa,CAAC;IAE3D,CAAC,GAAmB,EAAe,CACpC,EAEK,IAAe,SACZ;EACL,UAAU;EACV,UAAU,KAAA;EACV;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,kBAAC,EAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GAI5F,KAED,EACH,aACA,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AACxB,IAAS,EAAS,GAAmB,EAAa,CAAC;IAErD,CAAC,GAAmB,EAAS,CAC9B,EAEK,IAAe,SACZ;EACL,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,kBAAC,EAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GAIrF,KAAwE,MAAU;CAC7F,IAAM,EAAE,aAAU,gBAAa;AAa/B,QAZsB,IAapB,kBAAC,GAAD;EAAyB,GAAI;EAAiB;EAAU,cAAc;EACnE;EACuB,CAAA,GAXxB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAyB,GAAI;EAAO,cAAc;EAC/C;EACuB,CAAA,EACb,CAAA"}
1
+ {"version":3,"file":"TheGlobalFuelContext.js","names":[],"sources":["../../../src/theglobalfuel/context/TheGlobalFuelContext.tsx"],"sourcesContent":["/**\n * TheGlobalFuel Context Provider\n * @module theglobalfuel/context\n *\n * Splits standalone mode (wraps its own MemoryRouter + useNavigate) from\n * integrated mode (the host shell supplies `navigate`). Exposes gateway/auth\n * context + relative navigation helpers to every page.\n */\n\nimport type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router';\nimport type { TheGlobalFuelRootProps } from '../types';\nimport { joinPath } from '../utils/navigation';\n\ninterface TheGlobalFuelContextValue extends Omit<\n TheGlobalFuelRootProps,\n 'registerNavItems' | 'registerFooterItems' | 'navigate'\n> {\n isStandalone: boolean;\n /** Shell's navigate function (only available in integrated mode). */\n navigate?: (path: string) => void;\n /** Navigate to a path relative to basePath. */\n navigateTo: (relativePath: string) => void;\n /** Get the full path for a relative path. */\n getPath: (relativePath: string) => string;\n}\n\nconst TheGlobalFuelContext = createContext<TheGlobalFuelContextValue | null>(null);\n\nexport function useTheGlobalFuel(): TheGlobalFuelContextValue {\n const context = useContext(TheGlobalFuelContext);\n if (!context) {\n throw new Error('useTheGlobalFuel must be used within an TheGlobalFuelProvider');\n }\n return context;\n}\n\ntype ProviderProps = Omit<TheGlobalFuelRootProps, 'registerNavItems' | 'registerFooterItems'> & {\n isStandalone: boolean;\n};\n\nconst StandaloneProviderInner: FC<PropsWithChildren<ProviderProps>> = ({\n children,\n basePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const routerNavigate = useRouterNavigate();\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n routerNavigate(joinPath(effectiveBasePath, relativePath));\n },\n [effectiveBasePath, routerNavigate]\n );\n\n const contextValue = useMemo<TheGlobalFuelContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate: undefined,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: true,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <TheGlobalFuelContext.Provider value={contextValue}>{children}</TheGlobalFuelContext.Provider>\n );\n};\n\nconst IntegratedProviderInner: FC<\n PropsWithChildren<ProviderProps & { navigate: (path: string) => void }>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n}) => {\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n navigate(joinPath(effectiveBasePath, relativePath));\n },\n [effectiveBasePath, navigate]\n );\n\n const contextValue = useMemo<TheGlobalFuelContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n isStandalone: false,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n navigateTo,\n getPath,\n ]\n );\n\n return (\n <TheGlobalFuelContext.Provider value={contextValue}>{children}</TheGlobalFuelContext.Provider>\n );\n};\n\nexport const TheGlobalFuelProvider: FC<PropsWithChildren<TheGlobalFuelRootProps>> = (props) => {\n const { children, navigate } = props;\n const isStandalone = !navigate;\n\n if (isStandalone) {\n return (\n <MemoryRouter>\n <StandaloneProviderInner {...props} isStandalone={true}>\n {children}\n </StandaloneProviderInner>\n </MemoryRouter>\n );\n }\n\n return (\n <IntegratedProviderInner {...props} navigate={navigate} isStandalone={false}>\n {children}\n </IntegratedProviderInner>\n );\n};\n"],"mappings":";;;;;AA4BA,IAAM,IAAuB,EAAgD,KAAK;AAElF,SAAgB,IAA8C;CAC5D,IAAM,IAAU,EAAW,EAAqB;AAChD,KAAI,CAAC,EACH,OAAU,MAAM,gEAAgE;AAElF,QAAO;;AAOT,IAAM,KAAiE,EACrE,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAiB,GAAmB,EACpC,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AACxB,IAAe,EAAS,GAAmB,EAAa,CAAC;IAE3D,CAAC,GAAmB,EAAe,CACpC,EAEK,IAAe,SACZ;EACL,UAAU;EACV,UAAU,KAAA;EACV;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,kBAAC,EAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GAI5F,KAED,EACH,aACA,aACA,aACA,gBACA,aACA,gBACA,kBACA,mBACI;CACJ,IAAM,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AACxB,IAAS,EAAS,GAAmB,EAAa,CAAC;IAErD,CAAC,GAAmB,EAAS,CAC9B,EAEK,IAAe,SACZ;EACL,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,kBAAC,EAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GAIrF,KAAwE,MAAU;CAC7F,IAAM,EAAE,aAAU,gBAAa;AAa/B,QAZsB,IAapB,kBAAC,GAAD;EAAyB,GAAI;EAAiB;EAAU,cAAc;EACnE;EACuB,CAAA,GAXxB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAyB,GAAI;EAAO,cAAc;EAC/C;EACuB,CAAA,EACb,CAAA"}
@@ -23,7 +23,7 @@ import { WorldMap as xe } from "../../components/WorldMap.js";
23
23
  import "../../components/index.js";
24
24
  import { useState as g } from "react";
25
25
  import { Activity as Se, Archive as Ce, ArrowLeft as we, CalendarClock as Te, Factory as Ee, Fuel as De, Gauge as Oe, Layers as ke, MapPin as Ae, MessageSquare as je, Percent as Me, Plus as _, Tag as Ne } from "lucide-react";
26
- import { useParams as Pe } from "react-router-dom";
26
+ import { useParams as Pe } from "react-router";
27
27
  import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
28
28
  import { Button as x, GlassCard as S, Input as C, Label as w, ResponsiveDialog as Fe, ResponsiveDialogContent as Ie, ResponsiveDialogDescription as Le, ResponsiveDialogFooter as Re, ResponsiveDialogHeader as ze, ResponsiveDialogTitle as Be, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k, Textarea as Ve } from "@burdenoff/fe-libs/ui";
29
29
  //#region src/theglobalfuel/pages/assets/AssetDetailPage.tsx
@@ -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, type ReactNode } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Archive,\n Gauge,\n Percent,\n Fuel,\n CalendarClock,\n MapPin,\n Activity,\n Layers,\n Factory,\n Tag,\n MessageSquare,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n Tabs,\n type TabItem,\n Section,\n LoadingView,\n ErrorView,\n EmptyState,\n MetricsCard,\n TheTags,\n TheDiscussion,\n WorldMap,\n Pagination,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAsset,\n useTheEmissionRecords,\n useTheProductionRecords,\n useTheReserveEstimates,\n useTheRecordProduction,\n useTheCreateReserveEstimate,\n useTheTransitionAsset,\n useTheRetireAsset,\n useNotify,\n useTheAnalytics,\n useThePageView,\n useTheNativeControls,\n useCursorPager,\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 PAGE_SIZE = 25;\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 source: string;\n notes: string;\n}\n\ninterface ReserveFormState {\n category: TheReserveCategory;\n asOfDate: string;\n recoverable: string;\n recoveryFactor: string;\n unit: TheUnit;\n methodology: string;\n notes: string;\n}\n\n/** A single label/value row in the asset details definition list. */\nfunction DetailItem({ label, value }: { label: string; value: ReactNode }) {\n return (\n <div className=\"flex flex-col gap-0.5 border-b border-border-seam/60 py-2.5 last:border-b-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">{label}</dt>\n <dd className=\"truncate text-sm text-text-primary\">{value}</dd>\n </div>\n );\n}\n\nexport function AssetDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n useThePageView('asset-detail');\n const { haptic, confirm } = useTheNativeControls();\n\n const { data: asset, isLoading, isError, refetch } = useTheAsset(id);\n const emissions = useTheEmissionRecords({ assetId: id });\n const prodPager = useCursorPager();\n const reservePager = useCursorPager();\n const production = useTheProductionRecords({\n assetId: id,\n pagination: { limit: PAGE_SIZE, offset: prodPager.page * PAGE_SIZE },\n });\n const reserves = useTheReserveEstimates(id, undefined, {\n limit: PAGE_SIZE,\n offset: reservePager.page * PAGE_SIZE,\n });\n const {\n trackProductionRecordClicked,\n trackProductionRecorded,\n trackReserveCreateClicked,\n trackReserveCreated,\n } = useTheAnalytics();\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 source: '',\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\" dataTour=\"theglobalfuel-asset-detail-page\">\n <LoadingView label=\"Loading asset…\" />\n </PageLayout>\n );\n }\n if (isError || !asset) {\n return (\n <PageLayout\n title=\"Asset\"\n dataTour=\"theglobalfuel-asset-detail-page\"\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 = production.data?.items ?? [];\n const reserveRows = reserves.data?.items ?? [];\n const emissionRows = emissions.data?.items ?? [];\n const isRetired = asset.status === 'RETIRED';\n // Only the legal next states from the svc state machine — never all statuses.\n const transitionOptions = nextStatuses(ASSET_TRANSITIONS, asset.status);\n // Real coordinates → a tokenized locator; only plotted when both are present.\n const originPoint =\n typeof asset.latitude === 'number' && typeof asset.longitude === 'number'\n ? { lat: asset.latitude, lng: asset.longitude, label: asset.name, primary: true }\n : null;\n\n const openProduction = () => {\n setError(null);\n haptic('light');\n trackProductionRecordClicked();\n setProductionForm({\n periodStart: today(),\n periodEnd: today(),\n volume: '',\n unit: asset.capacityUnit,\n grade: '',\n downtimeHours: '',\n source: '',\n notes: '',\n });\n setProductionOpen(true);\n };\n\n const openReserve = () => {\n setError(null);\n haptic('light');\n trackReserveCreateClicked();\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 source: '',\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 const confirmed = await confirm({\n title: `Retire ${asset.name}?`,\n message: 'This marks the asset as decommissioned.',\n okButtonTitle: 'Retire',\n cancelButtonTitle: 'Cancel',\n });\n if (!confirmed) 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 const record = 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 source: productionForm.source.trim() || null,\n notes: productionForm.notes.trim() || null,\n });\n trackProductionRecorded(record.id);\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 const estimate = 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 trackReserveCreated(estimate.id);\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: 'source',\n header: 'Source',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-secondary\">{r.source ?? '—'}</span>,\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 dataTour=\"theglobalfuel-asset-detail-page\"\n actions={\n <>\n <StatusBadge status={asset.status} />\n {!isRetired && transitionOptions.length > 0 && (\n <Select\n value={asset.status}\n onValueChange={(v) => handleTransition(v as TheAssetStatus)}\n >\n <SelectTrigger className=\"h-9 w-44\" aria-label=\"Change asset status\">\n <SelectValue placeholder=\"Change status\" />\n </SelectTrigger>\n <SelectContent>\n {/* Current state — shown in the trigger, not itself a transition. */}\n <SelectItem value={asset.status} disabled>\n {formatEnumLabel(asset.status)}\n </SelectItem>\n {transitionOptions.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!isRetired && (\n <Button\n variant=\"ghost\"\n onClick={handleRetire}\n disabled={retireAsset.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Retire\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Metric strip */}\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5\">\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n label=\"Capacity\"\n />\n <MetricsCard\n icon={<Percent className=\"h-5 w-5\" />}\n value={formatPercent(asset.workingInterestPct)}\n label=\"Working interest\"\n />\n <MetricsCard\n icon={<Fuel className=\"h-5 w-5\" />}\n value={formatEnumLabel(asset.commodity)}\n label=\"Commodity\"\n />\n <MetricsCard\n icon={<CalendarClock className=\"h-5 w-5\" />}\n value={formatDate(asset.commissionedAt)}\n label=\"Commissioned\"\n />\n <MetricsCard\n icon={<MapPin className=\"h-5 w-5\" />}\n value={formatCoords(asset.latitude, asset.longitude)}\n label=\"Location\"\n footer={\n asset.location ? (\n <p className=\"truncate text-xs text-text-tertiary\">{asset.location}</p>\n ) : undefined\n }\n />\n </div>\n\n {/* Details + location — full real-field surface alongside a locator map */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <GlassCard treatment=\"glass\" className=\"p-6 lg:col-span-2\">\n <h2 className=\"mb-2 text-base font-semibold text-text-primary\">Asset details</h2>\n <dl className=\"grid grid-cols-1 gap-x-8 sm:grid-cols-2\">\n <DetailItem label=\"Asset code\" value={asset.code || '—'} />\n <DetailItem label=\"Kind\" value={formatEnumLabel(asset.kind)} />\n <DetailItem label=\"Commodity\" value={formatEnumLabel(asset.commodity)} />\n <DetailItem label=\"Status\" value={<StatusBadge status={asset.status} />} />\n <DetailItem\n label=\"Capacity / day\"\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n />\n <DetailItem label=\"Working interest\" value={formatPercent(asset.workingInterestPct)} />\n <DetailItem\n label=\"Operator lead\"\n value={\n asset.operatorLeadId ? (\n <span className=\"font-mono text-xs\" title={asset.operatorLeadId}>\n {asset.operatorLeadId}\n </span>\n ) : (\n '—'\n )\n }\n />\n <DetailItem label=\"Location\" value={asset.location || '—'} />\n <DetailItem label=\"Coordinates\" value={formatCoords(asset.latitude, asset.longitude)} />\n <DetailItem label=\"Commissioned\" value={formatDate(asset.commissionedAt)} />\n <DetailItem label=\"Decommissioned\" value={formatDate(asset.decommissionedAt)} />\n <DetailItem label=\"Field discovery\" value={formatDate(asset.discoveryAt)} />\n <DetailItem\n label=\"Area\"\n value={asset.area != null ? `~ ${formatNumber(asset.area)} km²` : '—'}\n />\n <DetailItem label=\"Reservoir type\" value={asset.reservoirType || '—'} />\n <DetailItem\n label=\"Water depth\"\n value={asset.waterDepth != null ? `${formatNumber(asset.waterDepth)} m` : 'Onshore'}\n />\n <DetailItem\n label=\"Registered\"\n value={\n <span title={formatDate(asset.createdAt)}>\n {formatRelativeTime(asset.createdAt)}\n </span>\n }\n />\n <DetailItem\n label=\"Last updated\"\n value={\n <span title={formatDate(asset.updatedAt)}>\n {formatRelativeTime(asset.updatedAt)}\n </span>\n }\n />\n </dl>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-3 p-6\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Location</h2>\n </div>\n {originPoint ? (\n <WorldMap points={[originPoint]} />\n ) : (\n <div className=\"flex flex-1 items-center justify-center rounded-xl border border-dashed border-border-seam py-10 text-center text-sm text-text-secondary\">\n No coordinates recorded for this asset.\n </div>\n )}\n {asset.location && <p className=\"text-xs text-text-tertiary\">{asset.location}</p>}\n </GlassCard>\n </div>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Production ──────────────────────────────────────────────────────── */}\n {activeTab === 'production' && (\n <Section\n title=\"Production\"\n description=\"Volumes produced per reporting period, with grade & downtime.\"\n action={\n <Button size=\"sm\" onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n >\n {production.isLoading ? (\n <LoadingView label=\"Loading production…\" />\n ) : production.isError ? (\n <ErrorView\n message=\"Couldn't load production records.\"\n onRetry={() => production.refetch()}\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 <>\n <DataTable\n columns={productionColumns}\n rows={productionRows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n <Pagination\n page={prodPager.page}\n pageSize={PAGE_SIZE}\n itemCount={productionRows.length}\n hasMore={production.data?.pageInfo?.hasMore ?? false}\n onPageChange={prodPager.onPageChange}\n />\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 {reserves.isLoading ? (\n <LoadingView label=\"Loading reserve estimates…\" />\n ) : reserves.isError ? (\n <ErrorView\n message=\"Couldn't load reserve estimates.\"\n onRetry={() => reserves.refetch()}\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 <>\n <DataTable columns={reserveColumns} rows={reserveRows} rowKey={(r) => r.id} />\n <Pagination\n page={reservePager.page}\n pageSize={PAGE_SIZE}\n itemCount={reserveRows.length}\n hasMore={reserves.data?.pageInfo?.hasMore ?? false}\n onPageChange={reservePager.onPageChange}\n />\n </>\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=\"prodSource\">Source</Label>\n <Input\n id=\"prodSource\"\n value={productionForm.source}\n onChange={(e) => setProductionForm({ ...productionForm, source: e.target.value })}\n placeholder=\"SCADA, Manual, Meter…\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodNotes\">Notes</Label>\n <Textarea\n id=\"prodNotes\"\n rows={2}\n value={productionForm.notes}\n onChange={(e) => setProductionForm({ ...productionForm, notes: e.target.value })}\n placeholder=\"Optional context about this period.\"\n />\n </div>\n\n {error && productionOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeProduction}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"recordProductionForm\" disabled={recordProduction.isPending}>\n {recordProduction.isPending ? 'Recording…' : 'Record production'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add reserve estimate dialog */}\n <ResponsiveDialog\n open={reserveOpen}\n onOpenChange={(open) => (open ? setReserveOpen(true) : closeReserve())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add reserve estimate</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a recoverable-volume estimate for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"reserveEstimateForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleCreateReserve();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resCategory\">Category</Label>\n <Select\n value={reserveForm.category}\n onValueChange={(v) =>\n setReserveForm({ ...reserveForm, category: v as TheReserveCategory })\n }\n >\n <SelectTrigger id=\"resCategory\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RESERVE_CATEGORIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resAsOf\">As-of date *</Label>\n <Input\n id=\"resAsOf\"\n type=\"date\"\n value={reserveForm.asOfDate}\n onChange={(e) => setReserveForm({ ...reserveForm, asOfDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resRecoverable\">Recoverable *</Label>\n <Input\n id=\"resRecoverable\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={reserveForm.recoverable}\n onChange={(e) => setReserveForm({ ...reserveForm, recoverable: e.target.value })}\n placeholder=\"2400000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resUnit\">Unit</Label>\n <Select\n value={reserveForm.unit}\n onValueChange={(v) => setReserveForm({ ...reserveForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"resUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resFactor\">Recovery factor (%)</Label>\n <Input\n id=\"resFactor\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={reserveForm.recoveryFactor}\n onChange={(e) =>\n setReserveForm({ ...reserveForm, recoveryFactor: e.target.value })\n }\n placeholder=\"35\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resMethodology\">Methodology</Label>\n <Input\n id=\"resMethodology\"\n value={reserveForm.methodology}\n onChange={(e) => setReserveForm({ ...reserveForm, methodology: e.target.value })}\n placeholder=\"Volumetric / material balance / decline curve\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resNotes\">Notes</Label>\n <Textarea\n id=\"resNotes\"\n rows={2}\n value={reserveForm.notes}\n onChange={(e) => setReserveForm({ ...reserveForm, notes: e.target.value })}\n placeholder=\"Optional context about this estimate.\"\n />\n </div>\n\n {error && reserveOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeReserve}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"reserveEstimateForm\" disabled={createReserve.isPending}>\n {createReserve.isPending ? 'Adding…' : 'Add estimate'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetDetailPage.tsx"],"sourcesContent":["/**\n * Asset detail — lifecycle, production capture, reserve estimates, emissions,\n * tags & discussion for a single resource asset.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theAsset` (+ nested productionRecords / reserveEstimates) and\n * `theListEmissionRecords`; writes `theRecordProduction`,\n * `theCreateReserveEstimate`, `theTransitionAsset` and `theRetireAsset`. Child\n * creates invalidate the asset query in the hooks, so we just close the dialog\n * and let it refetch. No mock data.\n */\n\nimport { useState, type ReactNode } from 'react';\nimport { useParams } from 'react-router';\nimport {\n ArrowLeft,\n Plus,\n Archive,\n Gauge,\n Percent,\n Fuel,\n CalendarClock,\n MapPin,\n Activity,\n Layers,\n Factory,\n Tag,\n MessageSquare,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n Tabs,\n type TabItem,\n Section,\n LoadingView,\n ErrorView,\n EmptyState,\n MetricsCard,\n TheTags,\n TheDiscussion,\n WorldMap,\n Pagination,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAsset,\n useTheEmissionRecords,\n useTheProductionRecords,\n useTheReserveEstimates,\n useTheRecordProduction,\n useTheCreateReserveEstimate,\n useTheTransitionAsset,\n useTheRetireAsset,\n useNotify,\n useTheAnalytics,\n useThePageView,\n useTheNativeControls,\n useCursorPager,\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 PAGE_SIZE = 25;\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 source: string;\n notes: string;\n}\n\ninterface ReserveFormState {\n category: TheReserveCategory;\n asOfDate: string;\n recoverable: string;\n recoveryFactor: string;\n unit: TheUnit;\n methodology: string;\n notes: string;\n}\n\n/** A single label/value row in the asset details definition list. */\nfunction DetailItem({ label, value }: { label: string; value: ReactNode }) {\n return (\n <div className=\"flex flex-col gap-0.5 border-b border-border-seam/60 py-2.5 last:border-b-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-tertiary\">{label}</dt>\n <dd className=\"truncate text-sm text-text-primary\">{value}</dd>\n </div>\n );\n}\n\nexport function AssetDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n useThePageView('asset-detail');\n const { haptic, confirm } = useTheNativeControls();\n\n const { data: asset, isLoading, isError, refetch } = useTheAsset(id);\n const emissions = useTheEmissionRecords({ assetId: id });\n const prodPager = useCursorPager();\n const reservePager = useCursorPager();\n const production = useTheProductionRecords({\n assetId: id,\n pagination: { limit: PAGE_SIZE, offset: prodPager.page * PAGE_SIZE },\n });\n const reserves = useTheReserveEstimates(id, undefined, {\n limit: PAGE_SIZE,\n offset: reservePager.page * PAGE_SIZE,\n });\n const {\n trackProductionRecordClicked,\n trackProductionRecorded,\n trackReserveCreateClicked,\n trackReserveCreated,\n } = useTheAnalytics();\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 source: '',\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\" dataTour=\"theglobalfuel-asset-detail-page\">\n <LoadingView label=\"Loading asset…\" />\n </PageLayout>\n );\n }\n if (isError || !asset) {\n return (\n <PageLayout\n title=\"Asset\"\n dataTour=\"theglobalfuel-asset-detail-page\"\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 = production.data?.items ?? [];\n const reserveRows = reserves.data?.items ?? [];\n const emissionRows = emissions.data?.items ?? [];\n const isRetired = asset.status === 'RETIRED';\n // Only the legal next states from the svc state machine — never all statuses.\n const transitionOptions = nextStatuses(ASSET_TRANSITIONS, asset.status);\n // Real coordinates → a tokenized locator; only plotted when both are present.\n const originPoint =\n typeof asset.latitude === 'number' && typeof asset.longitude === 'number'\n ? { lat: asset.latitude, lng: asset.longitude, label: asset.name, primary: true }\n : null;\n\n const openProduction = () => {\n setError(null);\n haptic('light');\n trackProductionRecordClicked();\n setProductionForm({\n periodStart: today(),\n periodEnd: today(),\n volume: '',\n unit: asset.capacityUnit,\n grade: '',\n downtimeHours: '',\n source: '',\n notes: '',\n });\n setProductionOpen(true);\n };\n\n const openReserve = () => {\n setError(null);\n haptic('light');\n trackReserveCreateClicked();\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 source: '',\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 const confirmed = await confirm({\n title: `Retire ${asset.name}?`,\n message: 'This marks the asset as decommissioned.',\n okButtonTitle: 'Retire',\n cancelButtonTitle: 'Cancel',\n });\n if (!confirmed) 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 const record = 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 source: productionForm.source.trim() || null,\n notes: productionForm.notes.trim() || null,\n });\n trackProductionRecorded(record.id);\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 const estimate = 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 trackReserveCreated(estimate.id);\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: 'source',\n header: 'Source',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-secondary\">{r.source ?? '—'}</span>,\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 dataTour=\"theglobalfuel-asset-detail-page\"\n actions={\n <>\n <StatusBadge status={asset.status} />\n {!isRetired && transitionOptions.length > 0 && (\n <Select\n value={asset.status}\n onValueChange={(v) => handleTransition(v as TheAssetStatus)}\n >\n <SelectTrigger className=\"h-9 w-44\" aria-label=\"Change asset status\">\n <SelectValue placeholder=\"Change status\" />\n </SelectTrigger>\n <SelectContent>\n {/* Current state — shown in the trigger, not itself a transition. */}\n <SelectItem value={asset.status} disabled>\n {formatEnumLabel(asset.status)}\n </SelectItem>\n {transitionOptions.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!isRetired && (\n <Button\n variant=\"ghost\"\n onClick={handleRetire}\n disabled={retireAsset.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Retire\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Metric strip */}\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5\">\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n label=\"Capacity\"\n />\n <MetricsCard\n icon={<Percent className=\"h-5 w-5\" />}\n value={formatPercent(asset.workingInterestPct)}\n label=\"Working interest\"\n />\n <MetricsCard\n icon={<Fuel className=\"h-5 w-5\" />}\n value={formatEnumLabel(asset.commodity)}\n label=\"Commodity\"\n />\n <MetricsCard\n icon={<CalendarClock className=\"h-5 w-5\" />}\n value={formatDate(asset.commissionedAt)}\n label=\"Commissioned\"\n />\n <MetricsCard\n icon={<MapPin className=\"h-5 w-5\" />}\n value={formatCoords(asset.latitude, asset.longitude)}\n label=\"Location\"\n footer={\n asset.location ? (\n <p className=\"truncate text-xs text-text-tertiary\">{asset.location}</p>\n ) : undefined\n }\n />\n </div>\n\n {/* Details + location — full real-field surface alongside a locator map */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <GlassCard treatment=\"glass\" className=\"p-6 lg:col-span-2\">\n <h2 className=\"mb-2 text-base font-semibold text-text-primary\">Asset details</h2>\n <dl className=\"grid grid-cols-1 gap-x-8 sm:grid-cols-2\">\n <DetailItem label=\"Asset code\" value={asset.code || '—'} />\n <DetailItem label=\"Kind\" value={formatEnumLabel(asset.kind)} />\n <DetailItem label=\"Commodity\" value={formatEnumLabel(asset.commodity)} />\n <DetailItem label=\"Status\" value={<StatusBadge status={asset.status} />} />\n <DetailItem\n label=\"Capacity / day\"\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n />\n <DetailItem label=\"Working interest\" value={formatPercent(asset.workingInterestPct)} />\n <DetailItem\n label=\"Operator lead\"\n value={\n asset.operatorLeadId ? (\n <span className=\"font-mono text-xs\" title={asset.operatorLeadId}>\n {asset.operatorLeadId}\n </span>\n ) : (\n '—'\n )\n }\n />\n <DetailItem label=\"Location\" value={asset.location || '—'} />\n <DetailItem label=\"Coordinates\" value={formatCoords(asset.latitude, asset.longitude)} />\n <DetailItem label=\"Commissioned\" value={formatDate(asset.commissionedAt)} />\n <DetailItem label=\"Decommissioned\" value={formatDate(asset.decommissionedAt)} />\n <DetailItem label=\"Field discovery\" value={formatDate(asset.discoveryAt)} />\n <DetailItem\n label=\"Area\"\n value={asset.area != null ? `~ ${formatNumber(asset.area)} km²` : '—'}\n />\n <DetailItem label=\"Reservoir type\" value={asset.reservoirType || '—'} />\n <DetailItem\n label=\"Water depth\"\n value={asset.waterDepth != null ? `${formatNumber(asset.waterDepth)} m` : 'Onshore'}\n />\n <DetailItem\n label=\"Registered\"\n value={\n <span title={formatDate(asset.createdAt)}>\n {formatRelativeTime(asset.createdAt)}\n </span>\n }\n />\n <DetailItem\n label=\"Last updated\"\n value={\n <span title={formatDate(asset.updatedAt)}>\n {formatRelativeTime(asset.updatedAt)}\n </span>\n }\n />\n </dl>\n </GlassCard>\n\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-3 p-6\">\n <div className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-action-primary-bg\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Location</h2>\n </div>\n {originPoint ? (\n <WorldMap points={[originPoint]} />\n ) : (\n <div className=\"flex flex-1 items-center justify-center rounded-xl border border-dashed border-border-seam py-10 text-center text-sm text-text-secondary\">\n No coordinates recorded for this asset.\n </div>\n )}\n {asset.location && <p className=\"text-xs text-text-tertiary\">{asset.location}</p>}\n </GlassCard>\n </div>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Production ──────────────────────────────────────────────────────── */}\n {activeTab === 'production' && (\n <Section\n title=\"Production\"\n description=\"Volumes produced per reporting period, with grade & downtime.\"\n action={\n <Button size=\"sm\" onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n >\n {production.isLoading ? (\n <LoadingView label=\"Loading production…\" />\n ) : production.isError ? (\n <ErrorView\n message=\"Couldn't load production records.\"\n onRetry={() => production.refetch()}\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 <>\n <DataTable\n columns={productionColumns}\n rows={productionRows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n <Pagination\n page={prodPager.page}\n pageSize={PAGE_SIZE}\n itemCount={productionRows.length}\n hasMore={production.data?.pageInfo?.hasMore ?? false}\n onPageChange={prodPager.onPageChange}\n />\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 {reserves.isLoading ? (\n <LoadingView label=\"Loading reserve estimates…\" />\n ) : reserves.isError ? (\n <ErrorView\n message=\"Couldn't load reserve estimates.\"\n onRetry={() => reserves.refetch()}\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 <>\n <DataTable columns={reserveColumns} rows={reserveRows} rowKey={(r) => r.id} />\n <Pagination\n page={reservePager.page}\n pageSize={PAGE_SIZE}\n itemCount={reserveRows.length}\n hasMore={reserves.data?.pageInfo?.hasMore ?? false}\n onPageChange={reservePager.onPageChange}\n />\n </>\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=\"prodSource\">Source</Label>\n <Input\n id=\"prodSource\"\n value={productionForm.source}\n onChange={(e) => setProductionForm({ ...productionForm, source: e.target.value })}\n placeholder=\"SCADA, Manual, Meter…\"\n />\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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"}
@@ -23,7 +23,7 @@ import { TheDiscussion as Ce } from "../../components/TheDiscussion.js";
23
23
  import { TheTags as we } from "../../components/TheTags.js";
24
24
  import { useState as l } from "react";
25
25
  import { ArrowLeft as Te, Building2 as Ee, Calendar as De, CheckCircle2 as Oe, Coins as ke, FileSignature as Ae, Gauge as je, MapPin as Me, MessageSquare as Ne, Package as Pe, Pencil as Fe, Plus as u, Ship as d, Tag as Ie } from "lucide-react";
26
- import { useParams as Le } from "react-router-dom";
26
+ import { useParams as Le } from "react-router";
27
27
  import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
28
28
  import { Button as h, GlassCard 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, Textarea as A } from "@burdenoff/fe-libs/ui";
29
29
  //#region src/theglobalfuel/pages/contracts/ContractDetailPage.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"ContractDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/contracts/ContractDetailPage.tsx"],"sourcesContent":["/**\n * Contract detail — headline economics, delivery progress, shipments & collaboration.\n * @module theglobalfuel/pages/contracts\n *\n * Reads `theContract` (+ nested shipments); writes `theUpdateContract`,\n * `theTransitionContract`, `theScheduleShipment`, `theDeliverShipment`.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Pencil,\n Ship,\n Building2,\n Coins,\n Package,\n Gauge,\n MapPin,\n Calendar,\n CheckCircle2,\n Tag as TagIcon,\n MessageSquare,\n FileSignature,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { Tabs, type TabItem } from '../../components/Tabs';\nimport { LoadingView, ErrorView, Section } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { MiniBar } from '../../components/MiniBar';\nimport { FileLink } from '../../components/FileLink';\nimport { EvidenceUpload } from '../../components/EvidenceUpload';\nimport { TheTags } from '../../components/TheTags';\nimport { TheDiscussion } from '../../components/TheDiscussion';\nimport { Pagination } from '../../components/Pagination';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheContract,\n useTheShipments,\n useTheUpdateContract,\n useTheTransitionContract,\n useTheScheduleShipment,\n useTheDeliverShipment,\n useNotify,\n useThePageView,\n useTheNativeControls,\n useCursorPager,\n type UploadedTheFile,\n} from '../../hooks';\nimport {\n formatDate,\n formatEnumLabel,\n formatMoney,\n formatUnit,\n formatVolume,\n} from '../../utils/formatters';\nimport { CONTRACT_TRANSITIONS, nextStatuses, toBackendDate } from '../../utils';\nimport type {\n TheShipment,\n TheContractStatus,\n ThePricingBasis,\n TheTransportMode,\n TheUnit,\n} from '../../types';\n\nconst PRICING_BASES: ThePricingBasis[] = ['FIXED', 'INDEX_LINKED', 'FORMULA', 'SPOT'];\nconst TRANSPORT_MODES: TheTransportMode[] = [\n 'PIPELINE',\n 'TANKER',\n 'VESSEL_BULK',\n 'RAIL',\n 'TRUCK',\n 'GRID',\n];\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\n/** Shipment states that are still \"open\" — eligible to be marked delivered. */\nconst OPEN_SHIPMENT_STATES = new Set(['SCHEDULED', 'LOADING', 'IN_TRANSIT']);\n\nconst PAGE_SIZE = 25;\n\nconst clampPercent = (value: number): number => Math.max(0, Math.min(100, value));\n\n/** ISO datetime → the `YYYY-MM-DD` a native date input expects (empty if unset). */\nconst toDateInput = (iso: string | null | undefined): string => (iso ? iso.slice(0, 10) : '');\n\ntype DetailTab = 'shipments' | 'tags' | 'discussion';\n\ninterface EditFormState {\n counterparty: string;\n pricingBasis: ThePricingBasis;\n pricePerUnit: string;\n priceIndex: string;\n currency: string;\n contractedVolume: string;\n unit: TheUnit;\n deliveryLocation: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\ninterface ShipmentFormState {\n reference: string;\n mode: TheTransportMode;\n carrier: string;\n origin: string;\n destination: string;\n volume: string;\n unit: TheUnit;\n scheduledAt: string;\n notes: string;\n}\n\nconst emptyShipmentForm = (unit: TheUnit): ShipmentFormState => ({\n reference: '',\n mode: 'VESSEL_BULK',\n carrier: '',\n origin: '',\n destination: '',\n volume: '',\n unit,\n scheduledAt: '',\n notes: '',\n});\n\nexport function ContractDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n useThePageView('contract-detail');\n const { haptic } = useTheNativeControls();\n const { data: contract, isLoading, isError, refetch } = useTheContract(id);\n\n const updateContract = useTheUpdateContract();\n const transitionContract = useTheTransitionContract();\n const scheduleShipment = useTheScheduleShipment();\n const deliverShipment = useTheDeliverShipment();\n\n const shipmentPager = useCursorPager();\n const shipmentsQuery = useTheShipments(id, undefined, {\n limit: PAGE_SIZE,\n offset: shipmentPager.page * PAGE_SIZE,\n });\n\n const [activeTab, setActiveTab] = useState<DetailTab>('shipments');\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<EditFormState | null>(null);\n const [shipmentOpen, setShipmentOpen] = useState(false);\n const [shipmentForm, setShipmentForm] = useState<ShipmentFormState>(emptyShipmentForm('BARRELS'));\n const [docFile, setDocFile] = useState<UploadedTheFile | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Contract\" dataTour=\"theglobalfuel-contract-detail-page\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !contract) {\n return (\n <PageLayout\n title=\"Contract\"\n dataTour=\"theglobalfuel-contract-detail-page\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This contract could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<FileSignature className=\"h-10 w-10\" />}\n title=\"Contract not found\"\n description=\"This contract may have been removed or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('contracts')}>Back to contracts</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const shipments = shipmentsQuery.data?.items ?? [];\n const deliveredPct =\n contract.contractedVolume > 0\n ? clampPercent((contract.deliveredVolume / contract.contractedVolume) * 100)\n : 0;\n // Only offer legal next states so the backend never rejects the transition.\n const contractNext = nextStatuses(CONTRACT_TRANSITIONS, contract.status);\n\n const openEdit = () => {\n setEditForm({\n counterparty: contract.counterparty,\n pricingBasis: contract.pricingBasis,\n pricePerUnit: contract.pricePerUnit ? String(contract.pricePerUnit) : '',\n priceIndex: contract.priceIndex ?? '',\n currency: contract.currency,\n contractedVolume: contract.contractedVolume ? String(contract.contractedVolume) : '',\n unit: contract.unit,\n deliveryLocation: contract.deliveryLocation ?? '',\n startDate: toDateInput(contract.startDate),\n endDate: toDateInput(contract.endDate),\n notes: contract.notes ?? '',\n });\n setError(null);\n setEditOpen(true);\n };\n\n const openShipment = () => {\n haptic('light');\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n setShipmentOpen(true);\n };\n\n const handleTransition = (status: TheContractStatus) => {\n if (status === contract.status) return;\n setError(null);\n transitionContract.mutate(\n { id: contract.id, status },\n {\n onSuccess: () => notify.success('Contract status updated'),\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update contract status.');\n notify.fromError(err);\n },\n }\n );\n };\n\n const handleSaveEdit = async () => {\n if (!editForm) return;\n if (!editForm.counterparty.trim()) {\n setError('Counterparty is required.');\n return;\n }\n setError(null);\n try {\n await updateContract.mutateAsync({\n id: contract.id,\n input: {\n counterparty: editForm.counterparty.trim(),\n pricingBasis: editForm.pricingBasis,\n pricePerUnit: editForm.pricePerUnit ? Number(editForm.pricePerUnit) : null,\n priceIndex: editForm.priceIndex.trim() || null,\n currency: editForm.currency.trim().toUpperCase() || 'USD',\n contractedVolume: editForm.contractedVolume ? Number(editForm.contractedVolume) : null,\n unit: editForm.unit,\n deliveryLocation: editForm.deliveryLocation.trim() || null,\n startDate: toBackendDate(editForm.startDate) ?? null,\n endDate: toBackendDate(editForm.endDate) ?? null,\n notes: editForm.notes.trim() || null,\n },\n });\n notify.success('Contract updated');\n setEditOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update contract.');\n notify.fromError(err);\n }\n };\n\n const handleScheduleShipment = async () => {\n if (!shipmentForm.reference.trim()) {\n setError('Shipment reference is required.');\n return;\n }\n const volume = Number(shipmentForm.volume);\n if (!shipmentForm.volume || Number.isNaN(volume) || volume <= 0) {\n setError('Enter a volume greater than zero.');\n notify.error('Enter a volume greater than zero.');\n return;\n }\n setError(null);\n try {\n await scheduleShipment.mutateAsync({\n contractId: contract.id,\n reference: shipmentForm.reference.trim(),\n mode: shipmentForm.mode,\n carrier: shipmentForm.carrier.trim() || null,\n origin: shipmentForm.origin.trim() || null,\n destination: shipmentForm.destination.trim() || null,\n volume,\n unit: shipmentForm.unit,\n scheduledAt: toBackendDate(shipmentForm.scheduledAt) ?? null,\n documentFileId: docFile?.fileId ?? null,\n notes: shipmentForm.notes.trim() || null,\n });\n notify.success('Shipment scheduled');\n setShipmentOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to schedule shipment.');\n notify.fromError(err);\n }\n };\n\n const handleDeliver = (shipmentId: string) => {\n setError(null);\n deliverShipment.mutate(shipmentId, {\n onSuccess: () => notify.success('Shipment delivered'),\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to mark shipment delivered.');\n notify.fromError(err);\n },\n });\n };\n\n const shipmentColumns: Column<TheShipment>[] = [\n {\n key: 'reference',\n header: 'Shipment',\n render: (s) => (\n <div>\n <p className=\"font-medium text-text-primary\">{s.reference}</p>\n <p className=\"text-xs text-text-tertiary\">{formatEnumLabel(s.mode)}</p>\n </div>\n ),\n },\n { key: 'status', header: 'Status', render: (s) => <StatusBadge status={s.status} /> },\n {\n key: 'carrier',\n header: 'Carrier',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-secondary\">{s.carrier ?? '—'}</span>,\n },\n {\n key: 'route',\n header: 'Route',\n hideOnMobile: true,\n render: (s) =>\n s.origin || s.destination ? (\n <span className=\"text-text-secondary\">\n {s.origin ?? '—'} <span className=\"text-text-tertiary\">→</span> {s.destination ?? '—'}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (s) => s.volume,\n render: (s) => (\n <span className=\"tabular-nums text-text-secondary\">{formatVolume(s.volume, s.unit)}</span>\n ),\n },\n {\n key: 'schedule',\n header: 'Scheduled',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-tertiary\">{formatDate(s.scheduledAt)}</span>,\n },\n {\n key: 'document',\n header: 'Document',\n hideOnMobile: true,\n render: (s) =>\n s.document?.id ? (\n <FileLink fileId={s.document.id} />\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'action',\n header: '',\n align: 'right',\n render: (s) =>\n OPEN_SHIPMENT_STATES.has(s.status) ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleDeliver(s.id)}\n disabled={deliverShipment.isPending}\n >\n <CheckCircle2 className=\"mr-1.5 h-4 w-4\" /> Mark delivered\n </Button>\n ) : null,\n },\n ];\n\n const tabs: TabItem<DetailTab>[] = [\n {\n value: 'shipments',\n label: 'Shipments',\n icon: <Ship className=\"h-4 w-4\" />,\n count: shipments.length,\n },\n { value: 'tags', label: 'Tags', icon: <TagIcon className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n const term =\n contract.startDate || contract.endDate\n ? `${formatDate(contract.startDate)} – ${formatDate(contract.endDate)}`\n : '—';\n\n return (\n <PageLayout\n title={contract.reference}\n description={`${contract.counterparty} · ${formatEnumLabel(contract.commodity)}`}\n dataTour=\"theglobalfuel-contract-detail-page\"\n actions={\n <>\n <StatusBadge status={contract.status} />\n <Select\n value={contract.status}\n onValueChange={(v) => handleTransition(v as TheContractStatus)}\n disabled={contractNext.length === 0}\n >\n <SelectTrigger className=\"h-9 w-40\" aria-label=\"Change contract status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {/* Current status shown as the trigger value; disabled so it is not re-selected. */}\n <SelectItem value={contract.status} disabled>\n {formatEnumLabel(contract.status)}\n </SelectItem>\n {contractNext.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit\n </Button>\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Headline metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Building2 className=\"h-5 w-5\" />}\n value={contract.counterparty}\n label=\"Counterparty\"\n featured\n />\n <MetricsCard\n icon={<Package className=\"h-5 w-5\" />}\n value={formatEnumLabel(contract.commodity)}\n label=\"Commodity & side\"\n footer={<StatusBadge status={contract.side} />}\n />\n <MetricsCard\n icon={<Coins className=\"h-5 w-5\" />}\n value={formatMoney(contract.pricePerUnit, contract.currency)}\n label={`Price per ${formatUnit(contract.unit)}`}\n footer={<StatusBadge status={contract.pricingBasis} />}\n />\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={formatVolume(contract.deliveredVolume, contract.unit)}\n label={`of ${formatVolume(contract.contractedVolume, contract.unit)} delivered`}\n footer={\n <div className=\"space-y-2\">\n <MiniBar value={deliveredPct} barClassName=\"bg-[var(--color-status-success-text)]\" />\n <p className=\"text-xs tabular-nums text-text-tertiary\">\n {Math.round(deliveredPct)}% fulfilled\n </p>\n </div>\n }\n />\n </div>\n\n {/* Overview */}\n <GlassCard treatment=\"glass\" className=\"mt-4 p-6\">\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3 lg:grid-cols-4\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Pricing basis</dt>\n <dd className=\"mt-1\">\n <StatusBadge status={contract.pricingBasis} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Price index</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.priceIndex ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Currency</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.currency}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery location</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary\">\n {contract.deliveryLocation ? (\n <>\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {contract.deliveryLocation}\n </>\n ) : (\n '—'\n )}\n </dd>\n </div>\n <div className=\"col-span-2\">\n <dt className=\"text-xs text-text-tertiary\">Term</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary tabular-nums\">\n <Calendar className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {term}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Signed</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.signedAt)}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Created</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.createdAt)}</dd>\n </div>\n </dl>\n {contract.notes && (\n <p className=\"mt-5 rounded-lg bg-bg-sunken/60 p-3 text-sm text-text-secondary\">\n {contract.notes}\n </p>\n )}\n </GlassCard>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Shipments ─────────────────────────────────────────────────────────── */}\n {activeTab === 'shipments' && (\n <div className=\"mt-6\">\n <Section\n title=\"Shipments\"\n description=\"Physical movements delivering against this contract's volume.\"\n action={\n <Button size=\"sm\" onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n >\n {shipmentsQuery.isLoading ? (\n <LoadingView label=\"Loading shipments…\" />\n ) : shipmentsQuery.isError ? (\n <ErrorView\n message=\"Couldn't load shipments.\"\n onRetry={() => shipmentsQuery.refetch()}\n />\n ) : shipments.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Ship className=\"h-10 w-10\" />}\n title=\"No shipments scheduled\"\n description=\"Schedule a shipment to start delivering against this contract.\"\n action={\n <Button onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n />\n ) : (\n <>\n <DataTable columns={shipmentColumns} rows={shipments} rowKey={(s) => s.id} />\n <Pagination\n page={shipmentPager.page}\n pageSize={PAGE_SIZE}\n itemCount={shipments.length}\n hasMore={shipmentsQuery.data?.pageInfo?.hasMore ?? false}\n onPageChange={shipmentPager.onPageChange}\n />\n </>\n )}\n </Section>\n </div>\n )}\n\n {/* ── Tags ──────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <div className=\"mt-6\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-contract\" entityId={contract.id} />\n </GlassCard>\n </div>\n )}\n\n {/* ── Discussion ────────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-6\">\n <TheDiscussion\n entityType=\"theglobalfuel-contract\"\n entityId={contract.id}\n description=\"Coordinate negotiation, delivery and settlement with your team.\"\n />\n </div>\n )}\n\n {/* Schedule shipment dialog */}\n <ResponsiveDialog\n open={shipmentOpen}\n onOpenChange={(open) => {\n setShipmentOpen(open);\n if (!open) {\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n }\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Schedule shipment</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a physical movement delivering against {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleScheduleShipment();\n }}\n >\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipReference\">Reference *</Label>\n <Input\n id=\"shipReference\"\n value={shipmentForm.reference}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, reference: e.target.value })\n }\n placeholder=\"SHP-2026-0031\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipMode\">Mode</Label>\n <Select\n value={shipmentForm.mode}\n onValueChange={(v) =>\n setShipmentForm({ ...shipmentForm, mode: v as TheTransportMode })\n }\n >\n <SelectTrigger id=\"shipMode\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSPORT_MODES.map((m) => (\n <SelectItem key={m} value={m}>\n {formatEnumLabel(m)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipCarrier\">Carrier</Label>\n <Input\n id=\"shipCarrier\"\n value={shipmentForm.carrier}\n onChange={(e) => setShipmentForm({ ...shipmentForm, carrier: e.target.value })}\n placeholder=\"Maersk Tankers\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipOrigin\">Origin</Label>\n <Input\n id=\"shipOrigin\"\n value={shipmentForm.origin}\n onChange={(e) => setShipmentForm({ ...shipmentForm, origin: e.target.value })}\n placeholder=\"Ras Tanura\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipDestination\">Destination</Label>\n <Input\n id=\"shipDestination\"\n value={shipmentForm.destination}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, destination: e.target.value })\n }\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipVolume\">Volume *</Label>\n <Input\n id=\"shipVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={shipmentForm.volume}\n onChange={(e) => setShipmentForm({ ...shipmentForm, volume: e.target.value })}\n placeholder=\"50000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipUnit\">Unit</Label>\n <Select\n value={shipmentForm.unit}\n onValueChange={(v) => setShipmentForm({ ...shipmentForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"shipUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipScheduled\">Scheduled at</Label>\n <Input\n id=\"shipScheduled\"\n type=\"date\"\n value={shipmentForm.scheduledAt}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, scheduledAt: e.target.value })\n }\n />\n </div>\n </div>\n\n <EvidenceUpload\n id=\"ship-doc\"\n label=\"Bill of lading / document\"\n value={docFile}\n onChange={setDocFile}\n accept=\"image/*,application/pdf\"\n hint=\"Attach the bill of lading or shipping document (PDF or image).\"\n />\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipNotes\">Notes</Label>\n <Textarea\n id=\"shipNotes\"\n rows={2}\n value={shipmentForm.notes}\n onChange={(e) => setShipmentForm({ ...shipmentForm, notes: e.target.value })}\n placeholder=\"Optional context about this shipment.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setShipmentOpen(false);\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={scheduleShipment.isPending}>\n {scheduleShipment.isPending ? 'Scheduling…' : 'Schedule shipment'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit contract dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the commercial terms of {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleSaveEdit();\n }}\n >\n {editForm && (\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCounterparty\">Counterparty *</Label>\n <Input\n id=\"editCounterparty\"\n value={editForm.counterparty}\n onChange={(e) => setEditForm({ ...editForm, counterparty: e.target.value })}\n placeholder=\"Vitol S.A.\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPricingBasis\">Pricing basis</Label>\n <Select\n value={editForm.pricingBasis}\n onValueChange={(v) =>\n setEditForm({ ...editForm, pricingBasis: v as ThePricingBasis })\n }\n >\n <SelectTrigger id=\"editPricingBasis\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRICING_BASES.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPriceIndex\">Price index</Label>\n <Input\n id=\"editPriceIndex\"\n value={editForm.priceIndex}\n onChange={(e) => setEditForm({ ...editForm, priceIndex: e.target.value })}\n placeholder=\"Brent, TTF, Henry Hub\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPrice\">Price / unit</Label>\n <Input\n id=\"editPrice\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.pricePerUnit}\n onChange={(e) => setEditForm({ ...editForm, pricePerUnit: e.target.value })}\n placeholder=\"82.50\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCurrency\">Currency</Label>\n <Input\n id=\"editCurrency\"\n value={editForm.currency}\n onChange={(e) => setEditForm({ ...editForm, currency: e.target.value })}\n placeholder=\"USD\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editUnit\">Unit</Label>\n <Select\n value={editForm.unit}\n onValueChange={(v) => setEditForm({ ...editForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"editUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editVolume\">Contracted volume</Label>\n <Input\n id=\"editVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.contractedVolume}\n onChange={(e) =>\n setEditForm({ ...editForm, contractedVolume: e.target.value })\n }\n placeholder=\"500000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editLocation\">Delivery location</Label>\n <Input\n id=\"editLocation\"\n value={editForm.deliveryLocation}\n onChange={(e) =>\n setEditForm({ ...editForm, deliveryLocation: e.target.value })\n }\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editStart\">Start date</Label>\n <Input\n id=\"editStart\"\n type=\"date\"\n value={editForm.startDate}\n onChange={(e) => setEditForm({ ...editForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editEnd\">End date</Label>\n <Input\n id=\"editEnd\"\n type=\"date\"\n value={editForm.endDate}\n onChange={(e) => setEditForm({ ...editForm, endDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editNotes\">Notes</Label>\n <Textarea\n id=\"editNotes\"\n rows={2}\n value={editForm.notes}\n onChange={(e) => setEditForm({ ...editForm, notes: e.target.value })}\n placeholder=\"Optional context about this contract.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n )}\n\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updateContract.isPending}>\n {updateContract.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ContractDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/contracts/ContractDetailPage.tsx"],"sourcesContent":["/**\n * Contract detail — headline economics, delivery progress, shipments & collaboration.\n * @module theglobalfuel/pages/contracts\n *\n * Reads `theContract` (+ nested shipments); writes `theUpdateContract`,\n * `theTransitionContract`, `theScheduleShipment`, `theDeliverShipment`.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport {\n ArrowLeft,\n Plus,\n Pencil,\n Ship,\n Building2,\n Coins,\n Package,\n Gauge,\n MapPin,\n Calendar,\n CheckCircle2,\n Tag as TagIcon,\n MessageSquare,\n FileSignature,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { DataTable, type Column } from '../../components/DataTable';\nimport { Tabs, type TabItem } from '../../components/Tabs';\nimport { LoadingView, ErrorView, Section } from '../../components/StateViews';\nimport { EmptyState } from '../../components/EmptyState';\nimport { MiniBar } from '../../components/MiniBar';\nimport { FileLink } from '../../components/FileLink';\nimport { EvidenceUpload } from '../../components/EvidenceUpload';\nimport { TheTags } from '../../components/TheTags';\nimport { TheDiscussion } from '../../components/TheDiscussion';\nimport { Pagination } from '../../components/Pagination';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheContract,\n useTheShipments,\n useTheUpdateContract,\n useTheTransitionContract,\n useTheScheduleShipment,\n useTheDeliverShipment,\n useNotify,\n useThePageView,\n useTheNativeControls,\n useCursorPager,\n type UploadedTheFile,\n} from '../../hooks';\nimport {\n formatDate,\n formatEnumLabel,\n formatMoney,\n formatUnit,\n formatVolume,\n} from '../../utils/formatters';\nimport { CONTRACT_TRANSITIONS, nextStatuses, toBackendDate } from '../../utils';\nimport type {\n TheShipment,\n TheContractStatus,\n ThePricingBasis,\n TheTransportMode,\n TheUnit,\n} from '../../types';\n\nconst PRICING_BASES: ThePricingBasis[] = ['FIXED', 'INDEX_LINKED', 'FORMULA', 'SPOT'];\nconst TRANSPORT_MODES: TheTransportMode[] = [\n 'PIPELINE',\n 'TANKER',\n 'VESSEL_BULK',\n 'RAIL',\n 'TRUCK',\n 'GRID',\n];\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\n/** Shipment states that are still \"open\" — eligible to be marked delivered. */\nconst OPEN_SHIPMENT_STATES = new Set(['SCHEDULED', 'LOADING', 'IN_TRANSIT']);\n\nconst PAGE_SIZE = 25;\n\nconst clampPercent = (value: number): number => Math.max(0, Math.min(100, value));\n\n/** ISO datetime → the `YYYY-MM-DD` a native date input expects (empty if unset). */\nconst toDateInput = (iso: string | null | undefined): string => (iso ? iso.slice(0, 10) : '');\n\ntype DetailTab = 'shipments' | 'tags' | 'discussion';\n\ninterface EditFormState {\n counterparty: string;\n pricingBasis: ThePricingBasis;\n pricePerUnit: string;\n priceIndex: string;\n currency: string;\n contractedVolume: string;\n unit: TheUnit;\n deliveryLocation: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\ninterface ShipmentFormState {\n reference: string;\n mode: TheTransportMode;\n carrier: string;\n origin: string;\n destination: string;\n volume: string;\n unit: TheUnit;\n scheduledAt: string;\n notes: string;\n}\n\nconst emptyShipmentForm = (unit: TheUnit): ShipmentFormState => ({\n reference: '',\n mode: 'VESSEL_BULK',\n carrier: '',\n origin: '',\n destination: '',\n volume: '',\n unit,\n scheduledAt: '',\n notes: '',\n});\n\nexport function ContractDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n useThePageView('contract-detail');\n const { haptic } = useTheNativeControls();\n const { data: contract, isLoading, isError, refetch } = useTheContract(id);\n\n const updateContract = useTheUpdateContract();\n const transitionContract = useTheTransitionContract();\n const scheduleShipment = useTheScheduleShipment();\n const deliverShipment = useTheDeliverShipment();\n\n const shipmentPager = useCursorPager();\n const shipmentsQuery = useTheShipments(id, undefined, {\n limit: PAGE_SIZE,\n offset: shipmentPager.page * PAGE_SIZE,\n });\n\n const [activeTab, setActiveTab] = useState<DetailTab>('shipments');\n const [editOpen, setEditOpen] = useState(false);\n const [editForm, setEditForm] = useState<EditFormState | null>(null);\n const [shipmentOpen, setShipmentOpen] = useState(false);\n const [shipmentForm, setShipmentForm] = useState<ShipmentFormState>(emptyShipmentForm('BARRELS'));\n const [docFile, setDocFile] = useState<UploadedTheFile | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Contract\" dataTour=\"theglobalfuel-contract-detail-page\">\n <LoadingView />\n </PageLayout>\n );\n }\n if (isError || !contract) {\n return (\n <PageLayout\n title=\"Contract\"\n dataTour=\"theglobalfuel-contract-detail-page\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This contract could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<FileSignature className=\"h-10 w-10\" />}\n title=\"Contract not found\"\n description=\"This contract may have been removed or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('contracts')}>Back to contracts</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const shipments = shipmentsQuery.data?.items ?? [];\n const deliveredPct =\n contract.contractedVolume > 0\n ? clampPercent((contract.deliveredVolume / contract.contractedVolume) * 100)\n : 0;\n // Only offer legal next states so the backend never rejects the transition.\n const contractNext = nextStatuses(CONTRACT_TRANSITIONS, contract.status);\n\n const openEdit = () => {\n setEditForm({\n counterparty: contract.counterparty,\n pricingBasis: contract.pricingBasis,\n pricePerUnit: contract.pricePerUnit ? String(contract.pricePerUnit) : '',\n priceIndex: contract.priceIndex ?? '',\n currency: contract.currency,\n contractedVolume: contract.contractedVolume ? String(contract.contractedVolume) : '',\n unit: contract.unit,\n deliveryLocation: contract.deliveryLocation ?? '',\n startDate: toDateInput(contract.startDate),\n endDate: toDateInput(contract.endDate),\n notes: contract.notes ?? '',\n });\n setError(null);\n setEditOpen(true);\n };\n\n const openShipment = () => {\n haptic('light');\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n setShipmentOpen(true);\n };\n\n const handleTransition = (status: TheContractStatus) => {\n if (status === contract.status) return;\n setError(null);\n transitionContract.mutate(\n { id: contract.id, status },\n {\n onSuccess: () => notify.success('Contract status updated'),\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to update contract status.');\n notify.fromError(err);\n },\n }\n );\n };\n\n const handleSaveEdit = async () => {\n if (!editForm) return;\n if (!editForm.counterparty.trim()) {\n setError('Counterparty is required.');\n return;\n }\n setError(null);\n try {\n await updateContract.mutateAsync({\n id: contract.id,\n input: {\n counterparty: editForm.counterparty.trim(),\n pricingBasis: editForm.pricingBasis,\n pricePerUnit: editForm.pricePerUnit ? Number(editForm.pricePerUnit) : null,\n priceIndex: editForm.priceIndex.trim() || null,\n currency: editForm.currency.trim().toUpperCase() || 'USD',\n contractedVolume: editForm.contractedVolume ? Number(editForm.contractedVolume) : null,\n unit: editForm.unit,\n deliveryLocation: editForm.deliveryLocation.trim() || null,\n startDate: toBackendDate(editForm.startDate) ?? null,\n endDate: toBackendDate(editForm.endDate) ?? null,\n notes: editForm.notes.trim() || null,\n },\n });\n notify.success('Contract updated');\n setEditOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to update contract.');\n notify.fromError(err);\n }\n };\n\n const handleScheduleShipment = async () => {\n if (!shipmentForm.reference.trim()) {\n setError('Shipment reference is required.');\n return;\n }\n const volume = Number(shipmentForm.volume);\n if (!shipmentForm.volume || Number.isNaN(volume) || volume <= 0) {\n setError('Enter a volume greater than zero.');\n notify.error('Enter a volume greater than zero.');\n return;\n }\n setError(null);\n try {\n await scheduleShipment.mutateAsync({\n contractId: contract.id,\n reference: shipmentForm.reference.trim(),\n mode: shipmentForm.mode,\n carrier: shipmentForm.carrier.trim() || null,\n origin: shipmentForm.origin.trim() || null,\n destination: shipmentForm.destination.trim() || null,\n volume,\n unit: shipmentForm.unit,\n scheduledAt: toBackendDate(shipmentForm.scheduledAt) ?? null,\n documentFileId: docFile?.fileId ?? null,\n notes: shipmentForm.notes.trim() || null,\n });\n notify.success('Shipment scheduled');\n setShipmentOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to schedule shipment.');\n notify.fromError(err);\n }\n };\n\n const handleDeliver = (shipmentId: string) => {\n setError(null);\n deliverShipment.mutate(shipmentId, {\n onSuccess: () => notify.success('Shipment delivered'),\n onError: (err) => {\n setError(err instanceof Error ? err.message : 'Failed to mark shipment delivered.');\n notify.fromError(err);\n },\n });\n };\n\n const shipmentColumns: Column<TheShipment>[] = [\n {\n key: 'reference',\n header: 'Shipment',\n render: (s) => (\n <div>\n <p className=\"font-medium text-text-primary\">{s.reference}</p>\n <p className=\"text-xs text-text-tertiary\">{formatEnumLabel(s.mode)}</p>\n </div>\n ),\n },\n { key: 'status', header: 'Status', render: (s) => <StatusBadge status={s.status} /> },\n {\n key: 'carrier',\n header: 'Carrier',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-secondary\">{s.carrier ?? '—'}</span>,\n },\n {\n key: 'route',\n header: 'Route',\n hideOnMobile: true,\n render: (s) =>\n s.origin || s.destination ? (\n <span className=\"text-text-secondary\">\n {s.origin ?? '—'} <span className=\"text-text-tertiary\">→</span> {s.destination ?? '—'}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (s) => s.volume,\n render: (s) => (\n <span className=\"tabular-nums text-text-secondary\">{formatVolume(s.volume, s.unit)}</span>\n ),\n },\n {\n key: 'schedule',\n header: 'Scheduled',\n hideOnMobile: true,\n render: (s) => <span className=\"text-text-tertiary\">{formatDate(s.scheduledAt)}</span>,\n },\n {\n key: 'document',\n header: 'Document',\n hideOnMobile: true,\n render: (s) =>\n s.document?.id ? (\n <FileLink fileId={s.document.id} />\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'action',\n header: '',\n align: 'right',\n render: (s) =>\n OPEN_SHIPMENT_STATES.has(s.status) ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => handleDeliver(s.id)}\n disabled={deliverShipment.isPending}\n >\n <CheckCircle2 className=\"mr-1.5 h-4 w-4\" /> Mark delivered\n </Button>\n ) : null,\n },\n ];\n\n const tabs: TabItem<DetailTab>[] = [\n {\n value: 'shipments',\n label: 'Shipments',\n icon: <Ship className=\"h-4 w-4\" />,\n count: shipments.length,\n },\n { value: 'tags', label: 'Tags', icon: <TagIcon className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n const term =\n contract.startDate || contract.endDate\n ? `${formatDate(contract.startDate)} – ${formatDate(contract.endDate)}`\n : '—';\n\n return (\n <PageLayout\n title={contract.reference}\n description={`${contract.counterparty} · ${formatEnumLabel(contract.commodity)}`}\n dataTour=\"theglobalfuel-contract-detail-page\"\n actions={\n <>\n <StatusBadge status={contract.status} />\n <Select\n value={contract.status}\n onValueChange={(v) => handleTransition(v as TheContractStatus)}\n disabled={contractNext.length === 0}\n >\n <SelectTrigger className=\"h-9 w-40\" aria-label=\"Change contract status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {/* Current status shown as the trigger value; disabled so it is not re-selected. */}\n <SelectItem value={contract.status} disabled>\n {formatEnumLabel(contract.status)}\n </SelectItem>\n {contractNext.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit\n </Button>\n <Button variant=\"ghost\" onClick={() => navigateTo('contracts')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Headline metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Building2 className=\"h-5 w-5\" />}\n value={contract.counterparty}\n label=\"Counterparty\"\n featured\n />\n <MetricsCard\n icon={<Package className=\"h-5 w-5\" />}\n value={formatEnumLabel(contract.commodity)}\n label=\"Commodity & side\"\n footer={<StatusBadge status={contract.side} />}\n />\n <MetricsCard\n icon={<Coins className=\"h-5 w-5\" />}\n value={formatMoney(contract.pricePerUnit, contract.currency)}\n label={`Price per ${formatUnit(contract.unit)}`}\n footer={<StatusBadge status={contract.pricingBasis} />}\n />\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={formatVolume(contract.deliveredVolume, contract.unit)}\n label={`of ${formatVolume(contract.contractedVolume, contract.unit)} delivered`}\n footer={\n <div className=\"space-y-2\">\n <MiniBar value={deliveredPct} barClassName=\"bg-[var(--color-status-success-text)]\" />\n <p className=\"text-xs tabular-nums text-text-tertiary\">\n {Math.round(deliveredPct)}% fulfilled\n </p>\n </div>\n }\n />\n </div>\n\n {/* Overview */}\n <GlassCard treatment=\"glass\" className=\"mt-4 p-6\">\n <dl className=\"grid grid-cols-2 gap-x-6 gap-y-4 sm:grid-cols-3 lg:grid-cols-4\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Pricing basis</dt>\n <dd className=\"mt-1\">\n <StatusBadge status={contract.pricingBasis} />\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Price index</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.priceIndex ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Currency</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{contract.currency}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery location</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary\">\n {contract.deliveryLocation ? (\n <>\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {contract.deliveryLocation}\n </>\n ) : (\n '—'\n )}\n </dd>\n </div>\n <div className=\"col-span-2\">\n <dt className=\"text-xs text-text-tertiary\">Term</dt>\n <dd className=\"mt-0.5 flex items-center gap-1.5 text-sm text-text-primary tabular-nums\">\n <Calendar className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {term}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Signed</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.signedAt)}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Created</dt>\n <dd className=\"mt-0.5 text-sm text-text-primary\">{formatDate(contract.createdAt)}</dd>\n </div>\n </dl>\n {contract.notes && (\n <p className=\"mt-5 rounded-lg bg-bg-sunken/60 p-3 text-sm text-text-secondary\">\n {contract.notes}\n </p>\n )}\n </GlassCard>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Shipments ─────────────────────────────────────────────────────────── */}\n {activeTab === 'shipments' && (\n <div className=\"mt-6\">\n <Section\n title=\"Shipments\"\n description=\"Physical movements delivering against this contract's volume.\"\n action={\n <Button size=\"sm\" onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n >\n {shipmentsQuery.isLoading ? (\n <LoadingView label=\"Loading shipments…\" />\n ) : shipmentsQuery.isError ? (\n <ErrorView\n message=\"Couldn't load shipments.\"\n onRetry={() => shipmentsQuery.refetch()}\n />\n ) : shipments.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Ship className=\"h-10 w-10\" />}\n title=\"No shipments scheduled\"\n description=\"Schedule a shipment to start delivering against this contract.\"\n action={\n <Button onClick={openShipment}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Schedule shipment\n </Button>\n }\n />\n ) : (\n <>\n <DataTable columns={shipmentColumns} rows={shipments} rowKey={(s) => s.id} />\n <Pagination\n page={shipmentPager.page}\n pageSize={PAGE_SIZE}\n itemCount={shipments.length}\n hasMore={shipmentsQuery.data?.pageInfo?.hasMore ?? false}\n onPageChange={shipmentPager.onPageChange}\n />\n </>\n )}\n </Section>\n </div>\n )}\n\n {/* ── Tags ──────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <div className=\"mt-6\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-contract\" entityId={contract.id} />\n </GlassCard>\n </div>\n )}\n\n {/* ── Discussion ────────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-6\">\n <TheDiscussion\n entityType=\"theglobalfuel-contract\"\n entityId={contract.id}\n description=\"Coordinate negotiation, delivery and settlement with your team.\"\n />\n </div>\n )}\n\n {/* Schedule shipment dialog */}\n <ResponsiveDialog\n open={shipmentOpen}\n onOpenChange={(open) => {\n setShipmentOpen(open);\n if (!open) {\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n }\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Schedule shipment</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a physical movement delivering against {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleScheduleShipment();\n }}\n >\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipReference\">Reference *</Label>\n <Input\n id=\"shipReference\"\n value={shipmentForm.reference}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, reference: e.target.value })\n }\n placeholder=\"SHP-2026-0031\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipMode\">Mode</Label>\n <Select\n value={shipmentForm.mode}\n onValueChange={(v) =>\n setShipmentForm({ ...shipmentForm, mode: v as TheTransportMode })\n }\n >\n <SelectTrigger id=\"shipMode\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSPORT_MODES.map((m) => (\n <SelectItem key={m} value={m}>\n {formatEnumLabel(m)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipCarrier\">Carrier</Label>\n <Input\n id=\"shipCarrier\"\n value={shipmentForm.carrier}\n onChange={(e) => setShipmentForm({ ...shipmentForm, carrier: e.target.value })}\n placeholder=\"Maersk Tankers\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipOrigin\">Origin</Label>\n <Input\n id=\"shipOrigin\"\n value={shipmentForm.origin}\n onChange={(e) => setShipmentForm({ ...shipmentForm, origin: e.target.value })}\n placeholder=\"Ras Tanura\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipDestination\">Destination</Label>\n <Input\n id=\"shipDestination\"\n value={shipmentForm.destination}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, destination: e.target.value })\n }\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipVolume\">Volume *</Label>\n <Input\n id=\"shipVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={shipmentForm.volume}\n onChange={(e) => setShipmentForm({ ...shipmentForm, volume: e.target.value })}\n placeholder=\"50000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipUnit\">Unit</Label>\n <Select\n value={shipmentForm.unit}\n onValueChange={(v) => setShipmentForm({ ...shipmentForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"shipUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipScheduled\">Scheduled at</Label>\n <Input\n id=\"shipScheduled\"\n type=\"date\"\n value={shipmentForm.scheduledAt}\n onChange={(e) =>\n setShipmentForm({ ...shipmentForm, scheduledAt: e.target.value })\n }\n />\n </div>\n </div>\n\n <EvidenceUpload\n id=\"ship-doc\"\n label=\"Bill of lading / document\"\n value={docFile}\n onChange={setDocFile}\n accept=\"image/*,application/pdf\"\n hint=\"Attach the bill of lading or shipping document (PDF or image).\"\n />\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"shipNotes\">Notes</Label>\n <Textarea\n id=\"shipNotes\"\n rows={2}\n value={shipmentForm.notes}\n onChange={(e) => setShipmentForm({ ...shipmentForm, notes: e.target.value })}\n placeholder=\"Optional context about this shipment.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n setShipmentOpen(false);\n setShipmentForm(emptyShipmentForm(contract.unit));\n setDocFile(null);\n setError(null);\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={scheduleShipment.isPending}>\n {scheduleShipment.isPending ? 'Scheduling…' : 'Schedule shipment'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Edit contract dialog */}\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the commercial terms of {contract.reference}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n onSubmit={(e) => {\n e.preventDefault();\n void handleSaveEdit();\n }}\n >\n {editForm && (\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCounterparty\">Counterparty *</Label>\n <Input\n id=\"editCounterparty\"\n value={editForm.counterparty}\n onChange={(e) => setEditForm({ ...editForm, counterparty: e.target.value })}\n placeholder=\"Vitol S.A.\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPricingBasis\">Pricing basis</Label>\n <Select\n value={editForm.pricingBasis}\n onValueChange={(v) =>\n setEditForm({ ...editForm, pricingBasis: v as ThePricingBasis })\n }\n >\n <SelectTrigger id=\"editPricingBasis\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PRICING_BASES.map((p) => (\n <SelectItem key={p} value={p}>\n {formatEnumLabel(p)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPriceIndex\">Price index</Label>\n <Input\n id=\"editPriceIndex\"\n value={editForm.priceIndex}\n onChange={(e) => setEditForm({ ...editForm, priceIndex: e.target.value })}\n placeholder=\"Brent, TTF, Henry Hub\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editPrice\">Price / unit</Label>\n <Input\n id=\"editPrice\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.pricePerUnit}\n onChange={(e) => setEditForm({ ...editForm, pricePerUnit: e.target.value })}\n placeholder=\"82.50\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editCurrency\">Currency</Label>\n <Input\n id=\"editCurrency\"\n value={editForm.currency}\n onChange={(e) => setEditForm({ ...editForm, currency: e.target.value })}\n placeholder=\"USD\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editUnit\">Unit</Label>\n <Select\n value={editForm.unit}\n onValueChange={(v) => setEditForm({ ...editForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"editUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatUnit(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editVolume\">Contracted volume</Label>\n <Input\n id=\"editVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={editForm.contractedVolume}\n onChange={(e) =>\n setEditForm({ ...editForm, contractedVolume: e.target.value })\n }\n placeholder=\"500000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editLocation\">Delivery location</Label>\n <Input\n id=\"editLocation\"\n value={editForm.deliveryLocation}\n onChange={(e) =>\n setEditForm({ ...editForm, deliveryLocation: e.target.value })\n }\n placeholder=\"Rotterdam\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editStart\">Start date</Label>\n <Input\n id=\"editStart\"\n type=\"date\"\n value={editForm.startDate}\n onChange={(e) => setEditForm({ ...editForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editEnd\">End date</Label>\n <Input\n id=\"editEnd\"\n type=\"date\"\n value={editForm.endDate}\n onChange={(e) => setEditForm({ ...editForm, endDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"editNotes\">Notes</Label>\n <Textarea\n id=\"editNotes\"\n rows={2}\n value={editForm.notes}\n onChange={(e) => setEditForm({ ...editForm, notes: e.target.value })}\n placeholder=\"Optional context about this contract.\"\n />\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n )}\n\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setEditOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updateContract.isPending}>\n {updateContract.isPending ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFA,IAAM,KAAmC;CAAC;CAAS;CAAgB;CAAW;CAAO,EAC/E,KAAsC;CAC1C;CACA;CACA;CACA;CACA;CACA;CACD,EACK,KAAmB;CAAC;CAAW;CAAgB;CAAU;CAAa;CAAO;CAAM;CAAM,EAGzF,KAAuB,IAAI,IAAI;CAAC;CAAa;CAAW;CAAa,CAAC,EAEtE,IAAY,IAEZ,MAAgB,MAA0B,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC,EAG3E,MAAe,MAA4C,IAAM,EAAI,MAAM,GAAG,GAAG,GAAG,IA8BpF,KAAqB,OAAsC;CAC/D,WAAW;CACX,MAAM;CACN,SAAS;CACT,QAAQ;CACR,aAAa;CACb,QAAQ;CACR;CACA,aAAa;CACb,OAAO;CACR;AAED,SAAgB,IAAqB;CACnC,IAAM,EAAE,UAAO,IAA2B,EACpC,EAAE,kBAAe,GAAkB,EACnC,IAAS,IAAW;AAC1B,IAAe,kBAAkB;CACjC,IAAM,EAAE,eAAW,IAAsB,EACnC,EAAE,MAAM,GAAU,eAAW,aAAS,gBAAY,GAAe,EAAG,EAEpE,IAAiB,IAAsB,EACvC,KAAqB,IAA0B,EAC/C,IAAmB,IAAwB,EAC3C,KAAkB,IAAuB,EAEzC,IAAgB,IAAgB,EAChC,IAAiB,GAAgB,GAAI,KAAA,GAAW;EACpD,OAAO;EACP,QAAQ,EAAc,OAAO;EAC9B,CAAC,EAEI,CAAC,GAAW,MAAgB,EAAoB,YAAY,EAC5D,CAAC,IAAU,KAAe,EAAS,GAAM,EACzC,CAAC,GAAU,KAAe,EAA+B,KAAK,EAC9D,CAAC,IAAc,KAAmB,EAAS,GAAM,EACjD,CAAC,GAAc,KAAmB,EAA4B,EAAkB,UAAU,CAAC,EAC3F,CAAC,IAAS,KAAc,EAAiC,KAAK,EAC9D,CAAC,GAAO,KAAY,EAAwB,KAAK;AAEvD,KAAI,GACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAW,UAAS;YACpC,kBAAC,IAAD,EAAe,CAAA;EACJ,CAAA;AAGjB,KAAI,MAAW,CAAC,EACd,QACE,kBAAC,GAAD;EACE,OAAM;EACN,UAAS;EACT,SACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,eAAe,EAAW,YAAY;aAA9D,CACE,kBAAC,IAAD,EAAW,WAAU,kBAAmB,CAAA,EAAA,QACjC;;YAGV,KACC,kBAAC,IAAD;GAAW,SAAQ;GAAqC,eAAe,IAAS;GAAI,CAAA,GAEpF,kBAAC,IAAD;GACE,cAAa;GACb,MAAM,kBAAC,IAAD,EAAe,WAAU,aAAc,CAAA;GAC7C,OAAM;GACN,aAAY;GACZ,QAAQ,kBAAC,GAAD;IAAQ,eAAe,EAAW,YAAY;cAAE;IAA0B,CAAA;GAClF,CAAA;EAEO,CAAA;CAIjB,IAAM,IAAY,EAAe,MAAM,SAAS,EAAE,EAC5C,KACJ,EAAS,mBAAmB,IACxB,GAAc,EAAS,kBAAkB,EAAS,mBAAoB,IAAI,GAC1E,GAEA,IAAe,GAAa,IAAsB,EAAS,OAAO,EAElE,WAAiB;AAerB,EAdA,EAAY;GACV,cAAc,EAAS;GACvB,cAAc,EAAS;GACvB,cAAc,EAAS,eAAe,OAAO,EAAS,aAAa,GAAG;GACtE,YAAY,EAAS,cAAc;GACnC,UAAU,EAAS;GACnB,kBAAkB,EAAS,mBAAmB,OAAO,EAAS,iBAAiB,GAAG;GAClF,MAAM,EAAS;GACf,kBAAkB,EAAS,oBAAoB;GAC/C,WAAW,GAAY,EAAS,UAAU;GAC1C,SAAS,GAAY,EAAS,QAAQ;GACtC,OAAO,EAAS,SAAS;GAC1B,CAAC,EACF,EAAS,KAAK,EACd,EAAY,GAAK;IAGb,UAAqB;AAKzB,EAJA,GAAO,QAAQ,EACf,EAAgB,EAAkB,EAAS,KAAK,CAAC,EACjD,EAAW,KAAK,EAChB,EAAS,KAAK,EACd,EAAgB,GAAK;IAGjB,MAAoB,MAA8B;AAClD,QAAW,EAAS,WACxB,EAAS,KAAK,EACd,GAAmB,OACjB;GAAE,IAAI,EAAS;GAAI;GAAQ,EAC3B;GACE,iBAAiB,EAAO,QAAQ,0BAA0B;GAC1D,UAAU,MAAQ;AAEhB,IADA,EAAS,aAAe,QAAQ,EAAI,UAAU,oCAAoC,EAClF,EAAO,UAAU,EAAI;;GAExB,CACF;IAGG,KAAiB,YAAY;AAC5B,SACL;OAAI,CAAC,EAAS,aAAa,MAAM,EAAE;AACjC,MAAS,4BAA4B;AACrC;;AAEF,KAAS,KAAK;AACd,OAAI;AAkBF,IAjBA,MAAM,EAAe,YAAY;KAC/B,IAAI,EAAS;KACb,OAAO;MACL,cAAc,EAAS,aAAa,MAAM;MAC1C,cAAc,EAAS;MACvB,cAAc,EAAS,eAAe,OAAO,EAAS,aAAa,GAAG;MACtE,YAAY,EAAS,WAAW,MAAM,IAAI;MAC1C,UAAU,EAAS,SAAS,MAAM,CAAC,aAAa,IAAI;MACpD,kBAAkB,EAAS,mBAAmB,OAAO,EAAS,iBAAiB,GAAG;MAClF,MAAM,EAAS;MACf,kBAAkB,EAAS,iBAAiB,MAAM,IAAI;MACtD,WAAW,EAAc,EAAS,UAAU,IAAI;MAChD,SAAS,EAAc,EAAS,QAAQ,IAAI;MAC5C,OAAO,EAAS,MAAM,MAAM,IAAI;MACjC;KACF,CAAC,EACF,EAAO,QAAQ,mBAAmB,EAClC,EAAY,GAAM;YACX,GAAK;AAEZ,IADA,EAAS,aAAe,QAAQ,EAAI,UAAU,6BAA6B,EAC3E,EAAO,UAAU,EAAI;;;IAInB,KAAyB,YAAY;AACzC,MAAI,CAAC,EAAa,UAAU,MAAM,EAAE;AAClC,KAAS,kCAAkC;AAC3C;;EAEF,IAAM,IAAS,OAAO,EAAa,OAAO;AAC1C,MAAI,CAAC,EAAa,UAAU,OAAO,MAAM,EAAO,IAAI,KAAU,GAAG;AAE/D,GADA,EAAS,oCAAoC,EAC7C,EAAO,MAAM,oCAAoC;AACjD;;AAEF,IAAS,KAAK;AACd,MAAI;AAeF,GAdA,MAAM,EAAiB,YAAY;IACjC,YAAY,EAAS;IACrB,WAAW,EAAa,UAAU,MAAM;IACxC,MAAM,EAAa;IACnB,SAAS,EAAa,QAAQ,MAAM,IAAI;IACxC,QAAQ,EAAa,OAAO,MAAM,IAAI;IACtC,aAAa,EAAa,YAAY,MAAM,IAAI;IAChD;IACA,MAAM,EAAa;IACnB,aAAa,EAAc,EAAa,YAAY,IAAI;IACxD,gBAAgB,IAAS,UAAU;IACnC,OAAO,EAAa,MAAM,MAAM,IAAI;IACrC,CAAC,EACF,EAAO,QAAQ,qBAAqB,EACpC,EAAgB,GAAM;WACf,GAAK;AAEZ,GADA,EAAS,aAAe,QAAQ,EAAI,UAAU,+BAA+B,EAC7E,EAAO,UAAU,EAAI;;IAInB,MAAiB,MAAuB;AAE5C,EADA,EAAS,KAAK,EACd,GAAgB,OAAO,GAAY;GACjC,iBAAiB,EAAO,QAAQ,qBAAqB;GACrD,UAAU,MAAQ;AAEhB,IADA,EAAS,aAAe,QAAQ,EAAI,UAAU,qCAAqC,EACnF,EAAO,UAAU,EAAI;;GAExB,CAAC;IAGE,KAAyC;EAC7C;GACE,KAAK;GACL,QAAQ;GACR,SAAS,MACP,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;IAAG,WAAU;cAAiC,EAAE;IAAc,CAAA,EAC9D,kBAAC,KAAD;IAAG,WAAU;cAA8B,EAAgB,EAAE,KAAK;IAAK,CAAA,CACnE,EAAA,CAAA;GAET;EACD;GAAE,KAAK;GAAU,QAAQ;GAAU,SAAS,MAAM,kBAAC,GAAD,EAAa,QAAQ,EAAE,QAAU,CAAA;GAAE;EACrF;GACE,KAAK;GACL,QAAQ;GACR,cAAc;GACd,SAAS,MAAM,kBAAC,QAAD;IAAM,WAAU;cAAuB,EAAE,WAAW;IAAW,CAAA;GAC/E;EACD;GACE,KAAK;GACL,QAAQ;GACR,cAAc;GACd,SAAS,MACP,EAAE,UAAU,EAAE,cACZ,kBAAC,QAAD;IAAM,WAAU;cAAhB;KACG,EAAE,UAAU;KAAI;KAAC,kBAAC,QAAD;MAAM,WAAU;gBAAqB;MAAQ,CAAA;;KAAE,EAAE,eAAe;KAC7E;QAEP,kBAAC,QAAD;IAAM,WAAU;cAAqB;IAAQ,CAAA;GAElD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,YAAY,MAAM,EAAE;GACpB,SAAS,MACP,kBAAC,QAAD;IAAM,WAAU;cAAoC,EAAa,EAAE,QAAQ,EAAE,KAAK;IAAQ,CAAA;GAE7F;EACD;GACE,KAAK;GACL,QAAQ;GACR,cAAc;GACd,SAAS,MAAM,kBAAC,QAAD;IAAM,WAAU;cAAsB,EAAW,EAAE,YAAY;IAAQ,CAAA;GACvF;EACD;GACE,KAAK;GACL,QAAQ;GACR,cAAc;GACd,SAAS,MACP,EAAE,UAAU,KACV,kBAAC,IAAD,EAAU,QAAQ,EAAE,SAAS,IAAM,CAAA,GAEnC,kBAAC,QAAD;IAAM,WAAU;cAAqB;IAAQ,CAAA;GAElD;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO;GACP,SAAS,MACP,GAAqB,IAAI,EAAE,OAAO,GAChC,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,eAAe,GAAc,EAAE,GAAG;IAClC,UAAU,GAAgB;cAJ5B,CAME,kBAAC,IAAD,EAAc,WAAU,kBAAmB,CAAA,EAAA,kBACpC;QACP;GACP;EACF,EAEK,KAA6B;EACjC;GACE,OAAO;GACP,OAAO;GACP,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;GAClC,OAAO,EAAU;GAClB;EACD;GAAE,OAAO;GAAQ,OAAO;GAAQ,MAAM,kBAAC,IAAD,EAAS,WAAU,WAAY,CAAA;GAAE;EACvE;GAAE,OAAO;GAAc,OAAO;GAAc,MAAM,kBAAC,IAAD,EAAe,WAAU,WAAY,CAAA;GAAE;EAC1F,EAEK,KACJ,EAAS,aAAa,EAAS,UAC3B,GAAG,EAAW,EAAS,UAAU,CAAC,KAAK,EAAW,EAAS,QAAQ,KACnE;AAEN,QACE,kBAAC,GAAD;EACE,OAAO,EAAS;EAChB,aAAa,GAAG,EAAS,aAAa,KAAK,EAAgB,EAAS,UAAU;EAC9E,UAAS;EACT,SACE,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD,EAAa,QAAQ,EAAS,QAAU,CAAA;GACxC,kBAAC,GAAD;IACE,OAAO,EAAS;IAChB,gBAAgB,MAAM,GAAiB,EAAuB;IAC9D,UAAU,EAAa,WAAW;cAHpC,CAKE,kBAAC,GAAD;KAAe,WAAU;KAAW,cAAW;eAC7C,kBAAC,GAAD,EAAe,CAAA;KACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CAEE,kBAAC,GAAD;KAAY,OAAO,EAAS;KAAQ,UAAA;eACjC,EAAgB,EAAS,OAAO;KACtB,CAAA,EACZ,EAAa,KAAK,MACjB,kBAAC,GAAD;KAAoB,OAAO;eACxB,EAAgB,EAAE;KACR,EAFI,EAEJ,CACb,CACY,EAAA,CAAA,CACT;;GACT,kBAAC,GAAD;IAAQ,SAAQ;IAAU,SAAS;cAAnC,CACE,kBAAC,IAAD,EAAQ,WAAU,kBAAmB,CAAA,EAAA,QAC9B;;GACT,kBAAC,GAAD;IAAQ,SAAQ;IAAQ,eAAe,EAAW,YAAY;cAA9D,CACE,kBAAC,IAAD,EAAW,WAAU,kBAAmB,CAAA,EAAA,QACjC;;GACR,EAAA,CAAA;YAjCP;GAqCE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,IAAD,EAAW,WAAU,WAAY,CAAA;MACvC,OAAO,EAAS;MAChB,OAAM;MACN,UAAA;MACA,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,IAAD,EAAS,WAAU,WAAY,CAAA;MACrC,OAAO,EAAgB,EAAS,UAAU;MAC1C,OAAM;MACN,QAAQ,kBAAC,GAAD,EAAa,QAAQ,EAAS,MAAQ,CAAA;MAC9C,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,IAAD,EAAO,WAAU,WAAY,CAAA;MACnC,OAAO,GAAY,EAAS,cAAc,EAAS,SAAS;MAC5D,OAAO,aAAa,EAAW,EAAS,KAAK;MAC7C,QAAQ,kBAAC,GAAD,EAAa,QAAQ,EAAS,cAAgB,CAAA;MACtD,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,IAAD,EAAO,WAAU,WAAY,CAAA;MACnC,OAAO,EAAa,EAAS,iBAAiB,EAAS,KAAK;MAC5D,OAAO,MAAM,EAAa,EAAS,kBAAkB,EAAS,KAAK,CAAC;MACpE,QACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,IAAD;QAAS,OAAO;QAAc,cAAa;QAA0C,CAAA,EACrF,kBAAC,KAAD;QAAG,WAAU;kBAAb,CACG,KAAK,MAAM,GAAa,EAAC,cACxB;UACA;;MAER,CAAA;KACE;;GAGN,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cAAvC,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd;MACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA6B;OAAkB,CAAA,EAC7D,kBAAC,MAAD;OAAI,WAAU;iBACZ,kBAAC,GAAD,EAAa,QAAQ,EAAS,cAAgB,CAAA;OAC3C,CAAA,CACD,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA6B;OAAgB,CAAA,EAC3D,kBAAC,MAAD;OAAI,WAAU;iBAAoC,EAAS,cAAc;OAAS,CAAA,CAC9E,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA6B;OAAa,CAAA,EACxD,kBAAC,MAAD;OAAI,WAAU;iBAAoC,EAAS;OAAc,CAAA,CACrE,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA6B;OAAsB,CAAA,EACjE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAS,mBACR,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,IAAD,EAAQ,WAAU,2CAA4C,CAAA,EAC7D,EAAS,iBACT,EAAA,CAAA,GAEH;OAEC,CAAA,CACD,EAAA,CAAA;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA6B;QAAS,CAAA,EACpD,kBAAC,MAAD;QAAI,WAAU;kBAAd,CACE,kBAAC,IAAD,EAAU,WAAU,2CAA4C,CAAA,EAC/D,GACE;UACD;;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA6B;OAAW,CAAA,EACtD,kBAAC,MAAD;OAAI,WAAU;iBAAoC,EAAW,EAAS,SAAS;OAAM,CAAA,CACjF,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA6B;OAAY,CAAA,EACvD,kBAAC,MAAD;OAAI,WAAU;iBAAoC,EAAW,EAAS,UAAU;OAAM,CAAA,CAClF,EAAA,CAAA;MACH;QACJ,EAAS,SACR,kBAAC,KAAD;KAAG,WAAU;eACV,EAAS;KACR,CAAA,CAEI;;GAEX,KAAS,kBAAC,KAAD;IAAG,WAAU;cAAuC;IAAU,CAAA;GAExE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,IAAD;KAAM,OAAO;KAAM,OAAO;KAAW,UAAU;KAAgB,CAAA;IAC3D,CAAA;GAGL,MAAc,eACb,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,IAAD;KACE,OAAM;KACN,aAAY;KACZ,QACE,kBAAC,GAAD;MAAQ,MAAK;MAAK,SAAS;gBAA3B,CACE,kBAAC,GAAD,EAAM,WAAU,kBAAmB,CAAA,EAAA,qBAC5B;;eAGV,EAAe,YACd,kBAAC,IAAD,EAAa,OAAM,sBAAuB,CAAA,GACxC,EAAe,UACjB,kBAAC,IAAD;MACE,SAAQ;MACR,eAAe,EAAe,SAAS;MACvC,CAAA,GACA,EAAU,WAAW,IACvB,kBAAC,IAAD;MACE,cAAa;MACb,MAAM,kBAAC,GAAD,EAAM,WAAU,aAAc,CAAA;MACpC,OAAM;MACN,aAAY;MACZ,QACE,kBAAC,GAAD;OAAQ,SAAS;iBAAjB,CACE,kBAAC,GAAD,EAAM,WAAU,kBAAmB,CAAA,EAAA,qBAC5B;;MAEX,CAAA,GAEF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,IAAD;MAAW,SAAS;MAAiB,MAAM;MAAW,SAAS,MAAM,EAAE;MAAM,CAAA,EAC7E,kBAAC,IAAD;MACE,MAAM,EAAc;MACpB,UAAU;MACV,WAAW,EAAU;MACrB,SAAS,EAAe,MAAM,UAAU,WAAW;MACnD,cAAc,EAAc;MAC5B,CAAA,CACD,EAAA,CAAA;KAEG,CAAA;IACN,CAAA;GAIP,MAAc,UACb,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAW,WAAU;KAAQ,WAAU;eACrC,kBAAC,IAAD;MAAS,YAAW;MAAyB,UAAU,EAAS;MAAM,CAAA;KAC5D,CAAA;IACR,CAAA;GAIP,MAAc,gBACb,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,IAAD;KACE,YAAW;KACX,UAAU,EAAS;KACnB,aAAY;KACZ,CAAA;IACE,CAAA;GAIR,kBAAC,GAAD;IACE,MAAM;IACN,eAAe,MAAS;AAEtB,KADA,EAAgB,EAAK,EAChB,MACH,EAAgB,EAAkB,EAAS,KAAK,CAAC,EACjD,EAAW,KAAK,EAChB,EAAS,KAAK;;cAIlB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAuB,qBAAyC,CAAA,EAChE,kBAAC,GAAD,EAAA,UAAA;KAA6B;KACiB,EAAS;KAAU;KACnC,EAAA,CAAA,CACP,EAAA,CAAA,EAEzB,kBAAC,QAAD;KACE,WAAW,MAAM;AAEV,MADL,EAAE,gBAAgB,EACb,IAAwB;;eAHjC,CAME,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAgB;UAAmB,CAAA,EAClD,kBAAC,GAAD;UACE,IAAG;UACH,OAAO,EAAa;UACpB,WAAW,MACT,EAAgB;WAAE,GAAG;WAAc,WAAW,EAAE,OAAO;WAAO,CAAC;UAEjE,aAAY;UACZ,CAAA,CACE;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAW;UAAY,CAAA,EACtC,kBAAC,GAAD;UACE,OAAO,EAAa;UACpB,gBAAgB,MACd,EAAgB;WAAE,GAAG;WAAc,MAAM;WAAuB,CAAC;oBAHrE,CAME,kBAAC,GAAD;WAAe,IAAG;qBAChB,kBAAC,GAAD,EAAe,CAAA;WACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,GAAgB,KAAK,MACpB,kBAAC,GAAD;WAAoB,OAAO;qBACxB,EAAgB,EAAE;WACR,EAFI,EAEJ,CACb,EACY,CAAA,CACT;YACL;WACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAO,SAAQ;mBAAc;SAAe,CAAA,EAC5C,kBAAC,GAAD;SACE,IAAG;SACH,OAAO,EAAa;SACpB,WAAW,MAAM,EAAgB;UAAE,GAAG;UAAc,SAAS,EAAE,OAAO;UAAO,CAAC;SAC9E,aAAY;SACZ,CAAA,CACE;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAa;UAAc,CAAA,EAC1C,kBAAC,GAAD;UACE,IAAG;UACH,OAAO,EAAa;UACpB,WAAW,MAAM,EAAgB;WAAE,GAAG;WAAc,QAAQ,EAAE,OAAO;WAAO,CAAC;UAC7E,aAAY;UACZ,CAAA,CACE;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAkB;UAAmB,CAAA,EACpD,kBAAC,GAAD;UACE,IAAG;UACH,OAAO,EAAa;UACpB,WAAW,MACT,EAAgB;WAAE,GAAG;WAAc,aAAa,EAAE,OAAO;WAAO,CAAC;UAEnE,aAAY;UACZ,CAAA,CACE;WACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAa;WAAgB,CAAA,EAC5C,kBAAC,GAAD;WACE,IAAG;WACH,MAAK;WACL,KAAI;WACJ,MAAK;WACL,OAAO,EAAa;WACpB,WAAW,MAAM,EAAgB;YAAE,GAAG;YAAc,QAAQ,EAAE,OAAO;YAAO,CAAC;WAC7E,aAAY;WACZ,CAAA,CACE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAW;WAAY,CAAA,EACtC,kBAAC,GAAD;WACE,OAAO,EAAa;WACpB,gBAAgB,MAAM,EAAgB;YAAE,GAAG;YAAc,MAAM;YAAc,CAAC;qBAFhF,CAIE,kBAAC,GAAD;YAAe,IAAG;sBAChB,kBAAC,GAAD,EAAe,CAAA;YACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,GAAM,KAAK,MACV,kBAAC,GAAD;YAAoB,OAAO;sBACxB,EAAW,EAAE;YACH,EAFI,EAEJ,CACb,EACY,CAAA,CACT;aACL;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAgB;WAAoB,CAAA,EACnD,kBAAC,GAAD;WACE,IAAG;WACH,MAAK;WACL,OAAO,EAAa;WACpB,WAAW,MACT,EAAgB;YAAE,GAAG;YAAc,aAAa,EAAE,OAAO;YAAO,CAAC;WAEnE,CAAA,CACE;;SACF;;OAEN,kBAAC,IAAD;QACE,IAAG;QACH,OAAM;QACN,OAAO;QACP,UAAU;QACV,QAAO;QACP,MAAK;QACL,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAO,SAAQ;mBAAY;SAAa,CAAA,EACxC,kBAAC,GAAD;SACE,IAAG;SACH,MAAM;SACN,OAAO,EAAa;SACpB,WAAW,MAAM,EAAgB;UAAE,GAAG;UAAc,OAAO,EAAE,OAAO;UAAO,CAAC;SAC5E,aAAY;SACZ,CAAA,CACE;;OAEL,KAAS,kBAAC,KAAD;QAAG,WAAU;kBAAkC;QAAU,CAAA;OAC/D;SAEN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,eAAe;AAIb,OAHA,EAAgB,GAAM,EACtB,EAAgB,EAAkB,EAAS,KAAK,CAAC,EACjD,EAAW,KAAK,EAChB,EAAS,KAAK;;gBAEjB;MAEQ,CAAA,EACT,kBAAC,GAAD;MAAQ,MAAK;MAAS,UAAU,EAAiB;gBAC9C,EAAiB,YAAY,gBAAgB;MACvC,CAAA,CACc,EAAA,CAAA,CACpB;OACiB,EAAA,CAAA;IACT,CAAA;GAGnB,kBAAC,GAAD;IAAkB,MAAM;IAAU,cAAc;cAC9C,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAuB,iBAAqC,CAAA,EAC5D,kBAAC,GAAD,EAAA,UAAA;KAA6B;KACK,EAAS;KAAU;KACvB,EAAA,CAAA,CACP,EAAA,CAAA,EAEzB,kBAAC,QAAD;KACE,WAAW,MAAM;AAEV,MADL,EAAE,gBAAgB,EACb,IAAgB;;eAHzB,CAMG,KACC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAO,SAAQ;mBAAmB;SAAsB,CAAA,EACxD,kBAAC,GAAD;SACE,IAAG;SACH,OAAO,EAAS;SAChB,WAAW,MAAM,EAAY;UAAE,GAAG;UAAU,cAAc,EAAE,OAAO;UAAO,CAAC;SAC3E,aAAY;SACZ,CAAA,CACE;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAmB;UAAqB,CAAA,EACvD,kBAAC,GAAD;UACE,OAAO,EAAS;UAChB,gBAAgB,MACd,EAAY;WAAE,GAAG;WAAU,cAAc;WAAsB,CAAC;oBAHpE,CAME,kBAAC,GAAD;WAAe,IAAG;qBAChB,kBAAC,GAAD,EAAe,CAAA;WACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,GAAc,KAAK,MAClB,kBAAC,GAAD;WAAoB,OAAO;qBACxB,EAAgB,EAAE;WACR,EAFI,EAEJ,CACb,EACY,CAAA,CACT;YACL;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAiB;UAAmB,CAAA,EACnD,kBAAC,GAAD;UACE,IAAG;UACH,OAAO,EAAS;UAChB,WAAW,MAAM,EAAY;WAAE,GAAG;WAAU,YAAY,EAAE,OAAO;WAAO,CAAC;UACzE,aAAY;UACZ,CAAA,CACE;WACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAY;WAAoB,CAAA,EAC/C,kBAAC,GAAD;WACE,IAAG;WACH,MAAK;WACL,KAAI;WACJ,MAAK;WACL,OAAO,EAAS;WAChB,WAAW,MAAM,EAAY;YAAE,GAAG;YAAU,cAAc,EAAE,OAAO;YAAO,CAAC;WAC3E,aAAY;WACZ,CAAA,CACE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAe;WAAgB,CAAA,EAC9C,kBAAC,GAAD;WACE,IAAG;WACH,OAAO,EAAS;WAChB,WAAW,MAAM,EAAY;YAAE,GAAG;YAAU,UAAU,EAAE,OAAO;YAAO,CAAC;WACvE,aAAY;WACZ,CAAA,CACE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAO,SAAQ;qBAAW;WAAY,CAAA,EACtC,kBAAC,GAAD;WACE,OAAO,EAAS;WAChB,gBAAgB,MAAM,EAAY;YAAE,GAAG;YAAU,MAAM;YAAc,CAAC;qBAFxE,CAIE,kBAAC,GAAD;YAAe,IAAG;sBAChB,kBAAC,GAAD,EAAe,CAAA;YACD,CAAA,EAChB,kBAAC,GAAD,EAAA,UACG,GAAM,KAAK,MACV,kBAAC,GAAD;YAAoB,OAAO;sBACxB,EAAW,EAAE;YACH,EAFI,EAEJ,CACb,EACY,CAAA,CACT;aACL;;SACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAa;UAAyB,CAAA,EACrD,kBAAC,GAAD;UACE,IAAG;UACH,MAAK;UACL,KAAI;UACJ,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MACT,EAAY;WAAE,GAAG;WAAU,kBAAkB,EAAE,OAAO;WAAO,CAAC;UAEhE,aAAY;UACZ,CAAA,CACE;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAe;UAAyB,CAAA,EACvD,kBAAC,GAAD;UACE,IAAG;UACH,OAAO,EAAS;UAChB,WAAW,MACT,EAAY;WAAE,GAAG;WAAU,kBAAkB,EAAE,OAAO;WAAO,CAAC;UAEhE,aAAY;UACZ,CAAA,CACE;WACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAY;UAAkB,CAAA,EAC7C,kBAAC,GAAD;UACE,IAAG;UACH,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MAAM,EAAY;WAAE,GAAG;WAAU,WAAW,EAAE,OAAO;WAAO,CAAC;UACxE,CAAA,CACE;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAO,SAAQ;oBAAU;UAAgB,CAAA,EACzC,kBAAC,GAAD;UACE,IAAG;UACH,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MAAM,EAAY;WAAE,GAAG;WAAU,SAAS,EAAE,OAAO;WAAO,CAAC;UACtE,CAAA,CACE;WACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAO,SAAQ;mBAAY;SAAa,CAAA,EACxC,kBAAC,GAAD;SACE,IAAG;SACH,MAAM;SACN,OAAO,EAAS;SAChB,WAAW,MAAM,EAAY;UAAE,GAAG;UAAU,OAAO,EAAE,OAAO;UAAO,CAAC;SACpE,aAAY;SACZ,CAAA,CACE;;OAEL,KAAS,kBAAC,KAAD;QAAG,WAAU;kBAAkC;QAAU,CAAA;OAC/D;SAGR,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAQ,MAAK;MAAS,SAAQ;MAAU,eAAe,EAAY,GAAM;gBAAE;MAElE,CAAA,EACT,kBAAC,GAAD;MAAQ,MAAK;MAAS,UAAU,EAAe;gBAC5C,EAAe,YAAY,YAAY;MACjC,CAAA,CACc,EAAA,CAAA,CACpB;OACiB,EAAA,CAAA;IACT,CAAA;GACR"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-theglobalfuel",
3
- "version": "2026.720.2",
3
+ "version": "2026.801.1",
4
4
  "description": "Burdenoff TheGlobalFuel Microfrontend — Energy, Mineral & Commodity Resource operating system",
5
5
  "type": "module",
6
6
  "files": [
@@ -26,11 +26,11 @@
26
26
  "types": "./dist/index.d.ts",
27
27
  "scripts": {
28
28
  "dev": "vite",
29
- "build": "tsc && vite build",
29
+ "build": "tsc && bash scripts/build-limits.sh --gate vite build",
30
30
  "lint": "eslint .",
31
31
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
32
- "type:check": "tsc --noEmit",
33
- "sanity": "bun run codegen && bun run lint && bun run format && bun run type:check && bun run build && bun run build-storybook",
32
+ "type:check": "bash scripts/build-limits.sh tsc --noEmit",
33
+ "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run lint && bun run format && bun run type:check && bun run build && bun run build-storybook'",
34
34
  "storybook": "storybook dev -p 6006",
35
35
  "build-storybook": "storybook build",
36
36
  "test:storybook": "test-storybook",
@@ -46,14 +46,14 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@apollo/client": "^4.0.11",
49
- "@burdenoff/fe-libs": "2026.713.6",
49
+ "@burdenoff/fe-libs": "2026.801.1",
50
50
  "@tanstack/react-query": "^5.90.16",
51
51
  "clsx": "^2.1.1",
52
52
  "graphql": "^16.10.0",
53
53
  "lucide-react": "^0.468.0",
54
54
  "react": "^19.0.0",
55
55
  "react-dom": "^19.0.0",
56
- "react-router-dom": "^7.1.3",
56
+ "react-router": "^8.3.0",
57
57
  "tailwind-merge": "^3.4.0",
58
58
  "zustand": "^5.0.3",
59
59
  "recharts": "^2.15.0",