@argusoft/medplat-product-management 1.0.2 → 1.0.3

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.
Files changed (79) hide show
  1. package/dist/{BrandsPage-CSA3meke.js → BrandsPage-NSvaMXWg.js} +76 -75
  2. package/dist/BrandsPage-NSvaMXWg.js.map +1 -0
  3. package/dist/{CategoriesPage-BrspzkJL.js → CategoriesPage-aZBZrDOi.js} +8 -8
  4. package/dist/{CategoriesPage-BrspzkJL.js.map → CategoriesPage-aZBZrDOi.js.map} +1 -1
  5. package/dist/{DashboardPage-CqaquOs2.js → DashboardPage-DjwlOhrd.js} +22 -22
  6. package/dist/DashboardPage-DjwlOhrd.js.map +1 -0
  7. package/dist/{FacilityPicker-Dv_H95WW.js → FacilityPicker-Chh-ZaR0.js} +2 -2
  8. package/dist/{FacilityPicker-Dv_H95WW.js.map → FacilityPicker-Chh-ZaR0.js.map} +1 -1
  9. package/dist/{InventoryPage-CPbzfDMR.js → InventoryPage-cy76UsMp.js} +109 -119
  10. package/dist/InventoryPage-cy76UsMp.js.map +1 -0
  11. package/dist/{MemberProfileCard-0vjO3Gzd.js → MemberProfileCard-CinPt09F.js} +6 -6
  12. package/dist/MemberProfileCard-CinPt09F.js.map +1 -0
  13. package/dist/{PaymentCreatePage-BYmDZAIB.js → PaymentCreatePage-BJe3LyFF.js} +148 -153
  14. package/dist/PaymentCreatePage-BJe3LyFF.js.map +1 -0
  15. package/dist/{PaymentsPage-BXPvKon-.js → PaymentsPage-DxHoKksN.js} +11 -11
  16. package/dist/{PaymentsPage-BXPvKon-.js.map → PaymentsPage-DxHoKksN.js.map} +1 -1
  17. package/dist/PickupCreatePage-Cq8zJ62Y.js +705 -0
  18. package/dist/PickupCreatePage-Cq8zJ62Y.js.map +1 -0
  19. package/dist/{PickupsPage-D66_Wta4.js → PickupsPage-BOygBQAb.js} +66 -74
  20. package/dist/PickupsPage-BOygBQAb.js.map +1 -0
  21. package/dist/{PmTable-B9970kPY.js → PmTable-CCpaJEA_.js} +4 -4
  22. package/dist/PmTable-CCpaJEA_.js.map +1 -0
  23. package/dist/{ProductEditPage-B8qFTCW9.js → ProductEditPage-DmdHO-fS.js} +109 -109
  24. package/dist/ProductEditPage-DmdHO-fS.js.map +1 -0
  25. package/dist/{ProductsPage-C7_r9cKn.js → ProductsPage-BglMe8EM.js} +6 -6
  26. package/dist/{ProductsPage-C7_r9cKn.js.map → ProductsPage-BglMe8EM.js.map} +1 -1
  27. package/dist/PurchaseCreatePage-1tYk41RS.js +590 -0
  28. package/dist/PurchaseCreatePage-1tYk41RS.js.map +1 -0
  29. package/dist/{PurchaseRequestDetailPage-C7aAwEqw.js → PurchaseRequestDetailPage-BYLx3aBI.js} +14 -14
  30. package/dist/PurchaseRequestDetailPage-BYLx3aBI.js.map +1 -0
  31. package/dist/{PurchaseRequestsPage-BwCkbpaX.js → PurchaseRequestsPage-D2yorc4s.js} +4 -4
  32. package/dist/{PurchaseRequestsPage-BwCkbpaX.js.map → PurchaseRequestsPage-D2yorc4s.js.map} +1 -1
  33. package/dist/{PurchasesPage-CvaZouVy.js → PurchasesPage-CanQTjlw.js} +3 -3
  34. package/dist/{PurchasesPage-CvaZouVy.js.map → PurchasesPage-CanQTjlw.js.map} +1 -1
  35. package/dist/{SaleCreatePage-DP1Qmltu.js → SaleCreatePage-DxFvPvju.js} +145 -170
  36. package/dist/SaleCreatePage-DxFvPvju.js.map +1 -0
  37. package/dist/{SalesPage-CO3cdYX5.js → SalesPage-CPMrdr5-.js} +12 -12
  38. package/dist/SalesPage-CPMrdr5-.js.map +1 -0
  39. package/dist/SettingsPage-CEy922rW.js +662 -0
  40. package/dist/SettingsPage-CEy922rW.js.map +1 -0
  41. package/dist/{StorageUnitsPage-B9Hr_RkW.js → StorageUnitsPage-DfLT6xC_.js} +13 -13
  42. package/dist/{StorageUnitsPage-B9Hr_RkW.js.map → StorageUnitsPage-DfLT6xC_.js.map} +1 -1
  43. package/dist/{TransactionsPage-HKIGwEZN.js → TransactionsPage-KFUJ4O5g.js} +4 -4
  44. package/dist/TransactionsPage-KFUJ4O5g.js.map +1 -0
  45. package/dist/TransferCreatePage-k1tsRGB3.js +315 -0
  46. package/dist/TransferCreatePage-k1tsRGB3.js.map +1 -0
  47. package/dist/TransfersPage-CDafSVO9.js +470 -0
  48. package/dist/TransfersPage-CDafSVO9.js.map +1 -0
  49. package/dist/VialsPage-DPsYFgaQ.js +897 -0
  50. package/dist/VialsPage-DPsYFgaQ.js.map +1 -0
  51. package/dist/{currency-ClRLIEg2.js → currency-bVQ7aEk2.js} +141 -506
  52. package/dist/currency-bVQ7aEk2.js.map +1 -0
  53. package/dist/index.js +1 -1
  54. package/package.json +1 -1
  55. package/dist/BrandsPage-CSA3meke.js.map +0 -1
  56. package/dist/DashboardPage-CqaquOs2.js.map +0 -1
  57. package/dist/InventoryPage-CPbzfDMR.js.map +0 -1
  58. package/dist/MemberProfileCard-0vjO3Gzd.js.map +0 -1
  59. package/dist/PaymentCreatePage-BYmDZAIB.js.map +0 -1
  60. package/dist/PickupCreatePage-CMGwoAXj.js +0 -426
  61. package/dist/PickupCreatePage-CMGwoAXj.js.map +0 -1
  62. package/dist/PickupsPage-D66_Wta4.js.map +0 -1
  63. package/dist/PmTable-B9970kPY.js.map +0 -1
  64. package/dist/ProductEditPage-B8qFTCW9.js.map +0 -1
  65. package/dist/PurchaseCreatePage-CDfNDcKG.js +0 -627
  66. package/dist/PurchaseCreatePage-CDfNDcKG.js.map +0 -1
  67. package/dist/PurchaseRequestDetailPage-C7aAwEqw.js.map +0 -1
  68. package/dist/SaleCreatePage-DP1Qmltu.js.map +0 -1
  69. package/dist/SalesPage-CO3cdYX5.js.map +0 -1
  70. package/dist/SettingsPage-DvVRwSFw.js +0 -711
  71. package/dist/SettingsPage-DvVRwSFw.js.map +0 -1
  72. package/dist/TransactionsPage-HKIGwEZN.js.map +0 -1
  73. package/dist/TransferCreatePage-DMuZqQ3c.js +0 -363
  74. package/dist/TransferCreatePage-DMuZqQ3c.js.map +0 -1
  75. package/dist/TransfersPage-COIyouL4.js +0 -480
  76. package/dist/TransfersPage-COIyouL4.js.map +0 -1
  77. package/dist/VialsPage-BNPUwGCU.js +0 -922
  78. package/dist/VialsPage-BNPUwGCU.js.map +0 -1
  79. package/dist/currency-ClRLIEg2.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickupCreatePage-Cq8zJ62Y.js","names":[],"sources":["../../node_modules/dayjs/dayjs.min.js","../src/views/PickupCreatePage.jsx"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n Grid,\n Stack,\n TextField,\n} from '@mui/material';\nimport { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport dayjs from 'dayjs';\nimport SaveRoundedIcon from '@mui/icons-material/SaveRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect } from '@pm/utils/permissions';\nimport { PmFormSection, PmSelect } from '@pm/components/PmTable';\nimport {\n listBatches,\n listFacilities,\n listMyOpenPickups,\n recordPickup,\n} from '@pm/services/pmApi';\nimport { formatDate } from '@pm/utils/format';\n\n// Only facility-owned, in-stock, non-quarantined, non-terminal batches are\n// candidates for pickup. The backend enforces the same rules; filtering here\n// keeps the dropdown free of unactionable rows.\nfunction isPickable(batch) {\n if (batch.ownerType !== 'FACILITY') return false;\n if (Number(batch.qtyRemaining ?? 0) <= 0) return false;\n if (batch.status === 'EXPIRED' || batch.status === 'EXHAUSTED' || batch.status === 'QUARANTINED') return false;\n return true;\n}\n\nexport default function PickupCreatePage() {\n const navigate = useNavigate();\n const [facilities, setFacilities] = useState([]);\n const [batches, setBatches] = useState([]);\n // OPEN pickups already on this user — one-session-per-user rule means\n // any open session blocks a new pickup. The user has to end the session\n // or top it up instead.\n const [openSessions, setOpenSessions] = useState([]);\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState('');\n const [form, setForm] = useState({\n id: uuidv4(),\n personalBatchId: uuidv4(),\n facilityId: '',\n sourceBatchId: '',\n pickedQty: 1,\n notes: '',\n // Outreach session metadata.\n sessionName: '',\n sessionDescription: '',\n sessionStartTime: dayjs(),\n sessionExpectedEndTime: null,\n sessionSite: '',\n });\n\n usePermissionedEffect('update.manage.productManagement.pickup', () => {\n async function load() {\n try {\n const [f, b, open] = await Promise.all([\n listFacilities(),\n listBatches(),\n listMyOpenPickups().catch(() => []),\n ]);\n setFacilities(f);\n setBatches(b);\n setOpenSessions(open);\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to load reference data');\n } finally {\n setLoading(false);\n }\n }\n void load();\n }, []);\n\n const hasOpenSession = openSessions.length > 0;\n\n // Batches limited to the picked facility (when one is selected). Reset\n // when the facility changes so the user can't carry over a stale batch.\n const eligibleBatches = useMemo(() => {\n if (!form.facilityId) return [];\n return batches.filter(isPickable).filter((b) => b.ownerId === form.facilityId);\n }, [batches, form.facilityId]);\n\n const selectedBatch = useMemo(\n () => batches.find((b) => b.id === form.sourceBatchId) ?? null,\n [batches, form.sourceBatchId],\n );\n\n function patch(k, v) {\n setForm((f) => ({ ...f, [k]: v }));\n }\n\n function patchFacility(id) {\n setForm((f) => ({ ...f, facilityId: id, sourceBatchId: '' }));\n }\n\n const qty = Number(form.pickedQty);\n const remaining = Number(selectedBatch?.qtyRemaining ?? 0);\n const qtyError = !selectedBatch\n ? ''\n : !Number.isInteger(qty) || qty <= 0\n ? 'Enter a whole number greater than 0.'\n : qty > remaining\n ? `Only ${remaining} available in this batch.`\n : '';\n const sessionNameError = form.sessionName.trim() ? '' : 'Session name is required.';\n // Start time can't be in the past. A small grace (5 min) tolerates the lag\n // between the prefilled \"now\" and submission; the backend re-checks against\n // server time so a tampered client clock can't bypass it.\n const startValid = form.sessionStartTime && dayjs.isDayjs(form.sessionStartTime) && form.sessionStartTime.isValid();\n const sessionStartError = !startValid\n ? 'Start time is required.'\n : form.sessionStartTime.valueOf() < Date.now() - 5 * 60 * 1000\n ? 'Start time cannot be in the past.'\n : '';\n // End time is required and must be after the start.\n const endValid = form.sessionExpectedEndTime && dayjs.isDayjs(form.sessionExpectedEndTime) && form.sessionExpectedEndTime.isValid();\n const sessionEndError = !endValid\n ? 'Expected end time is required.'\n : (startValid && !form.sessionExpectedEndTime.isAfter(form.sessionStartTime))\n ? 'Expected end must be after the start time.'\n : '';\n const formIsValid = !!form.facilityId && !!form.sourceBatchId && !qtyError && !hasOpenSession\n && !sessionNameError && !sessionStartError && !sessionEndError;\n\n async function save() {\n if (!formIsValid) return;\n setSubmitting(true);\n setError('');\n try {\n await recordPickup({\n id: form.id,\n personalBatchId: form.personalBatchId,\n sourceBatchId: form.sourceBatchId,\n pickedQty: qty,\n notes: form.notes || null,\n sessionName: form.sessionName.trim(),\n sessionDescription: form.sessionDescription.trim() || null,\n sessionStartTime: startValid ? form.sessionStartTime.toISOString() : null,\n sessionExpectedEndTime: endValid ? form.sessionExpectedEndTime.toISOString() : null,\n sessionSite: form.sessionSite.trim() || null,\n });\n showToast({ message: 'Pickup recorded successfully', type: 'success' });\n navigate('/ui/medplat/manage/pm/pickups');\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to record pickup');\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'update.manage.productManagement.pickup'} title=\"You don’t have permission to record pickups\">\n <PmPageShell\n title=\"Record Pickup\"\n subtitle=\"Check out stock from a facility for your field work. Record returns and wastage when you bring stock back.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" onClick={() => navigate('/ui/medplat/manage/pm/pickups')}>Cancel</Button>\n <Button variant=\"contained\" startIcon={<SaveRoundedIcon />}\n disabled={!formIsValid || submitting}\n onClick={() => void save()}>\n {submitting ? 'Recording…' : 'Record Pickup'}\n </Button>\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n {hasOpenSession ? (\n <Alert\n severity=\"warning\"\n sx={{ mb: 2 }}\n action={\n <Button color=\"inherit\" size=\"small\"\n onClick={() => navigate('/ui/medplat/manage/pm/pickups')}>\n Go to Pickups\n </Button>\n }\n >\n You already have <strong>{openSessions.length}</strong> open outreach session{openSessions.length === 1 ? '' : 's'}.\n End the active session{openSessions.length === 1 ? '' : 's'} before starting a new pickup,\n or use <strong>Top Up</strong> on the Pickups page to add more stock to an active session.\n </Alert>\n ) : null}\n\n <Card sx={{ borderRadius: 1.5, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <PmFormSection\n eyebrow=\"Step 1\"\n title=\"Source\"\n hint=\"Select a facility and then the batch to pick up.\"\n sx={{ mb: 2 }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} md={5}>\n <Autocomplete\n size=\"small\"\n options={facilities}\n getOptionLabel={(f) => f?.name ?? ''}\n isOptionEqualToValue={(a, b) => a?.id === b?.id}\n value={facilities.find((f) => f.id === form.facilityId) ?? null}\n onChange={(_, next) => patchFacility(next?.id ?? '')}\n loading={loading}\n renderInput={(params) => (\n <TextField {...params} required label=\"Source Facility\" placeholder=\"Pick a facility you're assigned to\" />\n )}\n />\n </Grid>\n <Grid item xs={12} md={7}>\n <PmSelect\n label=\"Source Batch\"\n required\n disabled={!form.facilityId}\n value={form.sourceBatchId}\n onChange={(v) => patch('sourceBatchId', v)}\n options={eligibleBatches.map((b) => ({\n value: b.id,\n label: `${b.productName} · qty ${b.qtyRemaining}`\n + `${b.lotNumber ? ` · ${b.lotNumber}` : ''}`\n + `${b.expiryDate ? ` · exp ${formatDate(b.expiryDate)}` : ''}`,\n }))}\n noOptionsText=\"No pickable stock in this facility\"\n helperText={!form.facilityId\n ? 'Pick a facility first.'\n : eligibleBatches.length === 0\n ? 'This facility has no in-stock batches you can pick up right now.'\n : 'Active facility batches only — quarantined / expired / exhausted stock is hidden.'}\n />\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n\n <Card sx={{ borderRadius: 1.5, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <PmFormSection\n eyebrow=\"Session\"\n title=\"Outreach session details\"\n hint=\"Records the purpose, timing and location of this outreach session. Shown when administering from this stock.\"\n sx={{ mb: 2 }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} md={6}>\n <TextField\n required fullWidth size=\"small\"\n label=\"Session name\"\n inputProps={{ maxLength: 150 }}\n value={form.sessionName}\n onChange={(e) => patch('sessionName', e.target.value)}\n error={!!sessionNameError && form.sessionName !== ''}\n helperText={form.sessionName === '' ? 'e.g. Anganwadi camp – Ward 4' : sessionNameError}\n />\n </Grid>\n <Grid item xs={12} md={6}>\n <TextField\n fullWidth size=\"small\"\n label=\"Session site (optional)\"\n placeholder=\"Location / site reference\"\n inputProps={{ maxLength: 200 }}\n value={form.sessionSite}\n onChange={(e) => patch('sessionSite', e.target.value)}\n />\n </Grid>\n <Grid item xs={12} md={6}>\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale=\"en\">\n <DateTimePicker\n label=\"Start time\"\n value={form.sessionStartTime}\n onChange={(newVal) => patch('sessionStartTime', newVal)}\n ampm={false}\n minDateTime={dayjs().subtract(5, 'minute')}\n slotProps={{\n actionBar: { actions: ['clear'] },\n textField: {\n size: 'small',\n fullWidth: true,\n required: true,\n error: !!sessionStartError && form.sessionStartTime !== null,\n helperText: (form.sessionStartTime !== null && sessionStartError) || 'Cannot be in the past. (5 minutes buffer allowed)',\n },\n }}\n />\n </LocalizationProvider>\n </Grid>\n <Grid item xs={12} md={6}>\n <LocalizationProvider dateAdapter={AdapterDayjs} adapterLocale=\"en\">\n <DateTimePicker\n label=\"Expected End Time\"\n value={form.sessionExpectedEndTime}\n onChange={(newVal) => patch('sessionExpectedEndTime', newVal)}\n ampm={false}\n minDateTime={startValid ? form.sessionStartTime : undefined}\n slotProps={{\n actionBar: { actions: ['clear'] },\n textField: {\n size: 'small',\n fullWidth: true,\n required: true,\n error: !!sessionEndError && form.sessionExpectedEndTime !== null,\n helperText: (form.sessionExpectedEndTime !== null && sessionEndError) || 'When the session is expected to end.',\n },\n }}\n />\n </LocalizationProvider>\n </Grid>\n <Grid item xs={12}>\n <TextField\n fullWidth size=\"small\" multiline minRows={2}\n label=\"Purpose / description (optional)\"\n value={form.sessionDescription}\n onChange={(e) => patch('sessionDescription', e.target.value)}\n />\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n\n {selectedBatch ? (\n <Card sx={{ borderRadius: 1.5, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <PmFormSection\n eyebrow=\"Step 2\"\n title=\"Quantity\"\n hint={`Available: ${remaining}. You can pick up to this amount.`}\n sx={{ mb: 2 }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} md={4}>\n <TextField\n required fullWidth size=\"small\" type=\"number\"\n label=\"Pick Quantity\"\n inputProps={{ min: 1, max: remaining }}\n value={form.pickedQty}\n onChange={(e) => patch('pickedQty', e.target.value)}\n error={!!qtyError}\n helperText={qtyError || `Out of ${remaining} available`}\n />\n </Grid>\n <Grid item xs={12} md={8}>\n <TextField\n fullWidth size=\"small\"\n label=\"Notes (optional)\"\n placeholder=\"Anything worth recording about this pickup\"\n value={form.notes}\n onChange={(e) => patch('notes', e.target.value)}\n />\n </Grid>\n </Grid>\n <Stack direction=\"row\" spacing={1} sx={{ mt: 2 }} flexWrap=\"wrap\" useFlexGap>\n <Chip size=\"small\" label={`Product · ${selectedBatch.productName}`} />\n {selectedBatch.lotNumber ? <Chip size=\"small\" label={`Lot · ${selectedBatch.lotNumber}`} /> : null}\n {selectedBatch.expiryDate ? <Chip size=\"small\" label={`Expiry · ${formatDate(selectedBatch.expiryDate)}`} /> : null}\n {selectedBatch.storageUnitName ? <Chip size=\"small\" label={`From · ${selectedBatch.storageUnitName}`} /> : null}\n </Stack>\n </CardContent>\n </Card>\n ) : null}\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,21 +1,21 @@
1
- import { U as e, a as t, i as ee, n as te, nt as ne, o as re, r as ie, tt as ae } from "./currency-ClRLIEg2.js";
2
- import { a as oe, c as se, s as ce, t as le } from "./PmTable-B9970kPY.js";
3
- import { n, t as ue } from "./format-UOyOu75i.js";
4
- import { f as de, p as fe, r as pe } from "./constants-5ZCZo-Zm.js";
5
- import { useMemo as me, useState as r } from "react";
1
+ import { $ as e, B as t, Q as ee, a as te, i as ne, n as re, o as ie, r as ae } from "./currency-bVQ7aEk2.js";
2
+ import { a as oe, c as se, o as ce, s as le, t as ue } from "./PmTable-CCpaJEA_.js";
3
+ import { n, t as de } from "./format-UOyOu75i.js";
4
+ import { f as fe, p as pe, r as me } from "./constants-5ZCZo-Zm.js";
5
+ import { useMemo as he, useState as r } from "react";
6
6
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
7
- import { v4 as he } from "uuid";
8
- import { Alert as o, Box as s, Button as c, Chip as l, Dialog as u, DialogActions as d, DialogContent as f, DialogTitle as ge, FormControl as _e, FormHelperText as ve, InputAdornment as ye, InputLabel as be, MenuItem as p, Select as xe, Skeleton as Se, Stack as m, TableBody as Ce, TableCell as h, TableHead as we, TableRow as g, TextField as _, Typography as v } from "@mui/material";
7
+ import { v4 as ge } from "uuid";
8
+ import { Alert as o, Box as s, Button as c, Chip as l, Dialog as u, DialogActions as d, DialogContent as f, DialogTitle as p, InputAdornment as _e, Skeleton as ve, Stack as m, TableBody as ye, TableCell as h, TableHead as be, TableRow as g, TextField as _, Tooltip as xe, Typography as v } from "@mui/material";
9
9
  import y from "@mui/icons-material/AddRounded";
10
- import Te from "@mui/icons-material/RefreshRounded";
10
+ import Se from "@mui/icons-material/RefreshRounded";
11
11
  import { showToast as b } from "@/common/toaster/toaster";
12
- import { useNavigate as Ee } from "react-router-dom";
12
+ import { useNavigate as Ce } from "react-router-dom";
13
13
  import { alpha as x } from "@mui/material/styles";
14
- import De from "@mui/icons-material/MoveDownRounded";
15
- import Oe from "@mui/icons-material/SearchRounded";
16
- import ke from "@mui/icons-material/AssignmentReturnRounded";
14
+ import we from "@mui/icons-material/MoveDownRounded";
15
+ import Te from "@mui/icons-material/SearchRounded";
16
+ import Ee from "@mui/icons-material/AssignmentReturnRounded";
17
17
  //#region src/views/PickupsPage.jsx
18
- function Ae(e) {
18
+ function De(e) {
19
19
  switch (e) {
20
20
  case "OPEN": return "info";
21
21
  case "RETURNED": return "success";
@@ -24,7 +24,7 @@ function Ae(e) {
24
24
  }
25
25
  }
26
26
  function S() {
27
- let S = Ee(), C = t().has("update.manage.productManagement.pickup"), [w, je] = r([]), [T, E] = r(!0), [D, O] = r(""), [k, Me] = r(""), [A, j] = r({
27
+ let S = Ce(), C = te().has("update.manage.productManagement.pickup"), [w, Oe] = r([]), [T, E] = r(!0), [D, O] = r(""), [k, ke] = r(""), [A, j] = r({
28
28
  open: !1,
29
29
  pickup: null
30
30
  }), [M, N] = r({
@@ -41,7 +41,7 @@ function S() {
41
41
  async function B() {
42
42
  E(!0), O("");
43
43
  try {
44
- je(await e());
44
+ Oe(await t());
45
45
  } catch (e) {
46
46
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to load pickups";
47
47
  O(t), b({
@@ -52,14 +52,14 @@ function S() {
52
52
  E(!1);
53
53
  }
54
54
  }
55
- ee("view.manage.productManagement.pickup", () => {
55
+ ne("view.manage.productManagement.pickup", () => {
56
56
  B();
57
57
  }, []);
58
- let V = me(() => {
58
+ let V = he(() => {
59
59
  let e = k.trim().toLowerCase();
60
60
  return e ? w.filter((t) => `${t.sessionName ?? ""} ${t.sessionSite ?? ""} ${t.productName ?? ""} ${t.facilityName ?? ""} ${t.userName ?? ""} ${t.lotNumber ?? ""} ${t.notes ?? ""}`.toLowerCase().includes(e)) : w;
61
61
  }, [w, k]);
62
- function Ne(e) {
62
+ function Ae(e) {
63
63
  let t = e.expectedRemainingQty ?? 0;
64
64
  N({
65
65
  returnedQty: String(t),
@@ -76,7 +76,7 @@ function S() {
76
76
  pickup: null
77
77
  });
78
78
  }
79
- function Pe(e) {
79
+ function je(e) {
80
80
  L({
81
81
  additionalQty: "1",
82
82
  notes: ""
@@ -92,12 +92,12 @@ function S() {
92
92
  });
93
93
  }
94
94
  let W = P.pickup?.sourceBatchQtyRemaining ?? null, G = Number(I.additionalQty), K = !Number.isInteger(G) || G <= 0 ? "Enter a whole number greater than 0." : W != null && G > W ? `Only ${W} available at the source facility.` : "";
95
- async function Fe() {
95
+ async function Me() {
96
96
  if (!(K || !P.pickup)) {
97
97
  z(!0);
98
98
  try {
99
- await ne(P.pickup.id, {
100
- id: he(),
99
+ await e(P.pickup.id, {
100
+ id: ge(),
101
101
  additionalQty: G,
102
102
  notes: I.notes || null
103
103
  }), b({
@@ -115,11 +115,11 @@ function S() {
115
115
  }
116
116
  }
117
117
  let q = A.pickup?.expectedRemainingQty ?? 0, J = Number(M.returnedQty), Y = Number.isFinite(J) && J >= 0 && J <= q ? q - J : null, X = !Number.isInteger(J) || J < 0 ? "Enter a whole number from 0 to the expected remaining." : J > q ? `At most ${q} can be returned.` : "", Z = Y != null && Y > 0 || (A.pickup?.openVials ?? []).length > 0, Q = Z && !M.wastageReason ? "A reason is required for the wastage being recorded." : "", $ = !X && !Q;
118
- async function Ie() {
118
+ async function Ne() {
119
119
  if (!(!$ || !A.pickup)) {
120
120
  z(!0);
121
121
  try {
122
- await ae(A.pickup.id, {
122
+ await ee(A.pickup.id, {
123
123
  returnedQty: J,
124
124
  wastageReason: Z ? M.wastageReason : null,
125
125
  notes: M.notes || null
@@ -138,10 +138,10 @@ function S() {
138
138
  }
139
139
  }
140
140
  return /* @__PURE__ */ a(s, { children: [
141
- /* @__PURE__ */ i(ie, {}),
142
- /* @__PURE__ */ i(te, {
141
+ /* @__PURE__ */ i(ae, {}),
142
+ /* @__PURE__ */ i(re, {
143
143
  perm: "view.manage.productManagement.pickup",
144
- children: /* @__PURE__ */ a(re, {
144
+ children: /* @__PURE__ */ a(ie, {
145
145
  title: "Stock Pickups",
146
146
  subtitle: "Stock you're carrying for field work. Record returns and any items lost or used.",
147
147
  actions: /* @__PURE__ */ a(m, {
@@ -149,7 +149,7 @@ function S() {
149
149
  spacing: 1,
150
150
  children: [/* @__PURE__ */ i(c, {
151
151
  variant: "outlined",
152
- startIcon: /* @__PURE__ */ i(Te, {}),
152
+ startIcon: /* @__PURE__ */ i(Se, {}),
153
153
  onClick: () => void B(),
154
154
  children: "Refresh"
155
155
  }), C ? /* @__PURE__ */ i(c, {
@@ -179,15 +179,15 @@ function S() {
179
179
  fullWidth: !0,
180
180
  placeholder: "Search by product, facility, user, lot, notes…",
181
181
  value: k,
182
- onChange: (e) => Me(e.target.value),
183
- InputProps: { startAdornment: /* @__PURE__ */ i(ye, {
182
+ onChange: (e) => ke(e.target.value),
183
+ InputProps: { startAdornment: /* @__PURE__ */ i(_e, {
184
184
  position: "start",
185
- children: /* @__PURE__ */ i(Oe, { fontSize: "small" })
185
+ children: /* @__PURE__ */ i(Te, { fontSize: "small" })
186
186
  }) }
187
187
  })
188
- }), /* @__PURE__ */ a(ce, {
188
+ }), /* @__PURE__ */ a(le, {
189
189
  dense: !0,
190
- children: [/* @__PURE__ */ i(we, { children: /* @__PURE__ */ a(g, { children: [
190
+ children: [/* @__PURE__ */ i(be, { children: /* @__PURE__ */ a(g, { children: [
191
191
  /* @__PURE__ */ i(h, { children: "Ref" }),
192
192
  /* @__PURE__ */ i(h, { children: "Session" }),
193
193
  /* @__PURE__ */ i(h, { children: "Product" }),
@@ -203,9 +203,9 @@ function S() {
203
203
  align: "right",
204
204
  children: "Action"
205
205
  })
206
- ] }) }), /* @__PURE__ */ i(Ce, { children: T ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ i(g, { children: Array.from({ length: 9 }).map((e, t) => /* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(Se, { height: 22 }) }, t)) }, t)) : V.length === 0 ? /* @__PURE__ */ i(le, {
206
+ ] }) }), /* @__PURE__ */ i(ye, { children: T ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ i(g, { children: Array.from({ length: 9 }).map((e, t) => /* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(ve, { height: 22 }) }, t)) }, t)) : V.length === 0 ? /* @__PURE__ */ i(ue, {
207
207
  colSpan: 9,
208
- icon: De,
208
+ icon: we,
209
209
  title: k.trim() === "" ? "No pickups yet" : "No pickups match your search",
210
210
  hint: "Check out stock from a facility to use in the field.",
211
211
  action: C ? /* @__PURE__ */ i(c, {
@@ -288,7 +288,7 @@ function S() {
288
288
  }),
289
289
  /* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(v, {
290
290
  variant: "body2",
291
- children: ue(e.pickedOn)
291
+ children: de(e.pickedOn)
292
292
  }) }),
293
293
  /* @__PURE__ */ i(h, { children: e.status === "OPEN" && e.sessionExpectedEndTime && new Date(e.sessionExpectedEndTime).getTime() < Date.now() ? /* @__PURE__ */ i(l, {
294
294
  size: "small",
@@ -296,8 +296,8 @@ function S() {
296
296
  color: "error"
297
297
  }) : /* @__PURE__ */ i(l, {
298
298
  size: "small",
299
- label: fe(pe, e.status),
300
- color: Ae(e.status)
299
+ label: pe(me, e.status),
300
+ color: De(e.status)
301
301
  }) }),
302
302
  /* @__PURE__ */ i(h, {
303
303
  align: "right",
@@ -305,17 +305,21 @@ function S() {
305
305
  direction: "row",
306
306
  spacing: 1,
307
307
  justifyContent: "flex-end",
308
- children: [/* @__PURE__ */ i(c, {
309
- size: "small",
310
- variant: "outlined",
311
- startIcon: /* @__PURE__ */ i(y, {}),
312
- onClick: () => Pe(e),
313
- children: "Top Up"
308
+ children: [/* @__PURE__ */ i(xe, {
309
+ title: (e.sourceBatchQtyRemaining ?? 0) <= 0 ? "No stock left in the source lot to top up from" : "",
310
+ children: /* @__PURE__ */ i("span", { children: /* @__PURE__ */ i(c, {
311
+ size: "small",
312
+ variant: "outlined",
313
+ startIcon: /* @__PURE__ */ i(y, {}),
314
+ disabled: (e.sourceBatchQtyRemaining ?? 0) <= 0,
315
+ onClick: () => je(e),
316
+ children: "Top Up"
317
+ }) })
314
318
  }), /* @__PURE__ */ i(c, {
315
319
  size: "small",
316
320
  variant: "outlined",
317
- startIcon: /* @__PURE__ */ i(ke, {}),
318
- onClick: () => Ne(e),
321
+ startIcon: /* @__PURE__ */ i(Ee, {}),
322
+ onClick: () => Ae(e),
319
323
  children: "End Session"
320
324
  })]
321
325
  }) : /* @__PURE__ */ i(v, {
@@ -336,7 +340,7 @@ function S() {
336
340
  maxWidth: "sm",
337
341
  fullWidth: !0,
338
342
  children: [
339
- /* @__PURE__ */ a(ge, { children: ["End outreach session #", A.pickup?.serialId] }),
343
+ /* @__PURE__ */ a(p, { children: ["End outreach session #", A.pickup?.serialId] }),
340
344
  /* @__PURE__ */ i(f, { children: A.pickup ? /* @__PURE__ */ a(m, {
341
345
  spacing: 2,
342
346
  sx: { mt: 1 },
@@ -344,7 +348,7 @@ function S() {
344
348
  /* @__PURE__ */ a(s, {
345
349
  sx: (e) => ({
346
350
  p: 1.5,
347
- borderRadius: 3,
351
+ borderRadius: 1.5,
348
352
  bgcolor: x(e.palette.primary.main, .04),
349
353
  border: `1px solid ${x(e.palette.primary.main, .12)}`
350
354
  }),
@@ -454,29 +458,17 @@ function S() {
454
458
  })
455
459
  ]
456
460
  }) : null,
457
- /* @__PURE__ */ a(_e, {
458
- size: "small",
461
+ /* @__PURE__ */ i(ce, {
462
+ label: `Wastage Reason${Z ? " *" : ""}`,
459
463
  disabled: !Z,
460
464
  error: !!Q,
461
- children: [
462
- /* @__PURE__ */ a(be, { children: ["Wastage Reason", Z ? " *" : ""] }),
463
- /* @__PURE__ */ a(xe, {
464
- label: `Wastage Reason${Z ? " *" : ""}`,
465
- value: M.wastageReason,
466
- onChange: (e) => N((t) => ({
467
- ...t,
468
- wastageReason: e.target.value
469
- })),
470
- children: [/* @__PURE__ */ i(p, {
471
- value: "",
472
- children: /* @__PURE__ */ i("em", { children: "—" })
473
- }), de.map((e) => /* @__PURE__ */ i(p, {
474
- value: e.value,
475
- children: e.label
476
- }, e.value))]
477
- }),
478
- /* @__PURE__ */ i(ve, { children: Q || (Z ? "Required — same reason covers both unaccounted sealed units and any open-vial remaining volume." : "Not needed — nothing being wasted.") })
479
- ]
465
+ value: M.wastageReason,
466
+ onChange: (e) => N((t) => ({
467
+ ...t,
468
+ wastageReason: e
469
+ })),
470
+ options: fe,
471
+ helperText: Q || (Z ? "Required — same reason covers both unaccounted sealed units and any open-vial remaining volume." : "Not needed — nothing being wasted.")
480
472
  }),
481
473
  /* @__PURE__ */ i(_, {
482
474
  size: "small",
@@ -497,7 +489,7 @@ function S() {
497
489
  children: "Cancel"
498
490
  }), /* @__PURE__ */ i(c, {
499
491
  variant: "contained",
500
- onClick: () => void Ie(),
492
+ onClick: () => void Ne(),
501
493
  disabled: !$ || R,
502
494
  children: R ? "Submitting…" : "End Session"
503
495
  })] })
@@ -509,7 +501,7 @@ function S() {
509
501
  maxWidth: "xs",
510
502
  fullWidth: !0,
511
503
  children: [
512
- /* @__PURE__ */ a(ge, { children: ["Top up session #", P.pickup?.serialId] }),
504
+ /* @__PURE__ */ a(p, { children: ["Top up session #", P.pickup?.serialId] }),
513
505
  /* @__PURE__ */ i(f, { children: P.pickup ? /* @__PURE__ */ a(m, {
514
506
  spacing: 2,
515
507
  sx: { mt: 1 },
@@ -517,7 +509,7 @@ function S() {
517
509
  /* @__PURE__ */ a(s, {
518
510
  sx: (e) => ({
519
511
  p: 1.5,
520
- borderRadius: 3,
512
+ borderRadius: 1.5,
521
513
  bgcolor: x(e.palette.primary.main, .04),
522
514
  border: `1px solid ${x(e.palette.primary.main, .12)}`
523
515
  }),
@@ -597,7 +589,7 @@ function S() {
597
589
  children: "Cancel"
598
590
  }), /* @__PURE__ */ i(c, {
599
591
  variant: "contained",
600
- onClick: () => void Fe(),
592
+ onClick: () => void Me(),
601
593
  disabled: !!K || R,
602
594
  children: R ? "Submitting…" : "Top Up"
603
595
  })] })
@@ -608,4 +600,4 @@ function S() {
608
600
  //#endregion
609
601
  export { S as default };
610
602
 
611
- //# sourceMappingURL=PickupsPage-D66_Wta4.js.map
603
+ //# sourceMappingURL=PickupsPage-BOygBQAb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickupsPage-BOygBQAb.js","names":[],"sources":["../src/views/PickupsPage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n InputAdornment,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport SearchRoundedIcon from '@mui/icons-material/SearchRounded';\nimport MoveDownRoundedIcon from '@mui/icons-material/MoveDownRounded';\nimport AssignmentReturnRoundedIcon from '@mui/icons-material/AssignmentReturnRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect, usePmPermissions } from '@pm/utils/permissions';\nimport {\n PmEmptyRow,\n PmRef,\n PmSelect,\n PmTable,\n PmTableCard,\n} from '@pm/components/PmTable';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n listPickups,\n recordPickupReturn,\n recordPickupTopup,\n} from '@pm/services/pmApi';\nimport { formatDate, formatDateTime } from '@pm/utils/format';\nimport { PICKUP_STATUSES, WASTAGE_REASONS, labelOf } from '@pm/utils/constants';\n\nfunction statusChipColor(status) {\n switch (status) {\n case 'OPEN': return 'info';\n case 'RETURNED': return 'success';\n case 'CANCELLED': return 'default';\n default: return 'default';\n }\n}\n\nexport default function PickupsPage() {\n const navigate = useNavigate();\n const perms = usePmPermissions();\n const canCreate = perms.has('update.manage.productManagement.pickup');\n const [rows, setRows] = useState([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n const [returnDialog, setReturnDialog] = useState({ open: false, pickup: null });\n const [returnForm, setReturnForm] = useState({ returnedQty: '', wastageReason: '', notes: '' });\n const [topupDialog, setTopupDialog] = useState({ open: false, pickup: null });\n const [topupForm, setTopupForm] = useState({ additionalQty: '', notes: '' });\n const [submitting, setSubmitting] = useState(false);\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n setRows(await listPickups());\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load pickups';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.pickup', () => { void load(); }, []);\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return rows;\n return rows.filter((r) => {\n const hay = `${r.sessionName ?? ''} ${r.sessionSite ?? ''} ${r.productName ?? ''} ${r.facilityName ?? ''} ${r.userName ?? ''} ${r.lotNumber ?? ''} ${r.notes ?? ''}`.toLowerCase();\n return hay.includes(q);\n });\n }, [rows, search]);\n\n function openReturn(p) {\n const expected = p.expectedRemainingQty ?? 0;\n setReturnForm({\n // Default to \"return everything that's expected to remain\" — no wastage.\n returnedQty: String(expected),\n wastageReason: '',\n notes: '',\n });\n setReturnDialog({ open: true, pickup: p });\n }\n\n function closeReturn() {\n if (submitting) return;\n setReturnDialog({ open: false, pickup: null });\n }\n\n function openTopup(p) {\n setTopupForm({ additionalQty: '1', notes: '' });\n setTopupDialog({ open: true, pickup: p });\n }\n\n function closeTopup() {\n if (submitting) return;\n setTopupDialog({ open: false, pickup: null });\n }\n\n // Ceiling for a top-up is whatever the source (facility) batch still has —\n // the backend rejects more than this, so cap it here for a friendly UX.\n const topupSourceAvailable = topupDialog.pickup?.sourceBatchQtyRemaining ?? null;\n const topupAdditionalQty = Number(topupForm.additionalQty);\n const topupQtyError = !Number.isInteger(topupAdditionalQty) || topupAdditionalQty <= 0\n ? 'Enter a whole number greater than 0.'\n : (topupSourceAvailable != null && topupAdditionalQty > topupSourceAvailable)\n ? `Only ${topupSourceAvailable} available at the source facility.`\n : '';\n\n async function submitTopup() {\n if (topupQtyError || !topupDialog.pickup) return;\n setSubmitting(true);\n try {\n await recordPickupTopup(topupDialog.pickup.id, {\n id: uuidv4(),\n additionalQty: topupAdditionalQty,\n notes: topupForm.notes || null,\n });\n showToast({\n message: `Topped up ${topupAdditionalQty} unit${topupAdditionalQty === 1 ? '' : 's'}.`,\n type: 'success',\n });\n closeTopup();\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to top up';\n showToast({ message, type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n const expectedRemaining = returnDialog.pickup?.expectedRemainingQty ?? 0;\n const returnedQty = Number(returnForm.returnedQty);\n const wastedQty = Number.isFinite(returnedQty) && returnedQty >= 0 && returnedQty <= expectedRemaining\n ? expectedRemaining - returnedQty\n : null;\n const returnedQtyError = !Number.isInteger(returnedQty) || returnedQty < 0\n ? 'Enter a whole number from 0 to the expected remaining.'\n : returnedQty > expectedRemaining\n ? `At most ${expectedRemaining} can be returned.`\n : '';\n // Reason is required whenever ANY wastage will be written — either the\n // sealed-units gap is > 0, or there are open vials to close (their\n // remaining volume becomes wastage).\n const reasonRequired = (wastedQty != null && wastedQty > 0)\n || ((returnDialog.pickup?.openVials ?? []).length > 0);\n const reasonError = reasonRequired && !returnForm.wastageReason\n ? 'A reason is required for the wastage being recorded.'\n : '';\n const returnFormValid = !returnedQtyError && !reasonError;\n\n async function submitReturn() {\n if (!returnFormValid || !returnDialog.pickup) return;\n setSubmitting(true);\n try {\n await recordPickupReturn(returnDialog.pickup.id, {\n returnedQty,\n wastageReason: reasonRequired ? returnForm.wastageReason : null,\n notes: returnForm.notes || null,\n });\n showToast({\n message: wastedQty > 0\n ? `Returned ${returnedQty}, wasted ${wastedQty}.`\n : `Returned ${returnedQty} unit${returnedQty === 1 ? '' : 's'}.`,\n type: 'success',\n });\n closeReturn();\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to record return';\n showToast({ message, type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.pickup'}>\n <PmPageShell\n title=\"Stock Pickups\"\n subtitle=\"Stock you're carrying for field work. Record returns and any items lost or used.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canCreate ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/pickups/new')}>\n New Pickup\n </Button>\n ) : null}\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n <PmTableCard\n eyebrow=\"Operations\"\n title=\"Pickups\"\n subtitle={loading ? 'Loading…' : `${filtered.length} ${filtered.length === 1 ? 'pickup' : 'pickups'}`}\n >\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} sx={{ mb: 2 }}>\n <TextField\n size=\"small\" fullWidth\n placeholder=\"Search by product, facility, user, lot, notes…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n InputProps={{\n startAdornment: <InputAdornment position=\"start\"><SearchRoundedIcon fontSize=\"small\" /></InputAdornment>,\n }}\n />\n </Stack>\n\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Ref</TableCell>\n <TableCell>Session</TableCell>\n <TableCell>Product</TableCell>\n <TableCell>Facility</TableCell>\n <TableCell>User</TableCell>\n <TableCell align=\"right\">Qty</TableCell>\n <TableCell>Picked</TableCell>\n <TableCell>Status</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 4 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 9 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : filtered.length === 0 ? (\n <PmEmptyRow\n colSpan={9}\n icon={MoveDownRoundedIcon}\n title={search.trim() !== '' ? 'No pickups match your search' : 'No pickups yet'}\n hint=\"Check out stock from a facility to use in the field.\"\n action={canCreate ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/pickups/new')}>\n Record first pickup\n </Button>\n ) : null}\n />\n ) : filtered.map((r) => (\n <TableRow key={r.id} hover>\n <TableCell><PmRef id={r.serialId} /></TableCell>\n <TableCell sx={{ maxWidth: 220 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, wordBreak: 'break-word' }}>\n {r.sessionName ?? '—'}\n </Typography>\n {r.sessionSite ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', wordBreak: 'break-word' }}>\n {r.sessionSite}\n </Typography>\n ) : null}\n {r.sessionStartTime ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', fontVariantNumeric: 'tabular-nums' }}>\n {formatDateTime(r.sessionStartTime)}\n {r.sessionExpectedEndTime ? ` → ${formatDateTime(r.sessionExpectedEndTime)}` : ''}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>{r.productName ?? '—'}</Typography>\n {r.lotNumber ? (\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace', color: 'text.secondary' }}>\n {r.lotNumber}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>{r.facilityName ?? '—'}</TableCell>\n <TableCell>{r.userName ?? '—'}</TableCell>\n <TableCell align=\"right\">\n <Typography sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{r.pickedQty}</Typography>\n {r.status === 'OPEN' && r.expectedRemainingQty != null ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {r.expectedRemainingQty} left on user\n </Typography>\n ) : r.status === 'RETURNED' ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {r.returnedQty} returned{r.wastedQty > 0 ? ` · ${r.wastedQty} wasted` : ''}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">{formatDate(r.pickedOn)}</Typography>\n </TableCell>\n <TableCell>\n {r.status === 'OPEN' && r.sessionExpectedEndTime\n && new Date(r.sessionExpectedEndTime).getTime() < Date.now() ? (\n <Chip size=\"small\" label=\"Overdue\" color=\"error\" />\n ) : (\n <Chip size=\"small\" label={labelOf(PICKUP_STATUSES, r.status)} color={statusChipColor(r.status)} />\n )}\n </TableCell>\n <TableCell align=\"right\">\n {r.status === 'OPEN' && canCreate ? (\n <Stack direction=\"row\" spacing={1} justifyContent=\"flex-end\">\n <Tooltip title={(r.sourceBatchQtyRemaining ?? 0) <= 0\n ? 'No stock left in the source lot to top up from'\n : ''}>\n <span>\n <Button size=\"small\" variant=\"outlined\" startIcon={<AddRoundedIcon />}\n disabled={(r.sourceBatchQtyRemaining ?? 0) <= 0}\n onClick={() => openTopup(r)}>\n Top Up\n </Button>\n </span>\n </Tooltip>\n <Button size=\"small\" variant=\"outlined\" startIcon={<AssignmentReturnRoundedIcon />}\n onClick={() => openReturn(r)}>\n End Session\n </Button>\n </Stack>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n\n {/* ---------- End Outreach Session dialog ---------- */}\n <Dialog open={returnDialog.open} onClose={closeReturn} maxWidth=\"sm\" fullWidth>\n <DialogTitle>End outreach session #{returnDialog.pickup?.serialId}</DialogTitle>\n <DialogContent>\n {returnDialog.pickup ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Box sx={(t) => ({\n p: 1.5, borderRadius: 1.5,\n bgcolor: alpha(t.palette.primary.main, 0.04),\n border: `1px solid ${alpha(t.palette.primary.main, 0.12)}`,\n })}>\n <Typography variant=\"body2\"><strong>{returnDialog.pickup.productName}</strong></Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Picked {returnDialog.pickup.pickedQty} on {formatDateTime(returnDialog.pickup.pickedOn)} from {returnDialog.pickup.facilityName}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5 }}>\n Sealed units expected on user: <strong>{expectedRemaining}</strong>\n {' '}({(returnDialog.pickup.pickedQty ?? 0) - expectedRemaining - ((returnDialog.pickup.openVials ?? []).length)} already administered / wasted during the day)\n </Typography>\n </Box>\n\n <TextField\n required size=\"small\" type=\"number\"\n label=\"Sealed Units Returned\"\n inputProps={{ min: 0, max: expectedRemaining }}\n value={returnForm.returnedQty}\n onChange={(e) => setReturnForm((f) => ({ ...f, returnedQty: e.target.value }))}\n error={!!returnedQtyError}\n helperText={returnedQtyError || `Out of ${expectedRemaining} sealed units expected to remain`}\n />\n\n {wastedQty != null && wastedQty > 0 ? (\n <Alert severity=\"warning\" variant=\"outlined\">\n <strong>{wastedQty}</strong> sealed {wastedQty === 1 ? 'unit' : 'units'} unaccounted for — will be marked as wastage.\n </Alert>\n ) : null}\n\n {/* Open-vial wastage preview. Any vial opened during outreach\n does not return to the facility — it's closed with wastage\n as part of this end-session action. Volume shown so the\n operator knows what's being written off. */}\n {(returnDialog.pickup.openVials ?? []).length > 0 ? (\n <Alert severity=\"info\" variant=\"outlined\">\n <Typography variant=\"body2\" sx={{ fontWeight: 700, mb: 0.5 }}>\n {returnDialog.pickup.openVials.length} open vial{returnDialog.pickup.openVials.length === 1 ? '' : 's'} on you will be closed with wastage\n </Typography>\n <Stack spacing={0.25} sx={{ mt: 0.5 }}>\n {returnDialog.pickup.openVials.map((v) => (\n <Typography key={v.id} variant=\"caption\" color=\"text.secondary\">\n Lot {v.lotNumber || '—'} · {Number(v.volumeRemainingMl ?? 0).toFixed(2)} ml remaining\n </Typography>\n ))}\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.75 }}>\n These volumes will be recorded as wastage using the reason picked below.\n </Typography>\n </Alert>\n ) : null}\n\n <PmSelect\n label={`Wastage Reason${reasonRequired ? ' *' : ''}`}\n disabled={!reasonRequired}\n error={!!reasonError}\n value={returnForm.wastageReason}\n onChange={(v) => setReturnForm((f) => ({ ...f, wastageReason: v }))}\n options={WASTAGE_REASONS}\n helperText={reasonError\n || (reasonRequired\n ? 'Required — same reason covers both unaccounted sealed units and any open-vial remaining volume.'\n : 'Not needed — nothing being wasted.')}\n />\n\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Notes (optional)\"\n value={returnForm.notes}\n onChange={(e) => setReturnForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeReturn} disabled={submitting}>Cancel</Button>\n <Button variant=\"contained\" onClick={() => void submitReturn()}\n disabled={!returnFormValid || submitting}>\n {submitting ? 'Submitting…' : 'End Session'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* ---------- Top Up dialog ---------- */}\n <Dialog open={topupDialog.open} onClose={closeTopup} maxWidth=\"xs\" fullWidth>\n <DialogTitle>Top up session #{topupDialog.pickup?.serialId}</DialogTitle>\n <DialogContent>\n {topupDialog.pickup ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Box sx={(t) => ({\n p: 1.5, borderRadius: 1.5,\n bgcolor: alpha(t.palette.primary.main, 0.04),\n border: `1px solid ${alpha(t.palette.primary.main, 0.12)}`,\n })}>\n <Typography variant=\"body2\"><strong>{topupDialog.pickup.productName}</strong></Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Source: {topupDialog.pickup.facilityName} · Lot {topupDialog.pickup.lotNumber || '—'}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Currently picked: {topupDialog.pickup.pickedQty} · remaining sealed on user: {topupDialog.pickup.expectedRemainingQty ?? 0}\n </Typography>\n {topupSourceAvailable != null ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Available at source: <strong>{topupSourceAvailable}</strong>\n </Typography>\n ) : null}\n </Box>\n\n <Alert severity=\"info\" variant=\"outlined\">\n Top-ups come from the same source batch as the original pickup so lot / expiry stays consistent. To pick from a different batch, end this session first.\n </Alert>\n\n <TextField\n required size=\"small\" type=\"number\"\n label=\"Additional Quantity\"\n inputProps={{ min: 1, max: topupSourceAvailable ?? undefined }}\n value={topupForm.additionalQty}\n onChange={(e) => setTopupForm((f) => ({ ...f, additionalQty: e.target.value }))}\n error={!!topupQtyError}\n helperText={topupQtyError\n || (topupSourceAvailable != null\n ? `Sealed units to add. Up to ${topupSourceAvailable} available at the source.`\n : 'Sealed units to add to this session.')}\n />\n\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Notes (optional)\"\n value={topupForm.notes}\n onChange={(e) => setTopupForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeTopup} disabled={submitting}>Cancel</Button>\n <Button variant=\"contained\" onClick={() => void submitTopup()}\n disabled={!!topupQtyError || submitting}>\n {submitting ? 'Submitting…' : 'Top Up'}\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { l as e, t } from "./currency-ClRLIEg2.js";
1
+ import { l as e, t } from "./currency-bVQ7aEk2.js";
2
2
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  import { Autocomplete as i, Box as a, Card as o, CardContent as s, Stack as c, Table as l, TableCell as u, TableContainer as d, TableRow as f, TextField as p, Typography as m } from "@mui/material";
4
4
  import h from "prop-types";
@@ -8,7 +8,7 @@ function v({ children: e, dense: t = !1, sx: r = {}, ...i }) {
8
8
  let a = _();
9
9
  return /* @__PURE__ */ n(d, {
10
10
  sx: {
11
- borderRadius: 2.5,
11
+ borderRadius: 1.5,
12
12
  border: `1px solid ${g(a.palette.divider, .55)}`,
13
13
  backgroundColor: a.palette.background.paper,
14
14
  overflow: "auto",
@@ -53,7 +53,7 @@ v.propTypes = {
53
53
  function y({ eyebrow: e, title: t, subtitle: i, actions: l, toolbar: u, children: d, sx: f = {} }) {
54
54
  return /* @__PURE__ */ n(o, {
55
55
  sx: {
56
- borderRadius: 4,
56
+ borderRadius: 1.5,
57
57
  border: "1px solid",
58
58
  borderColor: "divider",
59
59
  boxShadow: "0 12px 32px rgba(15, 23, 42, 0.045)",
@@ -372,4 +372,4 @@ T.propTypes = {
372
372
  //#endregion
373
373
  export { S as a, y as c, x as i, C as n, w as o, T as r, v as s, b as t };
374
374
 
375
- //# sourceMappingURL=PmTable-B9970kPY.js.map
375
+ //# sourceMappingURL=PmTable-CCpaJEA_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PmTable-CCpaJEA_.js","names":[],"sources":["../src/components/PmTable.jsx"],"sourcesContent":["import PropTypes from 'prop-types';\nimport {\n Autocomplete,\n Box,\n Card,\n CardContent,\n Stack,\n Table,\n TableCell,\n TableContainer,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport { currencySymbol } from '@pm/utils/currency';\nimport { usePmSettings } from '@pm/utils/settingsStore';\n\n// Shared building blocks for the data-heavy PM tables. The goal is one\n// consistent look: gradient-headed table, soft hover, eyebrow + title card\n// chrome, semantic empty state, tabular-figure money cell. Every list page\n// is built from these so the visual rhythm is identical everywhere.\n\n// -------- Table -----------------------------------------------------------\n\nexport function PmTable({ children, dense = false, sx = {}, ...props }) {\n const theme = useTheme();\n return (\n <TableContainer\n sx={{\n borderRadius: 1.5,\n border: `1px solid ${alpha(theme.palette.divider, 0.55)}`,\n backgroundColor: theme.palette.background.paper,\n overflow: 'auto',\n ...sx,\n }}\n >\n <Table\n size={dense ? 'small' : 'medium'}\n {...props}\n sx={{\n '& thead .MuiTableRow-root': {\n background: `linear-gradient(180deg, ${alpha(theme.palette.grey[50], 1)} 0%, ${alpha(theme.palette.grey[100], 1)} 100%)`,\n },\n '& thead .MuiTableCell-root': {\n fontWeight: 800,\n fontSize: '0.7rem',\n textTransform: 'uppercase',\n letterSpacing: '0.65px',\n color: theme.palette.text.secondary,\n borderBottom: `1px solid ${theme.palette.divider}`,\n py: 1.25,\n whiteSpace: 'nowrap',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n },\n '& tbody .MuiTableRow-root': {\n transition: 'background-color 140ms ease',\n },\n '& tbody .MuiTableRow-root:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n },\n '& tbody .MuiTableCell-root': {\n py: 1.4,\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.5)}`,\n verticalAlign: 'middle',\n },\n '& tbody .MuiTableRow-root:last-of-type .MuiTableCell-root': {\n borderBottom: 'none',\n },\n }}\n >\n {children}\n </Table>\n </TableContainer>\n );\n}\nPmTable.propTypes = {\n children: PropTypes.node,\n dense: PropTypes.bool,\n sx: PropTypes.object,\n};\n\n// -------- Section card chrome --------------------------------------------\n\n/**\n * Card with a consistent eyebrow + title + actions header, ready to hold a\n * PmTable (or any other content). The table renders flush against the card\n * because the container handles borders/radius. Toolbar slot is for filters\n * or search inputs that sit between the title and the table.\n */\nexport function PmTableCard({\n eyebrow,\n title,\n subtitle,\n actions,\n toolbar,\n children,\n sx = {},\n}) {\n return (\n <Card\n sx={{\n borderRadius: 1.5,\n border: '1px solid',\n borderColor: 'divider',\n boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)',\n overflow: 'hidden',\n ...sx,\n }}\n >\n <CardContent sx={{ p: 0, '&:last-child': { pb: 0 } }}>\n {(title || actions) ? (\n <Box sx={{ px: 2.5, pt: 2, pb: 1.5 }}>\n <Stack\n direction={{ xs: 'column', md: 'row' }}\n justifyContent=\"space-between\"\n alignItems={{ xs: 'flex-start', md: 'center' }}\n spacing={1.5}\n >\n <Box sx={{ minWidth: 0 }}>\n {eyebrow ? (\n <Typography\n variant=\"overline\"\n sx={{ color: 'text.secondary', fontWeight: 800, letterSpacing: 1, lineHeight: 1 }}\n >\n {eyebrow}\n </Typography>\n ) : null}\n {title ? (\n <Typography variant=\"h6\" sx={{ fontWeight: 800, lineHeight: 1.2 }}>\n {title}\n </Typography>\n ) : null}\n {subtitle ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n ) : null}\n </Box>\n {actions ? <Box>{actions}</Box> : null}\n </Stack>\n </Box>\n ) : null}\n {toolbar ? <Box sx={{ px: 2.5, pb: 1.5 }}>{toolbar}</Box> : null}\n <Box sx={{ p: 2.5, pt: title || toolbar ? 0 : 2.5 }}>{children}</Box>\n </CardContent>\n </Card>\n );\n}\nPmTableCard.propTypes = {\n eyebrow: PropTypes.node,\n title: PropTypes.node,\n subtitle: PropTypes.node,\n actions: PropTypes.node,\n toolbar: PropTypes.node,\n children: PropTypes.node,\n sx: PropTypes.object,\n};\n\n// -------- Empty state row -------------------------------------------------\n\nexport function PmEmptyRow({ colSpan, title, hint, icon: Icon, action }) {\n return (\n <TableRow hover={false}>\n <TableCell colSpan={colSpan} sx={{ py: 5, textAlign: 'center', borderBottom: 'none !important' }}>\n <Stack alignItems=\"center\" spacing={1.25}>\n {Icon ? <Icon sx={{ fontSize: 44, color: 'text.disabled', opacity: 0.7 }} /> : null}\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>{title}</Typography>\n {hint ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ maxWidth: 360 }}>{hint}</Typography>\n ) : null}\n {action ? <Box>{action}</Box> : null}\n </Stack>\n </TableCell>\n </TableRow>\n );\n}\nPmEmptyRow.propTypes = {\n colSpan: PropTypes.number.isRequired,\n title: PropTypes.node,\n hint: PropTypes.node,\n icon: PropTypes.elementType,\n action: PropTypes.node,\n};\n\n// -------- Money cell ------------------------------------------------------\n\n/**\n * Currency display with tabular figures so numbers don't shift between\n * rows. {@code tone} can semantically colour the value — useful for\n * paid/due splits in the Sales table.\n */\nexport function PmMoney({ value, fallback = '—', size = 'normal', tone, bold = true, prefix, sx = {} }) {\n const theme = useTheme();\n const settings = usePmSettings();\n // When the caller doesn't override the prefix, pull the symbol from the\n // module settings — every PmMoney across the module then renders with the\n // currency configured for the deployment.\n const effectivePrefix = prefix ?? currencySymbol(settings?.currencyCode);\n if (value == null || value === '') {\n return <Box component=\"span\" sx={{ color: 'text.disabled', fontVariantNumeric: 'tabular-nums' }}>{fallback}</Box>;\n }\n const n = Number(value);\n if (Number.isNaN(n)) {\n return <Box component=\"span\" sx={{ color: 'text.disabled', fontVariantNumeric: 'tabular-nums' }}>{fallback}</Box>;\n }\n const color = tone === 'warning' ? theme.palette.warning.dark\n : tone === 'success' ? theme.palette.success.dark\n : tone === 'error' ? theme.palette.error.dark\n : tone === 'muted' ? theme.palette.text.secondary\n : 'inherit';\n return (\n <Box\n component=\"span\"\n sx={{\n fontWeight: bold ? (size === 'big' ? 800 : 700) : 500,\n fontSize: size === 'big' ? '1.05rem' : 'inherit',\n fontVariantNumeric: 'tabular-nums',\n color,\n ...sx,\n }}\n >\n {effectivePrefix}{n.toFixed(2)}\n </Box>\n );\n}\nPmMoney.propTypes = {\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n fallback: PropTypes.node,\n size: PropTypes.oneOf(['normal', 'big']),\n tone: PropTypes.oneOf(['warning', 'success', 'error', 'muted']),\n bold: PropTypes.bool,\n prefix: PropTypes.string,\n sx: PropTypes.object,\n};\n\n// -------- Reference chip --------------------------------------------------\n\n/** Monospace `#1234` chip used in left-most \"Ref\" columns. */\nexport function PmRef({ id }) {\n return (\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n px: 0.85,\n py: 0.25,\n borderRadius: 1,\n backgroundColor: 'grey.100',\n color: 'text.secondary',\n fontFamily: 'monospace',\n fontSize: '0.72rem',\n fontWeight: 700,\n letterSpacing: 0.4,\n lineHeight: 1.5,\n }}\n >\n #{id}\n </Box>\n );\n}\nPmRef.propTypes = {\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\n// -------- Field helper text with character counter -----------------------\n\n/**\n * Helper-text content that pairs a message (validation error or hint) on the\n * left with a live \"remaining/allowed\" character counter on the right. Pass\n * as a TextField's `helperText`. Renders only spans so it's valid inside the\n * FormHelperText <p>.\n */\nexport function PmFieldHelp({ message, value, max }) {\n const used = (value ?? '').length;\n const remaining = Math.max(0, max - used);\n return (\n <Box component=\"span\" sx={{ display: 'flex', width: '100%', gap: 1 }}>\n <Box component=\"span\" sx={{ flexGrow: 1 }}>{message || ''}</Box>\n <Box\n component=\"span\"\n sx={{ flexShrink: 0, fontVariantNumeric: 'tabular-nums', color: 'text.secondary' }}\n >\n {remaining}/{max}\n </Box>\n </Box>\n );\n}\nPmFieldHelp.propTypes = {\n message: PropTypes.node,\n value: PropTypes.string,\n max: PropTypes.number.isRequired,\n};\n\n// -------- Select (dropdown) ----------------------------------------------\n\n/**\n * Standard PM dropdown. Wraps MUI Autocomplete (the app-wide dropdown\n * pattern, same as FacilityPicker / CustomDropdown) so every select in the\n * module looks and behaves identically and sizes like the themed text\n * fields. Options are plain `{ value, label }`; `value`/`onChange` work with\n * the raw value so callers don't deal with option objects.\n */\nexport function PmSelect({\n label,\n value,\n onChange,\n onBlur,\n options,\n required = false,\n disabled = false,\n error = false,\n helperText = '',\n fullWidth = true,\n size = 'small',\n noOptionsText,\n sx = {},\n}) {\n const selected = options.find((o) => o.value === value) ?? null;\n return (\n <Autocomplete\n size={size}\n fullWidth={fullWidth}\n disabled={disabled}\n options={options}\n value={selected}\n onChange={(_, opt) => onChange(opt ? opt.value : '')}\n getOptionLabel={(o) => o?.label ?? ''}\n isOptionEqualToValue={(o, v) => o?.value === v?.value}\n disableClearable={required}\n noOptionsText={noOptionsText}\n sx={sx}\n renderInput={(params) => (\n <TextField\n {...params}\n label={label}\n required={required}\n error={error}\n helperText={helperText}\n onBlur={onBlur}\n />\n )}\n />\n );\n}\nPmSelect.propTypes = {\n label: PropTypes.node,\n value: PropTypes.any,\n onChange: PropTypes.func.isRequired,\n onBlur: PropTypes.func,\n options: PropTypes.arrayOf(PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.node,\n })).isRequired,\n required: PropTypes.bool,\n disabled: PropTypes.bool,\n error: PropTypes.bool,\n helperText: PropTypes.node,\n fullWidth: PropTypes.bool,\n size: PropTypes.string,\n noOptionsText: PropTypes.node,\n sx: PropTypes.object,\n};\n\n// -------- Form section helper --------------------------------------------\n\n/**\n * Wraps a chunk of form fields with a consistent eyebrow + title + hint\n * header. Used inside create/edit pages so every section has the same\n * vertical rhythm.\n */\nexport function PmFormSection({ eyebrow, title, hint, children, sx = {} }) {\n return (\n <Box sx={sx}>\n {(eyebrow || title || hint) ? (\n <Box sx={{ mb: 1.75 }}>\n {eyebrow ? (\n <Typography\n variant=\"overline\"\n sx={{ color: 'text.secondary', fontWeight: 800, letterSpacing: 1, lineHeight: 1, display: 'block' }}\n >\n {eyebrow}\n </Typography>\n ) : null}\n {title ? (\n <Typography variant=\"h6\" sx={{ fontWeight: 800, lineHeight: 1.25 }}>{title}</Typography>\n ) : null}\n {hint ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5 }}>\n {hint}\n </Typography>\n ) : null}\n </Box>\n ) : null}\n {children}\n </Box>\n );\n}\nPmFormSection.propTypes = {\n eyebrow: PropTypes.node,\n title: PropTypes.node,\n hint: PropTypes.node,\n children: PropTypes.node,\n sx: PropTypes.object,\n};\n"],"mappings":"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"}