@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.
- package/dist/BrandsPage-CSA3meke.js +385 -0
- package/dist/BrandsPage-CSA3meke.js.map +1 -0
- package/dist/CategoriesPage-BrspzkJL.js +340 -0
- package/dist/CategoriesPage-BrspzkJL.js.map +1 -0
- package/dist/{DashboardPage-BNKUQj46.js → DashboardPage-CqaquOs2.js} +21 -22
- package/dist/{DashboardPage-BNKUQj46.js.map → DashboardPage-CqaquOs2.js.map} +1 -1
- package/dist/{FacilityPicker-Coi8I3yE.js → FacilityPicker-Dv_H95WW.js} +13 -13
- package/dist/{FacilityPicker-Coi8I3yE.js.map → FacilityPicker-Dv_H95WW.js.map} +1 -1
- package/dist/{InventoryPage-BR6jOzg2.js → InventoryPage-CPbzfDMR.js} +12 -12
- package/dist/{InventoryPage-BR6jOzg2.js.map → InventoryPage-CPbzfDMR.js.map} +1 -1
- package/dist/{MemberProfileCard-DbHZCS5n.js → MemberProfileCard-0vjO3Gzd.js} +2 -2
- package/dist/{MemberProfileCard-DbHZCS5n.js.map → MemberProfileCard-0vjO3Gzd.js.map} +1 -1
- package/dist/{PaymentCreatePage-Ci3ERnby.js → PaymentCreatePage-BYmDZAIB.js} +9 -10
- package/dist/{PaymentCreatePage-Ci3ERnby.js.map → PaymentCreatePage-BYmDZAIB.js.map} +1 -1
- package/dist/{PaymentsPage-sdg902zX.js → PaymentsPage-BXPvKon-.js} +16 -16
- package/dist/{PaymentsPage-sdg902zX.js.map → PaymentsPage-BXPvKon-.js.map} +1 -1
- package/dist/PickupCreatePage-CMGwoAXj.js +426 -0
- package/dist/PickupCreatePage-CMGwoAXj.js.map +1 -0
- package/dist/{PickupsPage-Ci2Ll0Kn.js → PickupsPage-D66_Wta4.js} +84 -39
- package/dist/PickupsPage-D66_Wta4.js.map +1 -0
- package/dist/PmTable-B9970kPY.js +375 -0
- package/dist/PmTable-B9970kPY.js.map +1 -0
- package/dist/{ProductEditPage-DL8gy85Y.js → ProductEditPage-B8qFTCW9.js} +226 -243
- package/dist/ProductEditPage-B8qFTCW9.js.map +1 -0
- package/dist/ProductsPage-C7_r9cKn.js +254 -0
- package/dist/ProductsPage-C7_r9cKn.js.map +1 -0
- package/dist/{PurchaseCreatePage-C3KMfBxJ.js → PurchaseCreatePage-CDfNDcKG.js} +150 -149
- package/dist/PurchaseCreatePage-CDfNDcKG.js.map +1 -0
- package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js → PurchaseRequestDetailPage-C7aAwEqw.js} +15 -15
- package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js.map → PurchaseRequestDetailPage-C7aAwEqw.js.map} +1 -1
- package/dist/{PurchaseRequestsPage-DvFH_tWe.js → PurchaseRequestsPage-BwCkbpaX.js} +14 -14
- package/dist/{PurchaseRequestsPage-DvFH_tWe.js.map → PurchaseRequestsPage-BwCkbpaX.js.map} +1 -1
- package/dist/{PurchasesPage-BCvLvSp4.js → PurchasesPage-CvaZouVy.js} +11 -12
- package/dist/{PurchasesPage-BCvLvSp4.js.map → PurchasesPage-CvaZouVy.js.map} +1 -1
- package/dist/{SaleCreatePage-DpkQMoTq.js → SaleCreatePage-DP1Qmltu.js} +30 -31
- package/dist/{SaleCreatePage-DpkQMoTq.js.map → SaleCreatePage-DP1Qmltu.js.map} +1 -1
- package/dist/{SalesPage-DUwgkEO-.js → SalesPage-CO3cdYX5.js} +18 -19
- package/dist/{SalesPage-DUwgkEO-.js.map → SalesPage-CO3cdYX5.js.map} +1 -1
- package/dist/{SettingsPage-CusC0jqJ.js → SettingsPage-DvVRwSFw.js} +104 -103
- package/dist/SettingsPage-DvVRwSFw.js.map +1 -0
- package/dist/StorageUnitsPage-B9Hr_RkW.js +470 -0
- package/dist/StorageUnitsPage-B9Hr_RkW.js.map +1 -0
- package/dist/{TransactionsPage-DDaK4VyY.js → TransactionsPage-HKIGwEZN.js} +127 -123
- package/dist/TransactionsPage-HKIGwEZN.js.map +1 -0
- package/dist/{TransferCreatePage-BxudLfhS.js → TransferCreatePage-DMuZqQ3c.js} +9 -9
- package/dist/{TransferCreatePage-BxudLfhS.js.map → TransferCreatePage-DMuZqQ3c.js.map} +1 -1
- package/dist/{TransfersPage-zgmt7teZ.js → TransfersPage-COIyouL4.js} +16 -16
- package/dist/{TransfersPage-zgmt7teZ.js.map → TransfersPage-COIyouL4.js.map} +1 -1
- package/dist/{VialsPage-CjqPfgpV.js → VialsPage-BNPUwGCU.js} +291 -224
- package/dist/VialsPage-BNPUwGCU.js.map +1 -0
- package/dist/{constants-BrA_hfAI.js → constants-5ZCZo-Zm.js} +5 -2
- package/dist/{constants-BrA_hfAI.js.map → constants-5ZCZo-Zm.js.map} +1 -1
- package/dist/{PmGuard-CjJBisaN.js → currency-ClRLIEg2.js} +186 -9
- package/dist/currency-ClRLIEg2.js.map +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/BrandsPage-DCMCVvDY.js +0 -334
- package/dist/BrandsPage-DCMCVvDY.js.map +0 -1
- package/dist/CategoriesPage-BpRhwfrc.js +0 -284
- package/dist/CategoriesPage-BpRhwfrc.js.map +0 -1
- package/dist/PickupCreatePage-CieMsgWV.js +0 -310
- package/dist/PickupCreatePage-CieMsgWV.js.map +0 -1
- package/dist/PickupsPage-Ci2Ll0Kn.js.map +0 -1
- package/dist/PmGuard-CjJBisaN.js.map +0 -1
- package/dist/PmTable-BuXZQZCU.js +0 -302
- package/dist/PmTable-BuXZQZCU.js.map +0 -1
- package/dist/ProductEditPage-DL8gy85Y.js.map +0 -1
- package/dist/ProductsPage-BANTKxLb.js +0 -221
- package/dist/ProductsPage-BANTKxLb.js.map +0 -1
- package/dist/PurchaseCreatePage-C3KMfBxJ.js.map +0 -1
- package/dist/SettingsPage-CusC0jqJ.js.map +0 -1
- package/dist/StorageUnitsPage-BlC2AgrJ.js +0 -469
- package/dist/StorageUnitsPage-BlC2AgrJ.js.map +0 -1
- package/dist/TransactionsPage-DDaK4VyY.js.map +0 -1
- package/dist/VialsPage-CjqPfgpV.js.map +0 -1
- package/dist/currency-BDDCDgeE.js +0 -169
- 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 {
|
|
2
|
-
import {
|
|
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
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
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
|
-
|
|
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
|
|
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
|
|
45
|
-
let
|
|
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
|
-
|
|
48
|
+
B(!0), K("");
|
|
48
49
|
try {
|
|
49
|
-
let [e,
|
|
50
|
-
|
|
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
|
-
|
|
55
|
+
B(!1);
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
|
-
|
|
58
|
+
s("view.manage.productManagement.settings", () => {
|
|
58
59
|
X();
|
|
59
60
|
}, []), g(() => {
|
|
60
|
-
let e = [
|
|
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
|
|
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
|
-
}, [
|
|
79
|
-
let e = [
|
|
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
|
|
82
|
+
let t = !1;
|
|
82
83
|
return (async () => {
|
|
83
|
-
let
|
|
84
|
+
let n = {};
|
|
84
85
|
await Promise.all(e.map(async (e) => {
|
|
85
86
|
try {
|
|
86
|
-
|
|
87
|
+
n[e] = await u(e);
|
|
87
88
|
} catch {
|
|
88
|
-
|
|
89
|
+
n[e] = [];
|
|
89
90
|
}
|
|
90
|
-
})),
|
|
91
|
+
})), t || oe((e) => ({
|
|
91
92
|
...e,
|
|
92
|
-
...
|
|
93
|
+
...n
|
|
93
94
|
}));
|
|
94
95
|
})(), () => {
|
|
95
|
-
|
|
96
|
+
t = !0;
|
|
96
97
|
};
|
|
97
|
-
}, [
|
|
98
|
-
let t = [
|
|
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
|
-
}, [
|
|
117
|
+
}, [_.memberTableName, Y]);
|
|
117
118
|
function Z(e, t) {
|
|
118
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
143
|
-
memberTableName:
|
|
144
|
-
memberIdColumn:
|
|
145
|
-
memberIdentifierColumn:
|
|
146
|
-
memberFamilyIdColumn:
|
|
147
|
-
memberNameColumn:
|
|
148
|
-
memberDobColumn:
|
|
149
|
-
countryCode:
|
|
150
|
-
managePurchaseAmounts:
|
|
151
|
-
manageSales: !!
|
|
152
|
-
allowPersonalPurchase: !!
|
|
153
|
-
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
|
-
|
|
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(
|
|
171
|
+
return /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(d, {}), /* @__PURE__ */ y(ee, {
|
|
171
172
|
perm: "view.manage.productManagement.settings",
|
|
172
|
-
children: /* @__PURE__ */ b(
|
|
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(
|
|
187
|
-
disabled: !le || U ||
|
|
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:
|
|
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(
|
|
287
|
-
icon: /* @__PURE__ */ y(
|
|
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(
|
|
292
|
-
icon: /* @__PURE__ */ y(
|
|
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(
|
|
321
|
+
/* @__PURE__ */ y(V, {
|
|
321
322
|
label: "Manage sales and payments",
|
|
322
323
|
hint: "Turn off to hide sales and payment features.",
|
|
323
|
-
value:
|
|
324
|
+
value: _.manageSales,
|
|
324
325
|
onChange: (e) => Z("manageSales", e)
|
|
325
326
|
}),
|
|
326
|
-
/* @__PURE__ */ y(
|
|
327
|
+
/* @__PURE__ */ y(V, {
|
|
327
328
|
label: "Manage purchase amounts",
|
|
328
329
|
hint: "Turn off if you only track stock, not money.",
|
|
329
|
-
value:
|
|
330
|
+
value: _.manageSales ? !0 : _.managePurchaseAmounts,
|
|
330
331
|
onChange: (e) => Z("managePurchaseAmounts", e),
|
|
331
|
-
disabled:
|
|
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(
|
|
335
|
+
/* @__PURE__ */ y(V, {
|
|
335
336
|
label: "Allow personal purchases",
|
|
336
337
|
hint: "Turn off to hide the personal purchase option.",
|
|
337
|
-
value:
|
|
338
|
+
value: _.allowPersonalPurchase,
|
|
338
339
|
onChange: (e) => Z("allowPersonalPurchase", e)
|
|
339
340
|
}),
|
|
340
|
-
/* @__PURE__ */ y(
|
|
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:
|
|
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:
|
|
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[
|
|
377
|
-
textColumns: J[
|
|
378
|
-
dateColumns: Y[
|
|
379
|
-
idColumnValue:
|
|
377
|
+
uuidColumns: q[_.memberTableName],
|
|
378
|
+
textColumns: J[_.memberTableName],
|
|
379
|
+
dateColumns: Y[_.memberTableName],
|
|
380
|
+
idColumnValue: _.memberIdColumn,
|
|
380
381
|
onIdColumnChange: (e) => Z("memberIdColumn", e),
|
|
381
|
-
identifierColumnValue:
|
|
382
|
+
identifierColumnValue: _.memberIdentifierColumn,
|
|
382
383
|
onIdentifierColumnChange: (e) => Z("memberIdentifierColumn", e),
|
|
383
|
-
familyIdColumnValue:
|
|
384
|
+
familyIdColumnValue: _.memberFamilyIdColumn,
|
|
384
385
|
onFamilyIdColumnChange: (e) => Z("memberFamilyIdColumn", e),
|
|
385
|
-
nameColumnValue:
|
|
386
|
+
nameColumnValue: _.memberNameColumn,
|
|
386
387
|
onNameColumnChange: (e) => Z("memberNameColumn", e),
|
|
387
|
-
dobColumnValue:
|
|
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
|
|
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 ?
|
|
417
|
-
bgcolor: o ?
|
|
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 :
|
|
421
|
-
bgcolor: o ?
|
|
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 ?
|
|
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:
|
|
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(
|
|
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
|
|
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:
|
|
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:
|
|
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 : [],
|
|
558
|
+
]), N = _(() => O(g ? i : [], l), [
|
|
558
559
|
i,
|
|
559
560
|
g,
|
|
560
|
-
|
|
561
|
-
]),
|
|
561
|
+
l
|
|
562
|
+
]), P = _(() => O(g ? i : [], d), [
|
|
562
563
|
i,
|
|
563
564
|
g,
|
|
564
565
|
d
|
|
565
|
-
]),
|
|
566
|
+
]), F = _(() => O(v ? a : [], p), [
|
|
566
567
|
a,
|
|
567
568
|
v,
|
|
568
569
|
p
|
|
569
|
-
]),
|
|
570
|
-
function
|
|
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
|
|
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:
|
|
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) =>
|
|
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:
|
|
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:
|
|
658
|
-
onChange: (e, 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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 {
|
|
709
|
+
export { B as default };
|
|
709
710
|
|
|
710
|
-
//# sourceMappingURL=SettingsPage-
|
|
711
|
+
//# sourceMappingURL=SettingsPage-DvVRwSFw.js.map
|