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.