@mx-cartographer/experiences 9.0.16 → 9.0.17-alpha
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/CHANGELOG.md +4 -5
- package/dist/Account-DR7Plrqy.mjs +1 -0
- package/dist/Account-DR7Plrqy.mjs.map +1 -0
- package/dist/{AccountDetailsDrawer-BuxLfuIm.mjs → AccountDetailsDrawer-CZPeLsCq.mjs} +4 -3
- package/dist/AccountDetailsDrawer-CZPeLsCq.mjs.map +1 -0
- package/dist/{AccountDetailsHeader-ByGNPZpO.mjs → AccountDetailsHeader-BvbCUQSS.mjs} +3 -0
- package/dist/AccountDetailsHeader-BvbCUQSS.mjs.map +1 -0
- package/dist/AccountUtils-B8ZzWI-d.mjs +1 -0
- package/dist/AccountUtils-B8ZzWI-d.mjs.map +1 -0
- package/dist/Analytics-CkYXKvco.mjs +1 -0
- package/dist/Analytics-CkYXKvco.mjs.map +1 -0
- package/dist/Analytics-WeZYytR0.mjs +1 -0
- package/dist/Analytics-WeZYytR0.mjs.map +1 -0
- package/dist/ApiEndpoints-DXwIYNUV.mjs +1 -0
- package/dist/ApiEndpoints-DXwIYNUV.mjs.map +1 -0
- package/dist/BeatMaterialIcon-1KOfRZrA.mjs +1 -0
- package/dist/BeatMaterialIcon-1KOfRZrA.mjs.map +1 -0
- package/dist/BudgetUtil-Bg2AQJpQ.mjs +1 -0
- package/dist/BudgetUtil-Bg2AQJpQ.mjs.map +1 -0
- package/dist/Category-DEKZGLYe.mjs +1 -0
- package/dist/Category-DEKZGLYe.mjs.map +1 -0
- package/dist/CategorySelectorDrawer-NJsFsKP1.mjs +1 -0
- package/dist/CategorySelectorDrawer-NJsFsKP1.mjs.map +1 -0
- package/dist/Connect-BH0Pt6zc.mjs +1 -0
- package/dist/Connect-BH0Pt6zc.mjs.map +1 -0
- package/dist/ConnectCard-D7uxoH5Y.mjs +1 -0
- package/dist/ConnectCard-D7uxoH5Y.mjs.map +1 -0
- package/dist/ConnectDrawer-CW4LA3H3.mjs +1 -0
- package/dist/ConnectDrawer-CW4LA3H3.mjs.map +1 -0
- package/dist/ConnectionsDrawer-CZU9ku-k.mjs +1 -0
- package/dist/ConnectionsDrawer-CZU9ku-k.mjs.map +1 -0
- package/dist/CurrencyDialog-DumQCTPO.mjs +1 -0
- package/dist/CurrencyDialog-DumQCTPO.mjs.map +1 -0
- package/dist/CurrencyInput-DaGEQaLW.mjs +1 -0
- package/dist/CurrencyInput-DaGEQaLW.mjs.map +1 -0
- package/dist/CurrencyText-CCbE6MmF.mjs +1 -0
- package/dist/CurrencyText-CCbE6MmF.mjs.map +1 -0
- package/dist/DateFormats-HudZ3Bjs.mjs +1 -0
- package/dist/DateFormats-HudZ3Bjs.mjs.map +1 -0
- package/dist/DateUtil-CzBmbjmA.mjs +1 -0
- package/dist/DateUtil-CzBmbjmA.mjs.map +1 -0
- package/dist/DebtUtils-i4pI2Uoe.mjs +1 -0
- package/dist/DebtUtils-i4pI2Uoe.mjs.map +1 -0
- package/dist/Dialog-Bvd2n8hz.mjs +1 -0
- package/dist/Dialog-Bvd2n8hz.mjs.map +1 -0
- package/dist/Donut-SzzfZDHF.mjs +1 -0
- package/dist/Donut-SzzfZDHF.mjs.map +1 -0
- package/dist/Drawer-DsnW2o0v.mjs +1 -0
- package/dist/Drawer-DsnW2o0v.mjs.map +1 -0
- package/dist/{EmbeddedCard-BxgB26dd.mjs → EmbeddedCard-DH8vQ3qN.mjs} +184 -181
- package/dist/EmbeddedCard-DH8vQ3qN.mjs.map +1 -0
- package/dist/EmptyState-CJUDc3kD.mjs +1 -0
- package/dist/EmptyState-CJUDc3kD.mjs.map +1 -0
- package/dist/Error-Dtw6yxkf.mjs +1 -0
- package/dist/Error-Dtw6yxkf.mjs.map +1 -0
- package/dist/ErrorBoundary-CsdOcnJ9.mjs +1 -0
- package/dist/ErrorBoundary-CsdOcnJ9.mjs.map +1 -0
- package/dist/{ExportCsvAction-BV69DnpC.mjs → ExportCsvAction-C9KWH3Az.mjs} +2 -1
- package/dist/ExportCsvAction-C9KWH3Az.mjs.map +1 -0
- package/dist/GlobalAccountFilter-BhzR5Vb1.mjs +1 -0
- package/dist/GlobalAccountFilter-BhzR5Vb1.mjs.map +1 -0
- package/dist/GlobalCopyApi-wcnDUzMV.mjs +1 -0
- package/dist/GlobalCopyApi-wcnDUzMV.mjs.map +1 -0
- package/dist/GoalsUtil-C9EnLWvC.mjs +1 -0
- package/dist/GoalsUtil-C9EnLWvC.mjs.map +1 -0
- package/dist/HeaderCell-P8w6CmfO.mjs +1 -0
- package/dist/HeaderCell-P8w6CmfO.mjs.map +1 -0
- package/dist/Help-CkQTjORd.mjs +1 -0
- package/dist/Help-CkQTjORd.mjs.map +1 -0
- package/dist/{Help-BMCejaQr.mjs → Help-aERwhajy.mjs} +3 -2
- package/dist/Help-aERwhajy.mjs.map +1 -0
- package/dist/IconBacking-DgT8DCeh.mjs +1 -0
- package/dist/IconBacking-DgT8DCeh.mjs.map +1 -0
- package/dist/InformationTooltip-4su8bn1e.mjs +1 -0
- package/dist/InformationTooltip-4su8bn1e.mjs.map +1 -0
- package/dist/InvestmentUtil-BItV7uEs.mjs +1 -0
- package/dist/InvestmentUtil-BItV7uEs.mjs.map +1 -0
- package/dist/LineChart-CUfiH86G.mjs +1 -0
- package/dist/LineChart-CUfiH86G.mjs.map +1 -0
- package/dist/ListItemAction-BqUCLj_w.mjs +1 -0
- package/dist/ListItemAction-BqUCLj_w.mjs.map +1 -0
- package/dist/ListItemRow-kH1rn8Xu.mjs +1 -0
- package/dist/ListItemRow-kH1rn8Xu.mjs.map +1 -0
- package/dist/ListItemWrapper-DRse79Iu.mjs +44 -0
- package/dist/ListItemWrapper-DRse79Iu.mjs.map +1 -0
- package/dist/Loader-CxeBwuPG.mjs +1 -0
- package/dist/Loader-CxeBwuPG.mjs.map +1 -0
- package/dist/Localization-DnoVyBNK.mjs +1 -0
- package/dist/Localization-DnoVyBNK.mjs.map +1 -0
- package/dist/{ManageIncome-BadwsHRL.mjs → ManageIncome-Dcsnnz86.mjs} +9 -8
- package/dist/ManageIncome-Dcsnnz86.mjs.map +1 -0
- package/dist/MicroWidgetContainer-B2NnKBgW.mjs +1 -0
- package/dist/MicroWidgetContainer-B2NnKBgW.mjs.map +1 -0
- package/dist/MiniWidgetContainer-Bmv_WeUd.mjs +1 -0
- package/dist/MiniWidgetContainer-Bmv_WeUd.mjs.map +1 -0
- package/dist/NetWorthUtils-DfSH3z70.mjs +1 -0
- package/dist/NetWorthUtils-DfSH3z70.mjs.map +1 -0
- package/dist/Notification-DTNYSd8P.mjs +1 -0
- package/dist/Notification-DTNYSd8P.mjs.map +1 -0
- package/dist/NotificationSettings-CW7okUrk.mjs +1 -0
- package/dist/NotificationSettings-CW7okUrk.mjs.map +1 -0
- package/dist/NotificationUtils-BRGFTePr.mjs +1 -0
- package/dist/NotificationUtils-BRGFTePr.mjs.map +1 -0
- package/dist/NumberFormatting--XMeeBfr.mjs +1 -0
- package/dist/NumberFormatting--XMeeBfr.mjs.map +1 -0
- package/dist/OriginalBalanceAction-YrvxBYAl.mjs +1 -0
- package/dist/OriginalBalanceAction-YrvxBYAl.mjs.map +1 -0
- package/dist/{RecurringSettings-CGZiV-Ie.mjs → RecurringSettings-D8hBbXV_.mjs} +2 -1
- package/dist/RecurringSettings-D8hBbXV_.mjs.map +1 -0
- package/dist/RecurringTransactionsUtil-CHWmqvW5.mjs +1 -0
- package/dist/RecurringTransactionsUtil-CHWmqvW5.mjs.map +1 -0
- package/dist/ResponsiveButton-CC9F_Ezk.mjs +1 -0
- package/dist/ResponsiveButton-CC9F_Ezk.mjs.map +1 -0
- package/dist/SearchBox-Cpgu_gdO.mjs +1 -0
- package/dist/SearchBox-Cpgu_gdO.mjs.map +1 -0
- package/dist/Select-CSpkK5cR.mjs +1 -0
- package/dist/Select-CSpkK5cR.mjs.map +1 -0
- package/dist/SelectionBox-B4xELRgp.mjs +1 -0
- package/dist/SelectionBox-B4xELRgp.mjs.map +1 -0
- package/dist/SingleSegmentDonut-7Uy6VEld.mjs +1 -0
- package/dist/SingleSegmentDonut-7Uy6VEld.mjs.map +1 -0
- package/dist/Sizes-DISGrlUg.mjs +1 -0
- package/dist/Sizes-DISGrlUg.mjs.map +1 -0
- package/dist/SkeletonLoader-BaNboJjD.mjs +1 -0
- package/dist/SkeletonLoader-BaNboJjD.mjs.map +1 -0
- package/dist/SpendingData-Fii_xATx.mjs +1 -0
- package/dist/SpendingData-Fii_xATx.mjs.map +1 -0
- package/dist/SpendingLegend-CxvNOg3c.mjs +1 -0
- package/dist/SpendingLegend-CxvNOg3c.mjs.map +1 -0
- package/dist/StatusBar-CPfSXe80.mjs +1 -0
- package/dist/StatusBar-CPfSXe80.mjs.map +1 -0
- package/dist/TabContentContainer-B0eYJP5p.mjs +1 -0
- package/dist/TabContentContainer-B0eYJP5p.mjs.map +1 -0
- package/dist/ToggleListItem-Dl1lXNwj.mjs +1 -0
- package/dist/ToggleListItem-Dl1lXNwj.mjs.map +1 -0
- package/dist/{TransactionDetails-DQ_eE7M4.mjs → TransactionDetails-roZ5xLq8.mjs} +2 -1
- package/dist/TransactionDetails-roZ5xLq8.mjs.map +1 -0
- package/dist/TransactionUtils-BphBJBbU.mjs +1 -0
- package/dist/TransactionUtils-BphBJBbU.mjs.map +1 -0
- package/dist/TrendsUtil-D9z3kIj_.mjs +1 -0
- package/dist/TrendsUtil-D9z3kIj_.mjs.map +1 -0
- package/dist/UserStore-C1fdL3Iu.mjs +1 -0
- package/dist/UserStore-C1fdL3Iu.mjs.map +1 -0
- package/dist/{ViewMoreMicroCard-fnwE0hqd.mjs → ViewMoreMicroCard-Dxghxphh.mjs} +352 -355
- package/dist/ViewMoreMicroCard-Dxghxphh.mjs.map +1 -0
- package/dist/WidgetContainer-DJnp6t6c.mjs +1 -0
- package/dist/WidgetContainer-DJnp6t6c.mjs.map +1 -0
- package/dist/accounts/index.es.js +5 -4
- package/dist/accounts/index.es.js.map +1 -0
- package/dist/analytics/index.es.js +1 -0
- package/dist/analytics/index.es.js.map +1 -0
- package/dist/budgets/index.es.js +4 -3
- package/dist/budgets/index.es.js.map +1 -0
- package/dist/cashflow/index.es.js +5 -4
- package/dist/cashflow/index.es.js.map +1 -0
- package/dist/categories/index.es.js +1 -0
- package/dist/categories/index.es.js.map +1 -0
- package/dist/common/components/ListItemWrapper.d.ts +2 -1
- package/dist/common/index.es.js +2 -1
- package/dist/common/index.es.js.map +1 -0
- package/dist/core/index.es.js +1 -0
- package/dist/core/index.es.js.map +1 -0
- package/dist/dashboard/index.es.js +1 -0
- package/dist/dashboard/index.es.js.map +1 -0
- package/dist/debts/index.es.js +64 -63
- package/dist/debts/index.es.js.map +1 -0
- package/dist/finstrong/index.es.js +6 -5
- package/dist/finstrong/index.es.js.map +1 -0
- package/dist/goals/index.es.js +1 -0
- package/dist/goals/index.es.js.map +1 -0
- package/dist/help/index.es.js +2 -1
- package/dist/help/index.es.js.map +1 -0
- package/dist/hooks-97sNJ_lf.mjs +1 -0
- package/dist/hooks-97sNJ_lf.mjs.map +1 -0
- package/dist/insights/index.es.js +3 -2
- package/dist/insights/index.es.js.map +1 -0
- package/dist/investments/index.es.js +1 -0
- package/dist/investments/index.es.js.map +1 -0
- package/dist/merchants/index.es.js +1 -0
- package/dist/merchants/index.es.js.map +1 -0
- package/dist/microinsights/index.es.js +2 -1
- package/dist/microinsights/index.es.js.map +1 -0
- package/dist/networth/index.es.js +1 -0
- package/dist/networth/index.es.js.map +1 -0
- package/dist/notifications/index.es.js +1 -0
- package/dist/notifications/index.es.js.map +1 -0
- package/dist/recurringtransactions/index.es.js +152 -138
- package/dist/recurringtransactions/index.es.js.map +1 -0
- package/dist/settings/index.es.js +2 -1
- package/dist/settings/index.es.js.map +1 -0
- package/dist/spending/index.es.js +3 -2
- package/dist/spending/index.es.js.map +1 -0
- package/dist/transactions/components/shared/transactionlist/TransactionRow.d.ts +1 -0
- package/dist/transactions/index.es.js +6 -5
- package/dist/transactions/index.es.js.map +1 -0
- package/dist/trends/index.es.js +5 -4
- package/dist/trends/index.es.js.map +1 -0
- package/dist/useAccountDisplayName-BsiXA0qf.mjs +1 -0
- package/dist/useAccountDisplayName-BsiXA0qf.mjs.map +1 -0
- package/dist/useAriaLive-MkYebyUR.mjs +1 -0
- package/dist/useAriaLive-MkYebyUR.mjs.map +1 -0
- package/dist/useDimensions-CeDR9V8N.mjs +1 -0
- package/dist/useDimensions-CeDR9V8N.mjs.map +1 -0
- package/dist/useInsightsEnabled-D5Sdm0TJ.mjs +1 -0
- package/dist/useInsightsEnabled-D5Sdm0TJ.mjs.map +1 -0
- package/dist/useScreenSize-mWpmnh5w.mjs +1 -0
- package/dist/useScreenSize-mWpmnh5w.mjs.map +1 -0
- package/dist/useWidgetLoadTimer-B0tB-yzL.mjs +1 -0
- package/dist/useWidgetLoadTimer-B0tB-yzL.mjs.map +1 -0
- package/package.json +6 -6
- package/dist/ListItemWrapper-BHIbqx7E.mjs +0 -42
- package/dist/insights/components/insights/P2pCategorization/_tests_/P2pCategorizationMultipleTransaction.test.d.ts +0 -0
- package/dist/insights/components/insights/P2pCategorization/_tests_/P2pCategorizationSingleTransaction.test.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetWorthUtils-DfSH3z70.mjs","sources":["../src/core/utils/NetWorthUtils.ts"],"sourcesContent":["import { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { subMonths } from 'date-fns/subMonths'\n\nimport type {\n Account,\n AccountGroup,\n FinancialAccount,\n Member,\n MonthlyAccountBalance,\n NetWorth,\n} from '../types'\nimport { AccountTypeName, AccountIcon, AccountIconVariants } from '../types'\nimport { isAccountLiability } from '../utils/AccountUtils'\n\nconst MAX_NUMBER_MONTHS = 13\n\nexport const filterAccounts = (accounts: Account[], members: Member[]) => {\n return accounts.filter((account) => {\n const { is_closed, is_deleted, is_hidden, is_manual } = account\n\n if (is_closed || is_deleted || is_hidden) return false\n if (is_manual || !account.guid) return true\n\n return members.some((member) => {\n return accounts.some((account) => {\n return member.guid === account.member_guid\n })\n })\n })\n}\n\nexport const flattenBalances = (\n allBalances: MonthlyAccountBalance[],\n currentBalances: MonthlyAccountBalance[],\n) => {\n return [...allBalances, ...currentBalances]\n}\n\nexport const getLatestNetWorthData = (chartData: NetWorth[]) => {\n if (chartData && chartData.length > 0) {\n return chartData[chartData.length - 1]\n } else return undefined\n}\n\nexport const sortByYearMonthAscending = (a: MonthlyAccountBalance, b: MonthlyAccountBalance) =>\n a.year_month - b.year_month\n\nconst buildDateTicks = () => {\n return Array.from({ length: MAX_NUMBER_MONTHS }, (_, count) => {\n return Math.floor(startOfMonth(subMonths(new Date(), count)).getTime() / 1000)\n }).sort()\n}\n\nexport const buildChartData = (\n accounts: Account[],\n monthlyAccountBalances: MonthlyAccountBalance[],\n numberOfMonths: number,\n) => {\n if (!accounts.length || !monthlyAccountBalances.length) return []\n const dateTicks = buildDateTicks()\n return dateTicks\n .reduceRight((result: any, x) => {\n const balances = monthlyAccountBalances.filter(\n ({ year_month }) => year_month === parseInt(format(fromUnixTime(x), 'yyyyMM')),\n )\n const accountsWithBalances = accounts.map((account) => {\n const balance = balances.find((balance) => balance.account_guid === account.guid)\n\n const zeroBalance = {\n change: 0,\n guid: account.guid,\n name: account.name,\n type: account.account_type,\n balance: 0,\n }\n\n if (!balance && result.length === 0 && !account.balance) return zeroBalance\n\n // The servers return the monthly account balances in Utah time. Frontend starts all the date calculations\n // in UTC. We get into overlaps for a few hours depending on the timezone with no monthly account balances\n // for all accounts.\n if (!balance && result.length === 0) {\n return {\n ...zeroBalance,\n value: isAccountLiability(account) ? -(account.balance ?? 0) : (account.balance ?? 0),\n }\n }\n\n if (!balance) {\n const lastBalance = result[0].accounts.find((acc: Account) => acc.guid === account.guid)\n\n return lastBalance ? lastBalance : zeroBalance\n }\n\n return {\n change: balance.transaction_total,\n guid: account.guid,\n name: account.name,\n type: account.account_type,\n value: balance.balance,\n }\n })\n\n const { y, change } = accountsWithBalances.reduce(\n (acc, current) => {\n return {\n y: acc.y + (current.value || 0),\n change: acc.change + (current.change || 0),\n }\n },\n { y: 0, change: 0 },\n )\n\n return [\n {\n accounts: accountsWithBalances,\n x,\n y,\n change,\n },\n ...result,\n ]\n }, [])\n .slice(MAX_NUMBER_MONTHS - numberOfMonths)\n}\n\nexport const buildGainsLosses = (selectedData?: NetWorth) => {\n const gains: { accountName: string; gain: number }[] = []\n const losses: { accountName: string; loss: number }[] = []\n let totalGains = 0\n let totalLosses = 0\n\n selectedData?.accounts.forEach((account) => {\n if (account.change > 0) {\n gains.push({ accountName: account.name, gain: account.change })\n totalGains += account.change\n }\n if (account.change < 0) {\n losses.push({ accountName: account.name, loss: account.change })\n totalLosses += account.change\n }\n })\n\n return { netWorth: selectedData, gains, losses, totalGains, totalLosses }\n}\n\nexport const buildAssetsLiabilities = (accounts: Account[]) => {\n const assets: FinancialAccount[] = []\n const liabilities: FinancialAccount[] = []\n let totalAssets = 0\n let totalLiabilities = 0\n\n accounts.forEach((account) => {\n if (isAccountLiability(account)) {\n const balance = account.balance ?? 0\n liabilities.push({ accountName: account.name, accountType: account.account_type, balance })\n totalLiabilities += balance\n } else {\n const balance = account.balance ?? 0\n assets.push({ accountName: account.name, accountType: account.account_type, balance })\n totalAssets += balance\n }\n })\n\n return { assets, liabilities, totalAssets, totalLiabilities }\n}\n// groups accounts by account type\n// returns array of account groups, each with an icon, name, and the grouped accounts\nexport const groupAccounts = (accounts: FinancialAccount[]): AccountGroup[] => {\n const groupedAccounts = accounts.reduce<{ [key: number]: FinancialAccount[] }>((acc, account) => {\n const accountType = account.accountType\n if (!acc[accountType]) {\n acc[accountType] = []\n }\n acc[accountType].push(account)\n return acc\n }, {})\n\n return Object.entries(groupedAccounts).map(([accountType, accounts]) => ({\n icon: AccountIconVariants[+accountType] || AccountIcon[+accountType],\n name: AccountTypeName[+accountType],\n accounts,\n }))\n}\n"],"names":["MAX_NUMBER_MONTHS","filterAccounts","accounts","members","account","is_closed","is_deleted","is_hidden","is_manual","member","flattenBalances","allBalances","currentBalances","getLatestNetWorthData","chartData","sortByYearMonthAscending","a","b","buildDateTicks","_","count","startOfMonth","subMonths","buildChartData","monthlyAccountBalances","numberOfMonths","result","x","balances","year_month","format","fromUnixTime","accountsWithBalances","balance","zeroBalance","isAccountLiability","lastBalance","acc","y","change","current","buildGainsLosses","selectedData","gains","losses","totalGains","totalLosses","buildAssetsLiabilities","assets","liabilities","totalAssets","totalLiabilities","groupAccounts","groupedAccounts","accountType","AccountIconVariants","AccountIcon","AccountTypeName"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Notification-DTNYSd8P.mjs","sources":["../src/core/types/Notification.ts"],"sourcesContent":["import { Account } from './Account'\n\nexport type Notification = {\n account: Account\n category_guid: string\n color: string\n content: string\n delivered_at: number\n entity_guid: string\n guid: string\n has_been_viewed: boolean\n in_app_icon: string\n merchant_guid: string\n notification_type: number\n}\n\nexport type NotificationProfile = {\n email_channel: boolean\n entity_guid: string\n guid: string\n is_enabled: boolean\n notification_type: number\n push_channel: boolean\n sms_channel: boolean\n threshold?: number | null\n}\n\nexport interface DetailedNotificationProfile extends NotificationProfile {\n account?: Account\n children?: DetailedNotificationProfile[]\n deliveryMethodsLabel?: string\n label: string\n}\n\nexport enum NotificationTypes {\n Accounts = 'accounts',\n Budgets = 'budgets',\n Insights = 'insights',\n Personal = 'personal',\n}\n\nexport enum AccountNotificationTypes {\n DebtPaymentReminder = 3,\n AccountBalanceLow = 6,\n AccountDepositLarge = 7,\n TransactionExpenseLarge = 8,\n TransactionFeeCharge = 9,\n InternationalTransaction = 23,\n AccountDepositLargePosted = 48,\n}\n\nexport enum BudgetNotificationTypes {\n BudgetExceeded = 1,\n BudgetOffTarget = 2,\n}\n\nexport enum InsightNotificationTypes {\n AccountBalanceLow = 33,\n AccountDepositHigh = 34,\n BillAmountNotStandard = 49,\n BudgetExceeded = 35,\n BudgetOffTarget = 36,\n CategoryBudget = 43,\n CategorySpending = 50,\n CreditCardCloseToLimit = 51,\n DebtPaymentReminder = 37,\n DebtPaymentReminderV3 = 66,\n DiscoveredAccounts = 52,\n DuplicatePayment = 42,\n GoalProgress = 38,\n MonthlySpendComparison = 53,\n MonthlySpendToIncomeComparison = 54,\n MonthlySubscriptionAggregate = 55,\n MonthlyTopMerchantSpending = 56,\n PromotionalCampaignMessages = 67,\n SaveAnExtra100Dollars = 57,\n SavingsOpportunity = 58,\n SetUpDirectDeposit = 59,\n SpendingPlanBudgetExceeded = 45,\n SpendingPlanCategorySpending = 44,\n SwitchDirectDeposit = 60,\n TransactionExpenseLarge = 39,\n TransactionFeeCharge = 40,\n TransactionIsInternational = 41,\n TransparentOverdraft = 68,\n UncategorizedTransactions = 61,\n UnifiedDeposit = 62,\n UpcomingBill = 63,\n WeekendSpendingSummary = 64,\n WeeklyNewMerchants = 65,\n}\n"],"names":["NotificationTypes","AccountNotificationTypes","BudgetNotificationTypes","InsightNotificationTypes"],"mappings":"AAkCO,IAAKA,sBAAAA,OACVA,EAAA,WAAW,YACXA,EAAA,UAAU,WACVA,EAAA,WAAW,YACXA,EAAA,WAAW,YAJDA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,sBAAsB,CAAA,IAAtB,uBACAA,EAAAA,EAAA,oBAAoB,CAAA,IAApB,qBACAA,EAAAA,EAAA,sBAAsB,CAAA,IAAtB,uBACAA,EAAAA,EAAA,0BAA0B,CAAA,IAA1B,2BACAA,EAAAA,EAAA,uBAAuB,CAAA,IAAvB,wBACAA,EAAAA,EAAA,2BAA2B,EAAA,IAA3B,4BACAA,EAAAA,EAAA,4BAA4B,EAAA,IAA5B,6BAPUA,IAAAA,KAAA,CAAA,CAAA,GAUAC,sBAAAA,OACVA,EAAAA,EAAA,iBAAiB,CAAA,IAAjB,kBACAA,EAAAA,EAAA,kBAAkB,CAAA,IAAlB,mBAFUA,IAAAA,KAAA,CAAA,CAAA,GAKAC,sBAAAA,OACVA,EAAAA,EAAA,oBAAoB,EAAA,IAApB,qBACAA,EAAAA,EAAA,qBAAqB,EAAA,IAArB,sBACAA,EAAAA,EAAA,wBAAwB,EAAA,IAAxB,yBACAA,EAAAA,EAAA,iBAAiB,EAAA,IAAjB,kBACAA,EAAAA,EAAA,kBAAkB,EAAA,IAAlB,mBACAA,EAAAA,EAAA,iBAAiB,EAAA,IAAjB,kBACAA,EAAAA,EAAA,mBAAmB,EAAA,IAAnB,oBACAA,EAAAA,EAAA,yBAAyB,EAAA,IAAzB,0BACAA,EAAAA,EAAA,sBAAsB,EAAA,IAAtB,uBACAA,EAAAA,EAAA,wBAAwB,EAAA,IAAxB,yBACAA,EAAAA,EAAA,qBAAqB,EAAA,IAArB,sBACAA,EAAAA,EAAA,mBAAmB,EAAA,IAAnB,oBACAA,EAAAA,EAAA,eAAe,EAAA,IAAf,gBACAA,EAAAA,EAAA,yBAAyB,EAAA,IAAzB,0BACAA,EAAAA,EAAA,iCAAiC,EAAA,IAAjC,kCACAA,EAAAA,EAAA,+BAA+B,EAAA,IAA/B,gCACAA,EAAAA,EAAA,6BAA6B,EAAA,IAA7B,8BACAA,EAAAA,EAAA,8BAA8B,EAAA,IAA9B,+BACAA,EAAAA,EAAA,wBAAwB,EAAA,IAAxB,yBACAA,EAAAA,EAAA,qBAAqB,EAAA,IAArB,sBACAA,EAAAA,EAAA,qBAAqB,EAAA,IAArB,sBACAA,EAAAA,EAAA,6BAA6B,EAAA,IAA7B,8BACAA,EAAAA,EAAA,+BAA+B,EAAA,IAA/B,gCACAA,EAAAA,EAAA,sBAAsB,EAAA,IAAtB,uBACAA,EAAAA,EAAA,0BAA0B,EAAA,IAA1B,2BACAA,EAAAA,EAAA,uBAAuB,EAAA,IAAvB,wBACAA,EAAAA,EAAA,6BAA6B,EAAA,IAA7B,8BACAA,EAAAA,EAAA,uBAAuB,EAAA,IAAvB,wBACAA,EAAAA,EAAA,4BAA4B,EAAA,IAA5B,6BACAA,EAAAA,EAAA,iBAAiB,EAAA,IAAjB,kBACAA,EAAAA,EAAA,eAAe,EAAA,IAAf,gBACAA,EAAAA,EAAA,yBAAyB,EAAA,IAAzB,0BACAA,EAAAA,EAAA,qBAAqB,EAAA,IAArB,sBAjCUA,IAAAA,KAAA,CAAA,CAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationSettings-CW7okUrk.mjs","sources":["../src/settings/components/profile/actions/VerifyEmailAction.tsx","../src/settings/components/profile/actions/VerifyTokenAction.tsx","../src/settings/components/profile/actions/VerifyPhoneAction.tsx","../src/settings/components/notifications/AccountProfileListItem.tsx","../src/settings/components/notifications/AccountNotificationProfile.tsx","../src/settings/components/notifications/AccountNotificationProfiles.tsx","../src/settings/components/notifications/NotificationProfile.tsx","../src/settings/components/notifications/BudgetNotificationProfiles.tsx","../src/settings/components/notifications/DeliveryMethods.tsx","../src/settings/components/notifications/InsightsNotificationProfiles.tsx","../src/settings/components/notifications/PersonalDetails.tsx","../src/settings/components/notifications/NotificationSettings.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport { useTheme } from '@mui/material/styles'\n\nimport { Text } from '@mxenabled/mxui'\nimport { ChevronRight } from '@mxenabled/mx-icons'\n\nimport { Dialog, useGlobalCopyStore, useSettingsStore, useUserStore } from '../../../../common'\n\nconst VerifyEmailAction = observer(() => {\n const { common: commonCopy, settings: settingsCopy } = useGlobalCopyStore()\n const { sendEmailVerification } = useSettingsStore()\n const { user } = useUserStore()\n const theme = useTheme()\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n const handleClose = (): void => {\n setIsOpen(false)\n }\n\n const handleOpen = (): void => {\n setIsOpen(true)\n }\n\n return (\n <React.Fragment>\n <Button onClick={handleOpen} sx={{ height: 'auto', p: 4, width: 'fit-content' }}>\n <Text variant=\"body2\">{settingsCopy.verify_email}</Text>\n <ChevronRight />\n </Button>\n <Dialog\n copy={{ title: '' }}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={sendEmailVerification}\n onSecondaryAction={handleClose}\n primaryText={settingsCopy.send_verification}\n secondaryText={commonCopy.back}\n sx={{\n '& .MuiDialogContent-root': { pt: 0, width: 400 },\n\n '& .MuiToolbar-root:last-child': {\n gap: 16,\n padding: '32px 60px 48px',\n justifyContent: 'center',\n },\n }}\n >\n <Stack spacing={16} sx={{ px: 40, textAlign: 'center', width: '100%' }}>\n <Text bold={true} truncate={false} variant=\"body1\">\n {settingsCopy.confirm_your_email}\n </Text>\n <Text truncate={false} variant=\"body2\">\n {settingsCopy.confirm_email}\n </Text>\n <Text\n sx={{\n border: `1px solid ${theme.palette.neutral.light}`,\n borderRadius: '4px',\n p: '16px 32px',\n }}\n variant=\"h3\"\n >\n {user.email}\n </Text>\n <Text truncate={false} variant=\"body2\">\n {settingsCopy.verification_notice_email}\n </Text>\n </Stack>\n </Dialog>\n </React.Fragment>\n )\n})\n\nexport default VerifyEmailAction\n","import { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Stack from '@mui/material/Stack'\nimport TextField from '@mui/material/TextField'\n\nimport { Dialog, useGlobalCopyStore } from '../../../../common'\n\ninterface ActionProps {\n handleClose: () => void\n handleVerify: (token: string) => void\n isOpen: boolean\n}\n\nconst VerifyTokenAction: React.FC<ActionProps> = observer(\n ({ handleClose, handleVerify, isOpen }) => {\n const { common: commonCopy, settings: settingsCopy } = useGlobalCopyStore()\n const [token, setToken] = React.useState('')\n\n return (\n <Dialog\n copy={{ title: settingsCopy.enter_verification_code }}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => handleVerify(token)}\n onSecondaryAction={handleClose}\n primaryText={settingsCopy.verify}\n secondaryText={commonCopy.cancel_button}\n sx={{\n '& .MuiDialogContent-root': { pt: 0, width: 400 },\n '& .MuiToolbar-root:last-child': {\n gap: 8,\n padding: 24,\n justifyContent: 'flex-end',\n },\n }}\n >\n <Stack>\n <TextField onChange={(e) => setToken(e.target.value)} sx={{ width: 352 }} value={token} />\n </Stack>\n </Dialog>\n )\n },\n)\n\nexport default VerifyTokenAction\n","import { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport { useTheme } from '@mui/material/styles'\n\nimport { Text } from '@mxenabled/mxui'\nimport { ChevronRight } from '@mxenabled/mx-icons'\nimport { Dialog, useGlobalCopyStore, useSettingsStore, useUserStore } from '../../../../common'\nimport VerifyTokenAction from './VerifyTokenAction'\n\nconst VerifyPhoneAction = observer(() => {\n const { common: commonCopy, settings: settingsCopy } = useGlobalCopyStore()\n const { sendPhoneVerification, verifyPhoneToken } = useSettingsStore()\n const { user } = useUserStore()\n const theme = useTheme()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [showVerifyToken, setShowVerifyToken] = React.useState(false)\n\n const handleClose = (): void => {\n setIsOpen(false)\n }\n\n const handleOpen = (): void => {\n setIsOpen(true)\n }\n\n const handlePhoneVerify = () => {\n sendPhoneVerification().finally(() => {\n setShowVerifyToken(true)\n })\n }\n\n const handleTokenVerify = (token: string) => {\n verifyPhoneToken(token).finally(() => {\n setShowVerifyToken(false)\n })\n }\n\n return (\n <React.Fragment>\n <Button onClick={handleOpen} sx={{ height: 'auto', p: 4, width: 'fit-content' }}>\n <Text variant=\"body2\">{settingsCopy.verify_phone}</Text>\n <ChevronRight />\n </Button>\n <Dialog\n copy={{ title: '' }}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={handlePhoneVerify}\n onSecondaryAction={handleClose}\n primaryText={settingsCopy.send_verification}\n secondaryText={commonCopy.back}\n sx={{\n '& .MuiDialogContent-root': { pt: 0, width: 400 },\n\n '& .MuiToolbar-root:last-child': {\n gap: 16,\n padding: '32px 60px 48px',\n justifyContent: 'center',\n },\n }}\n >\n <Stack spacing={16} sx={{ px: 40, textAlign: 'center', width: '100%' }}>\n <Text bold={true} truncate={false} variant=\"body1\">\n {settingsCopy.confirm_your_phone}\n </Text>\n <Text truncate={false} variant=\"body2\">\n {settingsCopy.confirm_phone}\n </Text>\n <Text\n sx={{\n border: `1px solid ${theme.palette.neutral.light}`,\n borderRadius: '4px',\n p: '16px 32px',\n }}\n variant=\"h3\"\n >\n {user.phone}\n </Text>\n <Text truncate={false} variant=\"body2\">\n {settingsCopy.verification_notice_phone}\n </Text>\n </Stack>\n </Dialog>\n <VerifyTokenAction\n handleClose={() => setShowVerifyToken(false)}\n handleVerify={handleTokenVerify}\n isOpen={showVerifyToken}\n />\n </React.Fragment>\n )\n})\n\nexport default VerifyPhoneAction\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport Stack from '@mui/material/Stack'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'\n\nimport { ChevronRight } from '@mxenabled/mx-icons'\n\nimport { InstitutionLogo } from '@mxenabled/mxui'\n\nimport {\n CurrencyInput,\n Dialog,\n ToggleButtonListItem,\n useAccountStore,\n useGlobalCopyStore,\n} from '../../../common'\nimport { AccountNotificationTypes, DetailedNotificationProfile } from '../../../core'\nimport { formatCurrency, formatOrdinal } from '../../../core/utils/NumberFormatting'\nimport { buildDynamicCopy } from '../../../core/utils/Localization'\n\ninterface AccountProfileListItemProps {\n onProfileUpdated: (profile: DetailedNotificationProfile) => void\n profile: DetailedNotificationProfile\n}\n\nexport const AccountProfileListItem = observer(\n ({ onProfileUpdated, profile }: AccountProfileListItemProps) => {\n const { common: commonCopy, recurring: recurringCopy, settings: copy } = useGlobalCopyStore()\n const { updateAccount } = useAccountStore()\n\n const isPaymentReminder =\n profile.notification_type === AccountNotificationTypes.DebtPaymentReminder\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [amount, setAmount] = React.useState<number>(profile.threshold || 0)\n const [paymentDay, setPaymentDay] = React.useState<number>(\n profile.account?.day_payment_is_due || 0,\n )\n\n const accountName = profile.account?.name || profile.account?.feed_name || ''\n const accountPaymentDate = profile.account?.day_payment_is_due\n ? (buildDynamicCopy(\n copy.notification_debt_payment_date,\n formatOrdinal(profile.account?.day_payment_is_due),\n ) as string)\n : copy.notification_debt_payment_zero_state\n\n const secondaryText = isPaymentReminder\n ? accountPaymentDate\n : formatCurrency(profile.threshold ?? 0, '0,0')\n\n const handleUpdateProfile = async () => {\n if (isPaymentReminder && profile.account) {\n await updateAccount({ ...profile.account, day_payment_is_due: paymentDay })\n } else {\n onProfileUpdated({ ...profile, threshold: amount })\n }\n }\n\n return (\n <Stack>\n <ToggleButtonListItem\n avatar={\n profile.account?.institution_guid ? (\n <InstitutionLogo\n alt={profile.label}\n institutionGuid={profile.account?.institution_guid}\n />\n ) : undefined\n }\n endIcon={<ChevronRight />}\n isChecked={profile.is_enabled}\n isDisabled={!profile.is_enabled}\n isPrimaryTextBold={true}\n onClick={() => setIsOpen(true)}\n onToggle={() =>\n onProfileUpdated({\n ...profile,\n is_enabled: !profile.is_enabled,\n })\n }\n primaryText={accountName}\n secondaryText={!profile.is_enabled ? copy.notification_disabled : secondaryText}\n />\n\n <Dialog\n copy={{\n title: isPaymentReminder\n ? recurringCopy.day_of_the_month\n : copy.notification_threshold_label,\n close_aria: commonCopy.close_aria,\n }}\n disablePrimaryButton={isPaymentReminder && paymentDay === 0}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onPrimaryAction={handleUpdateProfile}\n primaryText={commonCopy.save_button}\n >\n {isPaymentReminder ? (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <DateCalendar\n maxDate={endOfMonth(new Date())}\n minDate={startOfMonth(new Date())}\n onChange={(date: Date) => {\n setPaymentDay(date.getDate())\n }}\n slots={{\n // Hides the arrows\n leftArrowIcon: () => null,\n rightArrowIcon: () => null,\n }}\n sx={{\n // TODO: Needs to be updated in MXUI\n '& .MuiPickersDay-today': {\n color: 'primary.main',\n },\n }}\n views={['day']}\n />\n </LocalizationProvider>\n ) : (\n <CurrencyInput\n amount={amount}\n autoFocus={true}\n fullWidth={true}\n minAmount={0}\n setAmount={(value) => setAmount(Number(value) || 0)}\n sx={{ '.MuiTypography-body1': { p: 0 } }}\n />\n )}\n </Dialog>\n </Stack>\n )\n },\n)\n","import { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport {\n ToggleListItem,\n useGlobalCopyStore,\n useScreenSize,\n useSettingsStore,\n useUserStore,\n} from '../../../common'\nimport { DetailedNotificationProfile } from '../../../core'\n\nimport { AccountProfileListItem } from './AccountProfileListItem'\n\ninterface AccountNotificationProfileProps {\n onUpdateProfile: (profile: DetailedNotificationProfile) => void\n profile: DetailedNotificationProfile\n}\n\nexport const AccountNotificationProfile = observer(\n ({ onUpdateProfile, profile }: AccountNotificationProfileProps) => {\n const { settings: copy } = useGlobalCopyStore()\n const { user } = useUserStore()\n const { clientCommunicationProfile, userCommunicationsProfile } = useSettingsStore()\n const { isMobile } = useScreenSize()\n\n const isAccountProfile = profile.notification_type > 2\n const {\n opted_out_of_email_notifications: emailDisabled,\n opted_out_of_push_notifications: pushDisabled,\n opted_out_of_sms_notifications: smsDisabled,\n } = userCommunicationsProfile\n\n const {\n email_notifications_enabled: showEmail,\n push_notifications_enabled: showPush,\n sms_notifications_enabled: showSms,\n } = clientCommunicationProfile\n\n return (\n <Stack>\n {(showEmail || showSms || showPush) && (\n <>\n <Text bold={true} sx={{ mb: 4, ml: 24, mt: 12 }} variant=\"caption\">\n {copy.delivery_method_title}\n </Text>\n <List sx={{ bgcolor: 'background.paper' }}>\n {showEmail && (\n <Stack sx={{ pl: 24 }}>\n <ToggleListItem\n isChecked={!emailDisabled && profile.email_channel && !!user.email}\n isDisabled={emailDisabled || !user.email}\n onToggle={() =>\n onUpdateProfile({ ...profile, email_channel: !profile.email_channel })\n }\n primaryText={copy.delivery_method_email_label}\n secondaryText={\n emailDisabled || !profile.email_channel || !user.email\n ? copy.notification_disabled\n : copy.notification_enabled\n }\n useExtraPadding={false}\n />\n </Stack>\n )}\n\n {showEmail && (showSms || showPush) && <Divider sx={{ ml: isMobile ? 0 : 24 }} />}\n\n {showSms && (\n <Stack sx={{ pl: 24 }}>\n <ToggleListItem\n isChecked={!smsDisabled && profile.sms_channel && !!user.phone}\n isDisabled={smsDisabled || !user.phone}\n onToggle={() =>\n onUpdateProfile({ ...profile, sms_channel: !profile.sms_channel })\n }\n primaryText={`${copy.delivery_method_sms_label}`}\n secondaryText={\n smsDisabled || !profile.sms_channel || !user.phone\n ? copy.notification_disabled\n : copy.notification_enabled\n }\n useExtraPadding={false}\n />\n </Stack>\n )}\n\n {showSms && showPush && <Divider sx={{ ml: isMobile ? 0 : 24 }} />}\n\n {showPush && (\n <Stack sx={{ pl: 24 }}>\n <ToggleListItem\n isChecked={!pushDisabled && profile.push_channel}\n isDisabled={pushDisabled}\n onToggle={() =>\n onUpdateProfile({ ...profile, push_channel: !profile.push_channel })\n }\n primaryText={copy.delivery_method_push_label}\n secondaryText={copy.delivery_method_push_subtitle}\n useExtraPadding={false}\n />\n </Stack>\n )}\n <Divider />\n </List>\n </>\n )}\n\n {isAccountProfile && Boolean(profile.children?.length) && (\n <Stack>\n <Text bold={true} sx={{ mb: 4, ml: 24, mt: 12 }} variant=\"caption\">\n {copy.accounts_threshold_title}\n </Text>\n\n <List sx={{ bgcolor: 'background.paper' }}>\n {profile.children?.map((child) => (\n <AccountProfileListItem\n key={child.guid}\n onProfileUpdated={onUpdateProfile}\n profile={child}\n />\n ))}\n </List>\n </Stack>\n )}\n </Stack>\n )\n },\n)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { ChevronRight } from '@mxenabled/mx-icons'\n\nimport { Drawer, ToggleButtonListItem, useSettingsStore } from '../../../common'\nimport { DetailedNotificationProfile } from '../../../core'\n\nimport { AccountNotificationProfile } from './AccountNotificationProfile'\n\nexport const AccountNotificationProfiles = observer(() => {\n const { accountProfiles, updateNotificationProfile } = useSettingsStore()\n\n const [selectedProfileGuid, setSelectedProfileGuid] = React.useState('')\n\n const selectedProfile = React.useMemo(\n () => accountProfiles.find((profile) => profile.guid === selectedProfileGuid),\n [accountProfiles, selectedProfileGuid],\n )\n\n const handleProfileToggle = async (profile: DetailedNotificationProfile) => {\n await updateNotificationProfile({\n ...profile,\n is_enabled: !profile.is_enabled,\n })\n }\n\n const handleProfileUpdate = async (profile: DetailedNotificationProfile) => {\n await updateNotificationProfile(profile)\n }\n\n return (\n <Stack sx={{ backgroundColor: 'background.paper' }}>\n {accountProfiles\n // Don't show notification profiles that have no associated accounts (children)\n .filter((profile) => profile.children && profile.children.length > 0)\n .map((profile) => (\n <ToggleButtonListItem\n endIcon={<ChevronRight />}\n isChecked={profile.is_enabled}\n isDisabled={!profile.is_enabled}\n key={profile.guid}\n onClick={() => setSelectedProfileGuid(profile.guid)}\n onToggle={() => handleProfileToggle(profile)}\n primaryText={profile.label}\n secondaryText={profile.is_enabled ? profile.deliveryMethodsLabel : undefined}\n />\n ))}\n <Drawer\n isOpen={Boolean(selectedProfile)}\n onClose={() => setSelectedProfileGuid('')}\n title={selectedProfile ? selectedProfile.label : ''}\n >\n {selectedProfile && (\n <AccountNotificationProfile\n onUpdateProfile={handleProfileUpdate}\n profile={selectedProfile}\n />\n )}\n </Drawer>\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Collapse from '@mui/material/Collapse'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport { ExpandMore } from '@mxenabled/mx-icons'\n\nimport {\n ToggleButtonListItem,\n ToggleListItem,\n useGlobalCopyStore,\n useSettingsStore,\n useUserStore,\n} from '../../../common'\nimport { type DetailedNotificationProfile } from '../../../core'\n\ninterface BudgetNotificationProfileProps {\n profile: DetailedNotificationProfile\n}\n\nexport const NotificationProfile = observer(({ profile }: BudgetNotificationProfileProps) => {\n const { settings: copy } = useGlobalCopyStore()\n const {\n clientCommunicationProfile: {\n email_notifications_enabled: showEmail,\n push_notifications_enabled: showPush,\n sms_notifications_enabled: showSms,\n },\n updateNotificationProfile,\n userCommunicationsProfile: {\n opted_out_of_email_notifications: emailDisabled,\n opted_out_of_push_notifications: pushDisabled,\n opted_out_of_sms_notifications: smsDisabled,\n },\n } = useSettingsStore()\n\n const { user: userDetails } = useUserStore()\n\n const [isExpanded, setIsExpanded] = React.useState(false)\n\n const handleProfileToggle = async () => {\n await handleUpdateProfile({ ...profile, is_enabled: !profile.is_enabled })\n\n if (profile.is_enabled) {\n setIsExpanded(false)\n }\n }\n\n const handleUpdateProfile = async (updatedProfile: DetailedNotificationProfile) => {\n await updateNotificationProfile(updatedProfile)\n }\n\n const hasDeliveryMethods = showEmail || showSms || showPush\n\n return (\n <List key={profile.guid} sx={{ bgcolor: 'background.paper' }}>\n <ToggleButtonListItem\n endIcon={\n hasDeliveryMethods ? (\n <ExpandMore\n sx={{\n transition: 'transform 0.3s ease-in-out',\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n ) : undefined\n }\n isChecked={profile.is_enabled}\n isDisabled={!profile.is_enabled}\n key={profile.guid}\n onClick={() => setIsExpanded(!isExpanded)}\n onToggle={() => handleProfileToggle()}\n primaryText={profile.label}\n secondaryText={profile.is_enabled ? profile.deliveryMethodsLabel : undefined}\n />\n {hasDeliveryMethods && (\n <Collapse in={isExpanded}>\n <List sx={{ bgcolor: 'background.paper' }}>\n {showEmail && (\n <ToggleListItem\n isChecked={!emailDisabled && profile.email_channel && !!userDetails.email}\n isDisabled={emailDisabled || !userDetails.email}\n onToggle={() =>\n handleUpdateProfile({\n ...profile,\n email_channel: !profile.email_channel,\n })\n }\n primaryText={copy.delivery_method_email_label}\n />\n )}\n\n {showEmail && (showSms || showPush) && <Divider sx={{ ml: 48 }} />}\n\n {showSms && (\n <ToggleListItem\n isChecked={!smsDisabled && profile.sms_channel && !!userDetails.phone}\n isDisabled={smsDisabled || !userDetails.phone}\n onToggle={() =>\n handleUpdateProfile({\n ...profile,\n sms_channel: !profile.sms_channel,\n })\n }\n primaryText={copy.delivery_method_sms_label}\n />\n )}\n\n {showSms && showPush && <Divider sx={{ ml: 48 }} />}\n\n {showPush && (\n <ToggleListItem\n isChecked={!pushDisabled && profile.push_channel}\n isDisabled={pushDisabled}\n onToggle={() =>\n handleUpdateProfile({\n ...profile,\n push_channel: !profile.push_channel,\n })\n }\n primaryText={copy.delivery_method_push_label}\n />\n )}\n </List>\n </Collapse>\n )}\n <Divider />\n </List>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { NotificationProfile } from './NotificationProfile'\n\nimport { useSettingsStore } from '../../../common'\n\nexport const BudgetNotificationProfiles = observer(() => {\n const { budgetProfiles } = useSettingsStore()\n\n return (\n <Stack>\n {budgetProfiles.map((profile) => (\n <NotificationProfile key={profile.guid} profile={profile} />\n ))}\n </Stack>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport Divider from '@mui/material/Divider'\nimport Stack from '@mui/material/Stack'\n\nimport { Star } from '@mxenabled/mx-icons'\n\nimport { H3, Text } from '@mxenabled/mxui'\n\nimport {\n ToggleListItem,\n useEvent,\n useGlobalCopyStore,\n useSettingsStore,\n useUserStore,\n} from '../../../common'\nimport { type UserCommunicationProfile } from '../../../core'\n\nexport const DeliveryMethods = observer(() => {\n const { onEvent } = useEvent()\n const { settings: copy } = useGlobalCopyStore()\n const {\n clientCommunicationProfile: ccp,\n updateUserCommunicationProfile,\n userCommunicationsProfile: ucp,\n } = useSettingsStore()\n const { user } = useUserStore()\n\n const onProfileChange = async <K extends keyof UserCommunicationProfile>(\n key: K,\n value: UserCommunicationProfile[K],\n ) => {\n const updatedProfile = { ...ucp, [key]: value }\n\n if (onEvent) {\n const keyParts = key.split('_')\n const notificationType = keyParts[3] // e.g., 'email', 'sms', 'push' 'all'\n if (value === false) {\n onEvent('opt_in_notification_method', { notificationType })\n } else {\n onEvent('opt_out_notification_method', { notificationType })\n }\n }\n\n await updateUserCommunicationProfile(updatedProfile)\n }\n\n return (\n <Stack>\n <H3 sx={{ mt: 24 }}>{copy.delivery_method_title}</H3>\n\n {ccp.email_notifications_enabled && (\n <>\n <ToggleListItem\n isChecked={!!user.email && !ucp.opted_out_of_email_notifications}\n isDisabled={!user.email}\n onToggle={() =>\n onProfileChange(\n 'opted_out_of_email_notifications',\n !ucp.opted_out_of_email_notifications,\n )\n }\n primaryText={copy.delivery_method_email_title}\n secondaryText={\n !!user.email && !ucp.opted_out_of_email_notifications\n ? copy.notification_enabled\n : copy.notification_disabled\n }\n useExtraPadding={false}\n />\n\n {(ccp.sms_notifications_enabled || ccp.push_notifications_enabled) && <Divider />}\n </>\n )}\n\n {ccp.sms_notifications_enabled && (\n <>\n <ToggleListItem\n isChecked={!!user.phone && !ucp.opted_out_of_sms_notifications}\n isDisabled={!user.phone}\n onToggle={() =>\n onProfileChange('opted_out_of_sms_notifications', !ucp.opted_out_of_sms_notifications)\n }\n primaryText={copy.delivery_method_sms_title}\n secondaryText={\n !!user.phone && !ucp.opted_out_of_sms_notifications\n ? copy.notification_enabled\n : copy.notification_disabled\n }\n useExtraPadding={false}\n />\n\n {ccp.push_notifications_enabled && <Divider />}\n </>\n )}\n\n {ccp.push_notifications_enabled && (\n <ToggleListItem\n isChecked={!ucp.opted_out_of_push_notifications}\n isDisabled={true}\n onToggle={() => {}}\n primaryText={copy.delivery_method_push_title}\n secondaryText={copy.delivery_method_push_subtitle}\n useExtraPadding={false}\n />\n )}\n\n {ccp.sms_notifications_enabled && (\n <Card sx={{ backgroundColor: 'background.default', mt: 12 }} variant=\"outlined\">\n <CardContent>\n <Stack alignItems=\"flex-start\" direction=\"row\" gap={6}>\n <Star color=\"primary\" filled={true} />\n <Text variant=\"caption\">{copy.delivery_method_sms_note_1}</Text>\n </Stack>\n </CardContent>\n </Card>\n )}\n </Stack>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { useSettingsStore } from '../../../common'\n\nimport { NotificationProfile } from './NotificationProfile'\n\nexport const InsightsNotificationProfiles = observer(() => {\n const { insightsProfiles } = useSettingsStore()\n\n return (\n <Stack>\n {insightsProfiles.map((profile) => (\n <NotificationProfile key={profile.guid} profile={profile} />\n ))}\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport Stack from '@mui/material/Stack'\nimport TextField from '@mui/material/TextField'\n\nimport { H3 } from '@mxenabled/mxui'\n\nimport { useAppConfig, useGlobalCopyStore, useSettingsStore, useUserStore } from '../../../common'\nimport { type EditableUser } from '../../../core'\nimport { useDimensions } from '../../../common/hooks/useDimensions'\n\nimport VerifyEmailAction from '../profile/actions/VerifyEmailAction'\nimport VerifyPhoneAction from '../profile/actions/VerifyPhoneAction'\n\nconst PersonalDetails = () => {\n const { config } = useAppConfig()\n const [containerRef, { width }] = useDimensions()\n const { common: commonCopy, settings: settingsCopy } = useGlobalCopyStore()\n const { updateUser } = useSettingsStore()\n const { user } = useUserStore()\n\n const [hasUnsavedChanges, setHasUnsavedChanges] = React.useState(false)\n const [modifiedUser, setModifiedUser] = React.useState<EditableUser>({\n email: user.email,\n phone: user.phone,\n })\n\n const showVerifyEmail = modifiedUser.email && !user.email_is_verified && !hasUnsavedChanges\n const showVerifyPhone = modifiedUser.phone && !user.phone_is_verified && !hasUnsavedChanges\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = event.target\n const changedUser = { ...modifiedUser, [name]: value }\n\n setModifiedUser(changedUser)\n setHasUnsavedChanges(JSON.stringify({ ...user, ...changedUser }) !== JSON.stringify(user))\n }\n\n const handleSave = async () => {\n await updateUser({ ...user, ...modifiedUser })\n setHasUnsavedChanges(false)\n }\n\n return (\n <Stack ref={containerRef}>\n <Divider />\n <Stack sx={{ pt: 12 }}>\n <H3 sx={{ lineHeight: '20px', pb: 4, pt: 16 }}>{settingsCopy.personal_details}</H3>\n <Stack sx={{ flexDirection: width <= 768 ? 'column' : 'row', gap: 24, py: 16 }}>\n {config.display_email_edit_field_in_settings && (\n <Stack sx={{ flex: 1, pb: 14 }}>\n <TextField\n defaultValue={user.email}\n fullWidth={true}\n label={settingsCopy.email_address}\n name=\"email\"\n onChange={handleChange}\n />\n {showVerifyEmail && (\n <Box\n sx={{\n height: 20,\n '.MuiButton-root': {\n px: 0,\n ':hover': {\n bgcolor: 'transparent',\n },\n },\n }}\n >\n <VerifyEmailAction />\n </Box>\n )}\n </Stack>\n )}\n {config.display_sms_edit_field_in_settings && (\n <Stack sx={{ flex: 1, pb: 14 }}>\n <TextField\n defaultValue={user.phone}\n fullWidth={true}\n label={settingsCopy.mobile_number}\n name=\"phone\"\n onChange={handleChange}\n />\n {showVerifyPhone && (\n <Box\n sx={{\n height: 20,\n '.MuiButton-root': {\n px: 0,\n ':hover': {\n bgcolor: 'transparent',\n },\n },\n }}\n >\n <VerifyPhoneAction />\n </Box>\n )}\n </Stack>\n )}\n </Stack>\n <Button\n disabled={!hasUnsavedChanges}\n onClick={handleSave}\n sx={{ width: 84 }}\n variant=\"contained\"\n >\n {commonCopy.save_button}\n </Button>\n </Stack>\n </Stack>\n )\n}\n\nexport default observer(PersonalDetails)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemText from '@mui/material/ListItemText'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport Stack from '@mui/material/Stack'\n\nimport { ChevronRight } from '@mxenabled/mx-icons'\n\nimport { H3 } from '@mxenabled/mxui'\n\nimport {\n Drawer,\n Loader,\n useAccountStore,\n useAppConfig,\n useGlobalCopyStore,\n useGlobalUiStore,\n useInsightsEnabled,\n useSettingsStore,\n useWidgetLoadTimer,\n} from '../../../common'\nimport { NotificationTypes } from '../../../core'\n\nimport { AccountNotificationProfiles } from './AccountNotificationProfiles'\nimport { BudgetNotificationProfiles } from './BudgetNotificationProfiles'\nimport { DeliveryMethods } from './DeliveryMethods'\nimport { InsightsNotificationProfiles } from './InsightsNotificationProfiles'\nimport PersonalDetails from './PersonalDetails'\n\nexport interface NotificationSettingsProps {\n notificationTypes?: NotificationTypes[]\n showPersonalDetails?: boolean\n view?: string | undefined\n}\n\nexport const NotificationSettings: React.FC<NotificationSettingsProps> = observer(\n ({\n notificationTypes = [NotificationTypes.Accounts, NotificationTypes.Budgets],\n showPersonalDetails = false,\n view,\n }) => {\n const { config } = useAppConfig()\n const { settings: copy } = useGlobalCopyStore()\n const { isInitialized } = useGlobalUiStore()\n const { isAccountDataLoaded, loadAccountData } = useAccountStore()\n const { clientCommunicationProfile: ccp, loadNotificationProfiles } = useSettingsStore()\n const isInsightsEnabled = useInsightsEnabled()\n\n const [isLoaded, setIsLoaded] = React.useState(false)\n const [profileTypeOpen, setProfileTypeOpen] = React.useState<NotificationTypes | undefined>(\n undefined,\n )\n\n if (notificationTypes.length > 0 && isInsightsEnabled)\n notificationTypes.push(NotificationTypes.Insights)\n\n useWidgetLoadTimer({\n widgetName: 'NotificationSettingsWidget',\n isLoaded: isLoaded,\n })\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadNotificationProfiles().finally(() => setIsLoaded(true))\n }\n }, [isInitialized])\n\n if (!isInitialized) {\n return <Loader />\n }\n\n let drawerTitle = copy.manage_account_notifications\n if (profileTypeOpen === NotificationTypes.Budgets) {\n drawerTitle = copy.manage_budget_notifications\n } else if (profileTypeOpen === NotificationTypes.Insights) {\n drawerTitle = copy.manage_insights_notifications\n }\n\n const {\n email_notifications_enabled: emailEnabled,\n sms_notifications_enabled: smsEnabled,\n push_notifications_enabled: pushEnabled,\n } = ccp\n\n const hasDeliveryMethods = emailEnabled || smsEnabled || pushEnabled\n\n if (view === 'accounts') {\n return <AccountNotificationProfiles />\n } else if (view === 'budgets') {\n return <BudgetNotificationProfiles />\n } else if (view === 'insights') {\n return <InsightsNotificationProfiles />\n }\n\n const canEditFields =\n config.display_email_edit_field_in_settings || config.display_sms_edit_field_in_settings\n const shouldShowPersonalDetails =\n showPersonalDetails && ccp.can_edit_contact_info && canEditFields\n\n return (\n <Stack sx={{ pt: hasDeliveryMethods ? 0 : 24 }}>\n <Stack sx={{ px: 24 }}>\n {hasDeliveryMethods && (\n <>\n <DeliveryMethods />\n <Divider sx={{ my: 24 }} />\n </>\n )}\n\n <H3 sx={{ mb: 4 }}>{copy.notification_types_title}</H3>\n </Stack>\n <List>\n {notificationTypes.includes(NotificationTypes.Accounts) && (\n <ListItem>\n <ListItemButton onClick={() => setProfileTypeOpen(NotificationTypes.Accounts)}>\n <ListItemText primary={copy.accounts_title} secondary={copy.accounts_subtitle} />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n )}\n {notificationTypes.includes(NotificationTypes.Budgets) && (\n <ListItem>\n <ListItemButton onClick={() => setProfileTypeOpen(NotificationTypes.Budgets)}>\n <ListItemText primary={copy.budgets_title} secondary={copy.budgets_subtitle} />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n )}\n {notificationTypes.includes(NotificationTypes.Insights) && (\n <ListItem>\n <ListItemButton onClick={() => setProfileTypeOpen(NotificationTypes.Insights)}>\n <ListItemText primary={copy.insights_title} secondary={copy.insights_subtitle} />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n )}\n </List>\n\n {shouldShowPersonalDetails && (\n <Stack sx={{ px: 24 }}>\n <PersonalDetails />\n </Stack>\n )}\n\n <Drawer\n isOpen={Boolean(profileTypeOpen)}\n onClose={() => setProfileTypeOpen(undefined)}\n title={drawerTitle}\n >\n <Stack>\n {profileTypeOpen === NotificationTypes.Accounts && <AccountNotificationProfiles />}\n {profileTypeOpen === NotificationTypes.Budgets && <BudgetNotificationProfiles />}\n {profileTypeOpen === NotificationTypes.Insights && <InsightsNotificationProfiles />}\n </Stack>\n </Drawer>\n </Stack>\n )\n },\n)\n"],"names":["VerifyEmailAction","observer","commonCopy","settingsCopy","useGlobalCopyStore","sendEmailVerification","useSettingsStore","user","useUserStore","theme","useTheme","isOpen","setIsOpen","React","handleClose","handleOpen","jsxs","Button","jsx","Text","ChevronRight","Dialog","Stack","VerifyTokenAction","handleVerify","token","setToken","TextField","e","VerifyPhoneAction","sendPhoneVerification","verifyPhoneToken","showVerifyToken","setShowVerifyToken","handlePhoneVerify","handleTokenVerify","AccountProfileListItem","onProfileUpdated","profile","recurringCopy","copy","updateAccount","useAccountStore","isPaymentReminder","AccountNotificationTypes","amount","setAmount","paymentDay","setPaymentDay","accountName","accountPaymentDate","buildDynamicCopy","formatOrdinal","secondaryText","formatCurrency","handleUpdateProfile","ToggleButtonListItem","InstitutionLogo","LocalizationProvider","AdapterDateFns","DateCalendar","endOfMonth","startOfMonth","date","CurrencyInput","value","AccountNotificationProfile","onUpdateProfile","clientCommunicationProfile","userCommunicationsProfile","isMobile","useScreenSize","isAccountProfile","emailDisabled","pushDisabled","smsDisabled","showEmail","showPush","showSms","Fragment","List","ToggleListItem","Divider","child","AccountNotificationProfiles","accountProfiles","updateNotificationProfile","selectedProfileGuid","setSelectedProfileGuid","selectedProfile","handleProfileToggle","handleProfileUpdate","Drawer","NotificationProfile","userDetails","isExpanded","setIsExpanded","updatedProfile","hasDeliveryMethods","ExpandMore","Collapse","BudgetNotificationProfiles","budgetProfiles","DeliveryMethods","onEvent","useEvent","ccp","updateUserCommunicationProfile","ucp","onProfileChange","key","notificationType","H3","Card","CardContent","Star","InsightsNotificationProfiles","insightsProfiles","PersonalDetails","config","useAppConfig","containerRef","width","useDimensions","updateUser","hasUnsavedChanges","setHasUnsavedChanges","modifiedUser","setModifiedUser","showVerifyEmail","showVerifyPhone","handleChange","event","name","changedUser","handleSave","Box","PersonalDetails$1","NotificationSettings","notificationTypes","NotificationTypes","showPersonalDetails","view","isInitialized","useGlobalUiStore","isAccountDataLoaded","loadAccountData","loadNotificationProfiles","isInsightsEnabled","useInsightsEnabled","isLoaded","setIsLoaded","profileTypeOpen","setProfileTypeOpen","useWidgetLoadTimer","Loader","drawerTitle","emailEnabled","smsEnabled","pushEnabled","canEditFields","shouldShowPersonalDetails","ListItem","ListItemButton","ListItemText"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationUtils-BRGFTePr.mjs","sources":["../src/core/utils/NotificationUtils.ts"],"sourcesContent":["import { fromUnixTime, isSameDay } from 'date-fns'\n\nimport { type Notification, InsightNotificationTypes } from '../types'\n\n// Lazy-initialized set of insight notification type values for efficient filtering\nlet _insightNotificationTypeValues: Set<number> | null = null\n\nexport const getInsightNotificationTypeValues = (): Set<number> => {\n if (!_insightNotificationTypeValues) {\n _insightNotificationTypeValues = new Set(\n Object.values(InsightNotificationTypes).filter(\n (value) => typeof value === 'number',\n ) as number[],\n )\n }\n return _insightNotificationTypeValues\n}\n\nexport const sortByDate = (a: Notification, b: Notification) => {\n return b.delivered_at - a.delivered_at\n}\n\nexport const shouldShowDate = (index: number, notifications: Notification[]) => {\n const currentDate = fromUnixTime(notifications[index].delivered_at)\n const previousDate = fromUnixTime(notifications[index - 1]?.delivered_at)\n\n return !isSameDay(currentDate, previousDate)\n}\n\nexport const hasInsetBorder = (index: number, notifications: Notification[]) => {\n const currentDate = fromUnixTime(notifications[index].delivered_at)\n const nextDate = fromUnixTime(notifications[index + 1]?.delivered_at)\n\n return isSameDay(currentDate, nextDate)\n}\n\nexport function filterRecentNotifications(notifications: Notification[]): Notification[] {\n const THIRTY_DAYS_IN_SECONDS = 30 * 24 * 60 * 60\n const currentTime = Math.floor(Date.now() / 1000)\n\n return notifications.filter((notification: Notification) => {\n const deliveredAt = notification.delivered_at\n return currentTime - deliveredAt <= THIRTY_DAYS_IN_SECONDS\n })\n}\n"],"names":["_insightNotificationTypeValues","getInsightNotificationTypeValues","InsightNotificationTypes","value","shouldShowDate","index","notifications","currentDate","fromUnixTime","previousDate","isSameDay","filterRecentNotifications","currentTime","notification","deliveredAt"],"mappings":";;AAKA,IAAIA,IAAqD;AAElD,MAAMC,IAAmC,OACzCD,MACHA,IAAiC,IAAI;AAAA,EACnC,OAAO,OAAOE,CAAwB,EAAE;AAAA,IACtC,CAACC,MAAU,OAAOA,KAAU;AAAA,EAAA;AAC9B,IAGGH,IAOII,IAAiB,CAACC,GAAeC,MAAkC;AAC9E,QAAMC,IAAcC,EAAaF,EAAcD,CAAK,EAAE,YAAY,GAC5DI,IAAeD,EAAaF,EAAcD,IAAQ,CAAC,GAAG,YAAY;AAExE,SAAO,CAACK,EAAUH,GAAaE,CAAY;AAC7C;AASO,SAASE,EAA0BL,GAA+C;AAEvF,QAAMM,IAAc,KAAK,MAAM,KAAK,IAAA,IAAQ,GAAI;AAEhD,SAAON,EAAc,OAAO,CAACO,MAA+B;AAC1D,UAAMC,IAAcD,EAAa;AACjC,WAAOD,IAAcE,KAAe;AAAA,EACtC,CAAC;AACH;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberFormatting--XMeeBfr.mjs","sources":["../src/core/constants/Numbers.ts","../src/core/utils/NumberFormatting.ts"],"sourcesContent":["export const MAX_MONEY_INPUT = 99999999.99\n\nexport enum CurrencyCodes {\n CAD = 'CAD',\n USD = 'USD',\n}\n","import numeral from 'numeral'\nimport type { RoundingFunction } from 'numeral'\n\nimport { CurrencyCodes } from '../constants/Numbers'\nimport { getLocale } from './Localization'\n\nexport const generateEqualIntervals = (\n minValue: number,\n maxValue: number,\n tickCount: number,\n): number[] => {\n const ticks: number[] = []\n const range = maxValue - minValue\n const step = range / (tickCount - 1) // The space between each tick\n\n for (let i = 0; i < tickCount; i++) {\n const tickValue = minValue + i * step\n ticks.push(tickValue)\n }\n\n ticks[tickCount - 1] = maxValue\n\n return ticks.map(Math.round)\n}\n\n// enhances numeral's localization functionality by puting the $ in the correct place\nexport const formatCurrency = (\n amount: number | undefined,\n formatting: string,\n roundingFunction?: RoundingFunction,\n) => {\n switch (getLocale()) {\n case 'fr-ca': {\n return numeral(amount).format(`${formatting} $`, roundingFunction)\n }\n default: {\n return numeral(amount).format(`$${formatting}`, roundingFunction)\n }\n }\n}\n\nexport const getCurrencyCodes = () => {\n switch (getLocale()) {\n case 'fr-ca':\n return CurrencyCodes.CAD\n default:\n return CurrencyCodes.USD\n }\n}\n\n// will return `true` if value is a string number, like '99', which matches Serenity logic\nexport const isValidNumber = (value: any) =>\n value !== undefined && value !== null && value !== '' && isFinite(value)\n\nconst defaultPercentStyle = {\n style: 'percent',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n} as Intl.NumberFormatOptions\n\nexport const formatPercentage = (\n amount: number | string | undefined,\n options: Intl.NumberFormatOptions = defaultPercentStyle,\n) =>\n isValidNumber(amount)\n ? new Intl.NumberFormat(getLocale(), options).format(Number(amount))\n : amount\n\nexport const getPluralRules = (options: Intl.PluralRulesOptions) =>\n new Intl.PluralRules(getLocale(), options)\n\nexport const formatOrdinal = (\n number: number,\n options: Intl.PluralRulesOptions = { type: 'ordinal' },\n copy = {\n one: 'st',\n two: 'nd',\n few: 'rd',\n other: 'th',\n } as const,\n) => {\n const rule = getPluralRules(options).select(number)\n\n return `${number}${copy[rule as keyof typeof copy]}`\n}\n"],"names":["MAX_MONEY_INPUT","CurrencyCodes","generateEqualIntervals","minValue","maxValue","tickCount","ticks","step","i","tickValue","formatCurrency","amount","formatting","roundingFunction","getLocale","numeral","getCurrencyCodes","isValidNumber","value","defaultPercentStyle","formatPercentage","options","getPluralRules","formatOrdinal","number","copy","rule"],"mappings":";;AAAO,MAAMA,IAAkB;AAExB,IAAKC,sBAAAA,OACVA,EAAA,MAAM,OACNA,EAAA,MAAM,OAFIA,IAAAA,KAAA,CAAA,CAAA;ACIL,MAAMC,IAAyB,CACpCC,GACAC,GACAC,MACa;AACb,QAAMC,IAAkB,CAAA,GAElBC,KADQH,IAAWD,MACHE,IAAY;AAElC,WAASG,IAAI,GAAGA,IAAIH,GAAWG,KAAK;AAClC,UAAMC,IAAYN,IAAWK,IAAID;AACjC,IAAAD,EAAM,KAAKG,CAAS;AAAA,EACtB;AAEA,SAAAH,EAAMD,IAAY,CAAC,IAAID,GAEhBE,EAAM,IAAI,KAAK,KAAK;AAC7B,GAGaI,IAAiB,CAC5BC,GACAC,GACAC,MACG;AACH,UAAQC,KAAU;AAAA,IAChB,KAAK;AACH,aAAOC,EAAQJ,CAAM,EAAE,OAAO,GAAGC,CAAU,MAAMC,CAAgB;AAAA,IAEnE;AACE,aAAOE,EAAQJ,CAAM,EAAE,OAAO,IAAIC,CAAU,IAAIC,CAAgB;AAAA,EAClE;AAEJ,GAEaG,IAAmB,MAAM;AACpC,UAAQF,KAAU;AAAA,IAChB,KAAK;AACH,aAAOb,EAAc;AAAA,IACvB;AACE,aAAOA,EAAc;AAAA,EAAA;AAE3B,GAGagB,IAAgB,CAACC,MACLA,KAAU,QAAQA,MAAU,MAAM,SAASA,CAAK,GAEnEC,IAAsB;AAAA,EAC1B,OAAO;AAAA,EACP,uBAAuB;AAAA,EACvB,uBAAuB;AACzB,GAEaC,IAAmB,CAC9BT,GACAU,IAAoCF,MAEpCF,EAAcN,CAAM,IAChB,IAAI,KAAK,aAAaG,EAAA,GAAaO,CAAO,EAAE,OAAO,OAAOV,CAAM,CAAC,IACjEA,GAEOW,IAAiB,CAACD,MAC7B,IAAI,KAAK,YAAYP,EAAA,GAAaO,CAAO,GAE9BE,IAAgB,CAC3BC,GACAH,IAAmC,EAAE,MAAM,UAAA,GAC3CI,IAAO;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AACT,MACG;AACH,QAAMC,IAAOJ,EAAeD,CAAO,EAAE,OAAOG,CAAM;AAElD,SAAO,GAAGA,CAAM,GAAGC,EAAKC,CAAyB,CAAC;AACpD;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OriginalBalanceAction-YrvxBYAl.mjs","sources":["../src/goals/components/actions/InterestRateAction.tsx","../src/goals/components/actions/MonthlyPaymentAction.tsx","../src/goals/components/actions/OriginalBalanceAction.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport TextField from '@mui/material/TextField'\n\nimport { ListItemAction, useGlobalCopyStore, useGoalStore } from '../../../common'\nimport { Goal } from '../../../core'\nimport { formatPercentage } from '../../../core/utils/NumberFormatting'\n\ninterface InterestRateActionProps {\n goal: Goal\n}\n\nexport const InterestRateAction = observer(({ goal }: InterestRateActionProps) => {\n const { goals: copy } = useGlobalCopyStore()\n const { setAlert, setSelectedGoal, updateGoal } = useGoalStore()\n\n const [rate, setRate] = React.useState<number>(goal.interest_rate ?? 0)\n\n const isNew = !goal.guid\n const isInvalid = rate < 0\n\n const handleSave = async () => {\n const updatedGoal = { ...goal, interest_rate: rate }\n goal.interest_rate = rate\n\n if (isNew) {\n setSelectedGoal(updatedGoal)\n } else {\n await updateGoal(updatedGoal)\n setAlert(copy.alert_goal_updated_interest_rate)\n }\n }\n\n const handleCancel = () => {\n setTimeout(() => {\n setRate(goal.interest_rate ?? 0)\n }, 250)\n }\n\n return (\n <ListItemAction\n isDisabled={goal.is_complete}\n isSaveDisabled={isInvalid}\n label={`${copy.details_interest_rate} (%)`}\n onCancel={handleCancel}\n onSave={handleSave}\n primaryText={copy.details_interest_rate}\n secondaryText={formatPercentage(Number(goal.interest_rate) / 100) as string}\n zeroStateText={!goal.interest_rate ? copy.add_interest_rate : undefined}\n >\n <TextField\n error={isInvalid}\n fullWidth={true}\n onChange={(e) =>\n setRate(!isNaN(parseFloat(e.target.value)) ? parseFloat(e.target.value) : 0)\n }\n type=\"number\"\n value={rate}\n />\n </ListItemAction>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { CurrencyInput, ListItemAction, useGlobalCopyStore, useGoalStore } from '../../../common'\nimport { Goal } from '../../../core'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\ninterface MonthlyPaymentActionProps {\n goal: Goal\n}\n\nexport const MonthlyPaymentAction = observer(({ goal }: MonthlyPaymentActionProps) => {\n const { goals: copy } = useGlobalCopyStore()\n const { setAlert, setSelectedGoal, updateGoal } = useGoalStore()\n\n const [payment, setPayment] = React.useState<number>(goal.monthly_payment ?? 0)\n\n const isNew = !goal.guid\n const isInvalid = payment < 0 || payment > 99999999.99\n\n const handleSave = async () => {\n const updatedGoal = { ...goal, monthly_payment: payment }\n goal.monthly_payment = payment\n if (isNew) {\n setSelectedGoal(updatedGoal)\n } else {\n await updateGoal({ ...goal, monthly_payment: payment })\n setAlert(copy.alert_goal_updated_payment)\n }\n }\n\n const handleCancel = () => {\n setTimeout(() => {\n setPayment(goal.monthly_payment || 0)\n }, 250)\n }\n\n return (\n <ListItemAction\n isDisabled={goal.is_complete}\n isSaveDisabled={isInvalid}\n label={copy.details_monthly_payment}\n onCancel={handleCancel}\n onSave={handleSave}\n primaryText={copy.details_monthly_payment}\n secondaryText={formatCurrency(goal.monthly_payment, '0,0')}\n zeroStateText={!goal.monthly_payment ? copy.add_monthly_payment : undefined}\n >\n <CurrencyInput\n amount={payment}\n autoFocus={true}\n error={isInvalid}\n fullWidth={true}\n minAmount={0}\n setAmount={(v) => setPayment(!isNaN(Number(v)) ? Number(v) : payment)}\n sx={{ '.MuiTypography-body1': { p: 0 } }}\n />\n </ListItemAction>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { CurrencyInput, ListItemAction, useGlobalCopyStore, useGoalStore } from '../../../common'\nimport { Goal } from '../../../core'\nimport { formatCurrency } from '../../../core/utils/NumberFormatting'\n\ninterface OriginalBalanceActionProps {\n goal: Goal\n}\n\nexport const OriginalBalanceAction = observer(({ goal }: OriginalBalanceActionProps) => {\n const { goals: copy } = useGlobalCopyStore()\n const { setAlert, setSelectedGoal, updateGoal } = useGoalStore()\n\n const [balance, setBalance] = React.useState<number>(goal.initial_amount)\n\n const isNew = !goal.guid\n const isInvlaid = balance < 0 || balance > 99999999.99\n\n const handleSave = async () => {\n const updatedGoal = { ...goal, initial_amount: balance }\n goal.initial_amount = balance\n if (isNew) {\n setSelectedGoal(updatedGoal)\n } else {\n await updateGoal({ ...goal, initial_amount: balance })\n setAlert(copy.alert_goal_updated_balance)\n }\n }\n\n const handleCancel = () => {\n setTimeout(() => {\n setBalance(goal.initial_amount)\n }, 250)\n }\n\n return (\n <ListItemAction\n isDisabled={goal.is_complete}\n isSaveDisabled={isInvlaid}\n label={copy.details_original_balance}\n onCancel={handleCancel}\n onSave={handleSave}\n primaryText={copy.details_original_balance}\n secondaryText={formatCurrency(goal.initial_amount, '0,0')}\n zeroStateText={\n !goal.initial_amount && !goal.is_complete ? copy.add_original_balance : undefined\n }\n >\n <CurrencyInput\n amount={balance}\n autoFocus={true}\n error={isInvlaid}\n fullWidth={true}\n minAmount={0}\n setAmount={(v) => setBalance(!isNaN(Number(v)) ? Number(v) : balance)}\n sx={{ '.MuiTypography-body1': { p: 0 } }}\n />\n </ListItemAction>\n )\n})\n"],"names":["InterestRateAction","observer","goal","copy","useGlobalCopyStore","setAlert","setSelectedGoal","updateGoal","useGoalStore","rate","setRate","React","isNew","isInvalid","handleSave","updatedGoal","handleCancel","jsx","ListItemAction","formatPercentage","TextField","e","MonthlyPaymentAction","payment","setPayment","formatCurrency","CurrencyInput","v","OriginalBalanceAction","balance","setBalance","isInvlaid"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import R from "@mui/material/Tabs";
|
|
|
7
7
|
import d from "@mui/material/Divider";
|
|
8
8
|
import b from "@mui/material/List";
|
|
9
9
|
import T from "@mui/material/Stack";
|
|
10
|
-
import { R as C, A as S, a as E, M as v } from "./ManageIncome-
|
|
10
|
+
import { R as C, A as S, a as E, M as v } from "./ManageIncome-Dcsnnz86.mjs";
|
|
11
11
|
import { u as _, h as A, f } from "./hooks-97sNJ_lf.mjs";
|
|
12
12
|
import { R as y, F as N } from "./RecurringTransactionsUtil-CHWmqvW5.mjs";
|
|
13
13
|
import { A as m } from "./Analytics-WeZYytR0.mjs";
|
|
@@ -86,3 +86,4 @@ export {
|
|
|
86
86
|
I as M,
|
|
87
87
|
X as R
|
|
88
88
|
};
|
|
89
|
+
//# sourceMappingURL=RecurringSettings-D8hBbXV_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecurringSettings-D8hBbXV_.mjs","sources":["../src/recurringtransactions/components/shared/recurringsettings/ManageExpenses.tsx","../src/recurringtransactions/components/shared/RecurringSettings.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport {\n ANALYTICS_EVENTS,\n useEvent,\n useGlobalCopyStore,\n useRecurringTransactionsStore,\n} from '../../../../common'\nimport { type RepeatingTransaction, Frequency, RepeatingType } from '../../../../core'\n\nimport { RecurringRow } from './RecurringRow'\nimport { AddRecurringTransaction } from './AddRecurringTransaction'\nimport { RecurringSettingsZeroState } from './RecurringSettingsZeroState'\n\nexport const ManageExpenses = observer(() => {\n const { recurring: copy } = useGlobalCopyStore()\n const { detailedRepeatingTransactions } = useRecurringTransactionsStore()\n const { onEvent } = useEvent()\n\n const onClick = (repeatingTransaction: RepeatingTransaction) => {\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_CLICK_EXPENSE, {\n repeating_transaction_guid: repeatingTransaction.guid,\n })\n }\n\n const onAdd = () => {\n onEvent(ANALYTICS_EVENTS.RECURRING_TRANSACTIONS_CLICK_ADD_EXPENSE)\n }\n\n const filteredTransactions = detailedRepeatingTransactions.filter(\n (rt) =>\n rt.repeating_transaction_type !== RepeatingType.Income &&\n (rt.transactions.length > 0 || rt.recurrence_type === Frequency.EveryYear),\n )\n\n return (\n <>\n {filteredTransactions.length !== 0 ? (\n <Stack\n sx={{\n height: 'calc(100vh - 109px)',\n maxHeight: 'calc(100vh - 109px)',\n }}\n >\n <Box sx={{ flex: 1, overflow: 'auto' }}>\n <List sx={{ bgcolor: 'background.paper' }}>\n {filteredTransactions.map((rt, index) => (\n <React.Fragment key={rt.guid}>\n <RecurringRow onClick={onClick} repeatingTransaction={rt} />\n <Divider\n variant={index < filteredTransactions.length - 1 ? 'inset' : 'fullWidth'}\n />\n </React.Fragment>\n ))}\n </List>\n </Box>\n <Box>\n <Divider />\n <Box\n sx={{\n alignContent: 'center',\n bgcolor: 'background.paper',\n justifyContent: 'flex-end',\n px: 24,\n py: 12,\n textAlign: 'right',\n }}\n >\n <AddRecurringTransaction label={copy.add_expense} onAddRecurringTransaction={onAdd} />\n </Box>\n </Box>\n </Stack>\n ) : (\n <RecurringSettingsZeroState zeroStateFor=\"expenses\" />\n )}\n </>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { ManageExpenses } from './recurringsettings/ManageExpenses'\nimport { ManageIncome } from './recurringsettings/ManageIncome'\n\nimport { useEvent, useGlobalCopyStore } from '../../../common'\n\ninterface RecurringSettingsProps {\n defaultSelectedTab?: number\n}\n\nexport const RecurringSettings = observer(({ defaultSelectedTab = 0 }: RecurringSettingsProps) => {\n const [selectedTab, setSelectedTab] = React.useState(defaultSelectedTab)\n const { onEvent } = useEvent()\n const { recurring: recurringCopy } = useGlobalCopyStore()\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n onEvent(\n newValue === 0\n ? 'recurring_transactions_widget_manage_expenses'\n : 'recurring_transactions_widget_edit_income',\n )\n }\n\n return (\n <Box bgcolor=\"background.default\" height=\"100%\">\n <Tabs\n onChange={handleTabChange}\n sx={{ bgcolor: 'background.paper', mb: 0 }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={recurringCopy.expenses} />\n <Tab label={recurringCopy.income} />\n </Tabs>\n {selectedTab === 0 && <ManageExpenses />}\n {selectedTab === 1 && <ManageIncome />}\n </Box>\n )\n})\n"],"names":["ManageExpenses","observer","copy","useGlobalCopyStore","detailedRepeatingTransactions","useRecurringTransactionsStore","onEvent","useEvent","onClick","repeatingTransaction","ANALYTICS_EVENTS","onAdd","filteredTransactions","rt","RepeatingType","Frequency","jsx","Fragment","jsxs","Stack","Box","List","index","React","RecurringRow","Divider","AddRecurringTransaction","RecurringSettingsZeroState","RecurringSettings","defaultSelectedTab","selectedTab","setSelectedTab","recurringCopy","Tabs","_event","newValue","Tab","ManageIncome"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecurringTransactionsUtil-CHWmqvW5.mjs","sources":["../src/core/types/RepeatingTransaction.ts","../src/core/utils/RecurringTransactionsUtil.ts"],"sourcesContent":["import { Account } from './Account'\nimport { Transaction, TransactionType } from './Transaction'\n\nexport enum Frequency {\n Unknown = 0,\n EveryWeek = 1,\n EveryOtherWeek = 2,\n EveryMonth = 3,\n EveryOtherMonth = 4,\n EveryQuarter = 5,\n EveryOtherQuarter = 6,\n EveryYear = 7,\n TwiceAMonth = 8,\n}\n\nexport enum RecurrenceStatus {\n Paid = 0,\n Missed = 1,\n Upcoming = 2,\n}\n\nexport enum RecurrenceType {\n Expense = 0,\n Income = 1,\n}\n\nexport enum RepeatingType {\n Unknown = 0,\n Subscription = 1,\n Bill = 2,\n Income = 3,\n Transfer = 4,\n}\n\nexport interface RepeatingTransaction {\n // API fields\n guid: string\n account_guid: string\n created_by: number\n member_guid: string\n merchant_guid: string\n user_guid: string\n description: string\n amount: number\n predicted_occurs_on: string\n transaction_type: TransactionType\n recurrence_type: Frequency\n recurrence_day: number\n repeating_transaction_type: RepeatingType\n second_recurrence_day?: number\n\n // UI fields\n account?: Account\n transactions: Transaction[]\n}\n\nexport interface Recurrence {\n accountGuid: string\n amount: number\n categoryGuid: string\n expectedDate: Date\n frequency: Frequency\n institutionGuid: string\n institutionName: string\n merchantGuid: string\n name: string\n occurredOnDate?: Date\n recurrenceDay: number\n repeatingTransactionGuid: string\n secondRecurrenceDay?: number\n status: RecurrenceStatus\n type: RecurrenceType\n transaction?: Transaction\n}\n","import { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { lastDayOfMonth } from 'date-fns/lastDayOfMonth'\nimport { nextDay } from 'date-fns/nextDay'\nimport { parseISO } from 'date-fns/parseISO'\nimport { setDate } from 'date-fns/setDate'\nimport { setDay } from 'date-fns/setDay'\nimport { setDayOfYear } from 'date-fns/setDayOfYear'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\nimport { subMonths } from 'date-fns/subMonths'\nimport { subQuarters } from 'date-fns/subQuarters'\nimport { subWeeks } from 'date-fns/subWeeks'\nimport { subYears } from 'date-fns/subYears'\n\nimport type { Day } from 'date-fns/types'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport {\n type Account,\n type DateRange,\n type Recurrence,\n type RecurringCopy,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceType,\n RecurrenceStatus,\n RepeatingType,\n Frequency,\n} from '../types'\n\nimport {\n getNextBiMonthlyDate,\n getNextBiQuarterlyDate,\n getNextBiWeeklyDate,\n getNextMonthlyDate,\n getNextQuarterlyDate,\n getNextTwiceMonthlyDate,\n getNextWeeklyDate,\n getNextYearlyDate,\n getTwiceMonthlyDates,\n} from './DateUtil'\nimport { formatOrdinal } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport type GroupedRecurrence = {\n recurrences: Recurrence[]\n id: string\n date: Date\n}\n\nexport const buildInstitutionName = (account?: Account) => {\n if (!account) return ''\n\n let name = account.user_name || account.feed_name || ''\n if (account.account_number) {\n name = `${name} *${account.account_number}`\n }\n return name\n}\n\nconst buildRepeatingRecurrences = (\n repeatingTransaction: RepeatingTransaction,\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n const isYearly = repeatingTransaction.recurrence_type === Frequency.EveryYear\n\n const pastTransaction = repeatingTransaction.transactions.find(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n /*\n Since past transactions for yearly recurrences can be outside the 90 day data range, we need to display them\n even if there is no past transaction to match to. This will display it without a category, but that's the\n tradeoff until we impove our transactions service to return past transactions for all recurring transactions.\n */\n if (!isYearly && !pastTransaction) return []\n\n const occursOn = parseISO(repeatingTransaction.predicted_occurs_on)\n const baseRecurrence: Recurrence = {\n accountGuid: repeatingTransaction.account?.guid || '',\n amount: repeatingTransaction.amount,\n categoryGuid: pastTransaction?.category_guid || '',\n expectedDate: occursOn,\n frequency: repeatingTransaction.recurrence_type,\n institutionGuid: repeatingTransaction.account?.institution_guid || '',\n institutionName: buildInstitutionName(repeatingTransaction.account),\n merchantGuid: repeatingTransaction.merchant_guid,\n name: repeatingTransaction.description,\n recurrenceDay: repeatingTransaction.recurrence_day,\n repeatingTransactionGuid: repeatingTransaction.guid,\n secondRecurrenceDay: repeatingTransaction.second_recurrence_day,\n status: RecurrenceStatus.Upcoming,\n type:\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? RecurrenceType.Income\n : RecurrenceType.Expense,\n transaction: undefined,\n }\n\n const startDate = dateRange.start\n const endDate = dateRange.end\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryWeek:\n recurrences.push(...getWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherWeek:\n recurrences.push(...getBiWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.TwiceAMonth:\n recurrences.push(...getTwiceMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryMonth:\n recurrences.push(...getMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherMonth:\n recurrences.push(...getBiMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryQuarter:\n recurrences.push(...getQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherQuarter:\n recurrences.push(...getBiQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryYear:\n recurrences.push(...getYearlyRecurrences(baseRecurrence, startDate, endDate))\n break\n }\n\n // Track which transactions have already been matched to avoid double-counting\n const matchedTransactionGuids = new Set<string>()\n\n for (const recurrence of recurrences) {\n // First, try to find a manually linked transaction (any date)\n const linkedTransactions = repeatingTransaction.transactions.filter(\n (t) =>\n t.repeating_transaction_guid === repeatingTransaction.guid &&\n !matchedTransactionGuids.has(t.guid),\n )\n\n const transaction =\n linkedTransactions.find(\n (t) =>\n t.date > getUnixTime(subDays(recurrence.expectedDate, 5)) &&\n t.date < getUnixTime(addDays(recurrence.expectedDate, 5)),\n ) ||\n (isBefore(recurrence.expectedDate, startOfToday())\n ? linkedTransactions.reduce<Transaction | undefined>((closest, t) => {\n const dist = Math.abs(t.date - getUnixTime(recurrence.expectedDate))\n const closestDist = closest\n ? Math.abs(closest.date - getUnixTime(recurrence.expectedDate))\n : Infinity\n return dist < closestDist ? t : closest\n }, undefined)\n : undefined)\n\n if (transaction) {\n matchedTransactionGuids.add(transaction.guid)\n recurrence.transaction = transaction\n recurrence.status = RecurrenceStatus.Paid\n recurrence.occurredOnDate = fromUnixTime(transaction.date)\n } else if (isBefore(recurrence.expectedDate, subDays(startOfToday(), 3))) {\n recurrence.status = RecurrenceStatus.Missed\n }\n }\n\n return recurrences\n}\n\nconst getWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const activities: Recurrence[] = []\n\n // Add recurrence for each week for the current month and next month\n let nextDate = nextDay(startDate, baseRecurrence.recurrenceDay as Day)\n while (isBefore(nextDate, endDate)) {\n activities.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = nextDay(nextDate, baseRecurrence.recurrenceDay as Day)\n }\n\n return activities\n}\n\nconst getBiWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n // Determine the first occurrence of the bi-weekly recurrence within the date range\n let nextDate = baseRecurrence.expectedDate\n if (isBefore(nextDate, startDate)) {\n while (isBefore(nextDate, startDate)) {\n nextDate = addWeeks(nextDate, 2)\n }\n } else {\n while (isAfter(nextDate, startDate) || isSameDay(nextDate, startDate)) {\n nextDate = subWeeks(nextDate, 2)\n }\n nextDate = addWeeks(nextDate, 2)\n }\n\n while (isBefore(nextDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = addDays(nextDate, 14)\n }\n\n return recurrences\n}\n\nconst getTwiceMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let firstOccurrence = setDate(startDate, baseRecurrence.recurrenceDay)\n\n while (isBefore(firstOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: firstOccurrence })\n firstOccurrence = addMonths(firstOccurrence, 1)\n }\n\n let secondOccurrence =\n baseRecurrence.secondRecurrenceDay && baseRecurrence.secondRecurrenceDay < 28\n ? setDate(startDate, baseRecurrence.secondRecurrenceDay)\n : lastDayOfMonth(startDate)\n\n while (isBefore(secondOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: secondOccurrence })\n secondOccurrence = addMonths(secondOccurrence, 1)\n }\n\n return recurrences\n}\n\nconst getMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let expectedDate = setDate(startDate, baseRecurrence.recurrenceDay)\n\n // Add current month's repeating transaction recurrence\n recurrences.push({ ...baseRecurrence, expectedDate })\n\n expectedDate = addMonths(expectedDate, 1)\n while (isBefore(expectedDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate })\n expectedDate = addMonths(expectedDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subMonths(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addMonths(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getYearlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subYears(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addYears(nextDate, 1)\n }\n\n return recurrences\n}\n\nexport const buildAllRecurrences = (\n repeatingTransactions: RepeatingTransaction[],\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const activity = buildRepeatingRecurrences(repeatingTransaction, dateRange)\n recurrences.push(...activity)\n }\n\n return recurrences.sort(\n (a, b) =>\n getUnixTime(a.occurredOnDate || a.expectedDate) -\n getUnixTime(b.occurredOnDate || b.expectedDate),\n )\n}\n\nexport const augmentRepeatingTransactions = (\n accounts: Account[],\n repeatingTransactions: RepeatingTransaction[],\n transactions: Transaction[],\n) => {\n const augmentedRepeatingTransactions: RepeatingTransaction[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const relatedTransactions = transactions.filter(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n if (transactions.length > 0) {\n augmentedRepeatingTransactions.push({\n ...repeatingTransaction,\n account: accounts.find((account) => account.guid === repeatingTransaction.account_guid),\n transactions: relatedTransactions,\n })\n }\n }\n\n return augmentedRepeatingTransactions\n}\n\nexport const groupRecurrencesByDate = (recurrences: Recurrence[]): GroupedRecurrence[] => {\n return recurrences.reduce((groupedRecurrences: GroupedRecurrence[], recurrence) => {\n const dateString = formatISO(recurrence.expectedDate, { representation: 'date' })\n const existingGroup = groupedRecurrences.find(\n (group) => group.date.toString() === recurrence.expectedDate.toString(),\n )\n\n if (existingGroup) {\n existingGroup.recurrences.push(recurrence)\n } else {\n groupedRecurrences.push({\n date: recurrence.expectedDate,\n id: `date-${dateString}`,\n recurrences: [recurrence],\n })\n }\n\n return groupedRecurrences\n }, [])\n}\n\nexport const getFrequencyLabel = (\n copy: RecurringCopy,\n repeatingTransaction: RepeatingTransaction,\n showOrdinal: boolean,\n) => {\n const nextWeekday = nextDay(startOfToday(), repeatingTransaction.recurrence_day as Day)\n const nextAnnualDate = setDayOfYear(startOfToday(), repeatingTransaction.recurrence_day)\n const firstDateOrdinal = formatOrdinal(repeatingTransaction.recurrence_day)\n const secondDateOrdinal = repeatingTransaction.second_recurrence_day\n ? formatOrdinal(repeatingTransaction.second_recurrence_day)\n : ''\n\n let frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.monthly_ordinal, firstDateOrdinal)\n : copy.monthly\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.quarterly_ordinal, firstDateOrdinal)\n : copy.quarterly\n break\n case Frequency.EveryWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.weekly_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.weekly\n break\n case Frequency.EveryYear:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.anually_ordinal,\n formatDate(nextAnnualDate, DATE_FORMATS_INTL.MONTH_DAY),\n )\n : copy.anually\n break\n case Frequency.EveryOtherWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.every_other_week_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.every_other_week\n break\n case Frequency.EveryOtherMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_month_ordinal, firstDateOrdinal)\n : copy.every_other_month\n break\n case Frequency.EveryOtherQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_quarter_ordinal, firstDateOrdinal)\n : copy.every_other_quarter\n break\n case Frequency.TwiceAMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.twice_a_month_ordinal, firstDateOrdinal, secondDateOrdinal)\n : copy.twice_a_month\n break\n }\n\n return frequencyLabel as string\n}\n\nexport const getNextPaymentDate = (\n frequency: Frequency,\n date: Date,\n recurrenceDay?: number,\n secondRecurrenceDay?: number,\n) => {\n let baseDate = date\n\n // Apply user selected recurrenceDay based on frequency type\n if (recurrenceDay !== undefined) {\n if (frequency === Frequency.EveryWeek || frequency === Frequency.EveryOtherWeek) {\n baseDate = setDay(date, recurrenceDay)\n } else if (frequency === Frequency.EveryYear) {\n baseDate = setDayOfYear(date, recurrenceDay)\n } else {\n baseDate = setDate(date, recurrenceDay)\n }\n }\n\n let nextDate = baseDate\n\n switch (frequency) {\n case Frequency.EveryWeek:\n nextDate = getNextWeeklyDate(baseDate)\n break\n case Frequency.EveryOtherWeek:\n nextDate = getNextBiWeeklyDate(baseDate)\n break\n case Frequency.TwiceAMonth:\n nextDate = getNextTwiceMonthlyDate(\n recurrenceDay ?? baseDate.getDate(),\n secondRecurrenceDay ?? 28,\n )\n break\n case Frequency.EveryMonth:\n nextDate = getNextMonthlyDate(baseDate)\n break\n case Frequency.EveryOtherMonth:\n nextDate = getNextBiMonthlyDate(baseDate)\n break\n case Frequency.EveryQuarter:\n nextDate = getNextQuarterlyDate(baseDate)\n break\n case Frequency.EveryOtherQuarter:\n nextDate = getNextBiQuarterlyDate(baseDate)\n break\n case Frequency.EveryYear:\n nextDate = getNextYearlyDate(baseDate)\n break\n }\n\n return nextDate\n}\n\nexport const getNextUpcomingDate = (\n recurringTransaction: RepeatingTransaction,\n recurrences: Recurrence[],\n): Date => {\n const nextUpcoming = recurrences.find(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Upcoming,\n )\n if (nextUpcoming) return nextUpcoming.expectedDate\n\n const isPaidNearDate = (date: Date) =>\n recurrences.some(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Paid &&\n Math.abs(differenceInDays(r.expectedDate, date)) <= 5,\n )\n\n const frequencyAdvancers: Partial<Record<Frequency, (d: Date) => Date>> = {\n [Frequency.EveryWeek]: (d) => addWeeks(d, 1),\n [Frequency.EveryOtherWeek]: (d) => addWeeks(d, 2),\n [Frequency.TwiceAMonth]: (d) => {\n const candidates = getTwiceMonthlyDates(\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day ?? 28,\n )\n return candidates.find((c) => isAfter(c, d)) ?? candidates[candidates.length - 1]\n },\n [Frequency.EveryMonth]: (d) => addMonths(d, 1),\n [Frequency.EveryOtherMonth]: (d) => addMonths(d, 2),\n [Frequency.EveryQuarter]: (d) => addMonths(d, 3),\n [Frequency.EveryOtherQuarter]: (d) => addMonths(d, 6),\n [Frequency.EveryYear]: (d) => addYears(d, 1),\n }\n\n const baseNext = getNextPaymentDate(\n recurringTransaction.recurrence_type,\n parseISO(recurringTransaction.predicted_occurs_on),\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day,\n )\n\n if (!isPaidNearDate(baseNext)) return baseNext\n\n const advance = frequencyAdvancers[recurringTransaction.recurrence_type]\n return advance ? advance(baseNext) : baseNext\n}\n"],"names":["Frequency","RecurrenceStatus","RecurrenceType","RepeatingType","buildInstitutionName","account","name","buildRepeatingRecurrences","repeatingTransaction","dateRange","recurrences","isYearly","pastTransaction","t","occursOn","parseISO","baseRecurrence","startDate","endDate","getWeeklyRecurrences","getBiWeeklyRecurrences","getTwiceMonthlyRecurrences","getMonthlyRecurrences","getBiMonthlyRecurrences","getQuarterlyRecurrences","getBiQuarterlyRecurrences","getYearlyRecurrences","matchedTransactionGuids","recurrence","linkedTransactions","transaction","getUnixTime","subDays","addDays","isBefore","startOfToday","closest","dist","closestDist","fromUnixTime","activities","nextDate","nextDay","addWeeks","isAfter","isSameDay","subWeeks","firstOccurrence","setDate","addMonths","secondOccurrence","lastDayOfMonth","expectedDate","subMonths","subQuarters","addQuarters","subYears","addYears","buildAllRecurrences","repeatingTransactions","activity","a","b","augmentRepeatingTransactions","accounts","transactions","augmentedRepeatingTransactions","relatedTransactions","groupRecurrencesByDate","groupedRecurrences","dateString","formatISO","existingGroup","group","getFrequencyLabel","copy","showOrdinal","nextWeekday","nextAnnualDate","setDayOfYear","firstDateOrdinal","formatOrdinal","secondDateOrdinal","frequencyLabel","buildDynamicCopy","formatDate","DATE_FORMATS_INTL","getNextPaymentDate","frequency","date","recurrenceDay","secondRecurrenceDay","baseDate","setDay","getNextWeeklyDate","getNextBiWeeklyDate","getNextTwiceMonthlyDate","getNextMonthlyDate","getNextBiMonthlyDate","getNextQuarterlyDate","getNextBiQuarterlyDate","getNextYearlyDate","getNextUpcomingDate","recurringTransaction","nextUpcoming","r","isPaidNearDate","differenceInDays","frequencyAdvancers","d","candidates","getTwiceMonthlyDates","c","baseNext","advance"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponsiveButton-CC9F_Ezk.mjs","sources":["../src/common/components/ResponsiveButton.tsx"],"sourcesContent":["import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport IconButton from '@mui/material/IconButton'\nimport Tooltip from '@mui/material/Tooltip'\nimport { useTheme } from '@mui/material/styles'\n\ninterface ResponsiveButtonProps {\n icon: React.ReactElement\n label: string\n onClick?: () => void\n placement?:\n | 'bottom-end'\n | 'bottom-start'\n | 'bottom'\n | 'left-end'\n | 'left-start'\n | 'left'\n | 'right-end'\n | 'right-start'\n | 'right'\n | 'top-end'\n | 'top-start'\n | 'top'\n tooltipText: string\n variant?: 'contained' | 'outlined' | 'text'\n}\n\nconst ResponsiveButton: React.FC<ResponsiveButtonProps> = ({\n icon,\n label,\n onClick,\n placement = 'bottom',\n tooltipText,\n variant = 'text',\n}) => {\n const theme = useTheme()\n\n return (\n <React.Fragment>\n <Button\n onClick={onClick}\n startIcon={icon}\n sx={{\n [theme.breakpoints.down('lg')]: { display: 'none' },\n [theme.breakpoints.up('lg')]: { display: 'inline-flex' },\n }}\n title={tooltipText}\n variant={variant}\n >\n {label}\n </Button>\n <Tooltip\n describeChild={true}\n placement={placement}\n sx={{ display: { xs: 'inline-flex', lg: 'none' } }}\n title={tooltipText}\n >\n <IconButton onClick={onClick}>{icon}</IconButton>\n </Tooltip>\n </React.Fragment>\n )\n}\n\nexport default ResponsiveButton\n"],"names":["ResponsiveButton","icon","label","onClick","placement","tooltipText","variant","theme","useTheme","jsxs","React","jsx","Button","Tooltip","IconButton"],"mappings":";;;;;;AA4BA,MAAMA,IAAoD,CAAC;AAAA,EACzD,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,aAAAC;AAAA,EACA,SAAAC,IAAU;AACZ,MAAM;AACJ,QAAMC,IAAQC,EAAA;AAEd,SACE,gBAAAC,EAACC,EAAM,UAAN,EACC,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAAT;AAAA,QACA,WAAWF;AAAA,QACX,IAAI;AAAA,UACF,CAACM,EAAM,YAAY,KAAK,IAAI,CAAC,GAAG,EAAE,SAAS,OAAA;AAAA,UAC3C,CAACA,EAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,cAAA;AAAA,QAAc;AAAA,QAEzD,OAAOF;AAAA,QACP,SAAAC;AAAA,QAEC,UAAAJ;AAAA,MAAA;AAAA,IAAA;AAAA,IAEH,gBAAAS;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,eAAe;AAAA,QACf,WAAAT;AAAA,QACA,IAAI,EAAE,SAAS,EAAE,IAAI,eAAe,IAAI,SAAO;AAAA,QAC/C,OAAOC;AAAA,QAEP,UAAA,gBAAAM,EAACG,GAAA,EAAW,SAAAX,GAAmB,UAAAF,EAAA,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EACtC,GACF;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchBox-Cpgu_gdO.mjs","sources":["../src/common/components/SearchBox.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport IconButton from '@mui/material/IconButton'\nimport InputAdornment from '@mui/material/InputAdornment'\n\nimport { Icon, TextField } from '@mxenabled/mxui'\n\nexport interface SearchBoxProps {\n ariaLabel?: string\n cancelAriaLabel?: string\n onChange: (value: string) => void\n placeholder?: string\n searchValue: string\n}\n\nconst SearchBox: React.FC<SearchBoxProps> = ({\n ariaLabel = 'Search',\n cancelAriaLabel = 'Cancel Search',\n onChange,\n placeholder = 'Search',\n searchValue,\n}) => {\n const cancelButton = (\n <IconButton\n aria-label={cancelAriaLabel}\n className=\"mx-cat-cancel-search-button\"\n color=\"primary\"\n onClick={() => onChange('')}\n >\n <Icon name=\"cancel\" size={24} />\n </IconButton>\n )\n\n return (\n <Box className=\"mx-cmn-search-box\" px={24} py={16}>\n <TextField\n aria-label={ariaLabel}\n name=\"search\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n placeholder={placeholder}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <Icon name=\"search\" size={26} sx={{ color: 'action.active' }} />\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"end\" sx={{ p: 0 }}>\n {searchValue ? cancelButton : null}\n </InputAdornment>\n ),\n sx: {\n '& .MuiOutlinedInput-notchedOutline': {\n borderColor: 'text.secondary',\n opacity: 0.5,\n },\n '& input::placeholder': { color: 'text.secondary', opacity: 1 },\n },\n },\n }}\n sx={{\n width: '100%',\n }}\n value={searchValue}\n />\n </Box>\n )\n}\n\nexport default observer(SearchBox)\n"],"names":["SearchBox","ariaLabel","cancelAriaLabel","onChange","placeholder","searchValue","Box","jsx","TextField","e","InputAdornment","Icon","IconButton","SearchBox$1","observer"],"mappings":";;;;;;AAiBA,MAAMA,IAAsC,CAAC;AAAA,EAC3C,WAAAC,IAAY;AAAA,EACZ,iBAAAC,IAAkB;AAAA,EAClB,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,aAAAC;AACF,wBAaKC,GAAA,EAAI,WAAU,qBAAoB,IAAI,IAAI,IAAI,IAC7C,UAAA,gBAAAC;AAAA,EAACC;AAAA,EAAA;AAAA,IACC,cAAYP;AAAA,IACZ,MAAK;AAAA,IACL,UAAU,CAACQ,MAA2CN,EAASM,EAAE,OAAO,KAAK;AAAA,IAC7E,aAAAL;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,QACL,gBACE,gBAAAG,EAACG,GAAA,EAAe,UAAS,SACvB,4BAACC,GAAA,EAAK,MAAK,UAAS,MAAM,IAAI,IAAI,EAAE,OAAO,gBAAA,GAAmB,GAChE;AAAA,QAEF,cACE,gBAAAJ,EAACG,GAAA,EAAe,UAAS,OAAM,IAAI,EAAE,GAAG,EAAA,GACrC,UAAAL,IA1Bb,gBAAAE;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,cAAYV;AAAA,YACZ,WAAU;AAAA,YACV,OAAM;AAAA,YACN,SAAS,MAAMC,EAAS,EAAE;AAAA,YAE1B,UAAA,gBAAAI,EAACI,GAAA,EAAK,MAAK,UAAS,MAAM,GAAA,CAAI;AAAA,UAAA;AAAA,QAAA,IAoBU,KAAA,CAChC;AAAA,QAEF,IAAI;AAAA,UACF,sCAAsC;AAAA,YACpC,aAAa;AAAA,YACb,SAAS;AAAA,UAAA;AAAA,UAEX,wBAAwB,EAAE,OAAO,kBAAkB,SAAS,EAAA;AAAA,QAAE;AAAA,MAChE;AAAA,IACF;AAAA,IAEF,IAAI;AAAA,MACF,OAAO;AAAA,IAAA;AAAA,IAET,OAAON;AAAA,EAAA;AAAA,GAEX,GAIJQ,IAAeC,EAASd,CAAS;"}
|
package/dist/Select-CSpkK5cR.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select-CSpkK5cR.mjs","sources":["../src/common/components/DataRow.tsx","../src/common/components/Select.tsx"],"sourcesContent":["import React from 'react'\n\nimport Avatar from '@mui/material/Avatar'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon } from '@mxenabled/mxui'\n\ninterface DataRowProps {\n iconName: string\n label: string\n onClick?: () => void\n showChevron?: boolean\n value: string\n}\n\nconst DataRow: React.FC<DataRowProps> = ({\n iconName,\n label,\n onClick,\n showChevron = true,\n value,\n}) => {\n const rowContents = (\n <>\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'neutral.light' }} variant=\"rounded\">\n <Icon name={iconName} sx={{ color: 'text.primary' }} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={label}\n secondary={value}\n slotProps={{\n primary: { variant: 'caption', fontWeight: 'normal' },\n secondary: { color: 'text.default', variant: 'body1', fontWeight: 600 },\n }}\n />\n </>\n )\n\n return onClick ? (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onClick}>\n {rowContents}\n {showChevron && (\n <ListItemIcon>\n <Icon name=\"chevron_right\" size={24} />\n </ListItemIcon>\n )}\n </ListItemButton>\n </ListItem>\n ) : (\n <ListItem disableGutters={false} disablePadding={false}>\n {rowContents}\n </ListItem>\n )\n}\n\nexport default DataRow\n","import React from 'react'\n\nimport MenuItem from '@mui/material/MenuItem'\nimport TextField from '@mui/material/TextField'\n\nimport { ExpandMore } from '@mxenabled/mx-icons'\n\nexport type SelectOption = {\n id: number\n label: string\n}\n\ninterface SelectProps extends Omit<React.ComponentProps<typeof TextField>, 'onChange'> {\n label: string\n onChange: (value: number) => void\n options: SelectOption[]\n value: number\n}\n\nexport const Select = ({ label, onChange, options, value, ...props }: SelectProps) => {\n const handleChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange(Number(event.target.value))\n }\n\n return (\n <TextField\n defaultValue={0}\n label={label}\n onChange={handleChange}\n select={true}\n slotProps={{\n inputLabel: { shrink: true },\n select: {\n IconComponent: (props: React.ComponentProps<typeof ExpandMore>) => (\n <ExpandMore size={20} sx={{ mr: 4 }} {...props} />\n ),\n },\n }}\n value={value}\n variant=\"outlined\"\n {...props}\n >\n {options.map((option) => (\n <MenuItem key={option.id} value={option.id}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n )\n}\n"],"names":["DataRow","iconName","label","onClick","showChevron","value","rowContents","jsxs","Fragment","jsx","ListItemAvatar","Avatar","Icon","ListItemText","ListItem","ListItemButton","ListItemIcon","Select","onChange","options","props","TextField","event","ExpandMore","option","MenuItem"],"mappings":";;;;;;;;;;;AAmBA,MAAMA,IAAkC,CAAC;AAAA,EACvC,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,OAAAC;AACF,MAAM;AACJ,QAAMC,IACJ,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EACC,4BAACC,GAAA,EAAO,IAAI,EAAE,SAAS,gBAAA,GAAmB,SAAQ,WAChD,4BAACC,GAAA,EAAK,MAAMX,GAAU,IAAI,EAAE,OAAO,eAAA,GAAkB,GACvD,EAAA,CACF;AAAA,IACA,gBAAAQ;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,SAASX;AAAA,QACT,WAAWG;AAAA,QACX,WAAW;AAAA,UACT,SAAS,EAAE,SAAS,WAAW,YAAY,SAAA;AAAA,UAC3C,WAAW,EAAE,OAAO,gBAAgB,SAAS,SAAS,YAAY,IAAA;AAAA,QAAI;AAAA,MACxE;AAAA,IAAA;AAAA,EACF,GACF;AAGF,SAAOF,sBACJW,GAAA,EAAS,gBAAgB,IAAM,gBAAgB,IAC9C,UAAA,gBAAAP,EAACQ,GAAA,EAAe,SAAAZ,GACb,UAAA;AAAA,IAAAG;AAAA,IACAF,uBACEY,GAAA,EACC,UAAA,gBAAAP,EAACG,KAAK,MAAK,iBAAgB,MAAM,GAAA,CAAI,EAAA,CACvC;AAAA,EAAA,EAAA,CAEJ,EAAA,CACF,IAEA,gBAAAH,EAACK,GAAA,EAAS,gBAAgB,IAAO,gBAAgB,IAC9C,UAAAR,EAAA,CACH;AAEJ,GCzCaW,IAAS,CAAC,EAAE,OAAAf,GAAO,UAAAgB,GAAU,SAAAC,GAAS,OAAAd,GAAO,GAAGe,QAMzD,gBAAAX;AAAA,EAACY;AAAA,EAAA;AAAA,IACC,cAAc;AAAA,IACd,OAAAnB;AAAA,IACA,UARiB,CAACoB,MAAkD;AACtE,MAAAJ,EAAS,OAAOI,EAAM,OAAO,KAAK,CAAC;AAAA,IACrC;AAAA,IAOI,QAAQ;AAAA,IACR,WAAW;AAAA,MACT,YAAY,EAAE,QAAQ,GAAA;AAAA,MACtB,QAAQ;AAAA,QACN,eAAe,CAACF,MACd,gBAAAX,EAACc,GAAA,EAAW,MAAM,IAAI,IAAI,EAAE,IAAI,EAAA,GAAM,GAAGH,EAAAA,CAAO;AAAA,MAAA;AAAA,IAEpD;AAAA,IAEF,OAAAf;AAAA,IACA,SAAQ;AAAA,IACP,GAAGe;AAAA,IAEH,UAAAD,EAAQ,IAAI,CAACK,MACZ,gBAAAf,EAACgB,GAAA,EAAyB,OAAOD,EAAO,IACrC,UAAAA,EAAO,MAAA,GADKA,EAAO,EAEtB,CACD;AAAA,EAAA;AAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionBox-B4xELRgp.mjs","sources":["../src/common/components/SelectionBox.tsx"],"sourcesContent":["import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport FormControlLabel from '@mui/material/FormControlLabel'\nimport Radio from '@mui/material/Radio'\nimport type { SxProps } from '@mui/material/styles'\nimport { useTheme } from '@mui/material/styles'\nimport Tooltip from '@mui/material/Tooltip'\n\ninterface SelectionBoxProps {\n checked?: boolean\n label: string\n sx?: SxProps\n tooltip?: string\n value: string | number\n}\n\n/** TODO: Move this component to KyperMUI **/\nconst SelectionBox: React.FC<SelectionBoxProps> = ({\n checked = false,\n label,\n sx = {},\n tooltip = '',\n value,\n}) => {\n const theme = useTheme()\n\n /** TODO: Add new theme color to handle this color and remove the mode check **/\n const greyColor =\n theme.palette.mode === 'light' ? theme.palette.grey[400] : theme.palette.grey[700]\n const borderColor = checked ? theme.palette.action.active : greyColor\n const borderSize = checked ? 3 : 1\n\n return (\n <Box\n bgcolor=\"background.paper\"\n border={`${borderSize}px solid`}\n borderColor={borderColor}\n borderRadius={2}\n mt={-2}\n mx={8}\n pr={8}\n py={4}\n sx={{ '&:hover': { borderColor: theme.palette.action.active }, ...sx }}\n >\n <Tooltip title={tooltip}>\n <FormControlLabel\n control={\n <Radio\n disableRipple={true}\n sx={{ '&.Mui-checked': { color: theme.palette.action.active } }}\n />\n }\n label={label}\n labelPlacement=\"start\"\n sx={{ ml: 0, pl: 8 }}\n value={value}\n />\n </Tooltip>\n </Box>\n )\n}\n\nexport default SelectionBox\n"],"names":["SelectionBox","checked","label","sx","tooltip","value","theme","useTheme","greyColor","borderColor","jsx","Box","Tooltip","FormControlLabel","Radio"],"mappings":";;;;;;AAkBA,MAAMA,IAA4C,CAAC;AAAA,EACjD,SAAAC,IAAU;AAAA,EACV,OAAAC;AAAA,EACA,IAAAC,IAAK,CAAA;AAAA,EACL,SAAAC,IAAU;AAAA,EACV,OAAAC;AACF,MAAM;AACJ,QAAMC,IAAQC,EAAA,GAGRC,IACJF,EAAM,QAAQ,SAAS,UAAUA,EAAM,QAAQ,KAAK,GAAG,IAAIA,EAAM,QAAQ,KAAK,GAAG,GAC7EG,IAAcR,IAAUK,EAAM,QAAQ,OAAO,SAASE;AAG5D,SACE,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,QAAQ,GALOV,IAAU,IAAI,CAKR;AAAA,MACrB,aAAAQ;AAAA,MACA,cAAc;AAAA,MACd,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,EAAE,WAAW,EAAE,aAAaH,EAAM,QAAQ,OAAO,UAAU,GAAGH,EAAA;AAAA,MAElE,UAAA,gBAAAO,EAACE,GAAA,EAAQ,OAAOR,GACd,UAAA,gBAAAM;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,SACE,gBAAAH;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,eAAe;AAAA,cACf,IAAI,EAAE,iBAAiB,EAAE,OAAOR,EAAM,QAAQ,OAAO,OAAA,EAAO;AAAA,YAAE;AAAA,UAAA;AAAA,UAGlE,OAAAJ;AAAA,UACA,gBAAe;AAAA,UACf,IAAI,EAAE,IAAI,GAAG,IAAI,EAAA;AAAA,UACjB,OAAAG;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SingleSegmentDonut-7Uy6VEld.mjs","sources":["../src/common/constants/Donut.ts","../src/common/components/donuts/SingleSegmentDonut.tsx"],"sourcesContent":["export const DEFAULT_DONUT_SIZE = 48\nexport const DEFAULT_STROKE_WIDTH = 4\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport { useTheme } from '@mui/material/styles'\n\nimport { DEFAULT_DONUT_SIZE, DEFAULT_STROKE_WIDTH } from '../../constants'\n\nexport interface SingleSegmentDonutProps {\n children: React.ReactNode\n color: string\n percent: number\n size?: number\n strokeWidth?: number\n backgroundStrokeColor?: string\n}\n\nconst SingleSegmentDonut: React.FC<SingleSegmentDonutProps> = ({\n color = '',\n percent = 0,\n size = DEFAULT_DONUT_SIZE,\n strokeWidth = DEFAULT_STROKE_WIDTH,\n children,\n backgroundStrokeColor,\n}) => {\n const theme = useTheme()\n\n const radius = (size - strokeWidth) / 2\n const offset = -90\n const limitedPercent = percent > 100 ? 100 : percent\n const length = 2 * Math.PI * radius * (1 - limitedPercent / 100)\n const halfSize = size / 2\n\n return (\n <Box\n className=\"mx-cmn-single-segment-donut\"\n height={size}\n mt={-8}\n position=\"relative\"\n width={size}\n >\n <svg height={size} width={size}>\n <circle\n cx={halfSize}\n cy={halfSize}\n fill=\"none\"\n r={radius}\n stroke={backgroundStrokeColor ? backgroundStrokeColor : theme.palette.grey[300]}\n strokeWidth={strokeWidth}\n />\n\n <circle\n cx={halfSize}\n cy={halfSize}\n fill=\"none\"\n r={radius}\n stroke={color}\n strokeDasharray={2 * Math.PI * radius}\n strokeDashoffset={length}\n strokeWidth={strokeWidth}\n transform={`rotate(${offset}, ${halfSize}, ${halfSize})`}\n />\n </svg>\n <Box\n className=\"mx-cmn-single-segment-donut-children\"\n left=\"50%\"\n position=\"absolute\"\n sx={{ transform: 'translate(-50%, -50%)' }}\n textAlign=\"center\"\n top=\"50%\"\n >\n {children}\n </Box>\n </Box>\n )\n}\n\nexport default SingleSegmentDonut\n"],"names":["DEFAULT_DONUT_SIZE","DEFAULT_STROKE_WIDTH","SingleSegmentDonut","color","percent","size","strokeWidth","children","backgroundStrokeColor","theme","useTheme","radius","offset","limitedPercent","length","halfSize","jsxs","Box","jsx"],"mappings":";;;AAAO,MAAMA,IAAqB,IACrBC,IAAuB,GCe9BC,IAAwD,CAAC;AAAA,EAC7D,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAOL;AAAA,EACP,aAAAM,IAAcL;AAAA,EACd,UAAAM;AAAA,EACA,uBAAAC;AACF,MAAM;AACJ,QAAMC,IAAQC,EAAA,GAERC,KAAUN,IAAOC,KAAe,GAChCM,IAAS,KACTC,IAAiBT,IAAU,MAAM,MAAMA,GACvCU,IAAS,IAAI,KAAK,KAAKH,KAAU,IAAIE,IAAiB,MACtDE,IAAWV,IAAO;AAExB,SACE,gBAAAW;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,QAAQZ;AAAA,MACR,IAAI;AAAA,MACJ,UAAS;AAAA,MACT,OAAOA;AAAA,MAEP,UAAA;AAAA,QAAA,gBAAAW,EAAC,OAAA,EAAI,QAAQX,GAAM,OAAOA,GACxB,UAAA;AAAA,UAAA,gBAAAa;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIH;AAAA,cACJ,IAAIA;AAAA,cACJ,MAAK;AAAA,cACL,GAAGJ;AAAA,cACH,QAAQH,KAAgDC,EAAM,QAAQ,KAAK,GAAG;AAAA,cAC9E,aAAAH;AAAA,YAAA;AAAA,UAAA;AAAA,UAGF,gBAAAY;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAIH;AAAA,cACJ,IAAIA;AAAA,cACJ,MAAK;AAAA,cACL,GAAGJ;AAAA,cACH,QAAQR;AAAA,cACR,iBAAiB,IAAI,KAAK,KAAKQ;AAAA,cAC/B,kBAAkBG;AAAA,cAClB,aAAAR;AAAA,cACA,WAAW,UAAUM,CAAM,KAAKG,CAAQ,KAAKA,CAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QACvD,GACF;AAAA,QACA,gBAAAG;AAAA,UAACD;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,UAAS;AAAA,YACT,IAAI,EAAE,WAAW,wBAAA;AAAA,YACjB,WAAU;AAAA,YACV,KAAI;AAAA,YAEH,UAAAV;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
package/dist/Sizes-DISGrlUg.mjs
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sizes-DISGrlUg.mjs","sources":["../src/common/constants/Sizes.ts"],"sourcesContent":["export const enum Sizes {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\nexport const TOUCH_TARGET = 44\n"],"names":["Sizes","TOUCH_TARGET"],"mappings":"AAAO,IAAWA,sBAAAA,OAChBA,EAAA,QAAQ,SACRA,EAAA,SAAS,UACTA,EAAA,QAAQ,SAHQA,IAAAA,KAAA,CAAA,CAAA;AAMX,MAAMC,IAAe;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkeletonLoader-BaNboJjD.mjs","sources":["../src/common/components/SkeletonLoader.tsx"],"sourcesContent":["import Stack from '@mui/material/Stack'\nimport Skeleton from '@mui/material/Skeleton'\nimport { SxProps } from '@mui/material/styles'\n\ninterface SkeletonLoaderProps {\n sx?: SxProps\n variant?: 'card' | 'list' | 'dashboard'\n}\n\nexport const SkeletonLoader = ({ sx = {}, variant = 'list' }: SkeletonLoaderProps) => {\n return (\n <Stack sx={[...(Array.isArray(sx) ? sx : [sx])]}>\n {variant === 'list' && (\n <Stack gap={24}>\n <Skeleton height={25} variant=\"rounded\" width={150} />\n <Skeleton height={50} variant=\"rounded\" />\n <Skeleton height={50} variant=\"rounded\" />\n <Skeleton height={50} variant=\"rounded\" />\n </Stack>\n )}\n\n {variant === 'card' && (\n <Stack gap={24}>\n <Skeleton height={50} variant=\"rounded\" />\n <Stack direction=\"row\" gap={24}>\n <Skeleton height={300} variant=\"rounded\" width=\"20%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"80%\" />\n </Stack>\n </Stack>\n )}\n\n {variant === 'dashboard' && (\n <Stack gap={24}>\n <Skeleton height={75} variant=\"rounded\" />\n <Stack gap={24}>\n <Stack direction=\"row\" gap={24}>\n <Skeleton height={250} variant=\"rounded\" width=\"75%\" />\n <Skeleton height={250} variant=\"rounded\" width=\"25%\" />\n </Stack>\n <Stack direction=\"row\" gap={24}>\n <Skeleton height={250} variant=\"rounded\" width=\"75%\" />\n <Skeleton height={250} variant=\"rounded\" width=\"25%\" />\n </Stack>\n <Stack direction=\"row\" gap={24}>\n <Skeleton height={250} variant=\"rounded\" width=\"75%\" />\n <Skeleton height={250} variant=\"rounded\" width=\"25%\" />\n </Stack>\n </Stack>\n </Stack>\n )}\n </Stack>\n )\n}\n"],"names":["SkeletonLoader","sx","variant","jsxs","Stack","jsx","Skeleton"],"mappings":";;;AASO,MAAMA,IAAiB,CAAC,EAAE,IAAAC,IAAK,CAAA,GAAI,SAAAC,IAAU,aAEhD,gBAAAC,EAACC,GAAA,EAAM,IAAI,CAAC,GAAI,MAAM,QAAQH,CAAE,IAAIA,IAAK,CAACA,CAAE,CAAE,GAC3C,UAAA;AAAA,EAAAC,MAAY,UACX,gBAAAC,EAACC,GAAA,EAAM,KAAK,IACV,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAS,QAAQ,IAAI,SAAQ,WAAU,OAAO,KAAK;AAAA,IACpD,gBAAAD,EAACC,GAAA,EAAS,QAAQ,IAAI,SAAQ,WAAU;AAAA,IACxC,gBAAAD,EAACC,GAAA,EAAS,QAAQ,IAAI,SAAQ,WAAU;AAAA,IACxC,gBAAAD,EAACC,GAAA,EAAS,QAAQ,IAAI,SAAQ,UAAA,CAAU;AAAA,EAAA,GAC1C;AAAA,EAGDJ,MAAY,UACX,gBAAAC,EAACC,GAAA,EAAM,KAAK,IACV,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAS,QAAQ,IAAI,SAAQ,WAAU;AAAA,IACxC,gBAAAH,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,IAC1B,UAAA;AAAA,MAAA,gBAAAC,EAACC,KAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,OAAM;AAAA,wBACpDA,GAAA,EAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,MAAA,CAAM;AAAA,IAAA,EAAA,CACvD;AAAA,EAAA,GACF;AAAA,EAGDJ,MAAY,eACX,gBAAAC,EAACC,GAAA,EAAM,KAAK,IACV,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAS,QAAQ,IAAI,SAAQ,WAAU;AAAA,IACxC,gBAAAH,EAACC,GAAA,EAAM,KAAK,IACV,UAAA;AAAA,MAAA,gBAAAD,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,IAC1B,UAAA;AAAA,QAAA,gBAAAC,EAACC,KAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,OAAM;AAAA,0BACpDA,GAAA,EAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,MAAA,CAAM;AAAA,MAAA,GACvD;AAAA,MACA,gBAAAH,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,IAC1B,UAAA;AAAA,QAAA,gBAAAC,EAACC,KAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,OAAM;AAAA,0BACpDA,GAAA,EAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,MAAA,CAAM;AAAA,MAAA,GACvD;AAAA,MACA,gBAAAH,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,IAC1B,UAAA;AAAA,QAAA,gBAAAC,EAACC,KAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,OAAM;AAAA,0BACpDA,GAAA,EAAS,QAAQ,KAAK,SAAQ,WAAU,OAAM,MAAA,CAAM;AAAA,MAAA,EAAA,CACvD;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF;AAAA,GAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpendingData-Fii_xATx.mjs","sources":["../src/trends/utils/shared.ts","../src/trends/utils/SpendingData.ts"],"sourcesContent":["import { CategoryGuids, PaymentCategories } from '../../core/constants'\nimport { MonthlyCategoryTotals } from '../../core'\nimport { StackedLineChartData } from '../../core/utils/TrendsUtil'\n\ntype TotalsData = MonthlyCategoryTotals | StackedLineChartData\n\nexport const isIncome = (totals: TotalsData) => {\n return (\n (totals.top_level_category_guid === CategoryGuids.INCOME ||\n totals.category_guid === CategoryGuids.INCOME) &&\n !isInvestment(totals)\n )\n}\n\nexport const isExpense = (totals: TotalsData) => {\n return !isIncome(totals) && !isTransfer(totals)\n}\n\nexport const isPayment = (totals: TotalsData) => {\n return (\n PaymentCategories.includes(totals.top_level_category_guid) ||\n PaymentCategories.includes(totals.category_guid)\n )\n}\n\nexport const isTransfer = (totals: TotalsData) => {\n return (\n totals.top_level_category_guid === CategoryGuids.TRANSFER ||\n totals.category_guid === CategoryGuids.TRANSFER\n )\n}\n\nexport const isInvestment = (totals: TotalsData) => {\n return (\n totals.top_level_category_guid === CategoryGuids.INVESTMENTS ||\n totals.category_guid === CategoryGuids.INVESTMENTS\n )\n}\n\nexport const isSpend = (totals: TotalsData) => {\n return !isIncome(totals) && !isTransfer(totals) && !isInvestment(totals)\n}\n\nexport const getTopLevelCategoryTotals = (\n totals: (MonthlyCategoryTotals | StackedLineChartData)[],\n) => {\n return totals.filter((item) => item.category_guid === item.top_level_category_guid)\n}\n\nexport const calculateRelativeChange = (current: number, previous: number) => {\n if (previous === 0) return 0\n const change = (current - previous) / previous\n return isNaN(change) ? 0 : change\n}\n","import { addMonths } from 'date-fns/addMonths'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { subMonths } from 'date-fns/subMonths'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport { CategoryGuids, DATE_FORMATS_INTL, formatDate } from '../../core/constants'\nimport { MonthlyCategoryTotals } from '../../core'\nimport { isIncome, isPayment, isSpend } from './shared'\n\ntype DateRange = {\n start: Date\n end: Date\n}\n\nexport const getMonthlyTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const data: { x: string; y: number }[] = []\n let startDate = startOfMonth(range?.start ?? subMonths(new Date(), 5))\n const endDate = range?.end ?? new Date()\n\n while (isBefore(startDate, endDate)) {\n // Add total amount for each month\n data.push({\n x: formatDate(startDate, DATE_FORMATS_INTL.MONTH_SHORT),\n y: totals\n .filter((t) => t.year === startDate.getFullYear() && t.month === startDate.getMonth() + 1)\n .reduce((total, item) => total + item.total, 0),\n })\n startDate = addMonths(startDate, 1)\n }\n\n return data\n}\n\nexport const getIncomeTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const incomeTotals = totals.filter(isIncome)\n // Income totals are negative values, but we want to display them as positive\n return getMonthlyTotals(incomeTotals, range).map((t) => ({ ...t, y: Math.abs(t.y) }))\n}\n\nexport const getPaymentTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const paymentTotals = totals.filter(isPayment)\n // Payment totals are negative values, but we want to display them as positive\n return getMonthlyTotals(paymentTotals, range).map((t) => ({ ...t, y: Math.abs(t.y) }))\n}\n\nexport const getSpendingTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const spendingTotals = totals.filter(isSpend)\n return getMonthlyTotals(spendingTotals, range)\n}\n\nexport const getSpendingData = (totals: MonthlyCategoryTotals[]) => {\n const data: { x: string; y: number }[] = []\n\n // Filter out income and transfers\n const filteredTotals = totals.filter(\n (t) =>\n t.top_level_category_guid !== CategoryGuids.INCOME &&\n t.top_level_category_guid !== CategoryGuids.TRANSFER &&\n t.total > 0,\n )\n\n let startDate = startOfMonth(subMonths(new Date(), 5))\n const endDate = endOfMonth(new Date())\n while (isBefore(startDate, endDate)) {\n // Add total amount for each month\n data.push({\n x: formatDate(startDate, DATE_FORMATS_INTL.MONTH_SHORT),\n y: filteredTotals\n .filter((t) => t.year === startDate.getFullYear() && t.month === startDate.getMonth() + 1)\n .reduce((total, item) => total + item.total, 0),\n })\n startDate = addMonths(startDate, 1)\n }\n\n return data\n}\n"],"names":["isIncome","totals","CategoryGuids","isInvestment","isExpense","isTransfer","isPayment","PaymentCategories","isSpend","getTopLevelCategoryTotals","item","calculateRelativeChange","current","previous","change","getMonthlyTotals","range","data","startDate","startOfMonth","subMonths","endDate","isBefore","formatDate","DATE_FORMATS_INTL","t","total","addMonths","getIncomeTotals","incomeTotals","getPaymentTotals","paymentTotals","getSpendingTotals","spendingTotals","getSpendingData","filteredTotals","endOfMonth"],"mappings":"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"}
|