@argusoft/medplat-product-management 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/BrandsPage-CSA3meke.js +385 -0
  2. package/dist/BrandsPage-CSA3meke.js.map +1 -0
  3. package/dist/CategoriesPage-BrspzkJL.js +340 -0
  4. package/dist/CategoriesPage-BrspzkJL.js.map +1 -0
  5. package/dist/{DashboardPage-BNKUQj46.js → DashboardPage-CqaquOs2.js} +21 -22
  6. package/dist/{DashboardPage-BNKUQj46.js.map → DashboardPage-CqaquOs2.js.map} +1 -1
  7. package/dist/{FacilityPicker-Coi8I3yE.js → FacilityPicker-Dv_H95WW.js} +13 -13
  8. package/dist/{FacilityPicker-Coi8I3yE.js.map → FacilityPicker-Dv_H95WW.js.map} +1 -1
  9. package/dist/{InventoryPage-BR6jOzg2.js → InventoryPage-CPbzfDMR.js} +12 -12
  10. package/dist/{InventoryPage-BR6jOzg2.js.map → InventoryPage-CPbzfDMR.js.map} +1 -1
  11. package/dist/{MemberProfileCard-DbHZCS5n.js → MemberProfileCard-0vjO3Gzd.js} +2 -2
  12. package/dist/{MemberProfileCard-DbHZCS5n.js.map → MemberProfileCard-0vjO3Gzd.js.map} +1 -1
  13. package/dist/{PaymentCreatePage-Ci3ERnby.js → PaymentCreatePage-BYmDZAIB.js} +9 -10
  14. package/dist/{PaymentCreatePage-Ci3ERnby.js.map → PaymentCreatePage-BYmDZAIB.js.map} +1 -1
  15. package/dist/{PaymentsPage-sdg902zX.js → PaymentsPage-BXPvKon-.js} +16 -16
  16. package/dist/{PaymentsPage-sdg902zX.js.map → PaymentsPage-BXPvKon-.js.map} +1 -1
  17. package/dist/PickupCreatePage-CMGwoAXj.js +426 -0
  18. package/dist/PickupCreatePage-CMGwoAXj.js.map +1 -0
  19. package/dist/{PickupsPage-Ci2Ll0Kn.js → PickupsPage-D66_Wta4.js} +84 -39
  20. package/dist/PickupsPage-D66_Wta4.js.map +1 -0
  21. package/dist/PmTable-B9970kPY.js +375 -0
  22. package/dist/PmTable-B9970kPY.js.map +1 -0
  23. package/dist/{ProductEditPage-DL8gy85Y.js → ProductEditPage-B8qFTCW9.js} +226 -243
  24. package/dist/ProductEditPage-B8qFTCW9.js.map +1 -0
  25. package/dist/ProductsPage-C7_r9cKn.js +254 -0
  26. package/dist/ProductsPage-C7_r9cKn.js.map +1 -0
  27. package/dist/{PurchaseCreatePage-C3KMfBxJ.js → PurchaseCreatePage-CDfNDcKG.js} +150 -149
  28. package/dist/PurchaseCreatePage-CDfNDcKG.js.map +1 -0
  29. package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js → PurchaseRequestDetailPage-C7aAwEqw.js} +15 -15
  30. package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js.map → PurchaseRequestDetailPage-C7aAwEqw.js.map} +1 -1
  31. package/dist/{PurchaseRequestsPage-DvFH_tWe.js → PurchaseRequestsPage-BwCkbpaX.js} +14 -14
  32. package/dist/{PurchaseRequestsPage-DvFH_tWe.js.map → PurchaseRequestsPage-BwCkbpaX.js.map} +1 -1
  33. package/dist/{PurchasesPage-BCvLvSp4.js → PurchasesPage-CvaZouVy.js} +11 -12
  34. package/dist/{PurchasesPage-BCvLvSp4.js.map → PurchasesPage-CvaZouVy.js.map} +1 -1
  35. package/dist/{SaleCreatePage-DpkQMoTq.js → SaleCreatePage-DP1Qmltu.js} +30 -31
  36. package/dist/{SaleCreatePage-DpkQMoTq.js.map → SaleCreatePage-DP1Qmltu.js.map} +1 -1
  37. package/dist/{SalesPage-DUwgkEO-.js → SalesPage-CO3cdYX5.js} +18 -19
  38. package/dist/{SalesPage-DUwgkEO-.js.map → SalesPage-CO3cdYX5.js.map} +1 -1
  39. package/dist/{SettingsPage-CusC0jqJ.js → SettingsPage-DvVRwSFw.js} +104 -103
  40. package/dist/SettingsPage-DvVRwSFw.js.map +1 -0
  41. package/dist/StorageUnitsPage-B9Hr_RkW.js +470 -0
  42. package/dist/StorageUnitsPage-B9Hr_RkW.js.map +1 -0
  43. package/dist/{TransactionsPage-DDaK4VyY.js → TransactionsPage-HKIGwEZN.js} +127 -123
  44. package/dist/TransactionsPage-HKIGwEZN.js.map +1 -0
  45. package/dist/{TransferCreatePage-BxudLfhS.js → TransferCreatePage-DMuZqQ3c.js} +9 -9
  46. package/dist/{TransferCreatePage-BxudLfhS.js.map → TransferCreatePage-DMuZqQ3c.js.map} +1 -1
  47. package/dist/{TransfersPage-zgmt7teZ.js → TransfersPage-COIyouL4.js} +16 -16
  48. package/dist/{TransfersPage-zgmt7teZ.js.map → TransfersPage-COIyouL4.js.map} +1 -1
  49. package/dist/{VialsPage-CjqPfgpV.js → VialsPage-BNPUwGCU.js} +291 -224
  50. package/dist/VialsPage-BNPUwGCU.js.map +1 -0
  51. package/dist/{constants-BrA_hfAI.js → constants-5ZCZo-Zm.js} +5 -2
  52. package/dist/{constants-BrA_hfAI.js.map → constants-5ZCZo-Zm.js.map} +1 -1
  53. package/dist/{PmGuard-CjJBisaN.js → currency-ClRLIEg2.js} +186 -9
  54. package/dist/currency-ClRLIEg2.js.map +1 -0
  55. package/dist/index.js +1 -1
  56. package/package.json +1 -1
  57. package/dist/BrandsPage-DCMCVvDY.js +0 -334
  58. package/dist/BrandsPage-DCMCVvDY.js.map +0 -1
  59. package/dist/CategoriesPage-BpRhwfrc.js +0 -284
  60. package/dist/CategoriesPage-BpRhwfrc.js.map +0 -1
  61. package/dist/PickupCreatePage-CieMsgWV.js +0 -310
  62. package/dist/PickupCreatePage-CieMsgWV.js.map +0 -1
  63. package/dist/PickupsPage-Ci2Ll0Kn.js.map +0 -1
  64. package/dist/PmGuard-CjJBisaN.js.map +0 -1
  65. package/dist/PmTable-BuXZQZCU.js +0 -302
  66. package/dist/PmTable-BuXZQZCU.js.map +0 -1
  67. package/dist/ProductEditPage-DL8gy85Y.js.map +0 -1
  68. package/dist/ProductsPage-BANTKxLb.js +0 -221
  69. package/dist/ProductsPage-BANTKxLb.js.map +0 -1
  70. package/dist/PurchaseCreatePage-C3KMfBxJ.js.map +0 -1
  71. package/dist/SettingsPage-CusC0jqJ.js.map +0 -1
  72. package/dist/StorageUnitsPage-BlC2AgrJ.js +0 -469
  73. package/dist/StorageUnitsPage-BlC2AgrJ.js.map +0 -1
  74. package/dist/TransactionsPage-DDaK4VyY.js.map +0 -1
  75. package/dist/VialsPage-CjqPfgpV.js.map +0 -1
  76. package/dist/currency-BDDCDgeE.js +0 -169
  77. package/dist/currency-BDDCDgeE.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SalesPage-DUwgkEO-.js","names":[],"sources":["../src/views/SalesPage.jsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport {\n Alert,\n Avatar,\n Box,\n Button,\n Chip,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from \"@mui/material\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport AddRoundedIcon from \"@mui/icons-material/AddRounded\";\nimport RefreshRoundedIcon from \"@mui/icons-material/RefreshRounded\";\nimport PointOfSaleRoundedIcon from \"@mui/icons-material/PointOfSaleRounded\";\nimport ReceiptLongRoundedIcon from \"@mui/icons-material/ReceiptLongRounded\";\nimport PaymentsRoundedIcon from \"@mui/icons-material/PaymentsRounded\";\nimport TrendingUpRoundedIcon from \"@mui/icons-material/TrendingUpRounded\";\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 {\n PmEmptyRow,\n PmMoney,\n PmRef,\n PmTable,\n PmTableCard,\n} from \"@pm/components/PmTable\";\nimport { getMembersByIds, listSales } from \"@pm/services/pmApi\";\nimport { formatDate, formatNumber } from \"@pm/utils/format\";\nimport { currencySymbol } from \"@pm/utils/currency\";\nimport { usePmSettings } from \"@pm/utils/settingsStore\";\n\nfunction initials(name) {\n if (!name) return \"?\";\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((s) => s[0])\n .join(\"\")\n .toUpperCase();\n}\n\n// Mini KPI tile shown above the table. Compact, accent-tinted icon, big\n// number — gives the operator a \"what happened lately\" read at a glance.\nfunction SummaryTile({\n icon: Icon,\n label,\n value,\n accent = \"primary\",\n loading,\n}) {\n const theme = useTheme();\n const accentMain = theme.palette[accent]?.main ?? accent;\n const accentDark = theme.palette[accent]?.dark ?? accent;\n return (\n <Box\n sx={{\n flex: 1,\n p: 2,\n borderRadius: 3,\n border: \"1px solid\",\n borderColor: alpha(accentMain, 0.18),\n background: `linear-gradient(135deg, ${alpha(accentMain, 0.05)} 0%, ${alpha(theme.palette.background.paper, 1)} 70%)`,\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5}>\n <Box\n sx={{\n width: 36,\n height: 36,\n borderRadius: 2,\n display: \"grid\",\n placeItems: \"center\",\n background: `linear-gradient(135deg, ${accentMain} 0%, ${accentDark} 100%)`,\n color: \"#fff\",\n boxShadow: `0 6px 14px ${alpha(accentMain, 0.32)}`,\n }}\n >\n <Icon sx={{ fontSize: 18 }} />\n </Box>\n <Box sx={{ minWidth: 0 }}>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n fontWeight: 700,\n letterSpacing: 0.6,\n textTransform: \"uppercase\",\n }}\n >\n {label}\n </Typography>\n {loading ? (\n <Skeleton width={80} height={26} />\n ) : (\n <Typography\n variant=\"h6\"\n sx={{\n fontWeight: 800,\n fontVariantNumeric: \"tabular-nums\",\n lineHeight: 1.2,\n }}\n >\n {value}\n </Typography>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n\nexport default function SalesPage() {\n const navigate = useNavigate();\n const theme = useTheme();\n const settings = usePmSettings();\n const cur = currencySymbol(settings?.currencyCode);\n const [items, setItems] = useState([]);\n // Map of memberId -> display name, hydrated for memberIds present on the\n // loaded sales. Avoids loading the entire member directory just to render\n // the \"Customer\" column.\n const [memberNames, setMemberNames] = useState({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n\n async function load() {\n setLoading(true);\n setError(\"\");\n try {\n const list = await listSales(0, 50);\n setItems(list);\n const ids = Array.from(\n new Set(list.map((s) => s.memberId).filter(Boolean)),\n );\n if (ids.length === 0) {\n setMemberNames({});\n } else {\n try {\n const refs = await getMembersByIds(ids);\n const map = {};\n refs.forEach((r) => {\n map[r.id] = r.name;\n });\n setMemberNames(map);\n } catch {\n setMemberNames({});\n }\n }\n } catch (err) {\n const message =\n err?.response?.data?.message ?? err?.message ?? \"Failed to load sales\";\n setError(message);\n showToast({ message, type: \"error\" });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect(\n \"view.manage.productManagement.sale\",\n () => {\n void load();\n },\n [],\n );\n\n const summary = useMemo(() => {\n const totalRevenue = items.reduce(\n (s, x) => s + Number(x.totalAmount || 0),\n 0,\n );\n const totalDue = items.reduce((s, x) => s + Number(x.dueAmount || 0), 0);\n const openSales = items.filter((x) => Number(x.dueAmount) > 0).length;\n return { totalRevenue, totalDue, openSales, count: items.length };\n }, [items]);\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={\"view.manage.productManagement.sale\"}>\n <PmPageShell\n title=\"Sales\"\n subtitle=\"Customer sales and payments. Each sale is tracked with the batches used.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<RefreshRoundedIcon />}\n onClick={() => void load()}\n >\n Refresh\n </Button>\n {/* DEMO-ONLY: in production a sale is started by passing the member id\n via the URL (/sales/new/:memberId) from an outside flow. Unhide\n this button to launch the create page directly for demos. */}\n {false && (\n <Button\n variant=\"contained\"\n startIcon={<AddRoundedIcon />}\n onClick={() => navigate(\"/ui/medplat/manage/pm/sales/new\")}\n >\n New Sale\n </Button>\n )}\n </Stack>\n }\n >\n {/* ---------- Summary strip ---------- */}\n <Stack\n direction={{ xs: \"column\", md: \"row\" }}\n spacing={2}\n sx={{ mb: 2 }}\n >\n <SummaryTile\n icon={ReceiptLongRoundedIcon}\n label=\"Sales (last 50)\"\n value={summary.count}\n accent=\"primary\"\n loading={loading}\n />\n <SummaryTile\n icon={TrendingUpRoundedIcon}\n label=\"Total billed\"\n value={`${cur}${formatNumber(summary.totalRevenue)}`}\n accent=\"success\"\n loading={loading}\n />\n <SummaryTile\n icon={PaymentsRoundedIcon}\n label=\"Outstanding dues\"\n value={`${cur}${formatNumber(summary.totalDue)}`}\n accent=\"warning\"\n loading={loading}\n />\n <SummaryTile\n icon={PointOfSaleRoundedIcon}\n label=\"Open sales\"\n value={summary.openSales}\n accent=\"info\"\n loading={loading}\n />\n </Stack>\n\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n\n {/* ---------- Table ---------- */}\n <PmTableCard\n eyebrow=\"Recent activity\"\n title=\"Sales transactions\"\n subtitle={\n loading\n ? \"Loading…\"\n : `${summary.count} ${summary.count === 1 ? \"sale\" : \"sales\"} in the last window`\n }\n >\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Ref</TableCell>\n <TableCell>Date</TableCell>\n <TableCell>Customer</TableCell>\n <TableCell>Payment</TableCell>\n <TableCell align=\"right\">Total</TableCell>\n <TableCell align=\"right\">Paid</TableCell>\n <TableCell align=\"right\">Due</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 7 }).map((__, j) => (\n <TableCell key={j}>\n <Skeleton height={22} />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : items.length === 0 ? (\n <PmEmptyRow\n colSpan={7}\n icon={PointOfSaleRoundedIcon}\n title=\"No sales yet\"\n hint=\"Record a sale to see it here with payment details.\"\n action={\n <Button\n variant=\"contained\"\n size=\"small\"\n startIcon={<AddRoundedIcon />}\n onClick={() =>\n navigate(\"/ui/medplat/manage/pm/sales/new\")\n }\n >\n Record first sale\n </Button>\n }\n />\n ) : (\n items.map((s) => {\n const due = Number(s.dueAmount || 0);\n const isPaid = due <= 0;\n const memberName = memberNames[s.memberId];\n return (\n <TableRow key={s.id} hover>\n <TableCell>\n <PmRef id={s.serialId} />\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {formatDate(s.saleDate)}\n </Typography>\n </TableCell>\n <TableCell>\n {memberName ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.25}\n >\n <Avatar\n sx={{\n width: 28,\n height: 28,\n fontSize: 11,\n fontWeight: 700,\n bgcolor: alpha(\n theme.palette.primary.main,\n 0.12,\n ),\n color: \"primary.dark\",\n }}\n >\n {initials(memberName)}\n </Avatar>\n <Box sx={{ minWidth: 0 }}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 700, lineHeight: 1.2 }}\n >\n {memberName}\n </Typography>\n </Box>\n </Stack>\n ) : s.memberId ? (\n <Typography\n variant=\"caption\"\n sx={{\n fontFamily: \"monospace\",\n color: \"text.secondary\",\n }}\n >\n {s.memberId.slice(0, 8)}…\n </Typography>\n ) : (\n <Chip\n size=\"small\"\n label=\"Walk-in\"\n variant=\"outlined\"\n sx={{ fontWeight: 700, borderRadius: 1.5 }}\n />\n )}\n </TableCell>\n <TableCell>\n {s.paymentMode ? (\n <Chip\n size=\"small\"\n label={s.paymentMode}\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n bgcolor: alpha(\n theme.palette.primary.main,\n 0.08,\n ),\n color: \"primary.dark\",\n border: `1px solid ${alpha(theme.palette.primary.main, 0.18)}`,\n }}\n />\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">\n —\n </Typography>\n )}\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney value={s.totalAmount} />\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney\n value={s.paidAmount}\n tone={isPaid ? \"success\" : \"muted\"}\n />\n </TableCell>\n <TableCell align=\"right\">\n {isPaid ? (\n <Chip\n size=\"small\"\n color=\"success\"\n label=\"Paid\"\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n ) : (\n <PmMoney value={due} tone=\"warning\" size=\"big\" />\n )}\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SalesPage-CO3cdYX5.js","names":[],"sources":["../src/views/SalesPage.jsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport {\n Alert,\n Avatar,\n Box,\n Button,\n Chip,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from \"@mui/material\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport AddRoundedIcon from \"@mui/icons-material/AddRounded\";\nimport RefreshRoundedIcon from \"@mui/icons-material/RefreshRounded\";\nimport PointOfSaleRoundedIcon from \"@mui/icons-material/PointOfSaleRounded\";\nimport ReceiptLongRoundedIcon from \"@mui/icons-material/ReceiptLongRounded\";\nimport PaymentsRoundedIcon from \"@mui/icons-material/PaymentsRounded\";\nimport TrendingUpRoundedIcon from \"@mui/icons-material/TrendingUpRounded\";\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 {\n PmEmptyRow,\n PmMoney,\n PmRef,\n PmTable,\n PmTableCard,\n} from \"@pm/components/PmTable\";\nimport { getMembersByIds, listSales } from \"@pm/services/pmApi\";\nimport { formatDate, formatNumber } from \"@pm/utils/format\";\nimport { currencySymbol } from \"@pm/utils/currency\";\nimport { usePmSettings } from \"@pm/utils/settingsStore\";\n\nfunction initials(name) {\n if (!name) return \"?\";\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((s) => s[0])\n .join(\"\")\n .toUpperCase();\n}\n\n// Mini KPI tile shown above the table. Compact, accent-tinted icon, big\n// number — gives the operator a \"what happened lately\" read at a glance.\nfunction SummaryTile({\n icon: Icon,\n label,\n value,\n accent = \"primary\",\n loading,\n}) {\n const theme = useTheme();\n const accentMain = theme.palette[accent]?.main ?? accent;\n const accentDark = theme.palette[accent]?.dark ?? accent;\n return (\n <Box\n sx={{\n flex: 1,\n p: 2,\n borderRadius: 3,\n border: \"1px solid\",\n borderColor: alpha(accentMain, 0.18),\n background: `linear-gradient(135deg, ${alpha(accentMain, 0.05)} 0%, ${alpha(theme.palette.background.paper, 1)} 70%)`,\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5}>\n <Box\n sx={{\n width: 36,\n height: 36,\n borderRadius: 2,\n display: \"grid\",\n placeItems: \"center\",\n background: `linear-gradient(135deg, ${accentMain} 0%, ${accentDark} 100%)`,\n color: \"#fff\",\n boxShadow: `0 6px 14px ${alpha(accentMain, 0.32)}`,\n }}\n >\n <Icon sx={{ fontSize: 18 }} />\n </Box>\n <Box sx={{ minWidth: 0 }}>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n fontWeight: 700,\n letterSpacing: 0.6,\n textTransform: \"uppercase\",\n }}\n >\n {label}\n </Typography>\n {loading ? (\n <Skeleton width={80} height={26} />\n ) : (\n <Typography\n variant=\"h6\"\n sx={{\n fontWeight: 800,\n fontVariantNumeric: \"tabular-nums\",\n lineHeight: 1.2,\n }}\n >\n {value}\n </Typography>\n )}\n </Box>\n </Stack>\n </Box>\n );\n}\n\nexport default function SalesPage() {\n const navigate = useNavigate();\n const theme = useTheme();\n const settings = usePmSettings();\n const cur = currencySymbol(settings?.currencyCode);\n const [items, setItems] = useState([]);\n // Map of memberId -> display name, hydrated for memberIds present on the\n // loaded sales. Avoids loading the entire member directory just to render\n // the \"Customer\" column.\n const [memberNames, setMemberNames] = useState({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n\n async function load() {\n setLoading(true);\n setError(\"\");\n try {\n const list = await listSales(0, 50);\n setItems(list);\n const ids = Array.from(\n new Set(list.map((s) => s.memberId).filter(Boolean)),\n );\n if (ids.length === 0) {\n setMemberNames({});\n } else {\n try {\n const refs = await getMembersByIds(ids);\n const map = {};\n refs.forEach((r) => {\n map[r.id] = r.name;\n });\n setMemberNames(map);\n } catch {\n setMemberNames({});\n }\n }\n } catch (err) {\n const message =\n err?.response?.data?.message ?? err?.message ?? \"Failed to load sales\";\n setError(message);\n showToast({ message, type: \"error\" });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect(\n \"view.manage.productManagement.sale\",\n () => {\n void load();\n },\n [],\n );\n\n const summary = useMemo(() => {\n const totalRevenue = items.reduce(\n (s, x) => s + Number(x.totalAmount || 0),\n 0,\n );\n const totalDue = items.reduce((s, x) => s + Number(x.dueAmount || 0), 0);\n const openSales = items.filter((x) => Number(x.dueAmount) > 0).length;\n return { totalRevenue, totalDue, openSales, count: items.length };\n }, [items]);\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={\"view.manage.productManagement.sale\"}>\n <PmPageShell\n title=\"Sales\"\n subtitle=\"Customer sales and payments. Each sale is tracked with the batches used.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<RefreshRoundedIcon />}\n onClick={() => void load()}\n >\n Refresh\n </Button>\n {/* DEMO-ONLY: in production a sale is started by passing the member id\n via the URL (/sales/new/:memberId) from an outside flow. Unhide\n this button to launch the create page directly for demos. */}\n {false && (\n <Button\n variant=\"contained\"\n startIcon={<AddRoundedIcon />}\n onClick={() => navigate(\"/ui/medplat/manage/pm/sales/new\")}\n >\n New Sale\n </Button>\n )}\n </Stack>\n }\n >\n {/* ---------- Summary strip ---------- */}\n <Stack\n direction={{ xs: \"column\", md: \"row\" }}\n spacing={2}\n sx={{ mb: 2 }}\n >\n <SummaryTile\n icon={ReceiptLongRoundedIcon}\n label=\"Sales (last 50)\"\n value={summary.count}\n accent=\"primary\"\n loading={loading}\n />\n <SummaryTile\n icon={TrendingUpRoundedIcon}\n label=\"Total billed\"\n value={`${cur}${formatNumber(summary.totalRevenue)}`}\n accent=\"success\"\n loading={loading}\n />\n <SummaryTile\n icon={PaymentsRoundedIcon}\n label=\"Outstanding dues\"\n value={`${cur}${formatNumber(summary.totalDue)}`}\n accent=\"warning\"\n loading={loading}\n />\n <SummaryTile\n icon={PointOfSaleRoundedIcon}\n label=\"Open sales\"\n value={summary.openSales}\n accent=\"info\"\n loading={loading}\n />\n </Stack>\n\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n\n {/* ---------- Table ---------- */}\n <PmTableCard\n eyebrow=\"Recent activity\"\n title=\"Sales transactions\"\n subtitle={\n loading\n ? \"Loading…\"\n : `${summary.count} ${summary.count === 1 ? \"sale\" : \"sales\"} in the last window`\n }\n >\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Ref</TableCell>\n <TableCell>Date</TableCell>\n <TableCell>Customer</TableCell>\n <TableCell>Payment</TableCell>\n <TableCell align=\"right\">Total</TableCell>\n <TableCell align=\"right\">Paid</TableCell>\n <TableCell align=\"right\">Due</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 7 }).map((__, j) => (\n <TableCell key={j}>\n <Skeleton height={22} />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : items.length === 0 ? (\n <PmEmptyRow\n colSpan={7}\n icon={PointOfSaleRoundedIcon}\n title=\"No sales yet\"\n hint=\"Record a sale to see it here with payment details.\"\n action={\n <Button\n variant=\"contained\"\n size=\"small\"\n startIcon={<AddRoundedIcon />}\n onClick={() =>\n navigate(\"/ui/medplat/manage/pm/sales/new\")\n }\n >\n Record first sale\n </Button>\n }\n />\n ) : (\n items.map((s) => {\n const due = Number(s.dueAmount || 0);\n const isPaid = due <= 0;\n const memberName = memberNames[s.memberId];\n return (\n <TableRow key={s.id} hover>\n <TableCell>\n <PmRef id={s.serialId} />\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {formatDate(s.saleDate)}\n </Typography>\n </TableCell>\n <TableCell>\n {memberName ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1.25}\n >\n <Avatar\n sx={{\n width: 28,\n height: 28,\n fontSize: 11,\n fontWeight: 700,\n bgcolor: alpha(\n theme.palette.primary.main,\n 0.12,\n ),\n color: \"primary.dark\",\n }}\n >\n {initials(memberName)}\n </Avatar>\n <Box sx={{ minWidth: 0 }}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 700, lineHeight: 1.2 }}\n >\n {memberName}\n </Typography>\n </Box>\n </Stack>\n ) : s.memberId ? (\n <Typography\n variant=\"caption\"\n sx={{\n fontFamily: \"monospace\",\n color: \"text.secondary\",\n }}\n >\n {s.memberId.slice(0, 8)}…\n </Typography>\n ) : (\n <Chip\n size=\"small\"\n label=\"Walk-in\"\n variant=\"outlined\"\n sx={{ fontWeight: 700, borderRadius: 1.5 }}\n />\n )}\n </TableCell>\n <TableCell>\n {s.paymentMode ? (\n <Chip\n size=\"small\"\n label={s.paymentMode}\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n bgcolor: alpha(\n theme.palette.primary.main,\n 0.08,\n ),\n color: \"primary.dark\",\n border: `1px solid ${alpha(theme.palette.primary.main, 0.18)}`,\n }}\n />\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">\n —\n </Typography>\n )}\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney value={s.totalAmount} />\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney\n value={s.paidAmount}\n tone={isPaid ? \"success\" : \"muted\"}\n />\n </TableCell>\n <TableCell align=\"right\">\n {isPaid ? (\n <Chip\n size=\"small\"\n color=\"success\"\n label=\"Paid\"\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n ) : (\n <PmMoney value={due} tone=\"warning\" size=\"big\" />\n )}\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}
@@ -1,17 +1,18 @@
1
- import { F as e, K as t, M as n, U as r, Y as i, a, ct as o, i as s, l as c, n as l, o as u, r as ee, s as d, t as f, u as p } from "./PmGuard-CjJBisaN.js";
2
- import { n as m } from "./PmTable-BuXZQZCU.js";
1
+ import { I as e, N as t, W as n, X as r, a as i, c as a, d as o, i as s, lt as c, n as ee, o as l, q as u, r as d, s as f, u as p } from "./currency-ClRLIEg2.js";
2
+ import { r as m } from "./PmTable-B9970kPY.js";
3
3
  import { createElement as h, useEffect as g, useMemo as _, useState as v } from "react";
4
4
  import { jsx as y, jsxs as b } from "react/jsx-runtime";
5
5
  import { Alert as x, Autocomplete as S, Box as C, Button as w, Card as T, CardContent as E, Grid as D, Stack as O, TextField as k, Typography as A } from "@mui/material";
6
6
  import j from "@mui/icons-material/RefreshRounded";
7
7
  import { showToast as M } from "@/common/toaster/toaster";
8
- import { alpha as N } from "@mui/material/styles";
9
- import te from "@mui/icons-material/PaymentsRounded";
10
- import P from "@mui/icons-material/SaveRounded";
11
- import F from "@/views/custom-components/CustomSwitch";
12
- import I from "@mui/icons-material/PhoneIphoneRounded";
8
+ import N from "@/views/custom-components/CustomSwitch";
9
+ import { alpha as P } from "@mui/material/styles";
10
+ import F from "@mui/icons-material/PaymentsRounded";
11
+ import I from "@mui/icons-material/SaveRounded";
12
+ import L from "@mui/icons-material/PhoneIphoneRounded";
13
13
  //#region src/views/SettingsPage.jsx
14
- function L() {
14
+ var R = [...p].sort((e, t) => e.name.localeCompare(t.name));
15
+ function te() {
15
16
  return {
16
17
  memberTableName: "",
17
18
  memberIdColumn: "",
@@ -26,7 +27,7 @@ function L() {
26
27
  requirePurchaseConfirmation: !1
27
28
  };
28
29
  }
29
- function R(e) {
30
+ function z(e) {
30
31
  return {
31
32
  memberTableName: e?.memberTableName ?? "",
32
33
  memberIdColumn: e?.memberIdColumn ?? "",
@@ -41,30 +42,30 @@ function R(e) {
41
42
  requirePurchaseConfirmation: e?.requirePurchaseConfirmation === !0
42
43
  };
43
44
  }
44
- function z() {
45
- let _ = s().has("update.manage.productManagement.settings"), [N, F] = v(L()), [z, H] = v(!0), [U, W] = v(!1), [G, K] = v(""), [re, ie] = v([]), [q, ae] = v({}), [J, oe] = v({}), [Y, se] = v({});
45
+ function B() {
46
+ let p = i().has("update.manage.productManagement.settings"), [_, N] = v(te()), [P, B] = v(!0), [U, W] = v(!1), [G, K] = v(""), [re, ie] = v([]), [q, ae] = v({}), [J, oe] = v({}), [Y, se] = v({});
46
47
  async function X() {
47
- H(!0), K("");
48
+ B(!0), K("");
48
49
  try {
49
- let [e, t] = await Promise.all([n(), r().catch(() => [])]);
50
- F(R(e)), ie(t);
50
+ let [e, r] = await Promise.all([t(), n().catch(() => [])]);
51
+ N(z(e)), ie(r);
51
52
  } catch (e) {
52
53
  K(e?.response?.data?.message ?? e?.message ?? "Failed to load settings");
53
54
  } finally {
54
- H(!1);
55
+ B(!1);
55
56
  }
56
57
  }
57
- ee("view.manage.productManagement.settings", () => {
58
+ s("view.manage.productManagement.settings", () => {
58
59
  X();
59
60
  }, []), g(() => {
60
- let e = [N.memberTableName].filter(Boolean).filter((e) => q[e] === void 0);
61
+ let e = [_.memberTableName].filter(Boolean).filter((e) => q[e] === void 0);
61
62
  if (e.length === 0) return;
62
63
  let t = !1;
63
64
  return (async () => {
64
65
  let n = {};
65
66
  await Promise.all(e.map(async (e) => {
66
67
  try {
67
- n[e] = await i(e);
68
+ n[e] = await r(e);
68
69
  } catch {
69
70
  n[e] = [];
70
71
  }
@@ -75,27 +76,27 @@ function z() {
75
76
  })(), () => {
76
77
  t = !0;
77
78
  };
78
- }, [N.memberTableName, q]), g(() => {
79
- let e = [N.memberTableName].filter(Boolean).filter((e) => J[e] === void 0);
79
+ }, [_.memberTableName, q]), g(() => {
80
+ let e = [_.memberTableName].filter(Boolean).filter((e) => J[e] === void 0);
80
81
  if (e.length === 0) return;
81
- let n = !1;
82
+ let t = !1;
82
83
  return (async () => {
83
- let r = {};
84
+ let n = {};
84
85
  await Promise.all(e.map(async (e) => {
85
86
  try {
86
- r[e] = await t(e);
87
+ n[e] = await u(e);
87
88
  } catch {
88
- r[e] = [];
89
+ n[e] = [];
89
90
  }
90
- })), n || oe((e) => ({
91
+ })), t || oe((e) => ({
91
92
  ...e,
92
- ...r
93
+ ...n
93
94
  }));
94
95
  })(), () => {
95
- n = !0;
96
+ t = !0;
96
97
  };
97
- }, [N.memberTableName, J]), g(() => {
98
- let t = [N.memberTableName].filter(Boolean).filter((e) => Y[e] === void 0);
98
+ }, [_.memberTableName, J]), g(() => {
99
+ let t = [_.memberTableName].filter(Boolean).filter((e) => Y[e] === void 0);
99
100
  if (t.length === 0) return;
100
101
  let n = !1;
101
102
  return (async () => {
@@ -113,16 +114,16 @@ function z() {
113
114
  })(), () => {
114
115
  n = !0;
115
116
  };
116
- }, [N.memberTableName, Y]);
117
+ }, [_.memberTableName, Y]);
117
118
  function Z(e, t) {
118
- F((n) => ({
119
+ N((n) => ({
119
120
  ...n,
120
121
  [e]: t
121
122
  }));
122
123
  }
123
124
  function ce(e, t, n) {
124
125
  let r = Array.isArray(t) ? t : [t];
125
- F((t) => {
126
+ N((t) => {
126
127
  let i = r.reduce((e, t) => ({
127
128
  ...e,
128
129
  [t]: ""
@@ -134,25 +135,25 @@ function z() {
134
135
  };
135
136
  });
136
137
  }
137
- let Q = N.countryCode ? "" : "Country is required.", le = !Q, $ = p(N.countryCode);
138
+ let Q = _.countryCode ? "" : "Country is required.", le = !Q, $ = o(_.countryCode);
138
139
  async function ue() {
139
140
  if (le) {
140
141
  W(!0), K("");
141
142
  try {
142
- let e = await o({
143
- memberTableName: N.memberTableName || null,
144
- memberIdColumn: N.memberIdColumn || null,
145
- memberIdentifierColumn: N.memberIdentifierColumn || null,
146
- memberFamilyIdColumn: N.memberFamilyIdColumn || null,
147
- memberNameColumn: N.memberNameColumn || null,
148
- memberDobColumn: N.memberDobColumn || null,
149
- countryCode: N.countryCode,
150
- managePurchaseAmounts: N.manageSales ? !0 : !!N.managePurchaseAmounts,
151
- manageSales: !!N.manageSales,
152
- allowPersonalPurchase: !!N.allowPersonalPurchase,
153
- requirePurchaseConfirmation: !!N.requirePurchaseConfirmation
143
+ let e = await c({
144
+ memberTableName: _.memberTableName || null,
145
+ memberIdColumn: _.memberIdColumn || null,
146
+ memberIdentifierColumn: _.memberIdentifierColumn || null,
147
+ memberFamilyIdColumn: _.memberFamilyIdColumn || null,
148
+ memberNameColumn: _.memberNameColumn || null,
149
+ memberDobColumn: _.memberDobColumn || null,
150
+ countryCode: _.countryCode,
151
+ managePurchaseAmounts: _.manageSales ? !0 : !!_.managePurchaseAmounts,
152
+ manageSales: !!_.manageSales,
153
+ allowPersonalPurchase: !!_.allowPersonalPurchase,
154
+ requirePurchaseConfirmation: !!_.requirePurchaseConfirmation
154
155
  });
155
- F(R(e)), d(e), u(!0).catch(() => {}), M({
156
+ N(z(e)), a(e), f(!0).catch(() => {}), M({
156
157
  message: "Settings saved.",
157
158
  type: "success"
158
159
  });
@@ -167,9 +168,9 @@ function z() {
167
168
  }
168
169
  }
169
170
  }
170
- return /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(l, {}), /* @__PURE__ */ y(f, {
171
+ return /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(d, {}), /* @__PURE__ */ y(ee, {
171
172
  perm: "view.manage.productManagement.settings",
172
- children: /* @__PURE__ */ b(a, {
173
+ children: /* @__PURE__ */ b(l, {
173
174
  title: "Settings",
174
175
  subtitle: "Set up the module for your deployment. Choose your country, link to your database, and enable the features you need.",
175
176
  chips: ["Configuration"],
@@ -183,8 +184,8 @@ function z() {
183
184
  children: "Refresh"
184
185
  }), /* @__PURE__ */ y(w, {
185
186
  variant: "contained",
186
- startIcon: /* @__PURE__ */ y(P, {}),
187
- disabled: !le || U || z || !_,
187
+ startIcon: /* @__PURE__ */ y(I, {}),
188
+ disabled: !le || U || P || !p,
188
189
  onClick: () => void ue(),
189
190
  children: U ? "Saving…" : "Save"
190
191
  })]
@@ -219,7 +220,7 @@ function z() {
219
220
  md: 6,
220
221
  children: /* @__PURE__ */ y(S, {
221
222
  size: "small",
222
- options: c,
223
+ options: R,
223
224
  value: $,
224
225
  onChange: (e, t) => Z("countryCode", t?.code ?? ""),
225
226
  disableClearable: !0,
@@ -283,13 +284,13 @@ function z() {
283
284
  direction: "row",
284
285
  spacing: 1.5,
285
286
  sx: { height: "100%" },
286
- children: [/* @__PURE__ */ y(V, {
287
- icon: /* @__PURE__ */ y(te, { fontSize: "small" }),
287
+ children: [/* @__PURE__ */ y(H, {
288
+ icon: /* @__PURE__ */ y(F, { fontSize: "small" }),
288
289
  label: "Currency",
289
290
  primary: `${$?.currencySymbol ?? "—"} 1,234.50`,
290
291
  secondary: $?.currencyCode ?? "—"
291
- }), /* @__PURE__ */ y(V, {
292
- icon: /* @__PURE__ */ y(I, { fontSize: "small" }),
292
+ }), /* @__PURE__ */ y(H, {
293
+ icon: /* @__PURE__ */ y(L, { fontSize: "small" }),
293
294
  label: "Phone",
294
295
  primary: $?.phoneCode ?? "—",
295
296
  secondary: $ ? `${$.phoneMin}${$.phoneMin === $.phoneMax ? "" : `–${$.phoneMax}`} digits` : "—"
@@ -317,30 +318,30 @@ function z() {
317
318
  }), /* @__PURE__ */ b(O, {
318
319
  spacing: 1.5,
319
320
  children: [
320
- /* @__PURE__ */ y(B, {
321
+ /* @__PURE__ */ y(V, {
321
322
  label: "Manage sales and payments",
322
323
  hint: "Turn off to hide sales and payment features.",
323
- value: N.manageSales,
324
+ value: _.manageSales,
324
325
  onChange: (e) => Z("manageSales", e)
325
326
  }),
326
- /* @__PURE__ */ y(B, {
327
+ /* @__PURE__ */ y(V, {
327
328
  label: "Manage purchase amounts",
328
329
  hint: "Turn off if you only track stock, not money.",
329
- value: N.manageSales ? !0 : N.managePurchaseAmounts,
330
+ value: _.manageSales ? !0 : _.managePurchaseAmounts,
330
331
  onChange: (e) => Z("managePurchaseAmounts", e),
331
- disabled: N.manageSales,
332
+ disabled: _.manageSales,
332
333
  lockNote: "Required while sales and payments are on — sales need purchase costs to compute margins."
333
334
  }),
334
- /* @__PURE__ */ y(B, {
335
+ /* @__PURE__ */ y(V, {
335
336
  label: "Allow personal purchases",
336
337
  hint: "Turn off to hide the personal purchase option.",
337
- value: N.allowPersonalPurchase,
338
+ value: _.allowPersonalPurchase,
338
339
  onChange: (e) => Z("allowPersonalPurchase", e)
339
340
  }),
340
- /* @__PURE__ */ y(B, {
341
+ /* @__PURE__ */ y(V, {
341
342
  label: "Require purchase confirmation",
342
343
  hint: "Turn on to require a manager to approve purchases before stock is added.",
343
- value: N.requirePurchaseConfirmation,
344
+ value: _.requirePurchaseConfirmation,
344
345
  onChange: (e) => Z("requirePurchaseConfirmation", e)
345
346
  })
346
347
  ]
@@ -365,7 +366,7 @@ function z() {
365
366
  spacing: 3,
366
367
  children: /* @__PURE__ */ y(ne, {
367
368
  tables: re,
368
- tableValue: N.memberTableName,
369
+ tableValue: _.memberTableName,
369
370
  onTableChange: (e) => ce("memberTableName", [
370
371
  "memberIdColumn",
371
372
  "memberIdentifierColumn",
@@ -373,18 +374,18 @@ function z() {
373
374
  "memberNameColumn",
374
375
  "memberDobColumn"
375
376
  ], e),
376
- uuidColumns: q[N.memberTableName],
377
- textColumns: J[N.memberTableName],
378
- dateColumns: Y[N.memberTableName],
379
- idColumnValue: N.memberIdColumn,
377
+ uuidColumns: q[_.memberTableName],
378
+ textColumns: J[_.memberTableName],
379
+ dateColumns: Y[_.memberTableName],
380
+ idColumnValue: _.memberIdColumn,
380
381
  onIdColumnChange: (e) => Z("memberIdColumn", e),
381
- identifierColumnValue: N.memberIdentifierColumn,
382
+ identifierColumnValue: _.memberIdentifierColumn,
382
383
  onIdentifierColumnChange: (e) => Z("memberIdentifierColumn", e),
383
- familyIdColumnValue: N.memberFamilyIdColumn,
384
+ familyIdColumnValue: _.memberFamilyIdColumn,
384
385
  onFamilyIdColumnChange: (e) => Z("memberFamilyIdColumn", e),
385
- nameColumnValue: N.memberNameColumn,
386
+ nameColumnValue: _.memberNameColumn,
386
387
  onNameColumnChange: (e) => Z("memberNameColumn", e),
387
- dobColumnValue: N.memberDobColumn,
388
+ dobColumnValue: _.memberDobColumn,
388
389
  onDobColumnChange: (e) => Z("memberDobColumn", e)
389
390
  })
390
391
  })]
@@ -394,7 +395,7 @@ function z() {
394
395
  })
395
396
  })] });
396
397
  }
397
- function B({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNote: a = "" }) {
398
+ function V({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNote: a = "" }) {
398
399
  let o = !!n, s = !i;
399
400
  return /* @__PURE__ */ b(C, {
400
401
  role: "button",
@@ -413,12 +414,12 @@ function B({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNot
413
414
  cursor: s ? "pointer" : "not-allowed",
414
415
  opacity: s ? 1 : .75,
415
416
  border: "1px solid",
416
- borderColor: o ? N(e.palette.primary.main, .35) : "divider",
417
- bgcolor: o ? N(e.palette.primary.main, .04) : "transparent",
417
+ borderColor: o ? P(e.palette.primary.main, .35) : "divider",
418
+ bgcolor: o ? P(e.palette.primary.main, .04) : "transparent",
418
419
  transition: "all 180ms ease",
419
420
  "&:hover": s ? {
420
- borderColor: o ? e.palette.primary.main : N(e.palette.primary.main, .35),
421
- bgcolor: o ? N(e.palette.primary.main, .06) : N(e.palette.primary.main, .02)
421
+ borderColor: o ? e.palette.primary.main : P(e.palette.primary.main, .35),
422
+ bgcolor: o ? P(e.palette.primary.main, .06) : P(e.palette.primary.main, .02)
422
423
  } : void 0
423
424
  }),
424
425
  children: [/* @__PURE__ */ b(C, {
@@ -449,7 +450,7 @@ function B({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNot
449
450
  letterSpacing: .6,
450
451
  textTransform: "uppercase",
451
452
  color: o ? e.palette.success.dark : e.palette.text.disabled,
452
- bgcolor: o ? N(e.palette.success.main, .12) : N(e.palette.text.disabled, .1)
453
+ bgcolor: o ? P(e.palette.success.main, .12) : P(e.palette.text.disabled, .1)
453
454
  }),
454
455
  children: o ? "Enabled" : "Disabled"
455
456
  }),
@@ -463,7 +464,7 @@ function B({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNot
463
464
  letterSpacing: .6,
464
465
  textTransform: "uppercase",
465
466
  color: e.palette.warning.dark,
466
- bgcolor: N(e.palette.warning.main, .14)
467
+ bgcolor: P(e.palette.warning.main, .14)
467
468
  }),
468
469
  children: "Locked"
469
470
  }) : null
@@ -477,7 +478,7 @@ function B({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNot
477
478
  },
478
479
  children: i && a ? a : t
479
480
  })]
480
- }), /* @__PURE__ */ y(F, {
481
+ }), /* @__PURE__ */ y(N, {
481
482
  checked: o,
482
483
  disabled: i,
483
484
  onClick: (e) => e.stopPropagation(),
@@ -485,7 +486,7 @@ function B({ label: e, hint: t, value: n, onChange: r, disabled: i = !1, lockNot
485
486
  })]
486
487
  });
487
488
  }
488
- function V({ icon: e, label: t, primary: n, secondary: r }) {
489
+ function H({ icon: e, label: t, primary: n, secondary: r }) {
489
490
  return /* @__PURE__ */ b(C, {
490
491
  sx: (e) => ({
491
492
  flex: 1,
@@ -494,7 +495,7 @@ function V({ icon: e, label: t, primary: n, secondary: r }) {
494
495
  borderRadius: 3,
495
496
  border: "1px solid",
496
497
  borderColor: "divider",
497
- bgcolor: N(e.palette.primary.main, .03),
498
+ bgcolor: P(e.palette.primary.main, .03),
498
499
  display: "flex",
499
500
  flexDirection: "column",
500
501
  justifyContent: "center"
@@ -537,7 +538,7 @@ function V({ icon: e, label: t, primary: n, secondary: r }) {
537
538
  ]
538
539
  });
539
540
  }
540
- function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textColumns: i, dateColumns: a, idColumnValue: o, onIdColumnChange: s, identifierColumnValue: c, onIdentifierColumnChange: l, familyIdColumnValue: u, onFamilyIdColumnChange: ee, nameColumnValue: d, onNameColumnChange: f, dobColumnValue: p, onDobColumnChange: m }) {
541
+ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textColumns: i, dateColumns: a, idColumnValue: o, onIdColumnChange: s, identifierColumnValue: c, onIdentifierColumnChange: ee, familyIdColumnValue: l, onFamilyIdColumnChange: u, nameColumnValue: d, onNameColumnChange: f, dobColumnValue: p, onDobColumnChange: m }) {
541
542
  let h = Array.isArray(r), g = Array.isArray(i), v = Array.isArray(a), x = h && r.length === 0, w = g && i.length === 0, T = v && a.length === 0, E = _(() => {
542
543
  let n = e ?? [];
543
544
  return !t || n.includes(t) ? n : [t, ...n];
@@ -554,23 +555,23 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
554
555
  i,
555
556
  g,
556
557
  c
557
- ]), N = _(() => O(g ? i : [], u), [
558
+ ]), N = _(() => O(g ? i : [], l), [
558
559
  i,
559
560
  g,
560
- u
561
- ]), te = _(() => O(g ? i : [], d), [
561
+ l
562
+ ]), P = _(() => O(g ? i : [], d), [
562
563
  i,
563
564
  g,
564
565
  d
565
- ]), P = _(() => O(v ? a : [], p), [
566
+ ]), F = _(() => O(v ? a : [], p), [
566
567
  a,
567
568
  v,
568
569
  p
569
- ]), F = t ? h ? x ? "No UUID columns found in this table." : "Column that holds the member’s primary key." : "Loading columns…" : "Pick a table first.";
570
- function I(e) {
570
+ ]), I = t ? h ? x ? "No UUID columns found in this table." : "Column that holds the member’s primary key." : "Loading columns…" : "Pick a table first.";
571
+ function L(e) {
571
572
  return t ? g ? w ? "No text columns found in this table." : e : "Loading columns…" : "Pick a table first.";
572
573
  }
573
- let L = t ? v ? T ? "No date/timestamp columns found in this table." : "Age is derived from this column in the UI." : "Loading columns…" : "Pick a table first.";
574
+ let R = t ? v ? T ? "No date/timestamp columns found in this table." : "Age is derived from this column in the UI." : "Loading columns…" : "Pick a table first.";
574
575
  return /* @__PURE__ */ b(C, { children: [
575
576
  /* @__PURE__ */ y(A, {
576
577
  variant: "subtitle1",
@@ -624,7 +625,7 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
624
625
  ...e,
625
626
  label: "UUID column",
626
627
  placeholder: "Type to search…",
627
- helperText: F
628
+ helperText: I
628
629
  })
629
630
  })
630
631
  }),
@@ -637,12 +638,12 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
637
638
  disabled: !t || !g || w,
638
639
  options: M,
639
640
  value: c || null,
640
- onChange: (e, t) => l(t ?? ""),
641
+ onChange: (e, t) => ee(t ?? ""),
641
642
  renderInput: (e) => /* @__PURE__ */ y(k, {
642
643
  ...e,
643
644
  label: "Identifier column",
644
645
  placeholder: "Type to search…",
645
- helperText: I("Unique identifier shown on the profile card (e.g. national id).")
646
+ helperText: L("Unique identifier shown on the profile card (e.g. national id).")
646
647
  })
647
648
  })
648
649
  }),
@@ -654,13 +655,13 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
654
655
  size: "small",
655
656
  disabled: !t || !g || w,
656
657
  options: N,
657
- value: u || null,
658
- onChange: (e, t) => ee(t ?? ""),
658
+ value: l || null,
659
+ onChange: (e, t) => u(t ?? ""),
659
660
  renderInput: (e) => /* @__PURE__ */ y(k, {
660
661
  ...e,
661
662
  label: "Family ID column",
662
663
  placeholder: "Type to search…",
663
- helperText: I("Groups members by household.")
664
+ helperText: L("Groups members by household.")
664
665
  })
665
666
  })
666
667
  }),
@@ -671,14 +672,14 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
671
672
  children: /* @__PURE__ */ y(S, {
672
673
  size: "small",
673
674
  disabled: !t || !g || w,
674
- options: te,
675
+ options: P,
675
676
  value: d || null,
676
677
  onChange: (e, t) => f(t ?? ""),
677
678
  renderInput: (e) => /* @__PURE__ */ y(k, {
678
679
  ...e,
679
680
  label: "Name column",
680
681
  placeholder: "Type to search…",
681
- helperText: I("Display name. Also used by the recent-payments / sales tables.")
682
+ helperText: L("Display name. Also used by the recent-payments / sales tables.")
682
683
  })
683
684
  })
684
685
  }),
@@ -689,14 +690,14 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
689
690
  children: /* @__PURE__ */ y(S, {
690
691
  size: "small",
691
692
  disabled: !t || !v || T,
692
- options: P,
693
+ options: F,
693
694
  value: p || null,
694
695
  onChange: (e, t) => m(t ?? ""),
695
696
  renderInput: (e) => /* @__PURE__ */ y(k, {
696
697
  ...e,
697
698
  label: "Date of birth column",
698
699
  placeholder: "Type to search…",
699
- helperText: L
700
+ helperText: R
700
701
  })
701
702
  })
702
703
  })
@@ -705,6 +706,6 @@ function ne({ tables: e, tableValue: t, onTableChange: n, uuidColumns: r, textCo
705
706
  ] });
706
707
  }
707
708
  //#endregion
708
- export { z as default };
709
+ export { B as default };
709
710
 
710
- //# sourceMappingURL=SettingsPage-CusC0jqJ.js.map
711
+ //# sourceMappingURL=SettingsPage-DvVRwSFw.js.map