@burdenoff/microfe-assethandler 2026.826.2 → 2026.826.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +1 -1
- package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
- package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
- package/dist/assethandler/components/ActivityTimeline.js.map +1 -1
- package/dist/assethandler/components/AttachmentsPanel.js.map +1 -1
- package/dist/assethandler/components/ChartCard.js.map +1 -1
- package/dist/assethandler/components/CommentsPanel.js.map +1 -1
- package/dist/assethandler/components/NotFoundState.js.map +1 -1
- package/dist/assethandler/components/Pagination.js.map +1 -1
- package/dist/assethandler/components/SectionHeader.js.map +1 -1
- package/dist/assethandler/components/StatTile.js.map +1 -1
- package/dist/assethandler/components/charts/BarsChart.js.map +1 -1
- package/dist/assethandler/components/charts/ChartParts.js.map +1 -1
- package/dist/assethandler/components/charts/DonutChart.js.map +1 -1
- package/dist/assethandler/components/charts/ProgressMeter.js.map +1 -1
- package/dist/assethandler/components/charts/RadialGauge.js.map +1 -1
- package/dist/assethandler/components/charts/Sparkline.js.map +1 -1
- package/dist/assethandler/components/charts/TrendChart.js.map +1 -1
- package/dist/assethandler/components/charts/chartTheme.js.map +1 -1
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -1
- package/dist/assethandler/hooks/useCopy.js.map +1 -1
- package/dist/assethandler/hooks/useMaintenancePlans.js.map +1 -1
- package/dist/assethandler/ops/MaintenancePlanDialog.js.map +1 -1
- package/dist/assethandler/ops/NewWorkOrderDialog.js.map +1 -1
- package/dist/assethandler/ops/ScheduleMaintenanceDialog.js.map +1 -1
- package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilDialogs.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.d.ts.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.js +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/utils/categoryPresentation.js.map +1 -1
- package/dist/assethandler/utils/cn.js.map +1 -1
- package/dist/assethandler/utils/csv.js.map +1 -1
- package/dist/assethandler/utils/i18n.js.map +1 -1
- package/dist/assethandler/utils/knowledgeBase.js.map +1 -1
- package/dist/assethandler/utils/meter.js.map +1 -1
- package/dist/assethandler/utils/money.js.map +1 -1
- package/dist/assethandler/utils/navigation.js.map +1 -1
- package/dist/assethandler/utils/printAssetTag.js.map +1 -1
- package/dist/assethandler/utils/toast.js.map +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
- package/dist/node_modules/d3-array/src/ascending.js.map +1 -1
- package/dist/node_modules/d3-array/src/bisect.js.map +1 -1
- package/dist/node_modules/d3-array/src/bisector.js.map +1 -1
- package/dist/node_modules/d3-array/src/descending.js.map +1 -1
- package/dist/node_modules/d3-array/src/max.js.map +1 -1
- package/dist/node_modules/d3-array/src/min.js.map +1 -1
- package/dist/node_modules/d3-array/src/number.js.map +1 -1
- package/dist/node_modules/d3-array/src/quantile.js.map +1 -1
- package/dist/node_modules/d3-array/src/quickselect.js.map +1 -1
- package/dist/node_modules/d3-array/src/range.js.map +1 -1
- package/dist/node_modules/d3-array/src/sort.js.map +1 -1
- package/dist/node_modules/d3-array/src/ticks.js.map +1 -1
- package/dist/node_modules/d3-color/src/color.js.map +1 -1
- package/dist/node_modules/d3-color/src/define.js.map +1 -1
- package/dist/node_modules/d3-format/src/defaultLocale.js.map +1 -1
- package/dist/node_modules/d3-format/src/exponent.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatDecimal.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatGroup.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatNumerals.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatRounded.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatSpecifier.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatTrim.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatTypes.js.map +1 -1
- package/dist/node_modules/d3-format/src/identity.js.map +1 -1
- package/dist/node_modules/d3-format/src/locale.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionFixed.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionPrefix.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionRound.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/array.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/basis.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/color.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/date.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/number.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/numberArray.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/object.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/piecewise.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/rgb.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/round.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/string.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/value.js.map +1 -1
- package/dist/node_modules/d3-path/src/path.js.map +1 -1
- package/dist/node_modules/d3-scale/src/band.js.map +1 -1
- package/dist/node_modules/d3-scale/src/constant.js.map +1 -1
- package/dist/node_modules/d3-scale/src/continuous.js.map +1 -1
- package/dist/node_modules/d3-scale/src/diverging.js.map +1 -1
- package/dist/node_modules/d3-scale/src/identity.js.map +1 -1
- package/dist/node_modules/d3-scale/src/init.js.map +1 -1
- package/dist/node_modules/d3-scale/src/linear.js.map +1 -1
- package/dist/node_modules/d3-scale/src/log.js.map +1 -1
- package/dist/node_modules/d3-scale/src/nice.js.map +1 -1
- package/dist/node_modules/d3-scale/src/number.js.map +1 -1
- package/dist/node_modules/d3-scale/src/ordinal.js.map +1 -1
- package/dist/node_modules/d3-scale/src/pow.js.map +1 -1
- package/dist/node_modules/d3-scale/src/quantile.js.map +1 -1
- package/dist/node_modules/d3-scale/src/quantize.js.map +1 -1
- package/dist/node_modules/d3-scale/src/radial.js.map +1 -1
- package/dist/node_modules/d3-scale/src/sequential.js.map +1 -1
- package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +1 -1
- package/dist/node_modules/d3-scale/src/symlog.js.map +1 -1
- package/dist/node_modules/d3-scale/src/threshold.js.map +1 -1
- package/dist/node_modules/d3-scale/src/tickFormat.js.map +1 -1
- package/dist/node_modules/d3-scale/src/time.js.map +1 -1
- package/dist/node_modules/d3-scale/src/utcTime.js.map +1 -1
- package/dist/node_modules/d3-shape/src/area.js.map +1 -1
- package/dist/node_modules/d3-shape/src/array.js.map +1 -1
- package/dist/node_modules/d3-shape/src/constant.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basis.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/bump.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/linear.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/monotone.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/natural.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/step.js.map +1 -1
- package/dist/node_modules/d3-shape/src/line.js.map +1 -1
- package/dist/node_modules/d3-shape/src/noop.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/expand.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/none.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/order/none.js.map +1 -1
- package/dist/node_modules/d3-shape/src/path.js.map +1 -1
- package/dist/node_modules/d3-shape/src/point.js.map +1 -1
- package/dist/node_modules/d3-shape/src/stack.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/circle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/cross.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/square.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/star.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/wye.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol.js.map +1 -1
- package/dist/node_modules/d3-time/src/day.js.map +1 -1
- package/dist/node_modules/d3-time/src/hour.js.map +1 -1
- package/dist/node_modules/d3-time/src/interval.js.map +1 -1
- package/dist/node_modules/d3-time/src/millisecond.js.map +1 -1
- package/dist/node_modules/d3-time/src/minute.js.map +1 -1
- package/dist/node_modules/d3-time/src/month.js.map +1 -1
- package/dist/node_modules/d3-time/src/second.js.map +1 -1
- package/dist/node_modules/d3-time/src/ticks.js.map +1 -1
- package/dist/node_modules/d3-time/src/week.js.map +1 -1
- package/dist/node_modules/d3-time/src/year.js.map +1 -1
- package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +1 -1
- package/dist/node_modules/d3-time-format/src/locale.js.map +1 -1
- package/dist/node_modules/decimal.js-light/decimal.js.map +1 -1
- package/dist/node_modules/dijkstrajs/dijkstra.js.map +1 -1
- package/dist/node_modules/eventemitter3/index.js.map +1 -1
- package/dist/node_modules/fast-equals/dist/es/index.js.map +1 -1
- package/dist/node_modules/internmap/src/index.js.map +1 -1
- package/dist/node_modules/lodash/_DataView.js.map +1 -1
- package/dist/node_modules/lodash/_Hash.js.map +1 -1
- package/dist/node_modules/lodash/_ListCache.js.map +1 -1
- package/dist/node_modules/lodash/_Map.js.map +1 -1
- package/dist/node_modules/lodash/_MapCache.js.map +1 -1
- package/dist/node_modules/lodash/_Promise.js.map +1 -1
- package/dist/node_modules/lodash/_Set.js.map +1 -1
- package/dist/node_modules/lodash/_SetCache.js.map +1 -1
- package/dist/node_modules/lodash/_Stack.js +2 -1
- package/dist/node_modules/lodash/_Stack.js.map +1 -1
- package/dist/node_modules/lodash/_Symbol.js.map +1 -1
- package/dist/node_modules/lodash/_Uint8Array.js.map +1 -1
- package/dist/node_modules/lodash/_WeakMap.js.map +1 -1
- package/dist/node_modules/lodash/_apply.js.map +1 -1
- package/dist/node_modules/lodash/_arrayEvery.js.map +1 -1
- package/dist/node_modules/lodash/_arrayFilter.js.map +1 -1
- package/dist/node_modules/lodash/_arrayIncludes.js.map +1 -1
- package/dist/node_modules/lodash/_arrayIncludesWith.js.map +1 -1
- package/dist/node_modules/lodash/_arrayLikeKeys.js.map +1 -1
- package/dist/node_modules/lodash/_arrayMap.js.map +1 -1
- package/dist/node_modules/lodash/_arrayPush.js.map +1 -1
- package/dist/node_modules/lodash/_arraySome.js.map +1 -1
- package/dist/node_modules/lodash/_asciiToArray.js.map +1 -1
- package/dist/node_modules/lodash/_assocIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_baseAssignValue.js.map +1 -1
- package/dist/node_modules/lodash/_baseEach.js.map +1 -1
- package/dist/node_modules/lodash/_baseEvery.js.map +1 -1
- package/dist/node_modules/lodash/_baseExtremum.js.map +1 -1
- package/dist/node_modules/lodash/_baseFindIndex.js.map +1 -1
- package/dist/node_modules/lodash/_baseFlatten.js.map +1 -1
- package/dist/node_modules/lodash/_baseFor.js.map +1 -1
- package/dist/node_modules/lodash/_baseForOwn.js.map +1 -1
- package/dist/node_modules/lodash/_baseGet.js.map +1 -1
- package/dist/node_modules/lodash/_baseGetAllKeys.js.map +1 -1
- package/dist/node_modules/lodash/_baseGetTag.js.map +1 -1
- package/dist/node_modules/lodash/_baseGt.js.map +1 -1
- package/dist/node_modules/lodash/_baseHasIn.js.map +1 -1
- package/dist/node_modules/lodash/_baseIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsArguments.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsEqual.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsMatch.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsNaN.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsNative.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsTypedArray.js.map +1 -1
- package/dist/node_modules/lodash/_baseIteratee.js.map +1 -1
- package/dist/node_modules/lodash/_baseKeys.js.map +1 -1
- package/dist/node_modules/lodash/_baseLt.js.map +1 -1
- package/dist/node_modules/lodash/_baseMap.js.map +1 -1
- package/dist/node_modules/lodash/_baseMatches.js.map +1 -1
- package/dist/node_modules/lodash/_baseMatchesProperty.js.map +1 -1
- package/dist/node_modules/lodash/_baseOrderBy.js.map +1 -1
- package/dist/node_modules/lodash/_baseProperty.js.map +1 -1
- package/dist/node_modules/lodash/_basePropertyDeep.js.map +1 -1
- package/dist/node_modules/lodash/_baseRange.js.map +1 -1
- package/dist/node_modules/lodash/_baseRest.js.map +1 -1
- package/dist/node_modules/lodash/_baseSetToString.js.map +1 -1
- package/dist/node_modules/lodash/_baseSlice.js.map +1 -1
- package/dist/node_modules/lodash/_baseSome.js.map +1 -1
- package/dist/node_modules/lodash/_baseSortBy.js.map +1 -1
- package/dist/node_modules/lodash/_baseTimes.js.map +1 -1
- package/dist/node_modules/lodash/_baseToString.js.map +1 -1
- package/dist/node_modules/lodash/_baseTrim.js.map +1 -1
- package/dist/node_modules/lodash/_baseUnary.js.map +1 -1
- package/dist/node_modules/lodash/_baseUniq.js.map +1 -1
- package/dist/node_modules/lodash/_cacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_castPath.js.map +1 -1
- package/dist/node_modules/lodash/_castSlice.js.map +1 -1
- package/dist/node_modules/lodash/_compareAscending.js.map +1 -1
- package/dist/node_modules/lodash/_compareMultiple.js.map +1 -1
- package/dist/node_modules/lodash/_coreJsData.js.map +1 -1
- package/dist/node_modules/lodash/_createBaseEach.js.map +1 -1
- package/dist/node_modules/lodash/_createBaseFor.js.map +1 -1
- package/dist/node_modules/lodash/_createCaseFirst.js.map +1 -1
- package/dist/node_modules/lodash/_createFind.js.map +1 -1
- package/dist/node_modules/lodash/_createRange.js.map +1 -1
- package/dist/node_modules/lodash/_createSet.js.map +1 -1
- package/dist/node_modules/lodash/_defineProperty.js.map +1 -1
- package/dist/node_modules/lodash/_equalArrays.js.map +1 -1
- package/dist/node_modules/lodash/_equalByTag.js.map +1 -1
- package/dist/node_modules/lodash/_equalObjects.js.map +1 -1
- package/dist/node_modules/lodash/_freeGlobal.js.map +1 -1
- package/dist/node_modules/lodash/_getAllKeys.js.map +1 -1
- package/dist/node_modules/lodash/_getMapData.js.map +1 -1
- package/dist/node_modules/lodash/_getMatchData.js.map +1 -1
- package/dist/node_modules/lodash/_getNative.js.map +1 -1
- package/dist/node_modules/lodash/_getPrototype.js.map +1 -1
- package/dist/node_modules/lodash/_getRawTag.js.map +1 -1
- package/dist/node_modules/lodash/_getSymbols.js.map +1 -1
- package/dist/node_modules/lodash/_getTag.js.map +1 -1
- package/dist/node_modules/lodash/_getValue.js.map +1 -1
- package/dist/node_modules/lodash/_hasPath.js.map +1 -1
- package/dist/node_modules/lodash/_hasUnicode.js.map +1 -1
- package/dist/node_modules/lodash/_hashClear.js.map +1 -1
- package/dist/node_modules/lodash/_hashDelete.js.map +1 -1
- package/dist/node_modules/lodash/_hashGet.js.map +1 -1
- package/dist/node_modules/lodash/_hashHas.js.map +1 -1
- package/dist/node_modules/lodash/_hashSet.js.map +1 -1
- package/dist/node_modules/lodash/_isFlattenable.js.map +1 -1
- package/dist/node_modules/lodash/_isIndex.js.map +1 -1
- package/dist/node_modules/lodash/_isIterateeCall.js.map +1 -1
- package/dist/node_modules/lodash/_isKey.js.map +1 -1
- package/dist/node_modules/lodash/_isKeyable.js.map +1 -1
- package/dist/node_modules/lodash/_isMasked.js.map +1 -1
- package/dist/node_modules/lodash/_isPrototype.js.map +1 -1
- package/dist/node_modules/lodash/_isStrictComparable.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheClear.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheDelete.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheGet.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheSet.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheClear.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheDelete.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheGet.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheSet.js.map +1 -1
- package/dist/node_modules/lodash/_mapToArray.js.map +1 -1
- package/dist/node_modules/lodash/_matchesStrictComparable.js.map +1 -1
- package/dist/node_modules/lodash/_memoizeCapped.js.map +1 -1
- package/dist/node_modules/lodash/_nativeCreate.js.map +1 -1
- package/dist/node_modules/lodash/_nativeKeys.js.map +1 -1
- package/dist/node_modules/lodash/_nodeUtil.js.map +1 -1
- package/dist/node_modules/lodash/_objectToString.js.map +1 -1
- package/dist/node_modules/lodash/_overArg.js.map +1 -1
- package/dist/node_modules/lodash/_overRest.js.map +1 -1
- package/dist/node_modules/lodash/_root.js.map +1 -1
- package/dist/node_modules/lodash/_setCacheAdd.js.map +1 -1
- package/dist/node_modules/lodash/_setCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_setToArray.js.map +1 -1
- package/dist/node_modules/lodash/_setToString.js.map +1 -1
- package/dist/node_modules/lodash/_shortOut.js.map +1 -1
- package/dist/node_modules/lodash/_stackClear.js.map +1 -1
- package/dist/node_modules/lodash/_stackDelete.js.map +1 -1
- package/dist/node_modules/lodash/_stackGet.js.map +1 -1
- package/dist/node_modules/lodash/_stackHas.js.map +1 -1
- package/dist/node_modules/lodash/_stackSet.js.map +1 -1
- package/dist/node_modules/lodash/_strictIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_stringToArray.js.map +1 -1
- package/dist/node_modules/lodash/_stringToPath.js.map +1 -1
- package/dist/node_modules/lodash/_toKey.js.map +1 -1
- package/dist/node_modules/lodash/_toSource.js.map +1 -1
- package/dist/node_modules/lodash/_trimmedEndIndex.js.map +1 -1
- package/dist/node_modules/lodash/_unicodeToArray.js.map +1 -1
- package/dist/node_modules/lodash/constant.js.map +1 -1
- package/dist/node_modules/lodash/debounce.js.map +1 -1
- package/dist/node_modules/lodash/eq.js.map +1 -1
- package/dist/node_modules/lodash/every.js.map +1 -1
- package/dist/node_modules/lodash/find.js.map +1 -1
- package/dist/node_modules/lodash/findIndex.js.map +1 -1
- package/dist/node_modules/lodash/flatMap.js.map +1 -1
- package/dist/node_modules/lodash/get.js.map +1 -1
- package/dist/node_modules/lodash/hasIn.js.map +1 -1
- package/dist/node_modules/lodash/identity.js.map +1 -1
- package/dist/node_modules/lodash/isArguments.js.map +1 -1
- package/dist/node_modules/lodash/isArray.js.map +1 -1
- package/dist/node_modules/lodash/isArrayLike.js.map +1 -1
- package/dist/node_modules/lodash/isBoolean.js.map +1 -1
- package/dist/node_modules/lodash/isBuffer.js.map +1 -1
- package/dist/node_modules/lodash/isEqual.js.map +1 -1
- package/dist/node_modules/lodash/isFunction.js.map +1 -1
- package/dist/node_modules/lodash/isLength.js.map +1 -1
- package/dist/node_modules/lodash/isNaN.js.map +1 -1
- package/dist/node_modules/lodash/isNil.js.map +1 -1
- package/dist/node_modules/lodash/isNumber.js.map +1 -1
- package/dist/node_modules/lodash/isObject.js.map +1 -1
- package/dist/node_modules/lodash/isObjectLike.js.map +1 -1
- package/dist/node_modules/lodash/isPlainObject.js.map +1 -1
- package/dist/node_modules/lodash/isString.js.map +1 -1
- package/dist/node_modules/lodash/isSymbol.js.map +1 -1
- package/dist/node_modules/lodash/isTypedArray.js.map +1 -1
- package/dist/node_modules/lodash/keys.js.map +1 -1
- package/dist/node_modules/lodash/last.js.map +1 -1
- package/dist/node_modules/lodash/map.js.map +1 -1
- package/dist/node_modules/lodash/mapValues.js.map +1 -1
- package/dist/node_modules/lodash/max.js.map +1 -1
- package/dist/node_modules/lodash/maxBy.js.map +1 -1
- package/dist/node_modules/lodash/memoize.js.map +1 -1
- package/dist/node_modules/lodash/min.js.map +1 -1
- package/dist/node_modules/lodash/minBy.js.map +1 -1
- package/dist/node_modules/lodash/noop.js.map +1 -1
- package/dist/node_modules/lodash/now.js.map +1 -1
- package/dist/node_modules/lodash/property.js.map +1 -1
- package/dist/node_modules/lodash/range.js.map +1 -1
- package/dist/node_modules/lodash/some.js.map +1 -1
- package/dist/node_modules/lodash/sortBy.js.map +1 -1
- package/dist/node_modules/lodash/stubArray.js.map +1 -1
- package/dist/node_modules/lodash/stubFalse.js.map +1 -1
- package/dist/node_modules/lodash/throttle.js.map +1 -1
- package/dist/node_modules/lodash/toFinite.js.map +1 -1
- package/dist/node_modules/lodash/toInteger.js.map +1 -1
- package/dist/node_modules/lodash/toNumber.js.map +1 -1
- package/dist/node_modules/lodash/toString.js.map +1 -1
- package/dist/node_modules/lodash/uniqBy.js.map +1 -1
- package/dist/node_modules/lodash/upperFirst.js.map +1 -1
- package/dist/node_modules/object-assign/index.js.map +1 -1
- package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -1
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -1
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -1
- package/dist/node_modules/prop-types/index.js.map +1 -1
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -1
- package/dist/node_modules/prop-types/lib/has.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +1 -1
- package/dist/node_modules/qrcode/lib/browser.js.map +1 -1
- package/dist/node_modules/qrcode/lib/can-promise.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/alignment-pattern.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/alphanumeric-data.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/bit-buffer.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/bit-matrix.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/byte-data.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/error-correction-code.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/error-correction-level.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/finder-pattern.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/format-info.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/galois-field.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/kanji-data.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/mask-pattern.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/mode.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/numeric-data.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/polynomial.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/qrcode.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/regex.js +1 -1
- package/dist/node_modules/qrcode/lib/core/regex.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/segments.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/utils.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/version-check.js.map +1 -1
- package/dist/node_modules/qrcode/lib/core/version.js.map +1 -1
- package/dist/node_modules/qrcode/lib/renderer/canvas.js.map +1 -1
- package/dist/node_modules/qrcode/lib/renderer/svg-tag.js.map +1 -1
- package/dist/node_modules/qrcode/lib/renderer/utils.js.map +1 -1
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -1
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
- package/dist/node_modules/react-is/index.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/Animate.js +2 -2
- package/dist/node_modules/react-smooth/es6/Animate.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/configUpdate.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/easing.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/util.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Area.js +13 -13
- package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Bar.js +9 -9
- package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Brush.js +12 -12
- package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +7 -7
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +13 -13
- package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +4 -4
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Line.js +10 -10
- package/dist/node_modules/recharts/es6/cartesian/Line.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +4 -4
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +1 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/AreaChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/BarChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/LineChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/PieChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/RadialBarChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +22 -22
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Cell.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js +1 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +11 -11
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +6 -6
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Label.js +14 -14
- package/dist/node_modules/recharts/es6/component/Label.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/LabelList.js +6 -6
- package/dist/node_modules/recharts/es6/component/LabelList.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Legend.js +5 -5
- package/dist/node_modules/recharts/es6/component/Legend.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +3 -3
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Text.js +2 -2
- package/dist/node_modules/recharts/es6/component/Text.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Tooltip.js +3 -3
- package/dist/node_modules/recharts/es6/component/Tooltip.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +2 -2
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +1 -1
- package/dist/node_modules/recharts/es6/container/Layer.js +2 -2
- package/dist/node_modules/recharts/es6/container/Layer.js.map +1 -1
- package/dist/node_modules/recharts/es6/container/Surface.js +2 -2
- package/dist/node_modules/recharts/es6/container/Surface.js.map +1 -1
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +2 -2
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/Pie.js +13 -13
- package/dist/node_modules/recharts/es6/polar/Pie.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js +8 -8
- package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js +6 -6
- package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/RadialBar.js +6 -6
- package/dist/node_modules/recharts/es6/polar/RadialBar.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Polygon.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Polygon.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Rectangle.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +9 -9
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DataUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/Events.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/Global.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/LogUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/PolarUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/RadialBarUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/RadialBarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +1 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/TickUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/types.js +1 -1
- package/dist/node_modules/recharts/es6/util/types.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/util/utils.js.map +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
- package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +1 -1
- package/dist/services/createSandboxAssistantTransport.js.map +1 -1
- package/dist/utils/pageContext.js.map +1 -1
- package/package.json +4 -4
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -23527
- package/dist/generated/global-types.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetCreatePage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCreatePage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n formatAssetCategory,\n useAssetCategoryPresentation,\n useAssetMoney,\n useHiddenCategoryIds,\n} from '../providers/AssetHandlerProvider';\nimport { useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport {\n Button,\n GlassCard,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n GradientText,\n PagePurpose,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Loader2, Save, X, TrendingDown, Info } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { notify } from '../utils/toast';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { ChartCard, TrendChart } from '../components';\nimport { METER_UNIT_OPTIONS, meterReadingLabel } from '../utils/meter';\nimport { useCopy } from '../hooks/useCopy';\n\nconst CREATE_ASSET_MUTATION = gql`\n mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {\n createAsset(input: $input) {\n id\n assetNumber\n name\n }\n }\n`;\n\nconst BASE_CATEGORY_OPTIONS = [\n 'electronics',\n 'it_hardware',\n 'furniture',\n 'vehicles',\n 'equipment',\n 'software',\n 'networking',\n 'servers',\n];\n\ninterface FormState {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n assetNumber: string;\n locationName: string;\n assignedTo: string;\n purchaseValue: string;\n purchaseDate: string;\n usefulLifeMonths: string;\n salvageValue: string;\n depreciationMethod: string;\n unitsOfProductionCapacity: string;\n unitsProduced: string;\n meterUnit: string;\n warrantyExpiry: string;\n supplier: string;\n department: string;\n}\n\nconst INITIAL_FORM: FormState = {\n name: '',\n description: '',\n category: 'it_hardware',\n status: 'ACTIVE',\n condition: 'GOOD',\n serialNumber: '',\n assetNumber: '',\n locationName: '',\n assignedTo: '',\n purchaseValue: '',\n purchaseDate: '',\n usefulLifeMonths: '',\n salvageValue: '',\n depreciationMethod: 'STRAIGHT_LINE',\n unitsOfProductionCapacity: '',\n unitsProduced: '',\n meterUnit: '',\n warrantyExpiry: '',\n supplier: '',\n department: '',\n};\n\n// Pure derivation of a book-value schedule from the user's own inputs. Returns\n// an empty array when the essentials are missing — never fabricates a curve.\n// Mirrors wspace-assethandler-svc's computeDepreciation formulas per method\n// (annualized here for a compact preview chart; the server computes the\n// authoritative month-granular currentValue/accumulatedDepreciation).\nfunction buildDepreciationSeries(input: {\n purchaseValue: number | null;\n salvageValue: number | null;\n usefulLifeMonths: number | null;\n method: string;\n unitsOfProductionCapacity: number | null;\n unitsProduced: number | null;\n}): { year: number; bookValue: number }[] {\n const pv = input.purchaseValue;\n const life = input.usefulLifeMonths;\n if (!pv || pv <= 0 || !life || life <= 0) return [];\n const salvage = Math.max(0, Math.min(input.salvageValue ?? 0, pv));\n const method = input.method.toLowerCase();\n const years = Math.max(1, Math.round(life / 12));\n\n if (method === 'units_of_production') {\n const capacity = input.unitsOfProductionCapacity;\n const produced = Math.max(0, input.unitsProduced ?? 0);\n if (!capacity || capacity <= 0) return [];\n // Straight-line-by-usage preview: assumes even production across the\n // asset's life up to the units produced so far, then flat afterward.\n const bvAtProduced = Math.max(\n pv - (pv - salvage) * (Math.min(produced, capacity) / capacity),\n salvage\n );\n return [\n { year: 0, bookValue: Math.round(pv) },\n { year: years, bookValue: Math.round(bvAtProduced) },\n ];\n }\n\n const points: { year: number; bookValue: number }[] = [];\n for (let y = 0; y <= years; y += 1) {\n let bv: number;\n if (method === 'reducing_balance') {\n const rate = salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.9, 2 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'declining_balance') {\n const rate =\n salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.75, 1.5 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'sum_of_years_digits') {\n const syd = (years * (years + 1)) / 2;\n const cumulative = syd > 0 ? (pv - salvage) * ((y * years - (y * (y - 1)) / 2) / syd) : 0;\n bv = Math.max(pv - cumulative, salvage);\n } else if (method === 'none') {\n bv = pv;\n } else {\n bv = Math.max(pv - (pv - salvage) * (y / years), salvage);\n }\n points.push({ year: y, bookValue: Math.round(bv) });\n }\n return points;\n}\n\nconst SectionCard = ({\n title,\n description,\n children,\n glow,\n}: {\n title: string;\n description?: string;\n children: React.ReactNode;\n glow?: boolean;\n}) => (\n <GlassCard treatment=\"glass\" glow={glow} className=\"border-border-seam\">\n <div className=\"space-y-4 p-5 sm:p-6\">\n <div>\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n {description ? <p className=\"mt-0.5 text-sm text-text-secondary\">{description}</p> : null}\n </div>\n {children}\n </div>\n </GlassCard>\n);\n\nexport function AssetsAssetCreatePage() {\n const tc = useCopy();\n const navigate = useAssetHandlerNavigate();\n const { symbol: currencySymbolGlyph, compact: moneyCompact } = useAssetMoney();\n const hiddenCategories = useHiddenCategoryIds();\n const { labels: categoryLabels, options: configuredCategoryOptions } =\n useAssetCategoryPresentation();\n const { assets } = useAssetHandlerStore();\n const [formData, setFormData] = useState<FormState>(INITIAL_FORM);\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submitMode, setSubmitMode] = useState<'create' | 'add' | null>(null);\n const addAnotherRef = useRef(false);\n\n const categoryOptions = useMemo(() => {\n const set = new Set<string>(\n configuredCategoryOptions?.map((category) => category.id) ?? BASE_CATEGORY_OPTIONS\n );\n if (!configuredCategoryOptions) {\n for (const a of assets) if (a.category) set.add(a.category);\n }\n return [...set].filter((c) => !hiddenCategories.has(c)).sort();\n }, [assets, configuredCategoryOptions, hiddenCategories]);\n\n const [createAsset, { loading: creating }] = useMutation<{\n createAsset: { id: string; assetNumber: string; name: string };\n }>(CREATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success(\n tc('assethandler.assets.create.toast.title', '{{asset}} created'),\n tc('assethandler.assets.create.toast.body', '{{name}} was registered in the inventory.', {\n name: data.createAsset.name,\n })\n );\n setSubmitMode(null);\n if (addAnotherRef.current) {\n addAnotherRef.current = false;\n setFormData(INITIAL_FORM);\n setTags([]);\n setTagInput('');\n setErrors({});\n if (typeof window !== 'undefined') window.scrollTo({ top: 0, behavior: 'smooth' });\n } else {\n navigate(`/assets/${data.createAsset.id}`);\n }\n },\n onError: (error) => {\n setSubmitMode(null);\n notify.error('Could not create asset', error.message);\n },\n });\n\n const handleChange = (field: keyof FormState, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n setErrors((prev) => {\n if (!prev[field]) return prev;\n const next = { ...prev };\n delete next[field];\n return next;\n });\n };\n\n const commitTag = () => {\n const value = tagInput.trim().replace(/,$/, '').trim();\n if (value && !tags.includes(value)) setTags((prev) => [...prev, value]);\n setTagInput('');\n };\n const onTagKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n commitTag();\n } else if (e.key === 'Backspace' && tagInput === '' && tags.length > 0) {\n setTags((prev) => prev.slice(0, -1));\n }\n };\n\n const depreciationPreview = useMemo(\n () =>\n buildDepreciationSeries({\n purchaseValue: formData.purchaseValue.trim() ? Number(formData.purchaseValue) : null,\n salvageValue: formData.salvageValue.trim() ? Number(formData.salvageValue) : null,\n usefulLifeMonths: formData.usefulLifeMonths.trim()\n ? Number(formData.usefulLifeMonths)\n : null,\n method: formData.depreciationMethod,\n unitsOfProductionCapacity: formData.unitsOfProductionCapacity.trim()\n ? Number(formData.unitsOfProductionCapacity)\n : null,\n unitsProduced: formData.unitsProduced.trim() ? Number(formData.unitsProduced) : null,\n }),\n [\n formData.purchaseValue,\n formData.salvageValue,\n formData.usefulLifeMonths,\n formData.depreciationMethod,\n formData.unitsOfProductionCapacity,\n formData.unitsProduced,\n ]\n );\n\n const submit = (addAnother: boolean) => {\n const nextErrors: Record<string, string> = {};\n if (!formData.name.trim()) nextErrors.name = 'Asset name is required';\n if (!formData.assetNumber.trim()) nextErrors.assetNumber = 'Asset tag is required';\n if (!formData.category.trim()) nextErrors.category = 'Category is required';\n\n const numericField = (value: string, label: string, key: string) => {\n if (value.trim() === '') return;\n const parsed = Number(value);\n if (Number.isNaN(parsed) || parsed < 0)\n nextErrors[key] = `${label} must be a positive number`;\n };\n numericField(formData.purchaseValue, 'Purchase value', 'purchaseValue');\n numericField(formData.salvageValue, 'Salvage value', 'salvageValue');\n numericField(formData.usefulLifeMonths, 'Useful life', 'usefulLifeMonths');\n\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n notify.warning('Missing required fields', 'Fill in the highlighted fields and try again.');\n return;\n }\n\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n const optionalDate = (value: string): string | null =>\n value.trim() === '' ? null : new Date(value).toISOString();\n\n addAnotherRef.current = addAnother;\n setSubmitMode(addAnother ? 'add' : 'create');\n void createAsset({\n variables: {\n input: {\n name: formData.name.trim(),\n assetNumber: formData.assetNumber.trim(),\n category: formData.category,\n status: formData.status,\n condition: formData.condition,\n description: formData.description.trim() || null,\n serialNumber: formData.serialNumber.trim() || null,\n locationName: formData.locationName.trim() || null,\n assignedTo: formData.assignedTo.trim() || null,\n tags,\n purchaseValue: optionalNumber(formData.purchaseValue),\n purchaseDate: optionalDate(formData.purchaseDate),\n usefulLifeMonths: optionalNumber(formData.usefulLifeMonths),\n salvageValue: optionalNumber(formData.salvageValue),\n depreciationMethod: formData.depreciationMethod,\n unitsOfProductionCapacity: optionalNumber(formData.unitsOfProductionCapacity),\n unitsProduced: optionalNumber(formData.unitsProduced),\n meterUnit: formData.meterUnit || null,\n warrantyExpiry: optionalDate(formData.warrantyExpiry),\n supplier: formData.supplier.trim() || null,\n department: formData.department.trim() || null,\n },\n },\n });\n };\n\n return (\n <div className=\"mx-auto max-w-4xl space-y-6 p-4 pb-28 sm:p-6 sm:pb-28\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n className=\"w-fit\"\n onClick={() => navigate('/assets/asset-list')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>\n {tc('assethandler.assets.create.title', 'Create New {{asset}}')}\n </GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {tc(\n 'assethandler.assets.create.subtitle',\n 'Register a new {{assetLower}} in the inventory'\n )}{' '}\n · <span className=\"text-status-error-text\">*</span> required\n </p>\n </div>\n </div>\n\n <PagePurpose>\n {tc(\n 'assethandler.assets.create.purpose',\n 'Register a new {{assetLower}} so it can be tracked, maintained and assigned from day one. Capture its identity, category and condition, then its financials and location — the more you fill in now, the better your reports and audits later.'\n )}\n </PagePurpose>\n\n {/* General Information */}\n <SectionCard\n title=\"General Information\"\n description={tc(\n 'assethandler.assets.create.general.description',\n 'Basic {{assetLower}} details and identification'\n )}\n glow\n >\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>\n {tc('assethandler.assets.create.field.name', '{{asset}} Name')}{' '}\n <span className=\"text-status-error-text\">*</span>\n </Label>\n <Input\n placeholder={tc(\n 'assethandler.assets.create.field.namePlaceholder',\n 'e.g., Dell OptiPlex 7090'\n )}\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n aria-invalid={!!errors.name}\n />\n {errors.name ? <p className=\"text-xs text-status-error-text\">{errors.name}</p> : null}\n </div>\n <div className=\"space-y-2\">\n <Label>\n {tc('assethandler.assets.create.field.tag', '{{asset}} Tag')}{' '}\n <span className=\"text-status-error-text\">*</span>\n </Label>\n <Input\n placeholder={tc('assethandler.assets.create.field.tagPlaceholder', 'e.g., IT-HW-001')}\n value={formData.assetNumber}\n onChange={(e) => handleChange('assetNumber', e.target.value)}\n aria-invalid={!!errors.assetNumber}\n />\n {errors.assetNumber ? (\n <p className=\"text-xs text-status-error-text\">{errors.assetNumber}</p>\n ) : null}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder={tc(\n 'assethandler.assets.create.field.descriptionPlaceholder',\n 'Brief description of the {{assetLower}}...'\n )}\n value={formData.description}\n onChange={(e) => handleChange('description', e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>\n Category <span className=\"text-status-error-text\">*</span>\n </Label>\n <Select value={formData.category} onValueChange={(v) => handleChange('category', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {categoryOptions.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {configuredCategoryOptions?.find((option) => option.id === category)?.label ??\n formatAssetCategory(category, categoryLabels)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={formData.status} onValueChange={(v) => handleChange('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select value={formData.condition} onValueChange={(v) => handleChange('condition', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n placeholder=\"e.g., DELL-7090-X1A2B3\"\n value={formData.serialNumber}\n onChange={(e) => handleChange('serialNumber', e.target.value)}\n />\n </div>\n </SectionCard>\n\n {/* Financial Details */}\n <SectionCard\n title=\"Financial Details\"\n description=\"Purchase and depreciation data powers book value, TCO and finance reports\"\n >\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-sm text-text-secondary\">\n {currencySymbolGlyph}\n </span>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"1200\"\n className=\"pl-7\"\n value={formData.purchaseValue}\n onChange={(e) => handleChange('purchaseValue', e.target.value)}\n aria-invalid={!!errors.purchaseValue}\n />\n </div>\n {errors.purchaseValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.purchaseValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Purchase Date</Label>\n <Input\n type=\"date\"\n value={formData.purchaseDate}\n onChange={(e) => handleChange('purchaseDate', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n placeholder=\"e.g., Dell Technologies\"\n value={formData.supplier}\n onChange={(e) => handleChange('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Useful Life</Label>\n <div className=\"relative\">\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"60\"\n className=\"pr-16\"\n value={formData.usefulLifeMonths}\n onChange={(e) => handleChange('usefulLifeMonths', e.target.value)}\n aria-invalid={!!errors.usefulLifeMonths}\n />\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm text-text-secondary\">\n months\n </span>\n </div>\n {errors.usefulLifeMonths ? (\n <p className=\"text-xs text-status-error-text\">{errors.usefulLifeMonths}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-sm text-text-secondary\">\n {currencySymbolGlyph}\n </span>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"100\"\n className=\"pl-7\"\n value={formData.salvageValue}\n onChange={(e) => handleChange('salvageValue', e.target.value)}\n aria-invalid={!!errors.salvageValue}\n />\n </div>\n {errors.salvageValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.salvageValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation Method</Label>\n <Select\n value={formData.depreciationMethod}\n onValueChange={(v) => handleChange('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance (200%)</SelectItem>\n <SelectItem value=\"DECLINING_BALANCE\">Declining balance (150%)</SelectItem>\n <SelectItem value=\"SUM_OF_YEARS_DIGITS\">Sum of years' digits</SelectItem>\n <SelectItem value=\"UNITS_OF_PRODUCTION\">Units of production</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n {/*\n Lifetime Capacity is a depreciation input and stays gated on the method that\n uses it. The METER does not: `unitsProduced` is also what a maintenance plan's\n intervalMeter counts against, so gating it meant a straight-line tractor had\n nowhere to record engine hours and its meter plans could never come due\n (BOFF-6032).\n */}\n {formData.depreciationMethod === 'UNITS_OF_PRODUCTION' ? (\n <div className=\"space-y-2\">\n <Label>Lifetime Capacity (units)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"e.g., 100000 (miles, hours, cycles…)\"\n value={formData.unitsOfProductionCapacity}\n onChange={(e) => handleChange('unitsOfProductionCapacity', e.target.value)}\n />\n </div>\n ) : null}\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Meter unit</Label>\n <Select\n value={formData.meterUnit}\n onValueChange={(value) => handleChange('meterUnit', value)}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Not metered\" />\n </SelectTrigger>\n <SelectContent>\n {METER_UNIT_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>{meterReadingLabel(formData.meterUnit)}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n value={formData.unitsProduced}\n onChange={(e) => handleChange('unitsProduced', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Warranty Expiry</Label>\n <Input\n type=\"date\"\n value={formData.warrantyExpiry}\n onChange={(e) => handleChange('warrantyExpiry', e.target.value)}\n />\n </div>\n\n {/* Live depreciation preview */}\n <ChartCard\n title=\"Depreciation preview\"\n subtitle={tc(\n 'assethandler.assets.create.depreciation.subtitle',\n \"Projected book value over the {{assetLower}}'s useful life\"\n )}\n icon={TrendingDown}\n >\n {depreciationPreview.length > 0 ? (\n <TrendChart\n data={depreciationPreview}\n xKey=\"year\"\n height={240}\n valueFormat={moneyCompact}\n xTickFormat={(v) => `${v}y`}\n series={[{ key: 'bookValue', label: 'Book value' }]}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 py-10 text-center text-sm text-text-secondary\">\n <Info className=\"h-5 w-5 text-text-muted\" />\n Enter a purchase value and useful life to preview the depreciation schedule.\n </div>\n )}\n </ChartCard>\n </SectionCard>\n\n {/* Assignment & Location */}\n <SectionCard title=\"Assignment & Location\" description=\"Who holds it and where it lives\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n placeholder=\"e.g., john.smith@company.com\"\n value={formData.assignedTo}\n onChange={(e) => handleChange('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n placeholder=\"e.g., Building A, Floor 3, Desk 15\"\n value={formData.locationName}\n onChange={(e) => handleChange('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n placeholder=\"e.g., Engineering\"\n value={formData.department}\n onChange={(e) => handleChange('department', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Tags</Label>\n <div className=\"flex flex-wrap items-center gap-1.5 rounded-md border border-border-strong bg-bg-surface px-2 py-1.5 focus-within:border-action-primary-bg\">\n {tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"gap-1\">\n {tag}\n <button\n type=\"button\"\n aria-label={`Remove ${tag}`}\n onClick={() => setTags((prev) => prev.filter((x) => x !== tag))}\n className=\"text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n <input\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n onKeyDown={onTagKeyDown}\n onBlur={commitTag}\n placeholder={tags.length === 0 ? 'Type a tag and press Enter' : ''}\n className=\"min-w-[8rem] flex-1 border-0 bg-transparent text-sm outline-none placeholder:text-text-secondary\"\n />\n </div>\n </div>\n </div>\n </SectionCard>\n\n {/* Sticky action bar */}\n <div className=\"sticky bottom-0 -mx-4 mt-6 border-t border-border-seam bg-bg-surface/95 px-4 py-3 backdrop-blur sm:-mx-6 sm:px-6\">\n <div className=\"mx-auto flex max-w-4xl flex-col gap-2 sm:flex-row sm:justify-end\">\n <Button\n variant=\"outline\"\n className=\"w-full sm:w-auto\"\n onClick={() => navigate('/assets/asset-list')}\n disabled={creating}\n >\n <X className=\"mr-2 h-4 w-4\" />\n Cancel\n </Button>\n <Button\n variant=\"outline\"\n className=\"w-full sm:w-auto\"\n onClick={() => submit(true)}\n disabled={creating}\n >\n {creating && submitMode === 'add' ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n Save & add another\n </Button>\n <Button className=\"w-full sm:w-auto\" onClick={() => submit(false)} disabled={creating}>\n {creating && submitMode === 'create' ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsAssetCreatePage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCreatePage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n formatAssetCategory,\n useAssetCategoryPresentation,\n useAssetMoney,\n useHiddenCategoryIds,\n} from '../providers/AssetHandlerProvider';\nimport { useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport {\n Button,\n GlassCard,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n GradientText,\n PagePurpose,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Loader2, Save, X, TrendingDown, Info } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { notify } from '../utils/toast';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { ChartCard, TrendChart } from '../components';\nimport { METER_UNIT_OPTIONS, meterReadingLabel } from '../utils/meter';\nimport { useCopy } from '../hooks/useCopy';\n\nconst CREATE_ASSET_MUTATION = gql`\n mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {\n createAsset(input: $input) {\n id\n assetNumber\n name\n }\n }\n`;\n\nconst BASE_CATEGORY_OPTIONS = [\n 'electronics',\n 'it_hardware',\n 'furniture',\n 'vehicles',\n 'equipment',\n 'software',\n 'networking',\n 'servers',\n];\n\ninterface FormState {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n assetNumber: string;\n locationName: string;\n assignedTo: string;\n purchaseValue: string;\n purchaseDate: string;\n usefulLifeMonths: string;\n salvageValue: string;\n depreciationMethod: string;\n unitsOfProductionCapacity: string;\n unitsProduced: string;\n meterUnit: string;\n warrantyExpiry: string;\n supplier: string;\n department: string;\n}\n\nconst INITIAL_FORM: FormState = {\n name: '',\n description: '',\n category: 'it_hardware',\n status: 'ACTIVE',\n condition: 'GOOD',\n serialNumber: '',\n assetNumber: '',\n locationName: '',\n assignedTo: '',\n purchaseValue: '',\n purchaseDate: '',\n usefulLifeMonths: '',\n salvageValue: '',\n depreciationMethod: 'STRAIGHT_LINE',\n unitsOfProductionCapacity: '',\n unitsProduced: '',\n meterUnit: '',\n warrantyExpiry: '',\n supplier: '',\n department: '',\n};\n\n// Pure derivation of a book-value schedule from the user's own inputs. Returns\n// an empty array when the essentials are missing — never fabricates a curve.\n// Mirrors wspace-assethandler-svc's computeDepreciation formulas per method\n// (annualized here for a compact preview chart; the server computes the\n// authoritative month-granular currentValue/accumulatedDepreciation).\nfunction buildDepreciationSeries(input: {\n purchaseValue: number | null;\n salvageValue: number | null;\n usefulLifeMonths: number | null;\n method: string;\n unitsOfProductionCapacity: number | null;\n unitsProduced: number | null;\n}): { year: number; bookValue: number }[] {\n const pv = input.purchaseValue;\n const life = input.usefulLifeMonths;\n if (!pv || pv <= 0 || !life || life <= 0) return [];\n const salvage = Math.max(0, Math.min(input.salvageValue ?? 0, pv));\n const method = input.method.toLowerCase();\n const years = Math.max(1, Math.round(life / 12));\n\n if (method === 'units_of_production') {\n const capacity = input.unitsOfProductionCapacity;\n const produced = Math.max(0, input.unitsProduced ?? 0);\n if (!capacity || capacity <= 0) return [];\n // Straight-line-by-usage preview: assumes even production across the\n // asset's life up to the units produced so far, then flat afterward.\n const bvAtProduced = Math.max(\n pv - (pv - salvage) * (Math.min(produced, capacity) / capacity),\n salvage\n );\n return [\n { year: 0, bookValue: Math.round(pv) },\n { year: years, bookValue: Math.round(bvAtProduced) },\n ];\n }\n\n const points: { year: number; bookValue: number }[] = [];\n for (let y = 0; y <= years; y += 1) {\n let bv: number;\n if (method === 'reducing_balance') {\n const rate = salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.9, 2 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'declining_balance') {\n const rate =\n salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.75, 1.5 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'sum_of_years_digits') {\n const syd = (years * (years + 1)) / 2;\n const cumulative = syd > 0 ? (pv - salvage) * ((y * years - (y * (y - 1)) / 2) / syd) : 0;\n bv = Math.max(pv - cumulative, salvage);\n } else if (method === 'none') {\n bv = pv;\n } else {\n bv = Math.max(pv - (pv - salvage) * (y / years), salvage);\n }\n points.push({ year: y, bookValue: Math.round(bv) });\n }\n return points;\n}\n\nconst SectionCard = ({\n title,\n description,\n children,\n glow,\n}: {\n title: string;\n description?: string;\n children: React.ReactNode;\n glow?: boolean;\n}) => (\n <GlassCard treatment=\"glass\" glow={glow} className=\"border-border-seam\">\n <div className=\"space-y-4 p-5 sm:p-6\">\n <div>\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n {description ? <p className=\"mt-0.5 text-sm text-text-secondary\">{description}</p> : null}\n </div>\n {children}\n </div>\n </GlassCard>\n);\n\nexport function AssetsAssetCreatePage() {\n const tc = useCopy();\n const navigate = useAssetHandlerNavigate();\n const { symbol: currencySymbolGlyph, compact: moneyCompact } = useAssetMoney();\n const hiddenCategories = useHiddenCategoryIds();\n const { labels: categoryLabels, options: configuredCategoryOptions } =\n useAssetCategoryPresentation();\n const { assets } = useAssetHandlerStore();\n const [formData, setFormData] = useState<FormState>(INITIAL_FORM);\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submitMode, setSubmitMode] = useState<'create' | 'add' | null>(null);\n const addAnotherRef = useRef(false);\n\n const categoryOptions = useMemo(() => {\n const set = new Set<string>(\n configuredCategoryOptions?.map((category) => category.id) ?? BASE_CATEGORY_OPTIONS\n );\n if (!configuredCategoryOptions) {\n for (const a of assets) if (a.category) set.add(a.category);\n }\n return [...set].filter((c) => !hiddenCategories.has(c)).sort();\n }, [assets, configuredCategoryOptions, hiddenCategories]);\n\n const [createAsset, { loading: creating }] = useMutation<{\n createAsset: { id: string; assetNumber: string; name: string };\n }>(CREATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success(\n tc('assethandler.assets.create.toast.title', '{{asset}} created'),\n tc('assethandler.assets.create.toast.body', '{{name}} was registered in the inventory.', {\n name: data.createAsset.name,\n })\n );\n setSubmitMode(null);\n if (addAnotherRef.current) {\n addAnotherRef.current = false;\n setFormData(INITIAL_FORM);\n setTags([]);\n setTagInput('');\n setErrors({});\n if (typeof window !== 'undefined') window.scrollTo({ top: 0, behavior: 'smooth' });\n } else {\n navigate(`/assets/${data.createAsset.id}`);\n }\n },\n onError: (error) => {\n setSubmitMode(null);\n notify.error('Could not create asset', error.message);\n },\n });\n\n const handleChange = (field: keyof FormState, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n setErrors((prev) => {\n if (!prev[field]) return prev;\n const next = { ...prev };\n delete next[field];\n return next;\n });\n };\n\n const commitTag = () => {\n const value = tagInput.trim().replace(/,$/, '').trim();\n if (value && !tags.includes(value)) setTags((prev) => [...prev, value]);\n setTagInput('');\n };\n const onTagKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n commitTag();\n } else if (e.key === 'Backspace' && tagInput === '' && tags.length > 0) {\n setTags((prev) => prev.slice(0, -1));\n }\n };\n\n const depreciationPreview = useMemo(\n () =>\n buildDepreciationSeries({\n purchaseValue: formData.purchaseValue.trim() ? Number(formData.purchaseValue) : null,\n salvageValue: formData.salvageValue.trim() ? Number(formData.salvageValue) : null,\n usefulLifeMonths: formData.usefulLifeMonths.trim()\n ? Number(formData.usefulLifeMonths)\n : null,\n method: formData.depreciationMethod,\n unitsOfProductionCapacity: formData.unitsOfProductionCapacity.trim()\n ? Number(formData.unitsOfProductionCapacity)\n : null,\n unitsProduced: formData.unitsProduced.trim() ? Number(formData.unitsProduced) : null,\n }),\n [\n formData.purchaseValue,\n formData.salvageValue,\n formData.usefulLifeMonths,\n formData.depreciationMethod,\n formData.unitsOfProductionCapacity,\n formData.unitsProduced,\n ]\n );\n\n const submit = (addAnother: boolean) => {\n const nextErrors: Record<string, string> = {};\n if (!formData.name.trim()) nextErrors.name = 'Asset name is required';\n if (!formData.assetNumber.trim()) nextErrors.assetNumber = 'Asset tag is required';\n if (!formData.category.trim()) nextErrors.category = 'Category is required';\n\n const numericField = (value: string, label: string, key: string) => {\n if (value.trim() === '') return;\n const parsed = Number(value);\n if (Number.isNaN(parsed) || parsed < 0)\n nextErrors[key] = `${label} must be a positive number`;\n };\n numericField(formData.purchaseValue, 'Purchase value', 'purchaseValue');\n numericField(formData.salvageValue, 'Salvage value', 'salvageValue');\n numericField(formData.usefulLifeMonths, 'Useful life', 'usefulLifeMonths');\n\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n notify.warning('Missing required fields', 'Fill in the highlighted fields and try again.');\n return;\n }\n\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n const optionalDate = (value: string): string | null =>\n value.trim() === '' ? null : new Date(value).toISOString();\n\n addAnotherRef.current = addAnother;\n setSubmitMode(addAnother ? 'add' : 'create');\n void createAsset({\n variables: {\n input: {\n name: formData.name.trim(),\n assetNumber: formData.assetNumber.trim(),\n category: formData.category,\n status: formData.status,\n condition: formData.condition,\n description: formData.description.trim() || null,\n serialNumber: formData.serialNumber.trim() || null,\n locationName: formData.locationName.trim() || null,\n assignedTo: formData.assignedTo.trim() || null,\n tags,\n purchaseValue: optionalNumber(formData.purchaseValue),\n purchaseDate: optionalDate(formData.purchaseDate),\n usefulLifeMonths: optionalNumber(formData.usefulLifeMonths),\n salvageValue: optionalNumber(formData.salvageValue),\n depreciationMethod: formData.depreciationMethod,\n unitsOfProductionCapacity: optionalNumber(formData.unitsOfProductionCapacity),\n unitsProduced: optionalNumber(formData.unitsProduced),\n meterUnit: formData.meterUnit || null,\n warrantyExpiry: optionalDate(formData.warrantyExpiry),\n supplier: formData.supplier.trim() || null,\n department: formData.department.trim() || null,\n },\n },\n });\n };\n\n return (\n <div className=\"mx-auto max-w-4xl space-y-6 p-4 pb-28 sm:p-6 sm:pb-28\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n className=\"w-fit\"\n onClick={() => navigate('/assets/asset-list')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>\n {tc('assethandler.assets.create.title', 'Create New {{asset}}')}\n </GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {tc(\n 'assethandler.assets.create.subtitle',\n 'Register a new {{assetLower}} in the inventory'\n )}{' '}\n · <span className=\"text-status-error-text\">*</span> required\n </p>\n </div>\n </div>\n\n <PagePurpose>\n {tc(\n 'assethandler.assets.create.purpose',\n 'Register a new {{assetLower}} so it can be tracked, maintained and assigned from day one. Capture its identity, category and condition, then its financials and location — the more you fill in now, the better your reports and audits later.'\n )}\n </PagePurpose>\n\n {/* General Information */}\n <SectionCard\n title=\"General Information\"\n description={tc(\n 'assethandler.assets.create.general.description',\n 'Basic {{assetLower}} details and identification'\n )}\n glow\n >\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>\n {tc('assethandler.assets.create.field.name', '{{asset}} Name')}{' '}\n <span className=\"text-status-error-text\">*</span>\n </Label>\n <Input\n placeholder={tc(\n 'assethandler.assets.create.field.namePlaceholder',\n 'e.g., Dell OptiPlex 7090'\n )}\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n aria-invalid={!!errors.name}\n />\n {errors.name ? <p className=\"text-xs text-status-error-text\">{errors.name}</p> : null}\n </div>\n <div className=\"space-y-2\">\n <Label>\n {tc('assethandler.assets.create.field.tag', '{{asset}} Tag')}{' '}\n <span className=\"text-status-error-text\">*</span>\n </Label>\n <Input\n placeholder={tc('assethandler.assets.create.field.tagPlaceholder', 'e.g., IT-HW-001')}\n value={formData.assetNumber}\n onChange={(e) => handleChange('assetNumber', e.target.value)}\n aria-invalid={!!errors.assetNumber}\n />\n {errors.assetNumber ? (\n <p className=\"text-xs text-status-error-text\">{errors.assetNumber}</p>\n ) : null}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder={tc(\n 'assethandler.assets.create.field.descriptionPlaceholder',\n 'Brief description of the {{assetLower}}...'\n )}\n value={formData.description}\n onChange={(e) => handleChange('description', e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>\n Category <span className=\"text-status-error-text\">*</span>\n </Label>\n <Select value={formData.category} onValueChange={(v) => handleChange('category', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {categoryOptions.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {configuredCategoryOptions?.find((option) => option.id === category)?.label ??\n formatAssetCategory(category, categoryLabels)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={formData.status} onValueChange={(v) => handleChange('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select value={formData.condition} onValueChange={(v) => handleChange('condition', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n placeholder=\"e.g., DELL-7090-X1A2B3\"\n value={formData.serialNumber}\n onChange={(e) => handleChange('serialNumber', e.target.value)}\n />\n </div>\n </SectionCard>\n\n {/* Financial Details */}\n <SectionCard\n title=\"Financial Details\"\n description=\"Purchase and depreciation data powers book value, TCO and finance reports\"\n >\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-sm text-text-secondary\">\n {currencySymbolGlyph}\n </span>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"1200\"\n className=\"pl-7\"\n value={formData.purchaseValue}\n onChange={(e) => handleChange('purchaseValue', e.target.value)}\n aria-invalid={!!errors.purchaseValue}\n />\n </div>\n {errors.purchaseValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.purchaseValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Purchase Date</Label>\n <Input\n type=\"date\"\n value={formData.purchaseDate}\n onChange={(e) => handleChange('purchaseDate', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n placeholder=\"e.g., Dell Technologies\"\n value={formData.supplier}\n onChange={(e) => handleChange('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Useful Life</Label>\n <div className=\"relative\">\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"60\"\n className=\"pr-16\"\n value={formData.usefulLifeMonths}\n onChange={(e) => handleChange('usefulLifeMonths', e.target.value)}\n aria-invalid={!!errors.usefulLifeMonths}\n />\n <span className=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-sm text-text-secondary\">\n months\n </span>\n </div>\n {errors.usefulLifeMonths ? (\n <p className=\"text-xs text-status-error-text\">{errors.usefulLifeMonths}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-sm text-text-secondary\">\n {currencySymbolGlyph}\n </span>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"100\"\n className=\"pl-7\"\n value={formData.salvageValue}\n onChange={(e) => handleChange('salvageValue', e.target.value)}\n aria-invalid={!!errors.salvageValue}\n />\n </div>\n {errors.salvageValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.salvageValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation Method</Label>\n <Select\n value={formData.depreciationMethod}\n onValueChange={(v) => handleChange('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance (200%)</SelectItem>\n <SelectItem value=\"DECLINING_BALANCE\">Declining balance (150%)</SelectItem>\n <SelectItem value=\"SUM_OF_YEARS_DIGITS\">Sum of years' digits</SelectItem>\n <SelectItem value=\"UNITS_OF_PRODUCTION\">Units of production</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n {/*\n Lifetime Capacity is a depreciation input and stays gated on the method that\n uses it. The METER does not: `unitsProduced` is also what a maintenance plan's\n intervalMeter counts against, so gating it meant a straight-line tractor had\n nowhere to record engine hours and its meter plans could never come due\n (BOFF-6032).\n */}\n {formData.depreciationMethod === 'UNITS_OF_PRODUCTION' ? (\n <div className=\"space-y-2\">\n <Label>Lifetime Capacity (units)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"e.g., 100000 (miles, hours, cycles…)\"\n value={formData.unitsOfProductionCapacity}\n onChange={(e) => handleChange('unitsOfProductionCapacity', e.target.value)}\n />\n </div>\n ) : null}\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Meter unit</Label>\n <Select\n value={formData.meterUnit}\n onValueChange={(value) => handleChange('meterUnit', value)}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Not metered\" />\n </SelectTrigger>\n <SelectContent>\n {METER_UNIT_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>{meterReadingLabel(formData.meterUnit)}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n value={formData.unitsProduced}\n onChange={(e) => handleChange('unitsProduced', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Warranty Expiry</Label>\n <Input\n type=\"date\"\n value={formData.warrantyExpiry}\n onChange={(e) => handleChange('warrantyExpiry', e.target.value)}\n />\n </div>\n\n {/* Live depreciation preview */}\n <ChartCard\n title=\"Depreciation preview\"\n subtitle={tc(\n 'assethandler.assets.create.depreciation.subtitle',\n \"Projected book value over the {{assetLower}}'s useful life\"\n )}\n icon={TrendingDown}\n >\n {depreciationPreview.length > 0 ? (\n <TrendChart\n data={depreciationPreview}\n xKey=\"year\"\n height={240}\n valueFormat={moneyCompact}\n xTickFormat={(v) => `${v}y`}\n series={[{ key: 'bookValue', label: 'Book value' }]}\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2 py-10 text-center text-sm text-text-secondary\">\n <Info className=\"h-5 w-5 text-text-muted\" />\n Enter a purchase value and useful life to preview the depreciation schedule.\n </div>\n )}\n </ChartCard>\n </SectionCard>\n\n {/* Assignment & Location */}\n <SectionCard title=\"Assignment & Location\" description=\"Who holds it and where it lives\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n placeholder=\"e.g., john.smith@company.com\"\n value={formData.assignedTo}\n onChange={(e) => handleChange('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n placeholder=\"e.g., Building A, Floor 3, Desk 15\"\n value={formData.locationName}\n onChange={(e) => handleChange('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n placeholder=\"e.g., Engineering\"\n value={formData.department}\n onChange={(e) => handleChange('department', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Tags</Label>\n <div className=\"flex flex-wrap items-center gap-1.5 rounded-md border border-border-strong bg-bg-surface px-2 py-1.5 focus-within:border-action-primary-bg\">\n {tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"gap-1\">\n {tag}\n <button\n type=\"button\"\n aria-label={`Remove ${tag}`}\n onClick={() => setTags((prev) => prev.filter((x) => x !== tag))}\n className=\"text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n <input\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n onKeyDown={onTagKeyDown}\n onBlur={commitTag}\n placeholder={tags.length === 0 ? 'Type a tag and press Enter' : ''}\n className=\"min-w-[8rem] flex-1 border-0 bg-transparent text-sm outline-none placeholder:text-text-secondary\"\n />\n </div>\n </div>\n </div>\n </SectionCard>\n\n {/* Sticky action bar */}\n <div className=\"sticky bottom-0 -mx-4 mt-6 border-t border-border-seam bg-bg-surface/95 px-4 py-3 backdrop-blur sm:-mx-6 sm:px-6\">\n <div className=\"mx-auto flex max-w-4xl flex-col gap-2 sm:flex-row sm:justify-end\">\n <Button\n variant=\"outline\"\n className=\"w-full sm:w-auto\"\n onClick={() => navigate('/assets/asset-list')}\n disabled={creating}\n >\n <X className=\"mr-2 h-4 w-4\" />\n Cancel\n </Button>\n <Button\n variant=\"outline\"\n className=\"w-full sm:w-auto\"\n onClick={() => submit(true)}\n disabled={creating}\n >\n {creating && submitMode === 'add' ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n Save & add another\n </Button>\n <Button className=\"w-full sm:w-auto\" onClick={() => submit(false)} disabled={creating}>\n {creating && submitMode === 'create' ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { METER_UNIT_OPTIONS, NOT_METERED, meterReadingLabel } from '../utils/meter';\nimport {\n formatAssetCategory,\n useAssetCategoryPresentation,\n useAssetMoney,\n} from '../providers/AssetHandlerProvider';\nimport type React from 'react';\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n MapPin,\n Calendar,\n Tag,\n User,\n Wrench,\n Pencil,\n Trash2,\n Archive,\n DollarSign,\n TrendingDown,\n Hash,\n Building2,\n Truck,\n ShieldCheck,\n Layers,\n Printer,\n} from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { useCopy } from '../hooks/useCopy';\nimport { notify } from '../utils/toast';\nimport { printAssetTag } from '../utils/printAssetTag';\nimport { AttachmentsPanel, CommentsPanel, ActivityTimeline, NotFoundState } from '../components';\nimport { StatTile, ChartCard, TrendChart, BarsChart, DonutChart } from '../components';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n tagId\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n purchaseValue\n purchaseDate\n usefulLifeMonths\n salvageValue\n depreciationMethod\n unitsOfProductionCapacity\n unitsProduced\n meterUnit\n department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n }\n`;\n\ninterface AssetRecord {\n id: string;\n assetNumber: string;\n tagId: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n purchaseValue?: number | null;\n purchaseDate?: string | null;\n usefulLifeMonths?: number | null;\n salvageValue?: number | null;\n depreciationMethod?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n meterUnit?: string | null;\n department?: string | null;\n warrantyExpiry?: string | null;\n supplier?: string | null;\n disposalDate?: string | null;\n disposalMethod?: string | null;\n disposalNotes?: string | null;\n currentValue?: number | null;\n accumulatedDepreciation?: number | null;\n totalCostOfOwnership?: number | null;\n}\n\ninterface AssetQueryResult {\n asset: AssetRecord | null;\n}\n\nconst UPDATE_ASSET_MUTATION = gql`\n mutation AssetHandlerUpdateAsset($id: ID!, $input: UpdateAssetInput!) {\n updateAsset(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst DISPOSE_ASSET_MUTATION = gql`\n mutation AssetHandlerDisposeAsset($id: ID!, $input: DisposeAssetInput!) {\n disposeAsset(id: $id, input: $input) {\n id\n status\n }\n }\n`;\n\nconst DELETE_ASSET_MUTATION = gql`\n mutation AssetHandlerDeleteAsset($id: ID!) {\n deleteAsset(id: $id)\n }\n`;\n\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\n// Soonest future scheduled date among the given (already status-filtered) records.\n// Records with no / past / unparseable dates are ignored; returns undefined when none.\nfunction nextServiceDate(records: { scheduledDate?: string }[]): string | undefined {\n const now = Date.now();\n return records\n .map((record) => record.scheduledDate)\n .filter((date): date is string => date != null && new Date(date).getTime() >= now)\n .sort((a, b) => new Date(a).getTime() - new Date(b).getTime())[0];\n}\n\nconst depreciationLabels: Record<string, string> = {\n STRAIGHT_LINE: 'Straight line',\n REDUCING_BALANCE: 'Reducing balance (200%)',\n DECLINING_BALANCE: 'Declining balance (150%)',\n SUM_OF_YEARS_DIGITS: \"Sum of years' digits\",\n UNITS_OF_PRODUCTION: 'Units of production',\n NONE: 'None',\n};\n\n// Soft, semantic status pill — matches the mock's soft pills.\nconst statusPill: Record<string, string> = {\n active: 'bg-status-success-bg-subtle text-status-success-text',\n maintenance: 'bg-status-warning-bg-subtle text-status-warning-text',\n inactive: 'bg-bg-sunken text-text-secondary',\n retired: 'bg-bg-sunken text-text-secondary',\n disposed: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\n// Pure book-value schedule from real backend fields — empty when inputs missing.\n// Mirrors wspace-assethandler-svc's computeDepreciation formulas per method.\nfunction buildDepreciationSeries(input: {\n purchaseValue?: number | null;\n salvageValue?: number | null;\n usefulLifeMonths?: number | null;\n method?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n meterUnit?: string | null;\n}): { year: number; bookValue: number }[] {\n const pv = input.purchaseValue;\n const life = input.usefulLifeMonths;\n if (!pv || pv <= 0 || !life || life <= 0) return [];\n const salvage = Math.max(0, Math.min(input.salvageValue ?? 0, pv));\n const method = (input.method ?? 'straight_line').toLowerCase();\n const years = Math.max(1, Math.round(life / 12));\n\n if (method === 'units_of_production') {\n const capacity = input.unitsOfProductionCapacity;\n const produced = Math.max(0, input.unitsProduced ?? 0);\n if (!capacity || capacity <= 0) return [];\n const bvAtProduced = Math.max(\n pv - (pv - salvage) * (Math.min(produced, capacity) / capacity),\n salvage\n );\n return [\n { year: 0, bookValue: Math.round(pv) },\n { year: years, bookValue: Math.round(bvAtProduced) },\n ];\n }\n\n const points: { year: number; bookValue: number }[] = [];\n for (let y = 0; y <= years; y += 1) {\n let bv: number;\n if (method === 'reducing_balance') {\n const rate = salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.9, 2 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'declining_balance') {\n const rate =\n salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.75, 1.5 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'sum_of_years_digits') {\n const syd = (years * (years + 1)) / 2;\n const cumulative = syd > 0 ? (pv - salvage) * ((y * years - (y * (y - 1)) / 2) / syd) : 0;\n bv = Math.max(pv - cumulative, salvage);\n } else if (method === 'none') {\n bv = pv;\n } else {\n bv = Math.max(pv - (pv - salvage) * (y / years), salvage);\n }\n points.push({ year: y, bookValue: Math.round(bv) });\n }\n return points;\n}\n\ninterface EditForm {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n locationName: string;\n assignedTo: string;\n department: string;\n supplier: string;\n purchaseValue: string;\n salvageValue: string;\n usefulLifeMonths: string;\n depreciationMethod: string;\n unitsOfProductionCapacity: string;\n unitsProduced: string;\n meterUnit: string;\n}\n\nfunction toEditForm(asset: AssetRecord): EditForm {\n return {\n name: asset.name,\n description: asset.description ?? '',\n category: asset.category,\n status: asset.status.toUpperCase(),\n condition: asset.condition.toUpperCase(),\n serialNumber: asset.serialNumber ?? '',\n locationName: asset.locationName ?? '',\n assignedTo: asset.assignedTo ?? '',\n department: asset.department ?? '',\n supplier: asset.supplier ?? '',\n purchaseValue: asset.purchaseValue != null ? String(asset.purchaseValue) : '',\n salvageValue: asset.salvageValue != null ? String(asset.salvageValue) : '',\n usefulLifeMonths: asset.usefulLifeMonths != null ? String(asset.usefulLifeMonths) : '',\n depreciationMethod: (asset.depreciationMethod ?? 'STRAIGHT_LINE').toUpperCase(),\n unitsOfProductionCapacity:\n asset.unitsOfProductionCapacity != null ? String(asset.unitsOfProductionCapacity) : '',\n unitsProduced: asset.unitsProduced != null ? String(asset.unitsProduced) : '',\n meterUnit: asset.meterUnit ?? '',\n };\n}\n\nexport function AssetsAssetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { labels: categoryLabels } = useAssetCategoryPresentation();\n const { format: money, compact: moneyCompact } = useAssetMoney();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n const tc = useCopy();\n\n const { data, loading, refetch } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const [showEdit, setShowEdit] = useState(false);\n const [showDispose, setShowDispose] = useState(false);\n const [showDelete, setShowDelete] = useState(false);\n const [editForm, setEditForm] = useState<EditForm | null>(null);\n const [disposeForm, setDisposeForm] = useState({ disposalDate: '', method: '', notes: '' });\n\n const [updateAsset, { loading: updating }] = useMutation(UPDATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset updated', 'Your changes have been saved.');\n setShowEdit(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update asset', error.message),\n });\n\n const [disposeAsset, { loading: disposing }] = useMutation(DISPOSE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset disposed', 'The asset has been marked as disposed.');\n setShowDispose(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not dispose asset', error.message),\n });\n\n const [deleteAsset, { loading: deleting }] = useMutation(DELETE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset deleted', 'The asset has been removed from the inventory.');\n navigate('/assets/asset-list');\n },\n onError: (error) => notify.error('Could not delete asset', error.message),\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <NotFoundState\n entityLabel={tc('assethandler.asset.detail.notFound.entity', '{{asset}}')}\n description={tc(\n 'assethandler.asset.detail.notFound.description',\n 'This {{assetLower}} may have been disposed or removed. Return to the inventory to find it.'\n )}\n backLabel={tc('assethandler.asset.detail.notFound.back', 'Back to inventory')}\n onBack={() => navigate('/assets/asset-list')}\n />\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n // Soonest upcoming (future) scheduled service among the open records, if any.\n const nextServiceAt = nextServiceDate(openMaintenance);\n const isDisposed = asset.status === 'disposed';\n\n // Real derived depreciation schedule (empty if the asset lacks financial inputs).\n const depreciationSeries = buildDepreciationSeries({\n purchaseValue: asset.purchaseValue,\n salvageValue: asset.salvageValue,\n usefulLifeMonths: asset.usefulLifeMonths,\n method: asset.depreciationMethod,\n unitsOfProductionCapacity: asset.unitsOfProductionCapacity,\n unitsProduced: asset.unitsProduced,\n });\n const bookValueSpark = depreciationSeries.map((p) => p.bookValue);\n\n // Real maintenance cost history for this asset (per record, over scheduled date).\n const maintenanceCostData = assetMaintenance\n .filter((m) => (m.actualCost ?? m.estimatedCost) != null)\n .map((m) => ({\n label: m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString(undefined, {\n month: 'short',\n year: '2-digit',\n })\n : m.title.slice(0, 12),\n cost: m.actualCost ?? m.estimatedCost ?? 0,\n }));\n const maintenanceSpend = assetMaintenance.reduce(\n (sum, m) => sum + (m.actualCost ?? m.estimatedCost ?? 0),\n 0\n );\n // TCO composition — only when we have a real purchase value + some maintenance spend.\n const tcoSlices =\n asset.purchaseValue != null && maintenanceSpend > 0\n ? [\n {\n name: 'Purchase',\n value: asset.purchaseValue,\n color: 'var(--color-accent-primary)',\n },\n { name: 'Maintenance', value: maintenanceSpend, color: 'var(--color-status-info-bg)' },\n ]\n : [];\n\n const openEdit = () => {\n setEditForm(toEditForm(raw));\n setShowEdit(true);\n };\n\n const submitEdit = (event: React.FormEvent) => {\n event.preventDefault();\n if (!editForm) return;\n if (!editForm.name.trim()) {\n notify.warning('Name required', 'An asset must have a name.');\n return;\n }\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n void updateAsset({\n variables: {\n id: asset.id,\n input: {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n category: editForm.category.trim(),\n status: editForm.status,\n condition: editForm.condition,\n serialNumber: editForm.serialNumber.trim() || null,\n locationName: editForm.locationName.trim() || null,\n assignedTo: editForm.assignedTo.trim() || null,\n department: editForm.department.trim() || null,\n supplier: editForm.supplier.trim() || null,\n purchaseValue: optionalNumber(editForm.purchaseValue),\n salvageValue: optionalNumber(editForm.salvageValue),\n usefulLifeMonths: optionalNumber(editForm.usefulLifeMonths),\n depreciationMethod: editForm.depreciationMethod,\n unitsOfProductionCapacity: optionalNumber(editForm.unitsOfProductionCapacity),\n unitsProduced: optionalNumber(editForm.unitsProduced),\n meterUnit: editForm.meterUnit || null,\n },\n },\n });\n };\n\n const submitDispose = (event: React.FormEvent) => {\n event.preventDefault();\n void disposeAsset({\n variables: {\n id: asset.id,\n input: {\n disposalDate: disposeForm.disposalDate\n ? new Date(disposeForm.disposalDate).toISOString()\n : new Date().toISOString(),\n method: disposeForm.method.trim() || null,\n notes: disposeForm.notes.trim() || null,\n },\n },\n });\n };\n\n const setEdit = (field: keyof EditForm, value: string) =>\n setEditForm((prev) => (prev ? { ...prev, [field]: value } : prev));\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/assets/asset-list')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{asset.name}</GradientText>\n </h1>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${statusPill[asset.status] ?? 'bg-bg-sunken text-text-secondary'}`}\n >\n {asset.status.replace(/_/g, ' ')}\n </span>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> · SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n void printAssetTag({\n name: asset.name,\n tagId: asset.tagId,\n assetTag: asset.assetNumber,\n category: asset.category,\n })\n }\n >\n <Printer className=\"mr-2 h-4 w-4\" />\n Print tag\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Edit\n </Button>\n {!isDisposed ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowDispose(true)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n Dispose\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-status-error-text\"\n onClick={() => setShowDelete(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n {tc(\n 'assethandler.asset.detail.purpose',\n \"The complete profile of a single {{assetLower}} — its identity, condition, location, assignment, financials and maintenance history. Use this page as the {{assetLower}}'s home base: edit its details, track its book value, and dispose of it when it reaches end of life.\"\n )}\n </PagePurpose>\n\n {isDisposed ? (\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Archive className=\"h-4 w-4\" />\n This asset was disposed\n {asset.disposalDate ? ` on ${new Date(asset.disposalDate).toLocaleDateString()}` : ''}\n </div>\n {asset.disposalMethod ? (\n <p className=\"mt-1 text-sm text-text-secondary\">Method: {asset.disposalMethod}</p>\n ) : null}\n {asset.disposalNotes ? (\n <p className=\"mt-1 text-sm text-text-secondary\">{asset.disposalNotes}</p>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n hero\n label=\"Current value\"\n value={money(asset.currentValue)}\n delta={asset.purchaseValue != null ? `of ${money(asset.purchaseValue)}` : undefined}\n deltaDirection=\"neutral\"\n spark={bookValueSpark.length > 1 ? bookValueSpark : undefined}\n icon={DollarSign}\n />\n <StatTile\n label=\"Maintenance records\"\n value={assetMaintenance.length}\n delta={openMaintenance.length > 0 ? `${openMaintenance.length} open` : undefined}\n deltaTone=\"neutral\"\n deltaDirection=\"neutral\"\n icon={Wrench}\n />\n <StatTile\n label=\"Registered\"\n value={asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\n icon={Calendar}\n />\n <StatTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"min-w-0 lg:col-span-2\">\n <Tabs defaultValue=\"details\">\n <TabsList className=\"max-w-full justify-start overflow-x-auto\">\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n <TabsTrigger value=\"financial\">Financial</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance</TabsTrigger>\n <TabsTrigger value=\"discussion\">Discussion</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"mt-4 space-y-4\">\n {asset.description ? (\n <FieldTile label=\"Description\" value={asset.description} full />\n ) : null}\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n <FieldTile\n label={tc('assethandler.asset.detail.field.tag', '{{asset}} Tag')}\n value={asset.assetNumber}\n icon={Hash}\n mono\n />\n <FieldTile\n label=\"Serial Number\"\n value={asset.serialNumber || '—'}\n icon={Hash}\n mono\n />\n <FieldTile\n label=\"Category\"\n value={formatAssetCategory(asset.category, categoryLabels)}\n icon={Layers}\n capitalize\n />\n <FieldTile label=\"Condition\" icon={ShieldCheck}>\n <span\n className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </FieldTile>\n <FieldTile label=\"Assigned To\" value={asset.assignedTo || '—'} icon={User} />\n <FieldTile\n label={tc('assethandler.asset.detail.nextService', 'Next Service')}\n value={nextServiceAt ? new Date(nextServiceAt).toLocaleDateString() : '—'}\n icon={Wrench}\n />\n <FieldTile label=\"Department\" value={asset.department || '—'} icon={Building2} />\n <FieldTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n <FieldTile label=\"Supplier\" value={asset.supplier || '—'} icon={Truck} />\n <FieldTile\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry ? new Date(asset.warrantyExpiry).toLocaleDateString() : '—'\n }\n icon={Calendar}\n />\n </div>\n <AttachmentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n\n <TabsContent value=\"financial\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile label=\"Purchase Value\" value={money(asset.purchaseValue)} />\n <StatTile hero label=\"Current Book Value\" value={money(asset.currentValue)} />\n <StatTile\n label=\"Accum. Depreciation\"\n value={money(asset.accumulatedDepreciation)}\n />\n <StatTile\n label=\"Total Cost of Ownership\"\n value={money(asset.totalCostOfOwnership)}\n />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard\n title=\"Depreciation & book value\"\n subtitle=\"Projected book value over the useful life\"\n icon={TrendingDown}\n >\n {depreciationSeries.length > 0 ? (\n <TrendChart\n data={depreciationSeries}\n xKey=\"year\"\n height={260}\n valueFormat={moneyCompact}\n xTickFormat={(v) => `${v}y`}\n series={[{ key: 'bookValue', label: 'Book value' }]}\n />\n ) : (\n <div className=\"py-12 text-center text-sm text-text-secondary\">\n Add purchase value, useful life and salvage value to see the depreciation\n schedule.\n </div>\n )}\n </ChartCard>\n\n <ChartCard title=\"Key facts\" subtitle=\"Purchase & depreciation terms\">\n <dl className=\"overflow-hidden rounded-lg border border-border-seam text-sm\">\n <LedgerRow\n label=\"Purchase Date\"\n value={\n asset.purchaseDate ? new Date(asset.purchaseDate).toLocaleDateString() : '—'\n }\n striped\n />\n <LedgerRow\n label=\"Useful Life\"\n value={asset.usefulLifeMonths ? `${asset.usefulLifeMonths} months` : '—'}\n />\n <LedgerRow label=\"Salvage Value\" value={money(asset.salvageValue)} striped />\n <LedgerRow\n label=\"Depreciation Method\"\n value={\n asset.depreciationMethod\n ? (depreciationLabels[asset.depreciationMethod.toUpperCase()] ??\n asset.depreciationMethod)\n : '—'\n }\n />\n <LedgerRow label=\"Supplier\" value={asset.supplier || '—'} striped />\n <LedgerRow\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry\n ? new Date(asset.warrantyExpiry).toLocaleDateString()\n : '—'\n }\n />\n </dl>\n </ChartCard>\n </div>\n\n {tcoSlices.length > 0 ? (\n <ChartCard\n title=\"Total cost of ownership\"\n subtitle=\"What drives lifetime cost\"\n icon={DollarSign}\n >\n <DonutChart\n data={tcoSlices}\n centerLabel=\"TCO\"\n centerValue={tcoSlices.reduce((s, x) => s + x.value, 0)}\n valueFormat={moneyCompact}\n height={220}\n />\n </ChartCard>\n ) : null}\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4 space-y-4\">\n {maintenanceCostData.length > 0 ? (\n <ChartCard\n title=\"Maintenance cost history\"\n subtitle=\"Recorded cost per maintenance event\"\n icon={Wrench}\n >\n <BarsChart\n data={maintenanceCostData}\n xKey=\"label\"\n height={220}\n valueFormat={moneyCompact}\n series={[{ key: 'cost', label: 'Cost' }]}\n />\n </ChartCard>\n ) : null}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance History\n </CardTitle>\n <CardDescription>{assetMaintenance.length} records found</CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"py-8 text-center text-text-secondary\">\n No maintenance records for this asset.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${\n m.status === 'completed'\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-warning-bg-subtle text-status-warning-text'\n }`}\n >\n {m.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"mt-1 font-medium\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"mt-2 flex gap-4 text-xs text-text-secondary\">\n <span>\n Scheduled:{' '}\n {m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString()\n : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>Cost: {money(m.actualCost ?? m.estimatedCost)}</span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"discussion\" className=\"mt-4\">\n <CommentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Persistent right rail — Tags + Activity (mirrors the mock) */}\n <aside className=\"space-y-6\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <div className=\"space-y-3 p-5\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Tag className=\"h-4 w-4 text-text-secondary\" />\n Tags\n </h3>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No tags yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-action-primary-bg\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </GlassCard>\n\n <ActivityTimeline resourceId={asset.id} />\n </aside>\n </div>\n\n {/* Edit dialog */}\n <ResponsiveDialog open={showEdit} onOpenChange={setShowEdit}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this asset's details and financials.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n {editForm ? (\n <form className=\"space-y-4\" onSubmit={submitEdit}>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input value={editForm.name} onChange={(e) => setEdit('name', e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Input\n value={editForm.category}\n onChange={(e) => setEdit('category', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n value={editForm.description}\n onChange={(e) => setEdit('description', e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={editForm.status} onValueChange={(v) => setEdit('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select value={editForm.condition} onValueChange={(v) => setEdit('condition', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n value={editForm.department}\n onChange={(e) => setEdit('department', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n value={editForm.serialNumber}\n onChange={(e) => setEdit('serialNumber', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n value={editForm.assignedTo}\n onChange={(e) => setEdit('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n value={editForm.locationName}\n onChange={(e) => setEdit('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n value={editForm.supplier}\n onChange={(e) => setEdit('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.purchaseValue}\n onChange={(e) => setEdit('purchaseValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.salvageValue}\n onChange={(e) => setEdit('salvageValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Useful Life (mo)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.usefulLifeMonths}\n onChange={(e) => setEdit('usefulLifeMonths', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation</Label>\n <Select\n value={editForm.depreciationMethod}\n onValueChange={(v) => setEdit('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance (200%)</SelectItem>\n <SelectItem value=\"DECLINING_BALANCE\">Declining balance (150%)</SelectItem>\n <SelectItem value=\"SUM_OF_YEARS_DIGITS\">Sum of years' digits</SelectItem>\n <SelectItem value=\"UNITS_OF_PRODUCTION\">Units of production</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {/*\n Lifetime Capacity is a depreciation input and stays gated. The METER\n does not: it is what a maintenance plan's intervalMeter counts against,\n so gating it left a straight-line tractor unable to record engine hours\n (BOFF-6032).\n */}\n {editForm.depreciationMethod === 'UNITS_OF_PRODUCTION' ? (\n <div className=\"space-y-2\">\n <Label>Lifetime Capacity (units)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsOfProductionCapacity}\n onChange={(e) => setEdit('unitsOfProductionCapacity', e.target.value)}\n />\n </div>\n ) : null}\n <div className=\"space-y-2\">\n <Label>Meter unit</Label>\n {/*\n NOT_METERED is a sentinel, not a stored value — it maps back to null\n on save. Radix Select has no deselect and rejects an empty item value,\n so without it an asset that was once set to HOURS could never be\n un-metered again: the placeholder is only reachable before the first\n choice.\n */}\n <Select\n value={editForm.meterUnit || NOT_METERED}\n onValueChange={(value) =>\n setEdit('meterUnit', value === NOT_METERED ? '' : value)\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Not metered\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NOT_METERED}>Not metered</SelectItem>\n {METER_UNIT_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>{meterReadingLabel(editForm.meterUnit)}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsProduced}\n onChange={(e) => setEdit('unitsProduced', e.target.value)}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowEdit(false)}\n disabled={updating}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n ) : null}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Dispose dialog */}\n <ResponsiveDialog open={showDispose} onOpenChange={setShowDispose}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Dispose asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record the disposal of this asset. It will be marked as disposed and removed from\n active inventory.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <form className=\"space-y-4\" onSubmit={submitDispose}>\n <div className=\"space-y-2\">\n <Label>Disposal Date</Label>\n <Input\n type=\"date\"\n value={disposeForm.disposalDate}\n onChange={(e) =>\n setDisposeForm((prev) => ({ ...prev, disposalDate: e.target.value }))\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Method</Label>\n <Input\n placeholder=\"e.g., Sold, Recycled, Scrapped\"\n value={disposeForm.method}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, method: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Notes</Label>\n <Textarea\n placeholder=\"Optional details about the disposal\"\n value={disposeForm.notes}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, notes: e.target.value }))}\n rows={2}\n />\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowDispose(false)}\n disabled={disposing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={disposing}>\n {disposing ? 'Disposing…' : 'Confirm disposal'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete dialog */}\n <ResponsiveDialog open={showDelete} onOpenChange={setShowDelete}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes <span className=\"font-medium\">{asset.name}</span> from the inventory.\n This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShowDelete(false)} disabled={deleting}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => void deleteAsset({ variables: { id: asset.id } })}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n\n// A single labelled field rendered as its own clean card (mock's field grid).\n// Machine values (serial, tags, supplier) render verbatim — no blanket capitalize.\nfunction FieldTile({\n label,\n value,\n icon: Icon,\n mono,\n capitalize,\n full,\n children,\n}: {\n label: string;\n value?: string;\n icon?: React.ComponentType<{ className?: string }>;\n mono?: boolean;\n capitalize?: boolean;\n full?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div\n className={`rounded-lg border border-border-seam bg-bg-surface p-3.5 ${full ? 'sm:col-span-2 xl:col-span-3' : ''}`}\n >\n <p className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n {Icon ? <Icon className=\"h-3.5 w-3.5\" /> : null}\n {label}\n </p>\n {children ? (\n <div className=\"mt-1.5\">{children}</div>\n ) : (\n <p\n className={`mt-1 break-words font-medium ${mono ? 'font-mono text-sm' : ''} ${capitalize ? 'capitalize' : ''}`}\n >\n {value}\n </p>\n )}\n </div>\n );\n}\n\n// A striped ledger row for the financial key-facts panel.\nfunction LedgerRow({ label, value, striped }: { label: string; value: string; striped?: boolean }) {\n return (\n <div\n className={`flex items-center justify-between gap-4 px-3.5 py-2.5 ${striped ? 'bg-bg-sunken/40' : ''}`}\n >\n <dt className=\"shrink-0 text-text-secondary\">{label}</dt>\n <dd className=\"truncate text-right font-medium\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { METER_UNIT_OPTIONS, NOT_METERED, meterReadingLabel } from '../utils/meter';\nimport {\n formatAssetCategory,\n useAssetCategoryPresentation,\n useAssetMoney,\n} from '../providers/AssetHandlerProvider';\nimport type React from 'react';\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n MapPin,\n Calendar,\n Tag,\n User,\n Wrench,\n Pencil,\n Trash2,\n Archive,\n DollarSign,\n TrendingDown,\n Hash,\n Building2,\n Truck,\n ShieldCheck,\n Layers,\n Printer,\n} from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { useCopy } from '../hooks/useCopy';\nimport { notify } from '../utils/toast';\nimport { printAssetTag } from '../utils/printAssetTag';\nimport { AttachmentsPanel, CommentsPanel, ActivityTimeline, NotFoundState } from '../components';\nimport { StatTile, ChartCard, TrendChart, BarsChart, DonutChart } from '../components';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n tagId\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n purchaseValue\n purchaseDate\n usefulLifeMonths\n salvageValue\n depreciationMethod\n unitsOfProductionCapacity\n unitsProduced\n meterUnit\n department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n }\n`;\n\ninterface AssetRecord {\n id: string;\n assetNumber: string;\n tagId: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n purchaseValue?: number | null;\n purchaseDate?: string | null;\n usefulLifeMonths?: number | null;\n salvageValue?: number | null;\n depreciationMethod?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n meterUnit?: string | null;\n department?: string | null;\n warrantyExpiry?: string | null;\n supplier?: string | null;\n disposalDate?: string | null;\n disposalMethod?: string | null;\n disposalNotes?: string | null;\n currentValue?: number | null;\n accumulatedDepreciation?: number | null;\n totalCostOfOwnership?: number | null;\n}\n\ninterface AssetQueryResult {\n asset: AssetRecord | null;\n}\n\nconst UPDATE_ASSET_MUTATION = gql`\n mutation AssetHandlerUpdateAsset($id: ID!, $input: UpdateAssetInput!) {\n updateAsset(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst DISPOSE_ASSET_MUTATION = gql`\n mutation AssetHandlerDisposeAsset($id: ID!, $input: DisposeAssetInput!) {\n disposeAsset(id: $id, input: $input) {\n id\n status\n }\n }\n`;\n\nconst DELETE_ASSET_MUTATION = gql`\n mutation AssetHandlerDeleteAsset($id: ID!) {\n deleteAsset(id: $id)\n }\n`;\n\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\n// Soonest future scheduled date among the given (already status-filtered) records.\n// Records with no / past / unparseable dates are ignored; returns undefined when none.\nfunction nextServiceDate(records: { scheduledDate?: string }[]): string | undefined {\n const now = Date.now();\n return records\n .map((record) => record.scheduledDate)\n .filter((date): date is string => date != null && new Date(date).getTime() >= now)\n .sort((a, b) => new Date(a).getTime() - new Date(b).getTime())[0];\n}\n\nconst depreciationLabels: Record<string, string> = {\n STRAIGHT_LINE: 'Straight line',\n REDUCING_BALANCE: 'Reducing balance (200%)',\n DECLINING_BALANCE: 'Declining balance (150%)',\n SUM_OF_YEARS_DIGITS: \"Sum of years' digits\",\n UNITS_OF_PRODUCTION: 'Units of production',\n NONE: 'None',\n};\n\n// Soft, semantic status pill — matches the mock's soft pills.\nconst statusPill: Record<string, string> = {\n active: 'bg-status-success-bg-subtle text-status-success-text',\n maintenance: 'bg-status-warning-bg-subtle text-status-warning-text',\n inactive: 'bg-bg-sunken text-text-secondary',\n retired: 'bg-bg-sunken text-text-secondary',\n disposed: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\n// Pure book-value schedule from real backend fields — empty when inputs missing.\n// Mirrors wspace-assethandler-svc's computeDepreciation formulas per method.\nfunction buildDepreciationSeries(input: {\n purchaseValue?: number | null;\n salvageValue?: number | null;\n usefulLifeMonths?: number | null;\n method?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n meterUnit?: string | null;\n}): { year: number; bookValue: number }[] {\n const pv = input.purchaseValue;\n const life = input.usefulLifeMonths;\n if (!pv || pv <= 0 || !life || life <= 0) return [];\n const salvage = Math.max(0, Math.min(input.salvageValue ?? 0, pv));\n const method = (input.method ?? 'straight_line').toLowerCase();\n const years = Math.max(1, Math.round(life / 12));\n\n if (method === 'units_of_production') {\n const capacity = input.unitsOfProductionCapacity;\n const produced = Math.max(0, input.unitsProduced ?? 0);\n if (!capacity || capacity <= 0) return [];\n const bvAtProduced = Math.max(\n pv - (pv - salvage) * (Math.min(produced, capacity) / capacity),\n salvage\n );\n return [\n { year: 0, bookValue: Math.round(pv) },\n { year: years, bookValue: Math.round(bvAtProduced) },\n ];\n }\n\n const points: { year: number; bookValue: number }[] = [];\n for (let y = 0; y <= years; y += 1) {\n let bv: number;\n if (method === 'reducing_balance') {\n const rate = salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.9, 2 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'declining_balance') {\n const rate =\n salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.75, 1.5 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'sum_of_years_digits') {\n const syd = (years * (years + 1)) / 2;\n const cumulative = syd > 0 ? (pv - salvage) * ((y * years - (y * (y - 1)) / 2) / syd) : 0;\n bv = Math.max(pv - cumulative, salvage);\n } else if (method === 'none') {\n bv = pv;\n } else {\n bv = Math.max(pv - (pv - salvage) * (y / years), salvage);\n }\n points.push({ year: y, bookValue: Math.round(bv) });\n }\n return points;\n}\n\ninterface EditForm {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n locationName: string;\n assignedTo: string;\n department: string;\n supplier: string;\n purchaseValue: string;\n salvageValue: string;\n usefulLifeMonths: string;\n depreciationMethod: string;\n unitsOfProductionCapacity: string;\n unitsProduced: string;\n meterUnit: string;\n}\n\nfunction toEditForm(asset: AssetRecord): EditForm {\n return {\n name: asset.name,\n description: asset.description ?? '',\n category: asset.category,\n status: asset.status.toUpperCase(),\n condition: asset.condition.toUpperCase(),\n serialNumber: asset.serialNumber ?? '',\n locationName: asset.locationName ?? '',\n assignedTo: asset.assignedTo ?? '',\n department: asset.department ?? '',\n supplier: asset.supplier ?? '',\n purchaseValue: asset.purchaseValue != null ? String(asset.purchaseValue) : '',\n salvageValue: asset.salvageValue != null ? String(asset.salvageValue) : '',\n usefulLifeMonths: asset.usefulLifeMonths != null ? String(asset.usefulLifeMonths) : '',\n depreciationMethod: (asset.depreciationMethod ?? 'STRAIGHT_LINE').toUpperCase(),\n unitsOfProductionCapacity:\n asset.unitsOfProductionCapacity != null ? String(asset.unitsOfProductionCapacity) : '',\n unitsProduced: asset.unitsProduced != null ? String(asset.unitsProduced) : '',\n meterUnit: asset.meterUnit ?? '',\n };\n}\n\nexport function AssetsAssetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { labels: categoryLabels } = useAssetCategoryPresentation();\n const { format: money, compact: moneyCompact } = useAssetMoney();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n const tc = useCopy();\n\n const { data, loading, refetch } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const [showEdit, setShowEdit] = useState(false);\n const [showDispose, setShowDispose] = useState(false);\n const [showDelete, setShowDelete] = useState(false);\n const [editForm, setEditForm] = useState<EditForm | null>(null);\n const [disposeForm, setDisposeForm] = useState({ disposalDate: '', method: '', notes: '' });\n\n const [updateAsset, { loading: updating }] = useMutation(UPDATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset updated', 'Your changes have been saved.');\n setShowEdit(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update asset', error.message),\n });\n\n const [disposeAsset, { loading: disposing }] = useMutation(DISPOSE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset disposed', 'The asset has been marked as disposed.');\n setShowDispose(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not dispose asset', error.message),\n });\n\n const [deleteAsset, { loading: deleting }] = useMutation(DELETE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset deleted', 'The asset has been removed from the inventory.');\n navigate('/assets/asset-list');\n },\n onError: (error) => notify.error('Could not delete asset', error.message),\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <NotFoundState\n entityLabel={tc('assethandler.asset.detail.notFound.entity', '{{asset}}')}\n description={tc(\n 'assethandler.asset.detail.notFound.description',\n 'This {{assetLower}} may have been disposed or removed. Return to the inventory to find it.'\n )}\n backLabel={tc('assethandler.asset.detail.notFound.back', 'Back to inventory')}\n onBack={() => navigate('/assets/asset-list')}\n />\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n // Soonest upcoming (future) scheduled service among the open records, if any.\n const nextServiceAt = nextServiceDate(openMaintenance);\n const isDisposed = asset.status === 'disposed';\n\n // Real derived depreciation schedule (empty if the asset lacks financial inputs).\n const depreciationSeries = buildDepreciationSeries({\n purchaseValue: asset.purchaseValue,\n salvageValue: asset.salvageValue,\n usefulLifeMonths: asset.usefulLifeMonths,\n method: asset.depreciationMethod,\n unitsOfProductionCapacity: asset.unitsOfProductionCapacity,\n unitsProduced: asset.unitsProduced,\n });\n const bookValueSpark = depreciationSeries.map((p) => p.bookValue);\n\n // Real maintenance cost history for this asset (per record, over scheduled date).\n const maintenanceCostData = assetMaintenance\n .filter((m) => (m.actualCost ?? m.estimatedCost) != null)\n .map((m) => ({\n label: m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString(undefined, {\n month: 'short',\n year: '2-digit',\n })\n : m.title.slice(0, 12),\n cost: m.actualCost ?? m.estimatedCost ?? 0,\n }));\n const maintenanceSpend = assetMaintenance.reduce(\n (sum, m) => sum + (m.actualCost ?? m.estimatedCost ?? 0),\n 0\n );\n // TCO composition — only when we have a real purchase value + some maintenance spend.\n const tcoSlices =\n asset.purchaseValue != null && maintenanceSpend > 0\n ? [\n {\n name: 'Purchase',\n value: asset.purchaseValue,\n color: 'var(--color-accent-primary)',\n },\n { name: 'Maintenance', value: maintenanceSpend, color: 'var(--color-status-info-bg)' },\n ]\n : [];\n\n const openEdit = () => {\n setEditForm(toEditForm(raw));\n setShowEdit(true);\n };\n\n const submitEdit = (event: React.FormEvent) => {\n event.preventDefault();\n if (!editForm) return;\n if (!editForm.name.trim()) {\n notify.warning('Name required', 'An asset must have a name.');\n return;\n }\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n void updateAsset({\n variables: {\n id: asset.id,\n input: {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n category: editForm.category.trim(),\n status: editForm.status,\n condition: editForm.condition,\n serialNumber: editForm.serialNumber.trim() || null,\n locationName: editForm.locationName.trim() || null,\n assignedTo: editForm.assignedTo.trim() || null,\n department: editForm.department.trim() || null,\n supplier: editForm.supplier.trim() || null,\n purchaseValue: optionalNumber(editForm.purchaseValue),\n salvageValue: optionalNumber(editForm.salvageValue),\n usefulLifeMonths: optionalNumber(editForm.usefulLifeMonths),\n depreciationMethod: editForm.depreciationMethod,\n unitsOfProductionCapacity: optionalNumber(editForm.unitsOfProductionCapacity),\n unitsProduced: optionalNumber(editForm.unitsProduced),\n meterUnit: editForm.meterUnit || null,\n },\n },\n });\n };\n\n const submitDispose = (event: React.FormEvent) => {\n event.preventDefault();\n void disposeAsset({\n variables: {\n id: asset.id,\n input: {\n disposalDate: disposeForm.disposalDate\n ? new Date(disposeForm.disposalDate).toISOString()\n : new Date().toISOString(),\n method: disposeForm.method.trim() || null,\n notes: disposeForm.notes.trim() || null,\n },\n },\n });\n };\n\n const setEdit = (field: keyof EditForm, value: string) =>\n setEditForm((prev) => (prev ? { ...prev, [field]: value } : prev));\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/assets/asset-list')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{asset.name}</GradientText>\n </h1>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${statusPill[asset.status] ?? 'bg-bg-sunken text-text-secondary'}`}\n >\n {asset.status.replace(/_/g, ' ')}\n </span>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> · SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() =>\n void printAssetTag({\n name: asset.name,\n tagId: asset.tagId,\n assetTag: asset.assetNumber,\n category: asset.category,\n })\n }\n >\n <Printer className=\"mr-2 h-4 w-4\" />\n Print tag\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Edit\n </Button>\n {!isDisposed ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowDispose(true)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n Dispose\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-status-error-text\"\n onClick={() => setShowDelete(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n {tc(\n 'assethandler.asset.detail.purpose',\n \"The complete profile of a single {{assetLower}} — its identity, condition, location, assignment, financials and maintenance history. Use this page as the {{assetLower}}'s home base: edit its details, track its book value, and dispose of it when it reaches end of life.\"\n )}\n </PagePurpose>\n\n {isDisposed ? (\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Archive className=\"h-4 w-4\" />\n This asset was disposed\n {asset.disposalDate ? ` on ${new Date(asset.disposalDate).toLocaleDateString()}` : ''}\n </div>\n {asset.disposalMethod ? (\n <p className=\"mt-1 text-sm text-text-secondary\">Method: {asset.disposalMethod}</p>\n ) : null}\n {asset.disposalNotes ? (\n <p className=\"mt-1 text-sm text-text-secondary\">{asset.disposalNotes}</p>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n hero\n label=\"Current value\"\n value={money(asset.currentValue)}\n delta={asset.purchaseValue != null ? `of ${money(asset.purchaseValue)}` : undefined}\n deltaDirection=\"neutral\"\n spark={bookValueSpark.length > 1 ? bookValueSpark : undefined}\n icon={DollarSign}\n />\n <StatTile\n label=\"Maintenance records\"\n value={assetMaintenance.length}\n delta={openMaintenance.length > 0 ? `${openMaintenance.length} open` : undefined}\n deltaTone=\"neutral\"\n deltaDirection=\"neutral\"\n icon={Wrench}\n />\n <StatTile\n label=\"Registered\"\n value={asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\n icon={Calendar}\n />\n <StatTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"min-w-0 lg:col-span-2\">\n <Tabs defaultValue=\"details\">\n <TabsList className=\"max-w-full justify-start overflow-x-auto\">\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n <TabsTrigger value=\"financial\">Financial</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance</TabsTrigger>\n <TabsTrigger value=\"discussion\">Discussion</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"mt-4 space-y-4\">\n {asset.description ? (\n <FieldTile label=\"Description\" value={asset.description} full />\n ) : null}\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n <FieldTile\n label={tc('assethandler.asset.detail.field.tag', '{{asset}} Tag')}\n value={asset.assetNumber}\n icon={Hash}\n mono\n />\n <FieldTile\n label=\"Serial Number\"\n value={asset.serialNumber || '—'}\n icon={Hash}\n mono\n />\n <FieldTile\n label=\"Category\"\n value={formatAssetCategory(asset.category, categoryLabels)}\n icon={Layers}\n capitalize\n />\n <FieldTile label=\"Condition\" icon={ShieldCheck}>\n <span\n className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </FieldTile>\n <FieldTile label=\"Assigned To\" value={asset.assignedTo || '—'} icon={User} />\n <FieldTile\n label={tc('assethandler.asset.detail.nextService', 'Next Service')}\n value={nextServiceAt ? new Date(nextServiceAt).toLocaleDateString() : '—'}\n icon={Wrench}\n />\n <FieldTile label=\"Department\" value={asset.department || '—'} icon={Building2} />\n <FieldTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n <FieldTile label=\"Supplier\" value={asset.supplier || '—'} icon={Truck} />\n <FieldTile\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry ? new Date(asset.warrantyExpiry).toLocaleDateString() : '—'\n }\n icon={Calendar}\n />\n </div>\n <AttachmentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n\n <TabsContent value=\"financial\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile label=\"Purchase Value\" value={money(asset.purchaseValue)} />\n <StatTile hero label=\"Current Book Value\" value={money(asset.currentValue)} />\n <StatTile\n label=\"Accum. Depreciation\"\n value={money(asset.accumulatedDepreciation)}\n />\n <StatTile\n label=\"Total Cost of Ownership\"\n value={money(asset.totalCostOfOwnership)}\n />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard\n title=\"Depreciation & book value\"\n subtitle=\"Projected book value over the useful life\"\n icon={TrendingDown}\n >\n {depreciationSeries.length > 0 ? (\n <TrendChart\n data={depreciationSeries}\n xKey=\"year\"\n height={260}\n valueFormat={moneyCompact}\n xTickFormat={(v) => `${v}y`}\n series={[{ key: 'bookValue', label: 'Book value' }]}\n />\n ) : (\n <div className=\"py-12 text-center text-sm text-text-secondary\">\n Add purchase value, useful life and salvage value to see the depreciation\n schedule.\n </div>\n )}\n </ChartCard>\n\n <ChartCard title=\"Key facts\" subtitle=\"Purchase & depreciation terms\">\n <dl className=\"overflow-hidden rounded-lg border border-border-seam text-sm\">\n <LedgerRow\n label=\"Purchase Date\"\n value={\n asset.purchaseDate ? new Date(asset.purchaseDate).toLocaleDateString() : '—'\n }\n striped\n />\n <LedgerRow\n label=\"Useful Life\"\n value={asset.usefulLifeMonths ? `${asset.usefulLifeMonths} months` : '—'}\n />\n <LedgerRow label=\"Salvage Value\" value={money(asset.salvageValue)} striped />\n <LedgerRow\n label=\"Depreciation Method\"\n value={\n asset.depreciationMethod\n ? (depreciationLabels[asset.depreciationMethod.toUpperCase()] ??\n asset.depreciationMethod)\n : '—'\n }\n />\n <LedgerRow label=\"Supplier\" value={asset.supplier || '—'} striped />\n <LedgerRow\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry\n ? new Date(asset.warrantyExpiry).toLocaleDateString()\n : '—'\n }\n />\n </dl>\n </ChartCard>\n </div>\n\n {tcoSlices.length > 0 ? (\n <ChartCard\n title=\"Total cost of ownership\"\n subtitle=\"What drives lifetime cost\"\n icon={DollarSign}\n >\n <DonutChart\n data={tcoSlices}\n centerLabel=\"TCO\"\n centerValue={tcoSlices.reduce((s, x) => s + x.value, 0)}\n valueFormat={moneyCompact}\n height={220}\n />\n </ChartCard>\n ) : null}\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4 space-y-4\">\n {maintenanceCostData.length > 0 ? (\n <ChartCard\n title=\"Maintenance cost history\"\n subtitle=\"Recorded cost per maintenance event\"\n icon={Wrench}\n >\n <BarsChart\n data={maintenanceCostData}\n xKey=\"label\"\n height={220}\n valueFormat={moneyCompact}\n series={[{ key: 'cost', label: 'Cost' }]}\n />\n </ChartCard>\n ) : null}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance History\n </CardTitle>\n <CardDescription>{assetMaintenance.length} records found</CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"py-8 text-center text-text-secondary\">\n No maintenance records for this asset.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${\n m.status === 'completed'\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-warning-bg-subtle text-status-warning-text'\n }`}\n >\n {m.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"mt-1 font-medium\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"mt-2 flex gap-4 text-xs text-text-secondary\">\n <span>\n Scheduled:{' '}\n {m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString()\n : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>Cost: {money(m.actualCost ?? m.estimatedCost)}</span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"discussion\" className=\"mt-4\">\n <CommentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Persistent right rail — Tags + Activity (mirrors the mock) */}\n <aside className=\"space-y-6\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <div className=\"space-y-3 p-5\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Tag className=\"h-4 w-4 text-text-secondary\" />\n Tags\n </h3>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No tags yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-action-primary-bg\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </GlassCard>\n\n <ActivityTimeline resourceId={asset.id} />\n </aside>\n </div>\n\n {/* Edit dialog */}\n <ResponsiveDialog open={showEdit} onOpenChange={setShowEdit}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this asset's details and financials.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n {editForm ? (\n <form className=\"space-y-4\" onSubmit={submitEdit}>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input value={editForm.name} onChange={(e) => setEdit('name', e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Input\n value={editForm.category}\n onChange={(e) => setEdit('category', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n value={editForm.description}\n onChange={(e) => setEdit('description', e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={editForm.status} onValueChange={(v) => setEdit('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select value={editForm.condition} onValueChange={(v) => setEdit('condition', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n value={editForm.department}\n onChange={(e) => setEdit('department', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n value={editForm.serialNumber}\n onChange={(e) => setEdit('serialNumber', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n value={editForm.assignedTo}\n onChange={(e) => setEdit('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n value={editForm.locationName}\n onChange={(e) => setEdit('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n value={editForm.supplier}\n onChange={(e) => setEdit('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.purchaseValue}\n onChange={(e) => setEdit('purchaseValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.salvageValue}\n onChange={(e) => setEdit('salvageValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Useful Life (mo)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.usefulLifeMonths}\n onChange={(e) => setEdit('usefulLifeMonths', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation</Label>\n <Select\n value={editForm.depreciationMethod}\n onValueChange={(v) => setEdit('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance (200%)</SelectItem>\n <SelectItem value=\"DECLINING_BALANCE\">Declining balance (150%)</SelectItem>\n <SelectItem value=\"SUM_OF_YEARS_DIGITS\">Sum of years' digits</SelectItem>\n <SelectItem value=\"UNITS_OF_PRODUCTION\">Units of production</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {/*\n Lifetime Capacity is a depreciation input and stays gated. The METER\n does not: it is what a maintenance plan's intervalMeter counts against,\n so gating it left a straight-line tractor unable to record engine hours\n (BOFF-6032).\n */}\n {editForm.depreciationMethod === 'UNITS_OF_PRODUCTION' ? (\n <div className=\"space-y-2\">\n <Label>Lifetime Capacity (units)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsOfProductionCapacity}\n onChange={(e) => setEdit('unitsOfProductionCapacity', e.target.value)}\n />\n </div>\n ) : null}\n <div className=\"space-y-2\">\n <Label>Meter unit</Label>\n {/*\n NOT_METERED is a sentinel, not a stored value — it maps back to null\n on save. Radix Select has no deselect and rejects an empty item value,\n so without it an asset that was once set to HOURS could never be\n un-metered again: the placeholder is only reachable before the first\n choice.\n */}\n <Select\n value={editForm.meterUnit || NOT_METERED}\n onValueChange={(value) =>\n setEdit('meterUnit', value === NOT_METERED ? '' : value)\n }\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Not metered\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NOT_METERED}>Not metered</SelectItem>\n {METER_UNIT_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>{meterReadingLabel(editForm.meterUnit)}</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsProduced}\n onChange={(e) => setEdit('unitsProduced', e.target.value)}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowEdit(false)}\n disabled={updating}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n ) : null}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Dispose dialog */}\n <ResponsiveDialog open={showDispose} onOpenChange={setShowDispose}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Dispose asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record the disposal of this asset. It will be marked as disposed and removed from\n active inventory.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <form className=\"space-y-4\" onSubmit={submitDispose}>\n <div className=\"space-y-2\">\n <Label>Disposal Date</Label>\n <Input\n type=\"date\"\n value={disposeForm.disposalDate}\n onChange={(e) =>\n setDisposeForm((prev) => ({ ...prev, disposalDate: e.target.value }))\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Method</Label>\n <Input\n placeholder=\"e.g., Sold, Recycled, Scrapped\"\n value={disposeForm.method}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, method: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Notes</Label>\n <Textarea\n placeholder=\"Optional details about the disposal\"\n value={disposeForm.notes}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, notes: e.target.value }))}\n rows={2}\n />\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowDispose(false)}\n disabled={disposing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={disposing}>\n {disposing ? 'Disposing…' : 'Confirm disposal'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete dialog */}\n <ResponsiveDialog open={showDelete} onOpenChange={setShowDelete}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes <span className=\"font-medium\">{asset.name}</span> from the inventory.\n This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShowDelete(false)} disabled={deleting}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => void deleteAsset({ variables: { id: asset.id } })}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n\n// A single labelled field rendered as its own clean card (mock's field grid).\n// Machine values (serial, tags, supplier) render verbatim — no blanket capitalize.\nfunction FieldTile({\n label,\n value,\n icon: Icon,\n mono,\n capitalize,\n full,\n children,\n}: {\n label: string;\n value?: string;\n icon?: React.ComponentType<{ className?: string }>;\n mono?: boolean;\n capitalize?: boolean;\n full?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div\n className={`rounded-lg border border-border-seam bg-bg-surface p-3.5 ${full ? 'sm:col-span-2 xl:col-span-3' : ''}`}\n >\n <p className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n {Icon ? <Icon className=\"h-3.5 w-3.5\" /> : null}\n {label}\n </p>\n {children ? (\n <div className=\"mt-1.5\">{children}</div>\n ) : (\n <p\n className={`mt-1 break-words font-medium ${mono ? 'font-mono text-sm' : ''} ${capitalize ? 'capitalize' : ''}`}\n >\n {value}\n </p>\n )}\n </div>\n );\n}\n\n// A striped ledger row for the financial key-facts panel.\nfunction LedgerRow({ label, value, striped }: { label: string; value: string; striped?: boolean }) {\n return (\n <div\n className={`flex items-center justify-between gap-4 px-3.5 py-2.5 ${striped ? 'bg-bg-sunken/40' : ''}`}\n >\n <dt className=\"shrink-0 text-text-secondary\">{label}</dt>\n <dd className=\"truncate text-right font-medium\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
|