PageSourceSearch

https://app.clariumhealth.com/assets/item-detail-utilization.route-DDglwM2Y.js

js clariumhealth.com collected 2026-10-03 20:46:39 UTC 30,249 bytes, 702 lines download raw bytes

1import { o as __toESM } from "./chunk-6z4oVpB-.js";
2import "./capitalize-YV0fqYBS.js";
3import { t as require_react } from "./react-CCT1erMQ.js";
4import "./prop-types-BP3O0vhg.js";
5import { t as require_jsx_runtime } from "./jsx-runtime-6ToSbptA.js";
6import "./hoist-non-react-statics.cjs-aYVW55CP.js";
7import "./clsx-BbsgvS4T.js";
8import "./chainPropTypes-Bly6swO2.js";
9import "./Paper-BnSrFTB6.js";
10import "./typeof-CtObx4yR.js";
11import "./defineProperty-DbJZf-0N.js";
12import "./useTheme-DoOzSOnQ.js";
13import "./Amplify-D0fRojM9.js";
14import "./types-Badw_GZ3.js";
15import "./amplifyUrl-DDtOFVK1.js";
16import "./tslib.es6-DOCxQXyJ.js";
17import "./api-CPx3dJPV.js";
18import "./createCognitoUserPoolEndpointResolver-CeOq9LYq.js";
19import "./auth-112vuqrd.js";
20import { E as stableSort, I as formatDistanceToNowStrict, m as getComparator, o as formatDate, u as formatNumber } from "./helpers-CIThgqfh.js";
21import "./getCurrentUser-BNfTg9dP.js";
22import "./_setToArray-OJs2B4tA.js";
23import "./_baseGetTag-DyzlKCT_.js";
24import "./errors-Bz8_MS_m.js";
25import "./_Set-BMjVltMs.js";
26import "./_arrayPush-zqmRK2Sh.js";
27import "./isArray-DQJAKxTk.js";
28import "./isObjectLike-YfNJf3G6.js";
29import "./isArguments-jbXyUacA.js";
30import "./shim-tM7ZK01N.js";
31import "./use-isomorphic-layout-effect.browser.esm-B8DPirtA.js";
32import "./_arrayMap-CdYGT3WW.js";
33import "./isSymbol-fHles11u.js";
34import "./toString-BaR9Xa8n.js";
35import "./_basePropertyOf-jCWVBh4B.js";
36import "./transferTask-DmQEeV8J.js";
37import "./remove-Cy0lQM6m.js";
38import "./debounce-BI4AKE0v.js";
39import "./dist-9_GVLiOM.js";
40import "./dist-CuFlg_4O.js";
41import "./react-dom-ld7mzddK.js";
42import "./dist-DoGjUkMb.js";
43import "./dist-CNliTmfT.js";
44import "./classPrivateFieldGet2-T1C0ibFM.js";
45import "./dist-D_mba0Ln.js";
46import "./dist-wmihWyUh.js";
47import "./Combination-CbWrdVoQ.js";
48import "./dist-DNn8DQrd.js";
49import "./dist-4SRU2SWZ.js";
50import "./dist-auk7r2og.js";
51import "./dist-KMtZa6Tg.js";
52import "./dropdown-menu-Bura4Dcy.js";
53import "./select-CAOM9JtG.js";
54import "./dist-CvnDO-P6.js";
55import { n as ie } from "./esm-OeroYQy0.js";
56import { P as useRouteLoaderData, j as useParams } from "./chunk-62JRHF6Z-af5QuQJC.js";
57import "./exports-BpI0uky7.js";
58import "./notifyManager-DecSEhne.js";
59import "./useBaseQuery-B2Mj_MCe.js";
60import "./useInfiniteQuery-C4nk9Xz0.js";
61import "./useMutation-IAQRP4R7.js";
62import "./QueryClientProvider-C1UBWQV0.js";
63import "./useQuery-CSX9sxP2.js";
64import "./constants-DgZg1qAf.js";
65import "./session-CHB6zjYw.js";
66import "./iconPropTypes-C5chbmyn-FDi75KL4.js";
67import "./bucket-0-Dd64UaRz.js";
68import "./bucket-1-C6bHrojM.js";
69import { t as Calendar } from "./bucket-2-BGlGW4ET.js";
70import { o as ChevronRight } from "./bucket-3-C2c54QJ8.js";
71import "./bucket-6-Bmdc6sX9.js";
72import "./bucket-9-D26hyn0a.js";
73import "./bucket-10-23Eagi9e.js";
74import "./bucket-12-B_1FDRxt.js";
75import "./bucket-13-BcEElD4r.js";
76import "./bucket-14-CsPYJN2r.js";
77import "./bucket-15-CpUGvMi0.js";
78import "./bucket-16-CyywWRiY.js";
79import "./bucket-18-BdDXbEJz.js";
80import "./bucket-19-D0YP51jE.js";
81import "./dist-Z60waVX1.js";
82import "./dist-CWLu0srv.js";
83import "./createLucideIcon-COoV7LiJ.js";
84import "./check-DOlAikXd.js";
85import "./chevron-down-B2LT4j2G.js";
86import "./chevron-left-KK3O4Zh5.js";
87import "./chevron-right-D6LclTBO.js";
88import "./more-horizontal-MX1PRlOR.js";
89import { t as Search } from "./search-8Hqcfgqj.js";
90import { t as cn } from "./utils-DCaTMnxb.js";
91import "./use-toast-DjpclxwO.js";
92import "./mixpanel.module-BACt6dlR.js";
93import "./subDays-Bn5Ubekx.js";
94import "./format-DGSgaYyo.js";
95import "./differenceInSeconds-UipZMB3y.js";
96import "./addMonths-DV_ETa6N.js";
97import "./addYears-B4OCPROH.js";
98import "./endOfMonth-DiAWB7_8.js";
99import "./roundingMethods-XHnUL5k_.js";
100import "./differenceInWeeks-sFLJRI4F.js";
101import "./constants-fq6SDD6N.js";
102import "./startOfYear-EwWguQyv.js";
103import "./isValid-B-21K4uE.js";
104import "./addLeadingZeros-DTmdTJjv.js";
105import "./isSameYear-B4L00HFk.js";
106import "./unsupportedIterableToArray-sss3wv5M.js";
107import "./startOfMonth-BDv-jkgH.js";
108import "./vanilla-CLGkZFy8.js";
109import { r as useAtomValue } from "./react-DHanflfZ.js";
110import "./client.gen-BrTEPecv.js";
111import "./defineProperty-D5y_YB9q.js";
112import "./constants-CTwxR1wY.js";
113import { t as Button } from "./button-CgeNlB2Q.js";
114import "./breadcrumb-DV9NvwEZ.js";
115import "./tooltip-B35baM50.js";
116import { n as LongText_default } from "./LongText-BPuPQL-1.js";
117import { t as Badge } from "./badge-B_ZVhNO-.js";
118import "./module-icon-B5p6mCCk.js";
119import "./modules.api-DGo0G0c0.js";
120import "./dynamic-breadcrumbs-_-fMQBaM.js";
121import "./xstate-react.esm-Bnt7Kjod.js";
122import "./utils-B9FPGvAJ.js";
123import "./atoms-DP7aIs_n.js";
124import "./dynamic-breadcrumbs.utils-CfffO9VU.js";
125import "./Typography-Ds0rUQpc.js";
126import "./useSessionQuery-CaAx9LCq.js";
127import "./bootstrap-PD0gOsLT.js";
128import "./avatar-oyqGuiW5.js";
129import "./users-BmgN7Sdl.js";
130import "./command-BOGRc9Sm.js";
131import "./dist-FSwW85_l.js";
132import "./dialog-CHSk6eNP.js";
133import "./useDebounce-H0OkZLNE.js";
134import "./svg-icon-TH5Y1tt7.js";
135import "./track-BTherQuK.js";
136import "./sidebar-DQigFm0E.js";
137import "./main-B5_BDLTr.js";
138import "./parseAtMention-r5D-UbJw.js";
139import "./calendar-DJIrsEpF.js";
140import "./isThisYear-Bs3oEeLR.js";
141import "./RelativeDate-CvU78UoO.js";
142import "./utils-DMECC7FS.js";
143import "./comments-CJXe8Uor.js";
144import "./base-path-DffKLrHl.js";
145import "./zod-Cm5HR22p.js";
146import "./input-Ct-ouO13.js";
147import "./separator-keJIpHAu.js";
148import "./sheet-DOB9Or8E.js";
149import "./skeleton-BN73VL4N.js";
150import "./v4-BBDNiOOT.js";
151import { t as invariant } from "./tiny-invariant-wiz_5cyW.js";
152import "./colors-BE6kFbFY.js";
153import "./forms-Cc-Q6-j5.js";
154import "./useDebounceCallback-BTOGb8mZ.js";
155import { a as getExpandedRowModel, i as getCoreRowModel, n as useReactTable, o as getFilteredRowModel, r as createColumnHelper } from "./lib-BY10gxfc.js";
156import "./table-Dy8slfUO.js";
157import "./reset-to-first-page-C9Ia8cgw.js";
158import "./filter-search-params-BsP9grdP.js";
159import { o as useTableContext } from "./use-table-context-vmbhWTsO.js";
160import "./toConsumableArray-CbURU1_e.js";
161import { F as getCurrentClient, Wt as getUsageLocationsForItem } from "./sdk.gen-Bm4osd6G.js";
162import "./client-BXjQlaNr.js";
163import "./page-layout-B2r7ZEeF.js";
164import "./breadcrumb-BjTrkXIp.js";
165import { t as containers_default } from "./containers-tCHeBC2a.js";
166import { t as IconInput } from "./icon-input-CDNXspek.js";
167import { T as LAST_REPORTED_TOOLTIP } from "./api-DYsscDZP.js";
168import "./useMatchesData-BspVY2Cp.js";
169import "./api-BkfjtxrG.js";
170import "./queries-BCemRJki.js";
171import "./_baseFlatten-CQ5kwHSA.js";
172import { t as require_flatten } from "./flatten-C45Vd0Yy.js";
173import "./assignee-select-value-mUf-X1Sf.js";
174import "./utils-O1BD-TND.js";
175import { c as getManipulatedLocationNames } from "./tmpDataManipulation-LqS79Zqw.js";
176import "./table-meta-props-BSU7z6Gh.js";
177import "./Trigger-BoSVQJWZ.js";
178import "./dist-CbAgl5nj.js";
179import { n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-thS7yP-j.js";
180import "./ToolbarFilterNonParam-O65HaiCQ.js";
181import "./pluralize-zopUG0kl.js";
182import "./alert-dialog-D5UzG0QJ.js";
183import "./sidebar-DYeG06u4.js";
184import "./tabs-BHdYoQLd.js";
185import { r as DefaultTableCell, t as DefaultTableHead } from "./table-header-CTtTwFyN.js";
186import { t as Table } from "./table-BsIdRRX9.js";
187import { t as TableProvider } from "./table-provider-5zUFpHUQ.js";
188import "./event-severity-badge-CJmfbvHK.js";
189import "./columns-DX7wyb75.js";
190import { t as InfoToolTip } from "./InfoTooltip-2ydKh2zw.js";
191import "./_arrayIncludesWith-BCulhtkC.js";
192import "./_baseUniq-CBb66NNg.js";
193import { n as selectedUOMDetailAtomFamily, t as selectedPeriod } from "./atoms-DqC31a9x.js";
194import "./date-picker-DCGzwjWR.js";
195import { t as EmptyTableState } from "./EmptyState-CtBqraYg.js";
196import "./uniq-H_UT7B0b.js";
197import "./queries-p_6z-Zej.js";
198import "./global-CsycSdmI.js";
199import "./thumbnailUrl-CM9vwyYE.js";
200import "./images-B4lywOg8.js";
201import "./substitutes-vsbjey3-.js";
202import "./EmptyThumbnail-ACeq47Ok.js";
203import "./use-has-thumbnail-signed-url-8SiETZx-.js";
204import "./ImageDialog-x99TfmAd.js";
205import "./es-D1rf6MqR.js";
206import "./Thumbnail-DQuBjq9O.js";
207import "./useRouteMatch-D69Df39V.js";
208import "./MentionCommentBox-BLN67Y3C.js";
209import "./constants-9bN4NDG0.js";
210import "./unescape-D6HLYxsQ.js";
211import "./use-guarded-fetcher-CjgqKSRj.js";
212import "./CommentsAndActivities-DjilNeSI.js";
213import "./Container-Cqzmen0I.js";
214import "./use-loader-fetcher-CtTh3Rr6.js";
215import "./types-CkFXBpU0.js";
216import "./item-detail-events.route-kDg8O6UC.js";
217import "./current-user.route-g_ujdfeq.js";
218import "./hooks-3U4AvwAV.js";
219import "./disruption-fields-CKNXcrcZ.js";
220import "./disruption-types-cz2K7rKY.js";
221import "./ActivityHistory-DWf03Cwd.js";
222import "./activity-history-formatting-B78FEIzT.js";
223import "./item-labels-DVIa6r_U.js";
224import "./label-options-DvQtm8Nu.js";
225import "./constants-1CtwLJlH.js";
226import { o as selectUOMMap, r as useDrmItem } from "./item-detail.route-BNYfxqj4.js";
227import "./watchers-BsTLsTDe.js";
228import "./group-options-b35C2MO2.js";
229import "./period-select-xf0VEMK-.js";
230import "./location-options-BlMFQfCY.js";
231import "./permissions-CBl16tTq.js";
232var import_react = /* @__PURE__ */ __toESM(require_react(), 1);
233var import_jsx_runtime = /* @__PURE__ */ __toESM(require_jsx_runtime());
234function MoreInfoPopover({ buttonText, items }) {
235	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Popover, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PopoverTrigger, {
236		asChild: true,
237		children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button, {
238			variant: "ghost",
239			className: "h-7 whitespace-nowrap bg-primary-purple/15 px-2 py-1 text-indigo-500 hover:bg-primary-purple/30",
240			children: buttonText
241		})
242	}
242), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PopoverContent, {
243		className: "bg-white px-3 py-2",
244		children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", {
245			className: "py-1 text-black",
246			children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
247				className: "text-left",
248				children: item
249			})
250		}, item + i)) })
251	})] });
252}
253var more_info_popover_default = MoreInfoPopover;
254function PeriodPill({ period }) {
255	const [, num, type] = period.split("_");
256	const label = `Last ${num} ${type[0]}`;
257	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
258		variant: "outline",
259		className: "gap-1 self-start px-1",
260		children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Calendar, { className: "size-3" }), label]
261	});
262}
263function QOHAndUOM({ quantity, uom }) {
264	if (typeof quantity === "number") return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
265		formatNumber(quantity, 1),
266		" ",
267		uom !== null && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
268			className: "text-zinc-500",
269			children: uom
270		})
271	] });
272	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: "–" });
273}
274var qoh_and_uom_default = QOHAndUOM;
275function TableShell(props) {
276	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
277		className: props.className,
278		children: [props.title || props.lastReported ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
279			className: "flex items-center gap-1 pb-2",
280			children: [
281				props.title ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
282					className: "type-body font-medium",
283					children: props.title
284				}) : null,
285				props.lastReported ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
286					className: "type-eyebrow text-zinc-500",
287					children: [
288						formatDate(props.lastReported, "numeric", "2-digit", "2-digit", "numeric", "numeric"),
289						" (",
290						formatDistanceToNowStrict(new Date(props.lastReported)),
291						" ago)"
292					]
293				}) : null,
294				props.tooltip ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InfoToolTip, {
295					info: props.tooltip,
296					iconClassName: "text-zinc-400 group-hover:text-zinc-600 ml-1"
297				}) : null
298			]
299		}) : null, /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: props.emptyMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTableState, { message: props.emptyMessage }) : props.children })]
300	});
301}
302var import_flatten = /* @__PURE__ */ __toESM(require_flatten(), 1);
303function add(a, b) {
304	return a + b;
305}
306function parseToNumber(value) {
307	if (value == null || value === "") return null;
308	const n = typeof value === "number" ? value : parseFloat(String(value));
309	return Number.isFinite(n) ? n : null;
310}
311function total(arr, attr, period, conversionRate) {
312	const flattenedValues = (0, import_flatten.default)(arr.map((u) => u.department_utilizations.map((d) => parseToNumber(d[attr][period])).filter((n) => n !== null)));
313	return flattenedValues.length > 0 ? flattenedValues.reduce(add, 0) / conversionRate : null;
314}
315function totalUtilizations(utilizations, period, conversionRate) {
316	const quantityOnHandValues = (0, import_flatten.default)(utilizations.map((u) => u.department_utilizations.map((d) => parseToNumber(d.unit_quantity_on_hand)).filter((n) => n !== null)));
317	const quantityOnHand = quantityOnHandValues.length > 0 ? quantityOnHandValues.reduce(add, 0) / conversionRate : null;
318	const averageDailyPOReceipts = total(utilizations, "unit_average_daily_po_receipts", period, conversionRate);
319	const averageDailyInventoryReceipts = total(utilizations, "unit_average_daily_inventory_receipts", period, conversionRate);
320	const totalDailyReceipts = total(utilizations, "unit_total_daily_receipts", period, conversionRate);
321	return {
322		quantityOnHand,
323		averageDailyPOReceipts,
324		averageDailyInventoryReceipts,
325		totalDailyReceipts,
326		daysOnHand: (0, import_flatten.default)(utilizations.map((u) => u.department_utilizations.map((d) => parseToNumber(d.days_on_hand[period])).filter((n) => n !== null))).length > 0 && totalDailyReceipts && typeof quantityOnHand === "number" ? quantityOnHand / totalDailyReceipts : null
327	};
328}
329function normalizeDepartment(department, period, conversionRate) {
330	return stableSort(department.map((u) => {
331		const uomQuantity = parseToNumber(u.unit_quantity_on_hand);
332		const averageDailyInventoryReceipts = parseToNumber(u.unit_average_daily_inventory_receipts[period]);
333		const averageDailyPOReceipts = parseToNumber(u.unit_average_daily_po_receipts[period]);
334		const totalDailyReceipts = parseToNumber(u.unit_total_daily_receipts[period]);
335		const daysOnHand = parseToNumber(u.days_on_hand[period]);
336		return {
337			departmentName: u.client_department_id ? `${u.department_name} | ${u.client_department_id}` : u.department_name,
338			quantityOnHand: uomQuantity !== null ? uomQuantity / conversionRate : null,
339			averageDailyPOReceipts: averageDailyPOReceipts !== null ? averageDailyPOReceipts / conversionRate : null,
340			averageDailyInventoryReceipts: averageDailyInventoryReceipts !== null ? averageDailyInventoryReceipts / conversionRate : null,
341			totalDailyReceipts: totalDailyReceipts !== null ? totalDailyReceipts / conversionRate : null,
342			daysOnHand: daysOnHand !== null ? daysOnHand : null
343		};
344	}).filter((u) => {
345		if (u.quantityOnHand !== null) return true;
346		return Boolean(u.averageDailyInventoryReceipts || u.averageDailyPOReceipts || u.totalDailyReceipts);
347	}), getComparator("asc", "totalDailyReceipts"));
348}
349function normalizeDepartmentUtilizations(utilizations, period, conversionRate) {
350	return stableSort(utilizations.map((u) => {
351		const department = u.department_utilizations;
352		const departmentUtilizations = normalizeDepartment(department, period, conversionRate);
353		const qohValues = departmentUtilizations.map((d) => d.quantityOnHand).filter((u$1) => typeof u$1 === "number");
354		const quantityOnHand = qohValues.length > 0 ? qohValues.reduce(add, 0) : null;
355		const averageDailyInventoryReceiptsValues = departmentUtilizations.map((d) => d.averageDailyInventoryReceipts).filter((u$1) => typeof u$1 === "number");
356		const averageDailyPOReceiptsValues = departmentUtilizations.map((d) => d.averageDailyPOReceipts).filter((u$1) => typeof u$1 === "number");
357		const totalDailyReceiptsValues = departmentUtilizations.map((d) => d.totalDailyReceipts).filter((u$1) => typeof u$1 === "number");
358		const totalDailyReceipts = totalDailyReceiptsValues.length > 0 ? totalDailyReceiptsValues.reduce(add, 0) : null;
359		const daysOnHand = (0, import_flatten.default)(department.map((d) => d.days_on_hand[period]).filter((u$1) => typeof u$1 === "number")).length > 0 && totalDailyReceipts && typeof quantityOnHand === "number" ? quantityOnHand / totalDailyReceipts : null;
360		return {
361			clinicalLocationName: u.clinical_location_name,
362			quantityOnHand,
363			averageDailyInventoryReceipts: averageDailyInventoryReceiptsValues.length > 0 ? averageDailyInventoryReceiptsValues.reduce(add, 0) : null,
364			averageDailyPOReceipts: averageDailyPOReceiptsValues.length > 0 ? averageDailyPOReceiptsValues.reduce(add, 0) : null,
365			totalDailyReceipts,
366			daysOnHand,
367			departmentUtilizations
368		};
369	}).filter((d) => d.departmentUtilizations.length > 0), getComparator("asc", "totalDailyReceipts"));
370}
371function formatValue(value) {
372	return typeof value === "number" ? formatNumber(value, 1) : value || "–";
373}
374function SearchFilter({ handleChange }) {
375	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(IconInput, {
376		icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Search, { className: "h-4 w-4 shrink-0" }),
377		onChange: handleChange,
378		className: cn("mb-0.5 w-[500px]"),
379		type: "search",
380		sz: "sm",
381		placeholder: "Search by location or department"
382	}) });
383}
384function useNormalizedUtilization(utilizations, uom, period) {
385	const conversionRate = selectUOMMap(useDrmItem()?.details)[uom]?.conversion_rate || 1;
386	return import_react.useMemo(() => ({
387		utilizations: utilizations ? normalizeDepartmentUtilizations(utilizations, period, conversionRate) : [],
388		totals: utilizations && utilizations.length > 1 ? totalUtilizations(utilizations, period, conversionRate) : null
389	}), [
390		utilizations,
391		period,
392		conversionRate
393	]);
394}
395function Utilization() {
396	const flags = ie();
397	const { itemId } = useParams();
398	const uom = useAtomValue(selectedUOMDetailAtomFamily(itemId));
399	const loaderData = useDrmItemUtilization();
400	const locationUtilizations = loaderData?.utilizationData?.clinical_location_utilizations;
401	const period = loaderData?.periodParam;
402	const { utilizations, totals } = useNormalizedUtilization(locationUtilizations, uom, period ?? "30_days");
403	const hasQohAndDohUtilizationColumns = flags["hasQohAndDohUtilizationColumns"] ?? false;
404	const { expanded, setExpanded } = useExpandedState(utilizations);
405	const lastReported = locationUtilizations ? locationUtilizations[0]?.department_utilizations[0]?.last_reported : void 0;
406	return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableProvider, {
407		table: useReactTable({
408			data: utilizations,
409			columns: columns.filter((column) => {
410				if (column.id === "quantityOnHand" || column.id === "daysOnHand") return hasQohAndDohUtilizationColumns;
411				return true;
412			}),
413			getFilteredRowModel: getFilteredRowModel(),
414			filterFromLeafRows: true,
415			getCoreRowModel: getCoreRowModel(),
416			getRowId: (row) => row.clinicalLocationName,
417			getExpandedRowModel: getExpandedRowModel(),
418			getSubRows: (row) => row.departmentUtilizations.map((item) => ({
419				clinicalLocationName: item.departmentName,
420				quantityOnHand: item.quantityOnHand,
421				totalDailyReceipts: item.totalDailyReceipts,
422				averageDailyInventoryReceipts: item.averageDailyInventoryReceipts,
423				averageDailyPOReceipts: item.averageDailyPOReceipts,
424				daysOnHand: item.daysOnHand,
425				departmentUtilizations: []
426			})),
427			initialState: { expanded: true },
428			state: { expanded },
429			onExpandedChange: setExpanded,
430			meta: {
431				hasDemoDataManipulation: flags["demoDataManipulation"],
432				uom,
433				totals
434			}
435		}),
436		isLoading: false,
437		children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SearchInput, { columnId: "clinicalLocationName" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableShell, {
438			lastReported: lastReported ? new Date(lastReported).toISOString() : void 0,
439			emptyMessage: !utilizations || utilizations.length === 0 ? "No utilization data." : void 0,
440			tooltip: lastReported ? LAST_REPORTED_TOOLTIP : void 0,
441			className: "pt-1",
442			children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Table, {
443				className: "isolate",
444				containerClassName: "max-h-[calc(var(--app-viewport-height)-var(--drm-header-height)-96px)] overflow-auto"
445			})
446		})]
447	});
448}
449var columnHelper = createColumnHelper();
450var columns = [
451	columnHelper.accessor("clinicalLocationName", {
452		id: "clinicalLocationName",
453		filterFn: "includesString",
454		header: (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
455			header: props.header,
456			children: "Location"
457		}),
458		cell: (props) => {
459			const rowName = props.table.options.meta.hasDemoDataManipulation ? getManipulatedLocationNames(props.getValue()) : props.getValue();
460			return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DefaultTableCell, {
461				cell: props.cell,
462				className: cn(props.row.getCanExpand() ? "gap-1" : "gap-3 bg-indigo-50/30"),
463				children: [props.row.getCanExpand() ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button, {
464					variant: "ghost",
465					size: "icon",
466					"aria-expanded": props.row.getIsExpanded(),
467					onClick: props.row.getToggleExpandedHandler(),
468					className: "group size-6 cursor-pointer",
469					children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronRight, { className: "group-aria-expanded:rotate-90" })
470				}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "size-6" }), rowName ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LongText_default, { text: formatValue(rowName) }) : "–"]
471			});
472		},
473		footer: (props) => {
474			if (!props.table.options.meta.totals) return void 0;
475			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
476				header: props.header,
477				children: "Total:"
478			});
479		}
480	}),
481	columnHelper.accessor("quantityOnHand", {
482		id: "quantityOnHand",
483		size: 200,
484		header: (props) => {
485			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
486				header: props.header,
487				className: "justify-end",
488				children: "QOH Department"
489			});
490		},
491		cell: (props) => {
492			const meta = props.table.options.meta;
493			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableCell, {
494				cell: props.cell,
495				className: cn("justify-end", props.row.getCanExpand() ? "" : "bg-indigo-50/30"),
496				children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(qoh_and_uom_default, {
497					quantity: props.getValue(),
498					uom: meta.uom
499				})
500			});
501		},
502		footer: (props) => {
503			const meta = props.table.options.meta;
504			if (!meta.totals) return void 0;
505			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
506				header: props.header,
507				className: "justify-end",
508				children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(qoh_and_uom_default, {
509					quantity: meta.totals.quantityOnHand,
510					uom: meta.uom
511				})
512			});
513		}
514	}),
515	columnHelper.display({
516		id: "averageDailyUse",
517		size: 200,
518		header: (props) => {
519			const period = useAtomValue(selectedPeriod);
520			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
521				header: props.header,
522				className: "justify-end",
523				children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
524					className: "flex flex-col",
525					children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Avg. Daily Use" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PeriodPill, { period })]
526				})
527			});
528		},
529		cell: (props) => {
530			const meta = props.table.options.meta;
531			return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DefaultTableCell, {
532				cell: props.cell,
533				className: cn("justify-end gap-1", props.row.getCanExpand() ? "" : "bg-indigo-50/30"),
534				children: [
535					/* @__PURE__ */ (0, import_jsx_runtime.jsx)(more_info_popover_default, {
536						buttonText: formatValue(props.row.original.totalDailyReceipts),
537						items: [`From Inventory: ${formatValue(props.row.original.averageDailyInventoryReceipts)}`, `Non-Stock: ${formatValue(props.row.original.averageDailyPOReceipts)}`]
538					}),
539					" ",
540					/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
541						className: "text-zinc-500",
542						children: meta.uom
543					})
544				]
545			});
546		},
547		footer: (props) => {
548			const meta = props.table.options.meta;
549			if (!meta.totals) return void 0;
550			return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DefaultTableHead, {
551				header: props.header,
552				className: "justify-end gap-1",
553				children: [
554					/* @__PURE__ */ (0, import_jsx_runtime.jsx)(more_info_popover_default, {
555						buttonText: formatValue(meta.totals.totalDailyReceipts),
556						items: [`From Inventory: ${formatValue(meta.totals.averageDailyInventoryReceipts)}`, `Non-Stock: ${formatValue(meta.totals.averageDailyPOReceipts)}`]
557					}),
558					" ",
559					/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
560						className: "text-zinc-500",
561						children: meta.uom
562					})
563				]
564			});
565		}
566	}),
567	columnHelper.accessor("daysOnHand", {
568		id: "daysOnHand",
569		size: 200,
570		header: (props) => {
571			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
572				header: props.header,
573				className: "justify-end",
574				children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
575					className: "flex items-center gap-1",
576					children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(InfoToolTip, {
577						info: [
578							"Calculated: QOH",
579							"Department / Avg",
580							"Daily Received"
581						],
582						iconClassName: "text-indigo-500 group-hover:text-indigo-400 m-0"
583					}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "DOH Department" })]
584				})
585			});
586		},
587		cell: (props) => {
588			const value = props.getValue();
589			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableCell, {
590				cell: props.cell,
591				className: cn("justify-end", props.row.getCanExpand() ? "" : "bg-indigo-50/30"),
592				children: typeof value === "number" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
593					className: "flex items-center gap-1",
594					children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: formatValue(value) }
594), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
595						className: "text-zinc-500",
596						children: "d"
597					})]
598				}) : "–"
599			});
600		},
601		footer: (props) => {
602			const meta = props.table.options.meta;
603			if (!meta.totals) return void 0;
604			const value = meta.totals.daysOnHand;
605			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
606				header: props.header,
607				className: "justify-end",
608				children: typeof value === "number" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
609					className: "flex items-center gap-1",
610					children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: formatValue(value) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
611						className: "text-zinc-500",
612						children: "d"
613					})]
614				}) : "–"
615			});
616		}
617	}),
618	columnHelper.display({
619		id: "departmentCount",
620		size: 149,
621		header: (props) => {
622			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, {
623				header: props.header,
624				className: "justify-end",
625				children: "# of Depts"
626			});
627		},
628		cell: (props) => {
629			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableCell, {
630				cell: props.cell,
631				className: cn("justify-end", props.row.getCanExpand() ? "" : "bg-indigo-50/30"),
632				children: props.row.getCanExpand() ? props.row.original.departmentUtilizations.length : null
633			});
634		},
635		footer: (props) => {
636			if (!props.table.options.meta.totals) return void 0;
637			return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DefaultTableHead, { header: props.header });
638		}
639	})
640];
641function useExpandedState(data) {
642	const [expanded, setExpanded] = import_react.useState({});
643	import_react.useEffect(() => {
644		if (data.length === 1) setExpanded({ [data[0].clinicalLocationName]: true });
645	}, [data]);
646	return {
647		expanded,
648		setExpanded
649	};
650}
651function SearchInput(props) {
652	const ctx = useTableContext();
653	const column = ctx.table.getColumn(props.columnId);
654	function handleChange(e) {
655		if (!column) return;
656		const searchValue = e.target.value.trim();
657		column.setFilterValue(searchValue);
658		if (searchValue) autoExpandParentRows(ctx.table);
659	}
660	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SearchFilter, { handleChange });
661}
662function autoExpandParentRows(table) {
663	const newExpanded = {};
664	const filteredRows = table.getFilteredRowModel().flatRows;
665	filteredRows.forEach((row) => {
666		if (row.getCanExpand()) {
667			if ((row.subRows || []).some((subRow) => filteredRows.some((filteredRow) => filteredRow.id === subRow.id))) newExpanded[row.id] = true;
668		}
669	});
670	table.setExpanded(newExpanded);
671}
672async function loader({ params, request }) {
673	invariant(params.itemId, "itemId is required");
674	const url = new URL(request.url);
675	const clinicalLocationParam = url.searchParams.get("clinical_location");
676	const clinicalLocationParams = clinicalLocationParam ? clinicalLocationParam.split(",") : null;
677	const locationGroupParam = url.searchParams.get("location_group");
678	const locationGroupParams = locationGroupParam ? locationGroupParam : null;
679	const periodParam = url.searchParams.get("period");
680	const { data: utilizationData } = await getUsageLocationsForItem({
681		path: { client_item_id: params.itemId },
682		query: {
683			clinical_location: clinicalLocationParams,
684			location_group: locationGroupParams
685		}
686	});
687	const { data: client } = await getCurrentClient();
688	return {
689		utilizationData,
690		clientName: client?.name,
691		periodParam
692	};
693}
694function useDrmItemUtilization() {
695	return useRouteLoaderData("item-detail-utilization");
696}
697function Component() {
698	return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(containers_default, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Utilization, {}) });
699}
700export { Component, loader, useDrmItemUtilization };
701
702//# sourceMappingURL=item-detail-utilization.route-DDglwM2Y.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.