@burdenoff/microfe-assethandler 2026.811.1 → 2026.813.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/components/charts/BarsChart.js +25 -25
- package/dist/assethandler/components/charts/ChartParts.js +27 -27
- package/dist/assethandler/components/charts/DonutChart.js +17 -17
- package/dist/assethandler/components/charts/ProgressMeter.js +5 -5
- package/dist/assethandler/components/charts/RadialGauge.js +13 -13
- package/dist/assethandler/components/charts/Sparkline.js +27 -27
- package/dist/assethandler/components/charts/TrendChart.js +47 -47
- package/dist/assethandler/components/index.js +1 -1
- package/dist/assethandler/pages/AiPredictionsPage.js +20 -20
- package/dist/assethandler/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +133 -133
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +55 -55
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +172 -163
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +223 -224
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +249 -249
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +8 -8
- package/dist/assethandler/pages/CmdbBrowserPage.js +34 -34
- package/dist/assethandler/pages/DashboardPage.d.ts.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +256 -255
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js +27 -27
- package/dist/assethandler/pages/EsgDashboardPage.js +53 -53
- package/dist/assethandler/pages/FinanceBudgetDetailPage.d.ts.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +156 -155
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.d.ts.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +475 -475
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.d.ts.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +141 -140
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +21 -21
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +34 -34
- package/dist/assethandler/pages/ItilProblemManagementPage.js +17 -17
- package/dist/assethandler/pages/KnowledgeBasePage.js +39 -39
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.d.ts.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +114 -114
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.d.ts.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +158 -157
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.d.ts.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +253 -252
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.d.ts.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +96 -95
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js +21 -21
- package/dist/assethandler/pages/ReportsDashboardPage.d.ts.map +1 -1
- package/dist/assethandler/pages/ReportsDashboardPage.js +301 -301
- package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +126 -126
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.d.ts.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +112 -113
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.d.ts.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +136 -137
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.d.ts +14 -0
- package/dist/assethandler/providers/AssetHandlerProvider.d.ts.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js +44 -34
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/types/index.d.ts +10 -0
- package/dist/assethandler/types/index.d.ts.map +1 -1
- package/dist/assethandler/utils/money.d.ts +34 -0
- package/dist/assethandler/utils/money.d.ts.map +1 -0
- package/dist/assethandler/utils/money.js +27 -0
- package/dist/assethandler/utils/money.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
+
import { currencySymbol as t, formatMoney as n } from "../utils/money.js";
|
|
3
|
+
import { formatCurrencyCompact as r } from "../components/charts/chartTheme.js";
|
|
2
4
|
import "../utils/categoryPresentation.js";
|
|
3
|
-
import { createContext as
|
|
4
|
-
import { MemoryRouter as
|
|
5
|
-
import { ApolloClient as
|
|
6
|
-
import { ApolloProvider as
|
|
7
|
-
import { jsx as
|
|
5
|
+
import { createContext as i, useContext as a, useEffect as o, useMemo as s } from "react";
|
|
6
|
+
import { MemoryRouter as c } from "react-router";
|
|
7
|
+
import { ApolloClient as l, HttpLink as u, InMemoryCache as d, gql as f } from "@apollo/client";
|
|
8
|
+
import { ApolloProvider as p, useQuery as m } from "@apollo/client/react";
|
|
9
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
8
10
|
//#region src/assethandler/providers/AssetHandlerProvider.tsx
|
|
9
|
-
var
|
|
11
|
+
var _ = i(null), v = f`
|
|
10
12
|
query AssetHandlerBootstrap {
|
|
11
13
|
dashboardOverview {
|
|
12
14
|
totalAssets
|
|
@@ -198,63 +200,71 @@ var m = t(null), h = l`
|
|
|
198
200
|
}
|
|
199
201
|
}
|
|
200
202
|
`;
|
|
201
|
-
function
|
|
202
|
-
let t = e((e) => e.hydrateFromBootstrap), n = e((e) => e.setBootstrapRefetch), { data:
|
|
203
|
+
function y() {
|
|
204
|
+
let t = e((e) => e.hydrateFromBootstrap), n = e((e) => e.setBootstrapRefetch), { data: r, refetch: i } = m(v, {
|
|
203
205
|
fetchPolicy: "cache-and-network",
|
|
204
206
|
errorPolicy: "all"
|
|
205
207
|
});
|
|
206
|
-
return
|
|
207
|
-
|
|
208
|
-
}, [
|
|
209
|
-
|
|
210
|
-
}), () => n(null)), [
|
|
208
|
+
return o(() => {
|
|
209
|
+
r && t(r);
|
|
210
|
+
}, [r, t]), o(() => (n(() => {
|
|
211
|
+
i();
|
|
212
|
+
}), () => n(null)), [i, n]), null;
|
|
211
213
|
}
|
|
212
|
-
var
|
|
213
|
-
let e =
|
|
214
|
+
var b = () => {
|
|
215
|
+
let e = a(_);
|
|
214
216
|
if (!e) throw Error("useAssetHandler must be used within AssetHandlerProvider");
|
|
215
217
|
return e;
|
|
216
|
-
},
|
|
218
|
+
}, x = {
|
|
217
219
|
asset: "Asset",
|
|
218
220
|
assets: "Assets"
|
|
219
|
-
},
|
|
220
|
-
let { terminology: e } =
|
|
221
|
+
}, S = () => {
|
|
222
|
+
let { terminology: e } = b();
|
|
221
223
|
return {
|
|
222
|
-
asset: e?.asset ||
|
|
223
|
-
assets: e?.assets ||
|
|
224
|
+
asset: e?.asset || x.asset,
|
|
225
|
+
assets: e?.assets || x.assets
|
|
224
226
|
};
|
|
225
|
-
},
|
|
226
|
-
let {
|
|
227
|
-
return
|
|
228
|
-
|
|
229
|
-
|
|
227
|
+
}, C = () => {
|
|
228
|
+
let { currency: e } = b(), i = e || "USD";
|
|
229
|
+
return s(() => ({
|
|
230
|
+
currency: i,
|
|
231
|
+
symbol: t(i),
|
|
232
|
+
format: (e) => n(e, i),
|
|
233
|
+
compact: r(i)
|
|
234
|
+
}), [i]);
|
|
235
|
+
}, w = () => {
|
|
236
|
+
let { hiddenCategoryIds: e } = b();
|
|
237
|
+
return s(() => new Set(e ?? []), [e]);
|
|
238
|
+
}, T = () => {
|
|
239
|
+
let { categoryLabels: e, categoryOptions: t } = b();
|
|
230
240
|
return {
|
|
231
241
|
labels: e,
|
|
232
242
|
options: t
|
|
233
243
|
};
|
|
234
|
-
},
|
|
235
|
-
let n =
|
|
236
|
-
link: new
|
|
244
|
+
}, E = ({ children: e, ...t }) => {
|
|
245
|
+
let n = s(() => new l({
|
|
246
|
+
link: new u({
|
|
237
247
|
uri: t.apiGatewayUrl ? `${t.apiGatewayUrl}/workspaces/graphql` : "/workspaces/graphql",
|
|
238
248
|
headers: t.authToken ? {
|
|
239
249
|
Authorization: `Bearer ${t.authToken}`,
|
|
240
250
|
...t.workspaceToken ? { "X-Workspace-Authorization": `Bearer ${t.workspaceToken}` } : {}
|
|
241
251
|
} : void 0
|
|
242
252
|
}),
|
|
243
|
-
cache: new
|
|
253
|
+
cache: new d()
|
|
244
254
|
}), [
|
|
245
255
|
t.apiGatewayUrl,
|
|
246
256
|
t.authToken,
|
|
247
257
|
t.workspaceToken
|
|
248
|
-
]), r = !!t.basePath,
|
|
258
|
+
]), r = !!t.basePath, i = /* @__PURE__ */ g(_.Provider, {
|
|
249
259
|
value: t,
|
|
250
|
-
children: [/* @__PURE__ */
|
|
260
|
+
children: [/* @__PURE__ */ h(y, {}), e]
|
|
251
261
|
});
|
|
252
|
-
return r ?
|
|
262
|
+
return r ? i : /* @__PURE__ */ h(p, {
|
|
253
263
|
client: n,
|
|
254
|
-
children: /* @__PURE__ */
|
|
264
|
+
children: /* @__PURE__ */ h(c, { children: i })
|
|
255
265
|
});
|
|
256
266
|
};
|
|
257
267
|
//#endregion
|
|
258
|
-
export {
|
|
268
|
+
export { E as AssetHandlerProvider, T as useAssetCategoryPresentation, b as useAssetHandler, C as useAssetMoney, S as useAssetTerminology, w as useHiddenCategoryIds };
|
|
259
269
|
|
|
260
270
|
//# sourceMappingURL=AssetHandlerProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetHandlerProvider.js","names":[],"sources":["../../../src/assethandler/providers/AssetHandlerProvider.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useEffect } from 'react';\nimport { MemoryRouter } from 'react-router';\nimport { ApolloClient, HttpLink, InMemoryCache, gql } from '@apollo/client';\nimport { ApolloProvider, useQuery } from '@apollo/client/react';\nimport type { AssetHandlerRootProps } from '../types';\nimport type { AssetHandlerBootstrapPayload } from '../store/assethandlerStore';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nexport { formatAssetCategory } from '../utils/categoryPresentation';\n\ntype AssetHandlerContextValue = AssetHandlerRootProps;\n\nconst AssetHandlerContext = createContext<AssetHandlerContextValue | null>(null);\n\nconst ASSETHANDLER_BOOTSTRAP_QUERY = gql`\n query AssetHandlerBootstrap {\n dashboardOverview {\n totalAssets\n openIncidents\n openWorkOrders\n totalTransactions\n }\n assets {\n id\n assetNumber\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 department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n incidents {\n id\n title\n description\n category\n priority\n status\n assignedTo\n reportedBy\n reportedAt\n resolvedAt\n resolution\n slaBreached\n }\n workOrders {\n id\n title\n description\n type\n status\n priority\n assetId\n assignedTo\n createdAt\n updatedAt\n completedAt\n }\n maintenanceRecords {\n id\n assetId\n title\n description\n type\n status\n priority\n scheduledAt\n completedAt\n estimatedCost\n actualCost\n checklist\n createdAt\n updatedAt\n }\n transactions {\n id\n type\n status\n amount\n currency\n category\n description\n vendor\n department\n occurredAt\n }\n changeRequests {\n id\n title\n description\n type\n status\n risk\n requestedBy\n assignedTo\n affectedAssets\n scheduledStart\n scheduledEnd\n approvals\n createdAt\n updatedAt\n }\n problems {\n id\n title\n description\n status\n priority\n category\n assignedTo\n relatedIncidents\n rootCause\n workaround\n resolution\n createdAt\n updatedAt\n }\n budgets {\n id\n name\n category\n allocated\n spent\n remaining\n period\n department\n status\n }\n invoices {\n id\n number\n vendor\n amount\n currency\n issueDate\n dueDate\n status\n items\n relatedPO\n paidAt\n }\n securityEvents: getVaultSecurityEvents {\n items {\n id\n eventType\n severity\n title: message\n description\n source: resourceType\n userId\n ipAddress\n occurredAt: timestamp\n resolved: reviewed\n }\n }\n complianceFrameworks: securityComplianceFrameworks(filter: { sourceProduct: \"assethandler\" }) {\n items {\n id\n name\n version\n status\n score\n totalControls\n passedControls\n failedControls\n lastAssessment\n nextAssessment\n lastAssessedAt\n }\n }\n securityPolicies: securityGovernancePolicies(filter: { sourceProduct: \"assethandler\" }) {\n items {\n id\n name\n description\n category\n status\n version\n effectiveDate\n reviewDate\n owner\n applicableTo\n }\n }\n }\n`;\n\nfunction AssetHandlerBootstrapHydrator() {\n const hydrateFromBootstrap = useAssetHandlerStore((s) => s.hydrateFromBootstrap);\n const setBootstrapRefetch = useAssetHandlerStore((s) => s.setBootstrapRefetch);\n const { data, refetch } = useQuery<AssetHandlerBootstrapPayload>(ASSETHANDLER_BOOTSTRAP_QUERY, {\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n });\n\n useEffect(() => {\n if (data) {\n hydrateFromBootstrap(data);\n }\n }, [data, hydrateFromBootstrap]);\n\n useEffect(() => {\n setBootstrapRefetch(() => {\n void refetch();\n });\n return () => setBootstrapRefetch(null);\n }, [refetch, setBootstrapRefetch]);\n\n return null;\n}\n\nexport const useAssetHandler = () => {\n const context = useContext(AssetHandlerContext);\n if (!context) throw new Error('useAssetHandler must be used within AssetHandlerProvider');\n return context;\n};\n\nexport const DEFAULT_TERMINOLOGY = { asset: 'Asset', assets: 'Assets' } as const;\n\n/**\n * Resolved singular/plural noun for the module, applying consumer overrides on\n * top of the module defaults (\"Asset\"/\"Assets\").\n */\nexport const useAssetTerminology = (): { asset: string; assets: string } => {\n const { terminology } = useAssetHandler();\n return {\n asset: terminology?.asset || DEFAULT_TERMINOLOGY.asset,\n assets: terminology?.assets || DEFAULT_TERMINOLOGY.assets,\n };\n};\n\n/** Set of category ids the consumer asked to hide (empty by default). */\nexport const useHiddenCategoryIds = (): Set<string> => {\n const { hiddenCategoryIds } = useAssetHandler();\n return useMemo(() => new Set(hiddenCategoryIds ?? []), [hiddenCategoryIds]);\n};\n\nexport const useAssetCategoryPresentation = (): {\n labels?: Record<string, string>;\n options?: AssetHandlerRootProps['categoryOptions'];\n} => {\n const { categoryLabels, categoryOptions } = useAssetHandler();\n return { labels: categoryLabels, options: categoryOptions };\n};\n\nexport const AssetHandlerProvider: FC<PropsWithChildren<AssetHandlerRootProps>> = ({\n children,\n ...props\n}) => {\n const apolloClient = useMemo(\n () =>\n new ApolloClient({\n link: new HttpLink({\n uri: props.apiGatewayUrl\n ? `${props.apiGatewayUrl}/workspaces/graphql`\n : '/workspaces/graphql',\n headers: props.authToken\n ? {\n Authorization: `Bearer ${props.authToken}`,\n ...(props.workspaceToken\n ? { 'X-Workspace-Authorization': `Bearer ${props.workspaceToken}` }\n : {}),\n }\n : undefined,\n }),\n cache: new InMemoryCache(),\n }),\n [props.apiGatewayUrl, props.authToken, props.workspaceToken]\n );\n\n const isIntegrated = !!props.basePath;\n const content = (\n <AssetHandlerContext.Provider value={props}>\n <AssetHandlerBootstrapHydrator />\n {children}\n </AssetHandlerContext.Provider>\n );\n\n return isIntegrated ? (\n content\n ) : (\n <ApolloProvider client={apolloClient}>\n <MemoryRouter>{content}</MemoryRouter>\n </ApolloProvider>\n );\n};\n"],"mappings":";;;;;;;;AAYA,IAAM,IAAsB,EAA+C,KAAK,EAE1E,IAA+B,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiMxC,SAAS,IAAgC;CACvC,IAAM,IAAuB,GAAsB,MAAM,EAAE,qBAAqB,EAC1E,IAAsB,GAAsB,MAAM,EAAE,oBAAoB,EACxE,EAAE,SAAM,eAAY,EAAuC,GAA8B;EAC7F,aAAa;EACb,aAAa;EACd,CAAC;AAeF,QAbA,QAAgB;AACd,EAAI,KACF,EAAqB,EAAK;IAE3B,CAAC,GAAM,EAAqB,CAAC,EAEhC,SACE,QAA0B;AACnB,KAAS;GACd,QACW,EAAoB,KAAK,GACrC,CAAC,GAAS,EAAoB,CAAC,EAE3B;;AAGT,IAAa,UAAwB;CACnC,IAAM,IAAU,EAAW,EAAoB;AAC/C,KAAI,CAAC,EAAS,OAAU,MAAM,2DAA2D;AACzF,QAAO;GAGI,IAAsB;CAAE,OAAO;CAAS,QAAQ;CAAU,EAM1D,UAA+D;CAC1E,IAAM,EAAE,mBAAgB,GAAiB;AACzC,QAAO;EACL,OAAO,GAAa,SAAS,EAAoB;EACjD,QAAQ,GAAa,UAAU,EAAoB;EACpD;GAIU,UAA0C;CACrD,IAAM,EAAE,yBAAsB,GAAiB;AAC/C,QAAO,QAAc,IAAI,IAAI,KAAqB,EAAE,CAAC,EAAE,CAAC,EAAkB,CAAC;GAGhE,UAGR;CACH,IAAM,EAAE,mBAAgB,uBAAoB,GAAiB;AAC7D,QAAO;EAAE,QAAQ;EAAgB,SAAS;EAAiB;GAGhD,KAAsE,EACjF,aACA,GAAG,QACC;CACJ,IAAM,IAAe,QAEjB,IAAI,EAAa;EACf,MAAM,IAAI,EAAS;GACjB,KAAK,EAAM,gBACP,GAAG,EAAM,cAAc,uBACvB;GACJ,SAAS,EAAM,YACX;IACE,eAAe,UAAU,EAAM;IAC/B,GAAI,EAAM,iBACN,EAAE,6BAA6B,UAAU,EAAM,kBAAkB,GACjE,EAAE;IACP,GACD,KAAA;GACL,CAAC;EACF,OAAO,IAAI,GAAe;EAC3B,CAAC,EACJ;EAAC,EAAM;EAAe,EAAM;EAAW,EAAM;EAAe,CAC7D,EAEK,IAAe,CAAC,CAAC,EAAM,UACvB,IACJ,kBAAC,EAAoB,UAArB;EAA8B,OAAO;YAArC,CACE,kBAAC,GAAD,EAAiC,CAAA,EAChC,EAC4B;;AAGjC,QAAO,IACL,IAEA,kBAAC,GAAD;EAAgB,QAAQ;YACtB,kBAAC,GAAD,EAAA,UAAe,GAAuB,CAAA;EACvB,CAAA"}
|
|
1
|
+
{"version":3,"file":"AssetHandlerProvider.js","names":[],"sources":["../../../src/assethandler/providers/AssetHandlerProvider.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useEffect } from 'react';\nimport { MemoryRouter } from 'react-router';\nimport { ApolloClient, HttpLink, InMemoryCache, gql } from '@apollo/client';\nimport { ApolloProvider, useQuery } from '@apollo/client/react';\nimport type { AssetHandlerRootProps } from '../types';\nimport type { AssetHandlerBootstrapPayload } from '../store/assethandlerStore';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { DEFAULT_CURRENCY, currencySymbol, formatMoney } from '../utils/money';\nimport type { ValueFormatter } from '../components/charts/chartTheme';\nimport { formatCurrencyCompact } from '../components/charts/chartTheme';\nexport { formatAssetCategory } from '../utils/categoryPresentation';\n\ntype AssetHandlerContextValue = AssetHandlerRootProps;\n\nconst AssetHandlerContext = createContext<AssetHandlerContextValue | null>(null);\n\nconst ASSETHANDLER_BOOTSTRAP_QUERY = gql`\n query AssetHandlerBootstrap {\n dashboardOverview {\n totalAssets\n openIncidents\n openWorkOrders\n totalTransactions\n }\n assets {\n id\n assetNumber\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 department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n incidents {\n id\n title\n description\n category\n priority\n status\n assignedTo\n reportedBy\n reportedAt\n resolvedAt\n resolution\n slaBreached\n }\n workOrders {\n id\n title\n description\n type\n status\n priority\n assetId\n assignedTo\n createdAt\n updatedAt\n completedAt\n }\n maintenanceRecords {\n id\n assetId\n title\n description\n type\n status\n priority\n scheduledAt\n completedAt\n estimatedCost\n actualCost\n checklist\n createdAt\n updatedAt\n }\n transactions {\n id\n type\n status\n amount\n currency\n category\n description\n vendor\n department\n occurredAt\n }\n changeRequests {\n id\n title\n description\n type\n status\n risk\n requestedBy\n assignedTo\n affectedAssets\n scheduledStart\n scheduledEnd\n approvals\n createdAt\n updatedAt\n }\n problems {\n id\n title\n description\n status\n priority\n category\n assignedTo\n relatedIncidents\n rootCause\n workaround\n resolution\n createdAt\n updatedAt\n }\n budgets {\n id\n name\n category\n allocated\n spent\n remaining\n period\n department\n status\n }\n invoices {\n id\n number\n vendor\n amount\n currency\n issueDate\n dueDate\n status\n items\n relatedPO\n paidAt\n }\n securityEvents: getVaultSecurityEvents {\n items {\n id\n eventType\n severity\n title: message\n description\n source: resourceType\n userId\n ipAddress\n occurredAt: timestamp\n resolved: reviewed\n }\n }\n complianceFrameworks: securityComplianceFrameworks(filter: { sourceProduct: \"assethandler\" }) {\n items {\n id\n name\n version\n status\n score\n totalControls\n passedControls\n failedControls\n lastAssessment\n nextAssessment\n lastAssessedAt\n }\n }\n securityPolicies: securityGovernancePolicies(filter: { sourceProduct: \"assethandler\" }) {\n items {\n id\n name\n description\n category\n status\n version\n effectiveDate\n reviewDate\n owner\n applicableTo\n }\n }\n }\n`;\n\nfunction AssetHandlerBootstrapHydrator() {\n const hydrateFromBootstrap = useAssetHandlerStore((s) => s.hydrateFromBootstrap);\n const setBootstrapRefetch = useAssetHandlerStore((s) => s.setBootstrapRefetch);\n const { data, refetch } = useQuery<AssetHandlerBootstrapPayload>(ASSETHANDLER_BOOTSTRAP_QUERY, {\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n });\n\n useEffect(() => {\n if (data) {\n hydrateFromBootstrap(data);\n }\n }, [data, hydrateFromBootstrap]);\n\n useEffect(() => {\n setBootstrapRefetch(() => {\n void refetch();\n });\n return () => setBootstrapRefetch(null);\n }, [refetch, setBootstrapRefetch]);\n\n return null;\n}\n\nexport const useAssetHandler = () => {\n const context = useContext(AssetHandlerContext);\n if (!context) throw new Error('useAssetHandler must be used within AssetHandlerProvider');\n return context;\n};\n\nexport const DEFAULT_TERMINOLOGY = { asset: 'Asset', assets: 'Assets' } as const;\n\n/**\n * Resolved singular/plural noun for the module, applying consumer overrides on\n * top of the module defaults (\"Asset\"/\"Assets\").\n */\nexport const useAssetTerminology = (): { asset: string; assets: string } => {\n const { terminology } = useAssetHandler();\n return {\n asset: terminology?.asset || DEFAULT_TERMINOLOGY.asset,\n assets: terminology?.assets || DEFAULT_TERMINOLOGY.assets,\n };\n};\n\n/**\n * Resolved money presentation for the module: the consumer's `currency` prop\n * with the module default (\"USD\") applied, plus the three formatters every\n * surface needs. Amounts are never converted — see {@link formatMoney}.\n */\nexport const useAssetMoney = (): {\n currency: string;\n symbol: string;\n /** Full amount; renders an em dash for null/undefined/non-finite. */\n format: (value: number | null | undefined) => string;\n /** Compact amount for axis ticks and dense KPIs, e.g. `₹8.5L`. */\n compact: ValueFormatter;\n} => {\n const { currency } = useAssetHandler();\n const resolved = currency || DEFAULT_CURRENCY;\n return useMemo(\n () => ({\n currency: resolved,\n symbol: currencySymbol(resolved),\n format: (value: number | null | undefined) => formatMoney(value, resolved),\n compact: formatCurrencyCompact(resolved),\n }),\n [resolved]\n );\n};\n\n/** Set of category ids the consumer asked to hide (empty by default). */\nexport const useHiddenCategoryIds = (): Set<string> => {\n const { hiddenCategoryIds } = useAssetHandler();\n return useMemo(() => new Set(hiddenCategoryIds ?? []), [hiddenCategoryIds]);\n};\n\nexport const useAssetCategoryPresentation = (): {\n labels?: Record<string, string>;\n options?: AssetHandlerRootProps['categoryOptions'];\n} => {\n const { categoryLabels, categoryOptions } = useAssetHandler();\n return { labels: categoryLabels, options: categoryOptions };\n};\n\nexport const AssetHandlerProvider: FC<PropsWithChildren<AssetHandlerRootProps>> = ({\n children,\n ...props\n}) => {\n const apolloClient = useMemo(\n () =>\n new ApolloClient({\n link: new HttpLink({\n uri: props.apiGatewayUrl\n ? `${props.apiGatewayUrl}/workspaces/graphql`\n : '/workspaces/graphql',\n headers: props.authToken\n ? {\n Authorization: `Bearer ${props.authToken}`,\n ...(props.workspaceToken\n ? { 'X-Workspace-Authorization': `Bearer ${props.workspaceToken}` }\n : {}),\n }\n : undefined,\n }),\n cache: new InMemoryCache(),\n }),\n [props.apiGatewayUrl, props.authToken, props.workspaceToken]\n );\n\n const isIntegrated = !!props.basePath;\n const content = (\n <AssetHandlerContext.Provider value={props}>\n <AssetHandlerBootstrapHydrator />\n {children}\n </AssetHandlerContext.Provider>\n );\n\n return isIntegrated ? (\n content\n ) : (\n <ApolloProvider client={apolloClient}>\n <MemoryRouter>{content}</MemoryRouter>\n </ApolloProvider>\n );\n};\n"],"mappings":";;;;;;;;;;AAeA,IAAM,IAAsB,EAA+C,KAAK,EAE1E,IAA+B,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiMxC,SAAS,IAAgC;CACvC,IAAM,IAAuB,GAAsB,MAAM,EAAE,qBAAqB,EAC1E,IAAsB,GAAsB,MAAM,EAAE,oBAAoB,EACxE,EAAE,SAAM,eAAY,EAAuC,GAA8B;EAC7F,aAAa;EACb,aAAa;EACd,CAAC;AAeF,QAbA,QAAgB;AACd,EAAI,KACF,EAAqB,EAAK;IAE3B,CAAC,GAAM,EAAqB,CAAC,EAEhC,SACE,QAA0B;AACnB,KAAS;GACd,QACW,EAAoB,KAAK,GACrC,CAAC,GAAS,EAAoB,CAAC,EAE3B;;AAGT,IAAa,UAAwB;CACnC,IAAM,IAAU,EAAW,EAAoB;AAC/C,KAAI,CAAC,EAAS,OAAU,MAAM,2DAA2D;AACzF,QAAO;GAGI,IAAsB;CAAE,OAAO;CAAS,QAAQ;CAAU,EAM1D,UAA+D;CAC1E,IAAM,EAAE,mBAAgB,GAAiB;AACzC,QAAO;EACL,OAAO,GAAa,SAAS,EAAoB;EACjD,QAAQ,GAAa,UAAU,EAAoB;EACpD;GAQU,UAOR;CACH,IAAM,EAAE,gBAAa,GAAiB,EAChC,IAAW,KAAA;AACjB,QAAO,SACE;EACL,UAAU;EACV,QAAQ,EAAe,EAAS;EAChC,SAAS,MAAqC,EAAY,GAAO,EAAS;EAC1E,SAAS,EAAsB,EAAS;EACzC,GACD,CAAC,EAAS,CACX;GAIU,UAA0C;CACrD,IAAM,EAAE,yBAAsB,GAAiB;AAC/C,QAAO,QAAc,IAAI,IAAI,KAAqB,EAAE,CAAC,EAAE,CAAC,EAAkB,CAAC;GAGhE,UAGR;CACH,IAAM,EAAE,mBAAgB,uBAAoB,GAAiB;AAC7D,QAAO;EAAE,QAAQ;EAAgB,SAAS;EAAiB;GAGhD,KAAsE,EACjF,aACA,GAAG,QACC;CACJ,IAAM,IAAe,QAEjB,IAAI,EAAa;EACf,MAAM,IAAI,EAAS;GACjB,KAAK,EAAM,gBACP,GAAG,EAAM,cAAc,uBACvB;GACJ,SAAS,EAAM,YACX;IACE,eAAe,UAAU,EAAM;IAC/B,GAAI,EAAM,iBACN,EAAE,6BAA6B,UAAU,EAAM,kBAAkB,GACjE,EAAE;IACP,GACD,KAAA;GACL,CAAC;EACF,OAAO,IAAI,GAAe;EAC3B,CAAC,EACJ;EAAC,EAAM;EAAe,EAAM;EAAW,EAAM;EAAe,CAC7D,EAEK,IAAe,CAAC,CAAC,EAAM,UACvB,IACJ,kBAAC,EAAoB,UAArB;EAA8B,OAAO;YAArC,CACE,kBAAC,GAAD,EAAiC,CAAA,EAChC,EAC4B;;AAGjC,QAAO,IACL,IAEA,kBAAC,GAAD;EAAgB,QAAQ;YACtB,kBAAC,GAAD,EAAA,UAAe,GAAuB,CAAA;EACvB,CAAA"}
|
|
@@ -74,6 +74,16 @@ export interface AssetHandlerRootProps {
|
|
|
74
74
|
* to hiding nothing.
|
|
75
75
|
*/
|
|
76
76
|
hiddenCategoryIds?: string[];
|
|
77
|
+
/**
|
|
78
|
+
* ISO 4217 currency code used to LABEL every money figure the module renders
|
|
79
|
+
* — asset values, transactions, budgets, analytics. Defaults to "USD", so a
|
|
80
|
+
* host that sets nothing renders exactly as before.
|
|
81
|
+
*
|
|
82
|
+
* ★ Presentation only. Amounts are stored as plain numbers and nothing is
|
|
83
|
+
* converted: a purchase value of `850000` entered by an Indian farm was
|
|
84
|
+
* always ₹8.5 lakh and was merely being drawn with a dollar sign.
|
|
85
|
+
*/
|
|
86
|
+
currency?: string;
|
|
77
87
|
/** Consumer-owned category presentation for domain-specific asset flows. */
|
|
78
88
|
categoryLabels?: Record<string, string>;
|
|
79
89
|
/** Optional category taxonomy shown by create/edit/filter controls. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assethandler/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assethandler/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Money presentation for the module.
|
|
3
|
+
*
|
|
4
|
+
* Every amount the module stores is a plain number — the currency is purely a
|
|
5
|
+
* label put on it at render time. Nothing here converts anything: `850000`
|
|
6
|
+
* shown as `$850,000` and the same `850000` shown as `₹8,50,000` are the same
|
|
7
|
+
* stored value, and only one of them is telling the truth about the farm that
|
|
8
|
+
* entered it.
|
|
9
|
+
*
|
|
10
|
+
* The module's default stays `USD`, so a host that sets no `currency` prop
|
|
11
|
+
* renders exactly as it did before this existed.
|
|
12
|
+
*/
|
|
13
|
+
/** ISO 4217 code used when the host says nothing. Keeps existing consumers unchanged. */
|
|
14
|
+
export declare const DEFAULT_CURRENCY = "USD";
|
|
15
|
+
/**
|
|
16
|
+
* Full currency amount, e.g. `$850,000` / `₹8,50,000`.
|
|
17
|
+
*
|
|
18
|
+
* Locale is left to the browser (`undefined`), which is what `formatCompact`
|
|
19
|
+
* and `formatNumber` in `chartTheme` already do — so digit grouping follows the
|
|
20
|
+
* reader. An `en-IN` reader gets lakh grouping for free; an `en-US` reader gets
|
|
21
|
+
* western grouping with the right symbol. If a host ever needs to pin the
|
|
22
|
+
* grouping independently of the reader, that wants a `locale` prop, not a
|
|
23
|
+
* second currency argument.
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatMoney(value: number | null | undefined, currency?: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* The currency's symbol on its own, e.g. `$` / `₹` — for form-field adornments
|
|
28
|
+
* where the glyph sits beside the input rather than inside a formatted number.
|
|
29
|
+
*
|
|
30
|
+
* Falls back to the code itself (`INR`) rather than to a hard-coded `$`: a
|
|
31
|
+
* wrong symbol is a lie, an unfamiliar code is merely unhelpful.
|
|
32
|
+
*/
|
|
33
|
+
export declare function currencySymbol(currency?: string): string;
|
|
34
|
+
//# sourceMappingURL=money.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../../../src/assethandler/utils/money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,QAAQ,GAAE,MAAyB,GAClC,MAAM,CAUR;AAiBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAyB,GAAG,MAAM,CAS1E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function e(e, n = "USD") {
|
|
2
|
+
if (e == null || !Number.isFinite(Number(e))) return "—";
|
|
3
|
+
try {
|
|
4
|
+
return t(n).format(Number(e));
|
|
5
|
+
} catch {
|
|
6
|
+
return `${n} ${Number(e).toLocaleString()}`;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function t(e) {
|
|
10
|
+
return new Intl.NumberFormat(void 0, {
|
|
11
|
+
style: "currency",
|
|
12
|
+
currency: e,
|
|
13
|
+
minimumFractionDigits: 0,
|
|
14
|
+
maximumFractionDigits: 2
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function n(e = "USD") {
|
|
18
|
+
try {
|
|
19
|
+
return t(e).formatToParts(0).find((e) => e.type === "currency")?.value ?? e;
|
|
20
|
+
} catch {
|
|
21
|
+
return e;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { n as currencySymbol, e as formatMoney };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.js","names":[],"sources":["../../../src/assethandler/utils/money.ts"],"sourcesContent":["/**\n * Money presentation for the module.\n *\n * Every amount the module stores is a plain number — the currency is purely a\n * label put on it at render time. Nothing here converts anything: `850000`\n * shown as `$850,000` and the same `850000` shown as `₹8,50,000` are the same\n * stored value, and only one of them is telling the truth about the farm that\n * entered it.\n *\n * The module's default stays `USD`, so a host that sets no `currency` prop\n * renders exactly as it did before this existed.\n */\n\n/** ISO 4217 code used when the host says nothing. Keeps existing consumers unchanged. */\nexport const DEFAULT_CURRENCY = 'USD';\n\n/**\n * Full currency amount, e.g. `$850,000` / `₹8,50,000`.\n *\n * Locale is left to the browser (`undefined`), which is what `formatCompact`\n * and `formatNumber` in `chartTheme` already do — so digit grouping follows the\n * reader. An `en-IN` reader gets lakh grouping for free; an `en-US` reader gets\n * western grouping with the right symbol. If a host ever needs to pin the\n * grouping independently of the reader, that wants a `locale` prop, not a\n * second currency argument.\n */\nexport function formatMoney(\n value: number | null | undefined,\n currency: string = DEFAULT_CURRENCY\n): string {\n if (value == null || !Number.isFinite(Number(value))) return '—';\n try {\n return formatter(currency).format(Number(value));\n } catch {\n // `currency` is a host prop, so a malformed code ('', 'A', 'ABCD') reaches\n // us from outside. Intl throws RangeError on those, and this runs inside\n // every money render — an unguarded throw would blank the whole module.\n return `${currency} ${Number(value).toLocaleString()}`;\n }\n}\n\nfunction formatter(currency: string): Intl.NumberFormat {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n // `minimumFractionDigits: 0` is deliberate. Intl's currency default is 2,\n // which would print a whole ₹8,50,000 tractor as \"₹8,50,000.00\" — two\n // digits of noise on every figure in the module. The per-page helpers this\n // replaces used `maximumFractionDigits: 2` on a plain number, which also\n // hid the decimals on whole amounts; keeping that means the change is a\n // currency change and nothing else.\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n}\n\n/**\n * The currency's symbol on its own, e.g. `$` / `₹` — for form-field adornments\n * where the glyph sits beside the input rather than inside a formatted number.\n *\n * Falls back to the code itself (`INR`) rather than to a hard-coded `$`: a\n * wrong symbol is a lie, an unfamiliar code is merely unhelpful.\n */\nexport function currencySymbol(currency: string = DEFAULT_CURRENCY): string {\n try {\n const parts = formatter(currency).formatToParts(0);\n return parts.find((part) => part.type === 'currency')?.value ?? currency;\n } catch {\n // Same host-prop boundary as formatMoney: a malformed code must not take\n // the create form down with it.\n return currency;\n }\n}\n"],"mappings":"AA0BA,SAAgB,EACd,GACA,IAAA,OACQ;AACR,KAAI,KAAS,QAAQ,CAAC,OAAO,SAAS,OAAO,EAAM,CAAC,CAAE,QAAO;AAC7D,KAAI;AACF,SAAO,EAAU,EAAS,CAAC,OAAO,OAAO,EAAM,CAAC;SAC1C;AAIN,SAAO,GAAG,EAAS,GAAG,OAAO,EAAM,CAAC,gBAAgB;;;AAIxD,SAAS,EAAU,GAAqC;AACtD,QAAO,IAAI,KAAK,aAAa,KAAA,GAAW;EACtC,OAAO;EACP;EAOA,uBAAuB;EACvB,uBAAuB;EACxB,CAAC;;AAUJ,SAAgB,EAAe,IAAA,OAA6C;AAC1E,KAAI;AAEF,SADc,EAAU,EAAS,CAAC,cAAc,EAAE,CACrC,MAAM,MAAS,EAAK,SAAS,WAAW,EAAE,SAAS;SAC1D;AAGN,SAAO"}
|