@mx-cartographer/experiences 9.4.20 → 9.4.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"HoldingDrawer.es.js","names":[],"sources":["../../../src/investments/components/HoldingDrawer.tsx"],"sourcesContent":["import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport IconButton from '@mui/material/IconButton'\nimport TextField from '@mui/material/TextField'\nimport Stack from '@mui/system/Stack'\n\nimport { Icon } from '@mxenabled/mx-icons'\n\nimport { InstitutionLogo, Text } from '@mxenabled/mxui'\n\nimport { Drawer } from '../../common'\nimport { useGlobalCopyStore } from '../../common'\n\ninterface HoldingDetail {\n id: string\n description: string\n qty: number\n holding: string\n costBasis: number\n totalGainLoss: number\n marketValue: number\n}\n\ninterface InvestmentDetailsDrawerProps {\n accountHoldingsData: {\n accounts: any\n holdings: HoldingDetail[]\n }\n currentEditedCostBasis: string\n editingHoldingId: string | null\n handleCostBasisBlur: (id: string) => void\n handleCostBasisChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n handleCostBasisClick: (holdingId: string, currentCostBasis: number) => void\n handleCostBasisKeyDown: (event: React.KeyboardEvent<HTMLInputElement>, id: string) => void\n isOpen: boolean\n onClose: () => void\n}\n\nconst InvestmentDetailsDrawer: React.FC<InvestmentDetailsDrawerProps> = ({\n accountHoldingsData,\n currentEditedCostBasis,\n editingHoldingId,\n handleCostBasisBlur,\n handleCostBasisClick,\n handleCostBasisChange,\n handleCostBasisKeyDown,\n isOpen,\n onClose,\n}) => {\n const { investments: copy } = useGlobalCopyStore()\n const [expandedStates, setExpandedStates] = React.useState<Record<string, boolean>>({})\n\n const handleAccordionChange =\n (holdingId: string) => (_event: React.SyntheticEvent, isExpanded: boolean) => {\n setExpandedStates((prevStates) => ({\n ...prevStates,\n [holdingId]: isExpanded,\n }))\n }\n\n return (\n <Drawer\n ariaLabelClose={copy.overview.close_investment_drawer}\n isOpen={isOpen}\n onClose={onClose}\n title={copy.overview.investment_details}\n >\n <Stack sx={{ gap: 8, p: 24 }}>\n <InstitutionLogo\n alt={accountHoldingsData.accounts.institutionName || ''}\n institutionGuid={accountHoldingsData.accounts.institution_guid || ''}\n size={64}\n />\n <Text sx={{ color: 'text.primary' }} variant=\"body2\">\n {accountHoldingsData.accounts.memberName}\n </Text>\n <Text sx={{ color: 'text.primary' }} variant=\"h2\">\n {accountHoldingsData.accounts.user_name || accountHoldingsData.accounts.name}\n </Text>\n\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', justifyContent: 'space-between' }}>\n <Text sx={{ color: 'text.primary', fontWeight: 600 }} variant=\"body1\">\n {copy.overview.current_balance}\n </Text>\n\n <Text sx={{ color: 'text.primary', fontWeight: 600 }} variant=\"body1\">\n {accountHoldingsData.accounts.balance?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n </Stack>\n </Stack>\n\n <Stack\n sx={{\n bgcolor: 'background.default',\n flexDirection: 'row',\n justifyContent: 'space-between',\n px: 24,\n py: 10,\n }}\n >\n <Text sx={{ color: 'text.primary', fontWeight: 700 }} variant=\"caption\">\n {copy.overview.holding}\n </Text>\n <Text sx={{ color: 'text.primary', fontWeight: 700 }} variant=\"caption\">\n {copy.overview.market_value}\n </Text>\n </Stack>\n {accountHoldingsData.holdings?.map((holding, index) => {\n const isCurrentlyEditing = editingHoldingId === holding.id\n return (\n <Accordion\n disableGutters={true}\n expanded={expandedStates[holding.id] === true}\n key={holding.id}\n onChange={holding ? handleAccordionChange(holding?.id) : () => {}}\n sx={{\n ':before': index === 0 ? { opacity: 0 } : {},\n '.MuiAccordionDetails-root': { p: 0 },\n }}\n >\n <AccordionSummary\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n sx={[\n { height: 64 },\n expandedStates[holding.id] &&\n index > 0 && {\n borderTop: 1,\n borderColor: 'divider',\n },\n ]}\n >\n <Stack sx={{ flexDirection: 'row', width: '100%' }}>\n <div style={{ width: 24 }} />\n <Stack\n sx={[\n {\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'space-between',\n pr: 24,\n py: 14,\n width: '100%',\n },\n expandedStates[holding.id] && {\n borderBottom: 1,\n borderColor: 'divider',\n },\n ]}\n >\n <Stack\n sx={{\n alignItems: 'center',\n flex: 1,\n flexDirection: 'row',\n gap: 12,\n minWidth: 0,\n }}\n >\n <Stack sx={{ minWidth: 0, overflow: 'hidden' }}>\n <Text\n sx={{\n fontWeight: 600,\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 1,\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n }}\n variant=\"body1\"\n >\n {holding.holding}\n </Text>\n <Text\n sx={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 2,\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n }}\n variant=\"caption\"\n >\n {holding.description}\n </Text>\n </Stack>\n </Stack>\n\n <Stack\n sx={{\n alignItems: 'center',\n flexShrink: 0,\n flexDirection: 'row',\n gap: 12,\n justifyContent: 'flex-end',\n }}\n >\n <Stack>\n <Text sx={{ fontWeight: 600, textAlign: 'right' }} variant={'body1'}>\n {holding.marketValue?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n <Stack sx={{ alignItems: 'center', gap: 2, flexDirection: 'row' }}>\n {holding.totalGainLoss !== 0 && (\n <Icon\n name={holding.totalGainLoss >= 0 ? 'trending_up' : 'trending_down'}\n size={12}\n sx={{\n verticalAlign: 'middle',\n mr: 1,\n color: holding.totalGainLoss >= 0 ? 'success.main' : 'grey.700',\n }}\n />\n )}\n <Text\n sx={{\n color: holding.totalGainLoss <= 0 ? 'grey.700' : 'success.main',\n fontWeight: holding.totalGainLoss <= 0 ? 400 : 700,\n }}\n variant=\"caption\"\n >\n {holding.costBasis\n ? `${((holding.totalGainLoss / holding.costBasis) * 100).toFixed(2)}%`\n : '0.00%'}\n </Text>\n <Text sx={{ color: 'grey.700' }} variant=\"caption\">\n |\n </Text>\n <Text\n sx={{\n color: holding.totalGainLoss <= 0 ? 'grey.700' : 'success.main',\n fontWeight: holding.totalGainLoss <= 0 ? 400 : 700,\n }}\n variant=\"caption\"\n >\n {Math.abs(holding.totalGainLoss).toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n </Stack>\n </Stack>\n\n <Icon\n name={expandedStates[holding.id] ? 'expand_less' : 'expand_more'}\n size={20}\n />\n </Stack>\n </Stack>\n </Stack>\n </AccordionSummary>\n <AccordionDetails>\n <Stack\n sx={{\n alignItems: 'center',\n bgcolor: 'background.default',\n flexDirection: 'row',\n pl: 24,\n }}\n >\n <Stack sx={{ width: 32 }} />\n <Stack sx={{ flex: 1 }}>\n <Stack\n sx={{\n alignItems: 'center',\n borderBottom: 1,\n borderColor: 'divider',\n flexDirection: 'row',\n height: 48,\n justifyContent: 'space-between',\n pr: 24,\n }}\n >\n <Text sx={{ color: 'text.primary' }} variant=\"body1\">\n {copy.overview.quantity}\n </Text>\n <Text sx={{ color: 'text.primary' }} variant=\"body2\">\n {holding.qty}\n </Text>\n </Stack>\n <Stack\n sx={{\n alignItems: 'center',\n flexDirection: 'row',\n height: 48,\n justifyContent: 'space-between',\n pr: 24,\n }}\n >\n <Text sx={{ color: 'text.primary' }} variant=\"body1\">\n {copy.overview.cost_basis_header}\n </Text>\n\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center',\n gap: 4,\n }}\n >\n {isCurrentlyEditing ? (\n <TextField\n autoFocus={true}\n onBlur={() => handleCostBasisBlur(holding.id)}\n onChange={handleCostBasisChange}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>\n handleCostBasisKeyDown(e, holding.id)\n }\n size=\"small\"\n sx={{\n fontSize: 14,\n width: 58,\n '& .MuiInputBase-input': {\n padding: '4px 0',\n textAlign: 'center',\n fontWeight: 600,\n color: 'text.primary',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: 'none',\n },\n }}\n value={currentEditedCostBasis}\n />\n ) : (\n <Text sx={{ fontSize: 14, width: 58 }} variant=\"body2\">\n {holding.costBasis?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n )}\n\n <IconButton\n onClick={() => handleCostBasisClick(holding.id, holding.costBasis)}\n sx={{ minWidth: 16, minHeight: 16 }}\n >\n <Icon name={'stylus'} size={16} sx={{ color: 'grey.700' }} />\n </IconButton>\n </Stack>\n </Stack>\n </Stack>\n </Stack>\n </AccordionDetails>\n </Accordion>\n )\n })}\n </Drawer>\n )\n}\n\nexport default observer(InvestmentDetailsDrawer)\n"],"mappings":"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"}
1
+ {"version":3,"file":"HoldingDrawer.es.js","names":[],"sources":["../../../src/investments/components/HoldingDrawer.tsx"],"sourcesContent":["import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport IconButton from '@mui/material/IconButton'\nimport TextField from '@mui/material/TextField'\nimport Stack from '@mui/system/Stack'\n\nimport { Icon } from '@mxenabled/mx-icons'\n\nimport { InstitutionLogo, Text } from '@mxenabled/mxui'\n\nimport { Drawer } from '../../common'\nimport { useGlobalCopyStore } from '../../common'\n\ninterface HoldingDetail {\n id: string\n description: string\n qty: number\n holding: string\n costBasis: number\n rawCostBasis: number\n totalGainLoss: number\n gainLossAvailable: boolean\n gainLossBasis: number\n marketValue: number\n}\n\ninterface InvestmentDetailsDrawerProps {\n accountHoldingsData: {\n accounts: any\n holdings: HoldingDetail[]\n }\n currentEditedCostBasis: string\n editingHoldingId: string | null\n handleCostBasisBlur: (id: string) => void\n handleCostBasisChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n handleCostBasisClick: (holdingId: string, currentCostBasis: number) => void\n handleCostBasisKeyDown: (event: React.KeyboardEvent<HTMLInputElement>, id: string) => void\n isOpen: boolean\n onClose: () => void\n}\n\nconst InvestmentDetailsDrawer: React.FC<InvestmentDetailsDrawerProps> = ({\n accountHoldingsData,\n currentEditedCostBasis,\n editingHoldingId,\n handleCostBasisBlur,\n handleCostBasisClick,\n handleCostBasisChange,\n handleCostBasisKeyDown,\n isOpen,\n onClose,\n}) => {\n const { investments: copy } = useGlobalCopyStore()\n const [expandedStates, setExpandedStates] = React.useState<Record<string, boolean>>({})\n\n const handleAccordionChange =\n (holdingId: string) => (_event: React.SyntheticEvent, isExpanded: boolean) => {\n setExpandedStates((prevStates) => ({\n ...prevStates,\n [holdingId]: isExpanded,\n }))\n }\n\n return (\n <Drawer\n ariaLabelClose={copy.overview.close_investment_drawer}\n isOpen={isOpen}\n onClose={onClose}\n title={copy.overview.investment_details}\n >\n <Stack sx={{ gap: 8, p: 24 }}>\n <InstitutionLogo\n alt={accountHoldingsData.accounts.institutionName || ''}\n institutionGuid={accountHoldingsData.accounts.institution_guid || ''}\n size={64}\n />\n <Text sx={{ color: 'text.primary' }} variant=\"body2\">\n {accountHoldingsData.accounts.memberName}\n </Text>\n <Text sx={{ color: 'text.primary' }} variant=\"h2\">\n {accountHoldingsData.accounts.user_name || accountHoldingsData.accounts.name}\n </Text>\n\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', justifyContent: 'space-between' }}>\n <Text sx={{ color: 'text.primary', fontWeight: 600 }} variant=\"body1\">\n {copy.overview.current_balance}\n </Text>\n\n <Text sx={{ color: 'text.primary', fontWeight: 600 }} variant=\"body1\">\n {accountHoldingsData.accounts.balance?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n </Stack>\n </Stack>\n\n <Stack\n sx={{\n bgcolor: 'background.default',\n flexDirection: 'row',\n justifyContent: 'space-between',\n px: 24,\n py: 10,\n }}\n >\n <Text sx={{ color: 'text.primary', fontWeight: 700 }} variant=\"caption\">\n {copy.overview.holding}\n </Text>\n <Text sx={{ color: 'text.primary', fontWeight: 700 }} variant=\"caption\">\n {copy.overview.market_value}\n </Text>\n </Stack>\n {accountHoldingsData.holdings?.map((holding, index) => {\n const isCurrentlyEditing = editingHoldingId === holding.id\n return (\n <Accordion\n disableGutters={true}\n expanded={expandedStates[holding.id] === true}\n key={holding.id}\n onChange={holding ? handleAccordionChange(holding?.id) : () => {}}\n sx={{\n ':before': index === 0 ? { opacity: 0 } : {},\n '.MuiAccordionDetails-root': { p: 0 },\n }}\n >\n <AccordionSummary\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n sx={[\n { height: 64 },\n expandedStates[holding.id] &&\n index > 0 && {\n borderTop: 1,\n borderColor: 'divider',\n },\n ]}\n >\n <Stack sx={{ flexDirection: 'row', width: '100%' }}>\n <div style={{ width: 24 }} />\n <Stack\n sx={[\n {\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'space-between',\n pr: 24,\n py: 14,\n width: '100%',\n },\n expandedStates[holding.id] && {\n borderBottom: 1,\n borderColor: 'divider',\n },\n ]}\n >\n <Stack\n sx={{\n alignItems: 'center',\n flex: 1,\n flexDirection: 'row',\n gap: 12,\n minWidth: 0,\n }}\n >\n <Stack sx={{ minWidth: 0, overflow: 'hidden' }}>\n <Text\n sx={{\n fontWeight: 600,\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 1,\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n }}\n variant=\"body1\"\n >\n {holding.holding}\n </Text>\n <Text\n sx={{\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 2,\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n }}\n variant=\"caption\"\n >\n {holding.description}\n </Text>\n </Stack>\n </Stack>\n\n <Stack\n sx={{\n alignItems: 'center',\n flexShrink: 0,\n flexDirection: 'row',\n gap: 12,\n justifyContent: 'flex-end',\n }}\n >\n <Stack>\n <Text sx={{ fontWeight: 600, textAlign: 'right' }} variant={'body1'}>\n {holding.marketValue?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n <Stack sx={{ alignItems: 'center', gap: 2, flexDirection: 'row' }}>\n {!holding.gainLossAvailable ? (\n <Text sx={{ color: 'grey.700' }} variant=\"caption\">\n —\n </Text>\n ) : (\n <>\n {holding.totalGainLoss !== 0 && (\n <Icon\n name={holding.totalGainLoss >= 0 ? 'trending_up' : 'trending_down'}\n size={12}\n sx={{\n verticalAlign: 'middle',\n mr: 1,\n color: holding.totalGainLoss >= 0 ? 'success.main' : 'grey.700',\n }}\n />\n )}\n <Text\n sx={{\n color: holding.totalGainLoss <= 0 ? 'grey.700' : 'success.main',\n fontWeight: holding.totalGainLoss <= 0 ? 400 : 700,\n }}\n variant=\"caption\"\n >\n {holding.gainLossBasis\n ? `${((holding.totalGainLoss / holding.gainLossBasis) * 100).toFixed(2)}%`\n : '0.00%'}\n </Text>\n <Text sx={{ color: 'grey.700' }} variant=\"caption\">\n |\n </Text>\n <Text\n sx={{\n color: holding.totalGainLoss <= 0 ? 'grey.700' : 'success.main',\n fontWeight: holding.totalGainLoss <= 0 ? 400 : 700,\n }}\n variant=\"caption\"\n >\n {Math.abs(holding.totalGainLoss).toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n </>\n )}\n </Stack>\n </Stack>\n\n <Icon\n name={expandedStates[holding.id] ? 'expand_less' : 'expand_more'}\n size={20}\n />\n </Stack>\n </Stack>\n </Stack>\n </AccordionSummary>\n <AccordionDetails>\n <Stack\n sx={{\n alignItems: 'center',\n bgcolor: 'background.default',\n flexDirection: 'row',\n pl: 24,\n }}\n >\n <Stack sx={{ width: 32 }} />\n <Stack sx={{ flex: 1 }}>\n <Stack\n sx={{\n alignItems: 'center',\n borderBottom: 1,\n borderColor: 'divider',\n flexDirection: 'row',\n height: 48,\n justifyContent: 'space-between',\n pr: 24,\n }}\n >\n <Text sx={{ color: 'text.primary' }} variant=\"body1\">\n {copy.overview.quantity}\n </Text>\n <Text sx={{ color: 'text.primary' }} variant=\"body2\">\n {holding.qty}\n </Text>\n </Stack>\n <Stack\n sx={{\n alignItems: 'center',\n flexDirection: 'row',\n height: 48,\n justifyContent: 'space-between',\n pr: 24,\n }}\n >\n <Text sx={{ color: 'text.primary' }} variant=\"body1\">\n {copy.overview.cost_basis_header}\n </Text>\n\n <Stack\n direction=\"row\"\n sx={{\n alignItems: 'center',\n gap: 4,\n }}\n >\n {isCurrentlyEditing ? (\n <TextField\n autoFocus={true}\n onBlur={() => handleCostBasisBlur(holding.id)}\n onChange={handleCostBasisChange}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>\n handleCostBasisKeyDown(e, holding.id)\n }\n size=\"small\"\n sx={{\n fontSize: 14,\n width: 58,\n '& .MuiInputBase-input': {\n padding: '4px 0',\n textAlign: 'center',\n fontWeight: 600,\n color: 'text.primary',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: 'none',\n },\n }}\n value={currentEditedCostBasis}\n />\n ) : (\n <Text sx={{ fontSize: 14, width: 58 }} variant=\"body2\">\n {holding.gainLossAvailable\n ? holding.costBasis?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })\n : '—'}\n </Text>\n )}\n\n <IconButton\n onClick={() => handleCostBasisClick(holding.id, holding.rawCostBasis)}\n sx={{ minWidth: 16, minHeight: 16 }}\n >\n <Icon name={'stylus'} size={16} sx={{ color: 'grey.700' }} />\n </IconButton>\n </Stack>\n </Stack>\n </Stack>\n </Stack>\n </AccordionDetails>\n </Accordion>\n )\n })}\n </Drawer>\n )\n}\n\nexport default observer(InvestmentDetailsDrawer)\n"],"mappings":"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"}
@@ -5,7 +5,10 @@ interface HoldingDetail {
5
5
  qty: number;
6
6
  holding: string;
7
7
  costBasis: number;
8
+ rawCostBasis: number;
8
9
  totalGainLoss: number;
10
+ gainLossAvailable: boolean;
11
+ gainLossBasis: number;
9
12
  marketValue: number;
10
13
  }
11
14
  interface HoldingsTableProps {
@@ -1,20 +1,20 @@
1
- import { useGlobalCopyStore as b } from "../../common/context/hooks.es.js";
1
+ import { useGlobalCopyStore as p } from "../../common/context/hooks.es.js";
2
2
  import { HeaderCell as n } from "./HeaderCell.es.js";
3
3
  import "react";
4
4
  import l from "@mui/material/Stack";
5
- import { Text as t } from "@mxenabled/mxui";
5
+ import { Text as i } from "@mxenabled/mxui";
6
6
  import C from "@mui/material/Paper";
7
- import { Icon as u } from "@mxenabled/mx-icons";
7
+ import { Icon as h } from "@mxenabled/mx-icons";
8
8
  import { jsx as r, jsxs as d } from "react/jsx-runtime";
9
9
  import { useTheme as S } from "@mui/material/styles";
10
10
  import F from "@mui/material/IconButton";
11
- import _ from "@mui/material/TextField";
12
- import { DataGridPro as I } from "@mui/x-data-grid-pro";
13
- var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBasisClick: f, handleCostBasisChange: y, handleCostBasisKeyDown: v, handleCostBasisBlur: w }) => {
14
- const { investments: o } = b(), p = S().palette.mode === "dark", c = "success.main", h = p ? "grey.300" : "grey.700", a = (e, i = "lesserThan") => i === "greaterThan" ? e >= 0 ? c : h : e <= 0 ? h : c, D = [
11
+ import L from "@mui/material/TextField";
12
+ import { DataGridPro as _ } from "@mui/x-data-grid-pro";
13
+ var O = ({ data: u, editingHoldingId: m, currentEditedCostBasis: x, handleCostBasisClick: f, handleCostBasisChange: v, handleCostBasisKeyDown: y, handleCostBasisBlur: w }) => {
14
+ const { investments: t } = p(), b = S().palette.mode === "dark", c = "success.main", g = b ? "grey.300" : "grey.700", a = (e, o = "lesserThan") => o === "greaterThan" ? e >= 0 ? c : g : e <= 0 ? g : c, D = [
15
15
  {
16
16
  field: "qty",
17
- headerName: o.overview.qty_header,
17
+ headerName: t.overview.qty_header,
18
18
  sortable: !1,
19
19
  width: 48,
20
20
  align: "center",
@@ -22,7 +22,7 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
22
22
  },
23
23
  {
24
24
  field: "holding",
25
- headerName: o.overview.holding_header,
25
+ headerName: t.overview.holding_header,
26
26
  flex: 1,
27
27
  renderHeader: n,
28
28
  renderCell: (e) => /* @__PURE__ */ r(l, {
@@ -31,10 +31,10 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
31
31
  gap: 16,
32
32
  flexDirection: "row"
33
33
  },
34
- children: /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ r(t, {
34
+ children: /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ r(i, {
35
35
  sx: { fontWeight: 700 },
36
36
  children: e.row.holding
37
- }), /* @__PURE__ */ r(t, {
37
+ }), /* @__PURE__ */ r(i, {
38
38
  sx: {
39
39
  color: "text.secondary",
40
40
  fontWeight: 400
@@ -46,22 +46,22 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
46
46
  },
47
47
  {
48
48
  field: "costBasis",
49
- headerName: o.overview.cost_basis_header,
49
+ headerName: t.overview.cost_basis_header,
50
50
  width: 132,
51
51
  renderHeader: n,
52
52
  renderCell: (e) => {
53
- const i = m === e.row.id;
53
+ const o = m === e.row.id;
54
54
  return /* @__PURE__ */ d(l, {
55
55
  sx: {
56
56
  alignItems: "center",
57
57
  flexDirection: "row",
58
58
  gap: 4
59
59
  },
60
- children: [i ? /* @__PURE__ */ r(_, {
60
+ children: [o ? /* @__PURE__ */ r(L, {
61
61
  autoFocus: !0,
62
62
  onBlur: () => w(e.row.id),
63
- onChange: y,
64
- onKeyDown: (s) => v(s, e.row.id),
63
+ onChange: v,
64
+ onKeyDown: (s) => y(s, e.row.id),
65
65
  size: "small",
66
66
  sx: {
67
67
  fontSize: 14,
@@ -75,25 +75,25 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
75
75
  "& .MuiOutlinedInput-notchedOutline": { border: "none" }
76
76
  },
77
77
  value: x
78
- }) : /* @__PURE__ */ r(t, {
78
+ }) : /* @__PURE__ */ r(i, {
79
79
  sx: {
80
80
  fontSize: 14,
81
81
  width: 57
82
82
  },
83
83
  variant: "body2",
84
- children: e.value?.toLocaleString("en-US", {
84
+ children: e.row.gainLossAvailable ? e.value?.toLocaleString("en-US", {
85
85
  currency: "USD",
86
86
  maximumFractionDigits: 2,
87
87
  minimumFractionDigits: 2,
88
88
  style: "currency"
89
- })
89
+ }) : "—"
90
90
  }), /* @__PURE__ */ r(F, {
91
- onClick: () => f(e.row.id, e.row.costBasis),
91
+ onClick: () => f(e.row.id, e.row.rawCostBasis),
92
92
  sx: {
93
93
  minWidth: 12,
94
94
  minHeight: 12
95
95
  },
96
- children: /* @__PURE__ */ r(u, {
96
+ children: /* @__PURE__ */ r(h, {
97
97
  name: "stylus",
98
98
  size: 12,
99
99
  sx: { color: "grey.700" }
@@ -106,19 +106,19 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
106
106
  },
107
107
  {
108
108
  field: "totalGainLoss",
109
- headerName: o.overview.total_gain_loss_header,
109
+ headerName: t.overview.total_gain_loss_header,
110
110
  width: 196,
111
111
  renderHeader: n,
112
112
  renderCell: (e) => {
113
- const i = e.row.costBasis, s = i ? e.row.totalGainLoss / i * 100 : 0;
114
- return /* @__PURE__ */ d(l, {
113
+ const o = e.row.gainLossBasis, s = o ? e.row.totalGainLoss / o * 100 : 0;
114
+ return e.row.gainLossAvailable ? /* @__PURE__ */ d(l, {
115
115
  sx: {
116
116
  alignItems: "center",
117
117
  flexDirection: "row",
118
118
  gap: 2
119
119
  },
120
120
  children: [
121
- e.value !== 0 && /* @__PURE__ */ r(u, {
121
+ e.value !== 0 && /* @__PURE__ */ r(h, {
122
122
  name: e.value > 0 ? "trending_up" : "trending_down",
123
123
  size: 16,
124
124
  sx: {
@@ -127,20 +127,20 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
127
127
  verticalAlign: "middle"
128
128
  }
129
129
  }),
130
- /* @__PURE__ */ r(t, {
130
+ /* @__PURE__ */ r(i, {
131
131
  sx: {
132
132
  color: a(e.value),
133
133
  fontWeight: e.value > 0 ? 700 : 400
134
134
  },
135
135
  variant: "body2",
136
- children: i ? `${s.toFixed(2)}%` : "0.00%"
136
+ children: o ? `${s.toFixed(2)}%` : "0.00%"
137
137
  }),
138
- /* @__PURE__ */ r(t, {
138
+ /* @__PURE__ */ r(i, {
139
139
  sx: { color: "text.secondary" },
140
140
  variant: "caption",
141
141
  children: "|"
142
142
  }),
143
- /* @__PURE__ */ r(t, {
143
+ /* @__PURE__ */ r(i, {
144
144
  sx: {
145
145
  color: a(e.value),
146
146
  fontWeight: e.value > 0 ? 700 : 400
@@ -154,6 +154,10 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
154
154
  })
155
155
  })
156
156
  ]
157
+ }) : /* @__PURE__ */ r(i, {
158
+ sx: { color: "text.secondary" },
159
+ variant: "body2",
160
+ children: "—"
157
161
  });
158
162
  },
159
163
  align: "right",
@@ -162,10 +166,10 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
162
166
  },
163
167
  {
164
168
  field: "marketValue",
165
- headerName: o.overview.market_value_header,
169
+ headerName: t.overview.market_value_header,
166
170
  width: 132,
167
171
  renderHeader: n,
168
- renderCell: (e) => /* @__PURE__ */ r(t, {
172
+ renderCell: (e) => /* @__PURE__ */ r(i, {
169
173
  sx: { fontWeight: 700 },
170
174
  variant: "body2",
171
175
  children: e.value?.toLocaleString("en-US", {
@@ -184,13 +188,13 @@ var O = ({ data: g, editingHoldingId: m, currentEditedCostBasis: x, handleCostBa
184
188
  boxShadow: "none",
185
189
  width: "100%"
186
190
  },
187
- children: /* @__PURE__ */ r(I, {
191
+ children: /* @__PURE__ */ r(_, {
188
192
  columns: D,
189
193
  disableColumnFilter: !0,
190
194
  disableColumnMenu: !0,
191
195
  disableRowSelectionOnClick: !0,
192
196
  hideFooter: !0,
193
- rows: g,
197
+ rows: u,
194
198
  slotProps: { baseIconButton: { sx: { display: "none" } } }
195
199
  })
196
200
  });
@@ -1 +1 @@
1
- {"version":3,"file":"HoldingTable.es.js","names":[],"sources":["../../../src/investments/components/HoldingTable.tsx"],"sourcesContent":["import React from 'react'\n\nimport Stack from '@mui/material/Stack'\nimport Paper from '@mui/material/Paper'\nimport IconButton from '@mui/material/IconButton'\nimport TextField from '@mui/material/TextField'\nimport { useTheme } from '@mui/material/styles'\nimport { DataGridPro, GridColDef } from '@mui/x-data-grid-pro'\n\nimport { Icon } from '@mxenabled/mx-icons'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore } from '../../common'\n\nimport { HeaderCell } from './HeaderCell'\n\ninterface HoldingDetail {\n id: string\n description: string\n qty: number\n holding: string\n costBasis: number\n totalGainLoss: number\n marketValue: number\n}\n\ninterface HoldingsTableProps {\n data: HoldingDetail[]\n editingHoldingId: string | null\n currentEditedCostBasis: string\n handleCostBasisClick: (holdingId: string, currentCostBasis: number) => void\n handleCostBasisChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n handleCostBasisKeyDown: (event: React.KeyboardEvent<HTMLInputElement>, id: string) => void\n handleCostBasisBlur: (id: string) => void\n}\n\nconst HoldingsTable: React.FC<HoldingsTableProps> = ({\n data,\n editingHoldingId,\n currentEditedCostBasis,\n handleCostBasisClick,\n handleCostBasisChange,\n handleCostBasisKeyDown,\n handleCostBasisBlur,\n}) => {\n const { investments: copy } = useGlobalCopyStore()\n const theme = useTheme()\n\n const isDarkMode = theme.palette.mode === 'dark'\n const gainDisplayColor = 'success.main'\n const lossDisplayColor = isDarkMode ? 'grey.300' : 'grey.700'\n\n const gainLossDisplayColor = (value: number, type: string = 'lesserThan') => {\n if (type === 'greaterThan') {\n return value >= 0 ? gainDisplayColor : lossDisplayColor\n }\n return value <= 0 ? lossDisplayColor : gainDisplayColor\n }\n\n const columns: GridColDef[] = [\n {\n field: 'qty',\n headerName: copy.overview.qty_header,\n sortable: false,\n width: 48,\n align: 'center',\n headerAlign: 'center',\n },\n {\n field: 'holding',\n headerName: copy.overview.holding_header,\n flex: 1,\n renderHeader: HeaderCell,\n renderCell: (params) => (\n <Stack sx={{ alignItems: 'center', gap: 16, flexDirection: 'row' }}>\n <Stack>\n {/* TODO :InstitutionLogo in future */}\n <Text sx={{ fontWeight: 700 }}>{params.row.holding}</Text>\n <Text sx={{ color: 'text.secondary', fontWeight: 400 }} variant=\"tiny\">\n {params.row.description}\n </Text>\n </Stack>\n </Stack>\n ),\n },\n {\n field: 'costBasis',\n headerName: copy.overview.cost_basis_header,\n width: 132,\n renderHeader: HeaderCell,\n renderCell: (params) => {\n const isCurrentlyEditing = editingHoldingId === params.row.id\n return (\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', gap: 4 }}>\n {isCurrentlyEditing ? (\n <TextField\n autoFocus={true}\n onBlur={() => handleCostBasisBlur(params.row.id)}\n onChange={handleCostBasisChange}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>\n handleCostBasisKeyDown(e, params.row.id)\n }\n size=\"small\"\n sx={{\n fontSize: 14,\n width: 57,\n '& .MuiInputBase-input': {\n padding: '4px 0',\n textAlign: 'center',\n fontWeight: 600,\n color: 'text.primary',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: 'none',\n },\n }}\n value={currentEditedCostBasis}\n />\n ) : (\n <Text sx={{ fontSize: 14, width: 57 }} variant=\"body2\">\n {params.value?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n )}\n <IconButton\n onClick={() => handleCostBasisClick(params.row.id, params.row.costBasis)}\n sx={{ minWidth: 12, minHeight: 12 }}\n >\n <Icon name={'stylus'} size={12} sx={{ color: 'grey.700' }} />\n </IconButton>\n </Stack>\n )\n },\n align: 'center',\n headerAlign: 'center',\n },\n {\n field: 'totalGainLoss',\n headerName: copy.overview.total_gain_loss_header,\n width: 196,\n renderHeader: HeaderCell,\n renderCell: (params) => {\n const costBasis = params.row.costBasis\n const gainLossPercentage = costBasis ? (params.row.totalGainLoss / costBasis) * 100 : 0\n return (\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', gap: 2 }}>\n {params.value !== 0 && (\n <Icon\n name={params.value > 0 ? 'trending_up' : 'trending_down'}\n size={16}\n sx={{\n color: gainLossDisplayColor(params.value),\n mr: 1,\n verticalAlign: 'middle',\n }}\n />\n )}\n <Text\n sx={{\n color: gainLossDisplayColor(params.value),\n fontWeight: params.value > 0 ? 700 : 400,\n }}\n variant=\"body2\"\n >\n {costBasis ? `${gainLossPercentage.toFixed(2)}%` : '0.00%'}\n </Text>\n <Text sx={{ color: 'text.secondary' }} variant=\"caption\">\n |\n </Text>\n <Text\n sx={{\n color: gainLossDisplayColor(params.value),\n fontWeight: params.value > 0 ? 700 : 400,\n }}\n variant=\"body2\"\n >\n {Math.abs(params.value).toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n </Stack>\n )\n },\n align: 'right',\n headerAlign: 'right',\n sortable: false,\n },\n {\n field: 'marketValue',\n headerName: copy.overview.market_value_header,\n width: 132,\n renderHeader: HeaderCell,\n renderCell: (params) => (\n <Text sx={{ fontWeight: 700 }} variant={'body2'}>\n {params.value?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n ),\n align: 'right',\n headerAlign: 'right',\n },\n ]\n\n return (\n <Paper\n sx={{\n boxShadow: 'none',\n width: '100%',\n }}\n >\n <DataGridPro\n columns={columns}\n disableColumnFilter={true}\n disableColumnMenu={true}\n disableRowSelectionOnClick={true}\n hideFooter={true}\n rows={data}\n slotProps={{ baseIconButton: { sx: { display: 'none' } } }}\n />\n </Paper>\n )\n}\n\nexport default HoldingsTable\n"],"mappings":";;;;;;;;;;;;AAqCA,IAAM,IAAA,CAA+C,EACnD,MAAA,GACA,kBAAA,GACA,wBAAA,GACA,sBAAA,GACA,uBAAA,GACA,wBAAA,GACA,qBAAA,EAAA,MACI;AACJ,QAAM,EAAE,aAAa,EAAA,IAAS,EAAmB,GAG3C,IAFQ,EAEK,EAAM,QAAQ,SAAS,QACpC,IAAmB,gBACnB,IAAmB,IAAa,aAAa,YAE7C,IAAA,CAAwB,GAAe,IAAe,iBACtD,MAAS,gBACJ,KAAS,IAAI,IAAmB,IAElC,KAAS,IAAI,IAAmB,GAGnC,IAAwB;AAAA,IAC5B;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAK,SAAS;AAAA,MAC1B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAK,SAAS;AAAA,MAC1B,MAAM;AAAA,MACN,cAAc;AAAA,MACd,YAAA,CAAa,MACX,gBAAA,EAAC,GAAD;AAAA,QAAO,IAAI;AAAA,UAAE,YAAY;AAAA,UAAU,KAAK;AAAA,UAAI,eAAe;AAAA,QAAM;AAAA,QAC/D,UAAA,gBAAA,EAAC,GAAD,EAAA,UAAA,CAEE,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,YAAY,IAAI;AAAA,UAAI,UAAA,EAAO,IAAI;AAAA,QAAc,CAAA,GACzD,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI;AAAA,YAAE,OAAO;AAAA,YAAkB,YAAY;AAAA,UAAI;AAAA,UAAG,SAAQ;AAAA,UAC7D,UAAA,EAAO,IAAI;AAAA,QACR,CAAA,CACD,EAAA,CAAA;AAAA,MACF,CAAA;AAAA,IAEX;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAK,SAAS;AAAA,MAC1B,OAAO;AAAA,MACP,cAAc;AAAA,MACd,YAAA,CAAa,MAAW;AACtB,cAAM,IAAqB,MAAqB,EAAO,IAAI;AAC3D,eACE,gBAAA,EAAC,GAAD;AAAA,UAAO,IAAI;AAAA,YAAE,YAAY;AAAA,YAAU,eAAe;AAAA,YAAO,KAAK;AAAA,UAAE;AAAA,UAAhE,UAAA,CACG,IACC,gBAAA,EAAC,GAAD;AAAA,YACE,WAAW;AAAA,YACX,QAAA,MAAc,EAAoB,EAAO,IAAI,EAAE;AAAA,YAC/C,UAAU;AAAA,YACV,WAAA,CAAY,MACV,EAAuB,GAAG,EAAO,IAAI,EAAE;AAAA,YAEzC,MAAK;AAAA,YACL,IAAI;AAAA,cACF,UAAU;AAAA,cACV,OAAO;AAAA,cACP,yBAAyB;AAAA,gBACvB,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ,OAAO;AAAA,cACT;AAAA,cACA,sCAAsC,EACpC,QAAQ,OACV;AAAA,YACF;AAAA,YACA,OAAO;AAAA,UACR,CAAA,IAED,gBAAA,EAAC,GAAD;AAAA,YAAM,IAAI;AAAA,cAAE,UAAU;AAAA,cAAI,OAAO;AAAA,YAAG;AAAA,YAAG,SAAQ;AAAA,YAC5C,UAAA,EAAO,OAAO,eAAe,SAAS;AAAA,cACrC,UAAU;AAAA,cACV,uBAAuB;AAAA,cACvB,uBAAuB;AAAA,cACvB,OAAO;AAAA,YACT,CAAC;AAAA,UACG,CAAA,GAER,gBAAA,EAAC,GAAD;AAAA,YACE,SAAA,MAAe,EAAqB,EAAO,IAAI,IAAI,EAAO,IAAI,SAAS;AAAA,YACvE,IAAI;AAAA,cAAE,UAAU;AAAA,cAAI,WAAW;AAAA,YAAG;AAAA,YAElC,UAAA,gBAAA,EAAC,GAAD;AAAA,cAAM,MAAM;AAAA,cAAU,MAAM;AAAA,cAAI,IAAI,EAAE,OAAO,WAAW;AAAA,YAAI,CAAA;AAAA,UAClD,CAAA,CACP;AAAA;MAEX;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAK,SAAS;AAAA,MAC1B,OAAO;AAAA,MACP,cAAc;AAAA,MACd,YAAA,CAAa,MAAW;AACtB,cAAM,IAAY,EAAO,IAAI,WACvB,IAAqB,IAAa,EAAO,IAAI,gBAAgB,IAAa,MAAM;AACtF,eACE,gBAAA,EAAC,GAAD;AAAA,UAAO,IAAI;AAAA,YAAE,YAAY;AAAA,YAAU,eAAe;AAAA,YAAO,KAAK;AAAA,UAAE;AAAA,UAAhE,UAAA;AAAA,YACG,EAAO,UAAU,KAChB,gBAAA,EAAC,GAAD;AAAA,cACE,MAAM,EAAO,QAAQ,IAAI,gBAAgB;AAAA,cACzC,MAAM;AAAA,cACN,IAAI;AAAA,gBACF,OAAO,EAAqB,EAAO,KAAK;AAAA,gBACxC,IAAI;AAAA,gBACJ,eAAe;AAAA,cACjB;AAAA,YACD,CAAA;AAAA,YAEH,gBAAA,EAAC,GAAD;AAAA,cACE,IAAI;AAAA,gBACF,OAAO,EAAqB,EAAO,KAAK;AAAA,gBACxC,YAAY,EAAO,QAAQ,IAAI,MAAM;AAAA,cACvC;AAAA,cACA,SAAQ;AAAA,cAEP,UAAA,IAAY,GAAG,EAAmB,QAAQ,CAAC,CAAA,MAAO;AAAA,YAC/C,CAAA;AAAA,YACN,gBAAA,EAAC,GAAD;AAAA,cAAM,IAAI,EAAE,OAAO,iBAAiB;AAAA,cAAG,SAAQ;AAAA,cAAU,UAAA;AAAA,YAEnD,CAAA;AAAA,YACN,gBAAA,EAAC,GAAD;AAAA,cACE,IAAI;AAAA,gBACF,OAAO,EAAqB,EAAO,KAAK;AAAA,gBACxC,YAAY,EAAO,QAAQ,IAAI,MAAM;AAAA,cACvC;AAAA,cACA,SAAQ;AAAA,cAEP,UAAA,KAAK,IAAI,EAAO,KAAK,EAAE,eAAe,SAAS;AAAA,gBAC9C,UAAU;AAAA,gBACV,uBAAuB;AAAA,gBACvB,uBAAuB;AAAA,gBACvB,OAAO;AAAA,cACT,CAAC;AAAA,YACG,CAAA;AAAA,UACD;AAAA;MAEX;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAK,SAAS;AAAA,MAC1B,OAAO;AAAA,MACP,cAAc;AAAA,MACd,YAAA,CAAa,MACX,gBAAA,EAAC,GAAD;AAAA,QAAM,IAAI,EAAE,YAAY,IAAI;AAAA,QAAG,SAAS;AAAA,QACrC,UAAA,EAAO,OAAO,eAAe,SAAS;AAAA,UACrC,UAAU;AAAA,UACV,uBAAuB;AAAA,UACvB,uBAAuB;AAAA,UACvB,OAAO;AAAA,QACT,CAAC;AAAA,MACG,CAAA;AAAA,MAER,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,IAAI;AAAA,MACF,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IAEA,UAAA,gBAAA,EAAC,GAAD;AAAA,MACW,SAAA;AAAA,MACT,qBAAqB;AAAA,MACrB,mBAAmB;AAAA,MACnB,4BAA4B;AAAA,MAC5B,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE;AAAA,IAC1D,CAAA;AAAA,EACI,CAAA;AAEX"}
1
+ {"version":3,"file":"HoldingTable.es.js","names":[],"sources":["../../../src/investments/components/HoldingTable.tsx"],"sourcesContent":["import React from 'react'\n\nimport Stack from '@mui/material/Stack'\nimport Paper from '@mui/material/Paper'\nimport IconButton from '@mui/material/IconButton'\nimport TextField from '@mui/material/TextField'\nimport { useTheme } from '@mui/material/styles'\nimport { DataGridPro, GridColDef } from '@mui/x-data-grid-pro'\n\nimport { Icon } from '@mxenabled/mx-icons'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore } from '../../common'\n\nimport { HeaderCell } from './HeaderCell'\n\ninterface HoldingDetail {\n id: string\n description: string\n qty: number\n holding: string\n costBasis: number\n rawCostBasis: number\n totalGainLoss: number\n gainLossAvailable: boolean\n gainLossBasis: number\n marketValue: number\n}\n\ninterface HoldingsTableProps {\n data: HoldingDetail[]\n editingHoldingId: string | null\n currentEditedCostBasis: string\n handleCostBasisClick: (holdingId: string, currentCostBasis: number) => void\n handleCostBasisChange: (event: React.ChangeEvent<HTMLInputElement>) => void\n handleCostBasisKeyDown: (event: React.KeyboardEvent<HTMLInputElement>, id: string) => void\n handleCostBasisBlur: (id: string) => void\n}\n\nconst HoldingsTable: React.FC<HoldingsTableProps> = ({\n data,\n editingHoldingId,\n currentEditedCostBasis,\n handleCostBasisClick,\n handleCostBasisChange,\n handleCostBasisKeyDown,\n handleCostBasisBlur,\n}) => {\n const { investments: copy } = useGlobalCopyStore()\n const theme = useTheme()\n\n const isDarkMode = theme.palette.mode === 'dark'\n const gainDisplayColor = 'success.main'\n const lossDisplayColor = isDarkMode ? 'grey.300' : 'grey.700'\n\n const gainLossDisplayColor = (value: number, type: string = 'lesserThan') => {\n if (type === 'greaterThan') {\n return value >= 0 ? gainDisplayColor : lossDisplayColor\n }\n return value <= 0 ? lossDisplayColor : gainDisplayColor\n }\n\n const columns: GridColDef[] = [\n {\n field: 'qty',\n headerName: copy.overview.qty_header,\n sortable: false,\n width: 48,\n align: 'center',\n headerAlign: 'center',\n },\n {\n field: 'holding',\n headerName: copy.overview.holding_header,\n flex: 1,\n renderHeader: HeaderCell,\n renderCell: (params) => (\n <Stack sx={{ alignItems: 'center', gap: 16, flexDirection: 'row' }}>\n <Stack>\n {/* TODO :InstitutionLogo in future */}\n <Text sx={{ fontWeight: 700 }}>{params.row.holding}</Text>\n <Text sx={{ color: 'text.secondary', fontWeight: 400 }} variant=\"tiny\">\n {params.row.description}\n </Text>\n </Stack>\n </Stack>\n ),\n },\n {\n field: 'costBasis',\n headerName: copy.overview.cost_basis_header,\n width: 132,\n renderHeader: HeaderCell,\n renderCell: (params) => {\n const isCurrentlyEditing = editingHoldingId === params.row.id\n return (\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', gap: 4 }}>\n {isCurrentlyEditing ? (\n <TextField\n autoFocus={true}\n onBlur={() => handleCostBasisBlur(params.row.id)}\n onChange={handleCostBasisChange}\n onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) =>\n handleCostBasisKeyDown(e, params.row.id)\n }\n size=\"small\"\n sx={{\n fontSize: 14,\n width: 57,\n '& .MuiInputBase-input': {\n padding: '4px 0',\n textAlign: 'center',\n fontWeight: 600,\n color: 'text.primary',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n border: 'none',\n },\n }}\n value={currentEditedCostBasis}\n />\n ) : (\n <Text sx={{ fontSize: 14, width: 57 }} variant=\"body2\">\n {params.row.gainLossAvailable\n ? params.value?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })\n : '—'}\n </Text>\n )}\n <IconButton\n onClick={() => handleCostBasisClick(params.row.id, params.row.rawCostBasis)}\n sx={{ minWidth: 12, minHeight: 12 }}\n >\n <Icon name={'stylus'} size={12} sx={{ color: 'grey.700' }} />\n </IconButton>\n </Stack>\n )\n },\n align: 'center',\n headerAlign: 'center',\n },\n {\n field: 'totalGainLoss',\n headerName: copy.overview.total_gain_loss_header,\n width: 196,\n renderHeader: HeaderCell,\n renderCell: (params) => {\n const gainLossBasis = params.row.gainLossBasis\n const gainLossPercentage = gainLossBasis\n ? (params.row.totalGainLoss / gainLossBasis) * 100\n : 0\n // No known cost basis — show \"—\" instead of a fabricated 0/100%.\n if (!params.row.gainLossAvailable) {\n return (\n <Text sx={{ color: 'text.secondary' }} variant=\"body2\">\n —\n </Text>\n )\n }\n return (\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', gap: 2 }}>\n {params.value !== 0 && (\n <Icon\n name={params.value > 0 ? 'trending_up' : 'trending_down'}\n size={16}\n sx={{\n color: gainLossDisplayColor(params.value),\n mr: 1,\n verticalAlign: 'middle',\n }}\n />\n )}\n <Text\n sx={{\n color: gainLossDisplayColor(params.value),\n fontWeight: params.value > 0 ? 700 : 400,\n }}\n variant=\"body2\"\n >\n {gainLossBasis ? `${gainLossPercentage.toFixed(2)}%` : '0.00%'}\n </Text>\n <Text sx={{ color: 'text.secondary' }} variant=\"caption\">\n |\n </Text>\n <Text\n sx={{\n color: gainLossDisplayColor(params.value),\n fontWeight: params.value > 0 ? 700 : 400,\n }}\n variant=\"body2\"\n >\n {Math.abs(params.value).toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n </Stack>\n )\n },\n align: 'right',\n headerAlign: 'right',\n sortable: false,\n },\n {\n field: 'marketValue',\n headerName: copy.overview.market_value_header,\n width: 132,\n renderHeader: HeaderCell,\n renderCell: (params) => (\n <Text sx={{ fontWeight: 700 }} variant={'body2'}>\n {params.value?.toLocaleString('en-US', {\n currency: 'USD',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n style: 'currency',\n })}\n </Text>\n ),\n align: 'right',\n headerAlign: 'right',\n },\n ]\n\n return (\n <Paper\n sx={{\n boxShadow: 'none',\n width: '100%',\n }}\n >\n <DataGridPro\n columns={columns}\n disableColumnFilter={true}\n disableColumnMenu={true}\n disableRowSelectionOnClick={true}\n hideFooter={true}\n rows={data}\n slotProps={{ baseIconButton: { sx: { display: 'none' } } }}\n />\n </Paper>\n )\n}\n\nexport default HoldingsTable\n"],"mappings":"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"}