@mx-cartographer/experiences 9.1.0-alpha.bb1 → 9.1.1
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 +80 -0
- package/README.md +10 -10
- package/dist/Account-DR7Plrqy.mjs +119 -0
- package/dist/Account-DR7Plrqy.mjs.map +1 -0
- package/dist/AccountDetailsDrawer-C1hhmlmI.mjs +922 -0
- package/dist/AccountDetailsDrawer-C1hhmlmI.mjs.map +1 -0
- package/dist/AccountDetailsHeader-BliEZhz7.mjs +230 -0
- package/dist/AccountDetailsHeader-BliEZhz7.mjs.map +1 -0
- package/dist/AccountUtils-Cbh8r9cP.mjs +29 -0
- package/dist/AccountUtils-Cbh8r9cP.mjs.map +1 -0
- package/dist/Analytics-CkYXKvco.mjs +54 -0
- package/dist/Analytics-CkYXKvco.mjs.map +1 -0
- package/dist/Analytics-WeZYytR0.mjs +140 -0
- package/dist/Analytics-WeZYytR0.mjs.map +1 -0
- package/dist/ApiEndpoints-DXwIYNUV.mjs +50 -0
- package/dist/ApiEndpoints-DXwIYNUV.mjs.map +1 -0
- package/dist/BeatMaterialIcon-1KOfRZrA.mjs +27 -0
- package/dist/BeatMaterialIcon-1KOfRZrA.mjs.map +1 -0
- package/dist/BudgetUtil-Bg2AQJpQ.mjs +75 -0
- package/dist/BudgetUtil-Bg2AQJpQ.mjs.map +1 -0
- package/dist/Category-DEKZGLYe.mjs +302 -0
- package/dist/Category-DEKZGLYe.mjs.map +1 -0
- package/dist/CategorySelectorDrawer-NJsFsKP1.mjs +431 -0
- package/dist/CategorySelectorDrawer-NJsFsKP1.mjs.map +1 -0
- package/dist/Connect-BH0Pt6zc.mjs +43 -0
- package/dist/Connect-BH0Pt6zc.mjs.map +1 -0
- package/dist/ConnectCard-D7uxoH5Y.mjs +55 -0
- package/dist/ConnectCard-D7uxoH5Y.mjs.map +1 -0
- package/dist/ConnectDrawer-CW4LA3H3.mjs +58 -0
- package/dist/ConnectDrawer-CW4LA3H3.mjs.map +1 -0
- package/dist/ConnectionsDrawer-CZU9ku-k.mjs +54 -0
- package/dist/ConnectionsDrawer-CZU9ku-k.mjs.map +1 -0
- package/dist/CurrencyDialog-DumQCTPO.mjs +374 -0
- package/dist/CurrencyDialog-DumQCTPO.mjs.map +1 -0
- package/dist/CurrencyInput-DaGEQaLW.mjs +88 -0
- package/dist/CurrencyInput-DaGEQaLW.mjs.map +1 -0
- package/dist/CurrencyText-CCbE6MmF.mjs +21 -0
- package/dist/CurrencyText-CCbE6MmF.mjs.map +1 -0
- package/dist/DateFormats-HudZ3Bjs.mjs +65 -0
- package/dist/DateFormats-HudZ3Bjs.mjs.map +1 -0
- package/dist/DateUtil-CzBmbjmA.mjs +75 -0
- package/dist/DateUtil-CzBmbjmA.mjs.map +1 -0
- package/dist/DebtUtils-i4pI2Uoe.mjs +154 -0
- package/dist/DebtUtils-i4pI2Uoe.mjs.map +1 -0
- package/dist/Dialog-Bvd2n8hz.mjs +67 -0
- package/dist/Dialog-Bvd2n8hz.mjs.map +1 -0
- package/dist/Donut-SzzfZDHF.mjs +89 -0
- package/dist/Donut-SzzfZDHF.mjs.map +1 -0
- package/dist/Drawer-DsnW2o0v.mjs +175 -0
- package/dist/Drawer-DsnW2o0v.mjs.map +1 -0
- package/dist/EmbeddedCard-DH8vQ3qN.mjs +859 -0
- package/dist/EmbeddedCard-DH8vQ3qN.mjs.map +1 -0
- package/dist/EmptyState-CJUDc3kD.mjs +85 -0
- package/dist/EmptyState-CJUDc3kD.mjs.map +1 -0
- package/dist/Error-Dtw6yxkf.mjs +85 -0
- package/dist/Error-Dtw6yxkf.mjs.map +1 -0
- package/dist/ErrorBoundary-CsdOcnJ9.mjs +24 -0
- package/dist/ErrorBoundary-CsdOcnJ9.mjs.map +1 -0
- package/dist/ExportCsvAction-C9KWH3Az.mjs +25 -0
- package/dist/ExportCsvAction-C9KWH3Az.mjs.map +1 -0
- package/dist/GlobalAccountFilter-BhzR5Vb1.mjs +230 -0
- package/dist/GlobalAccountFilter-BhzR5Vb1.mjs.map +1 -0
- package/dist/GlobalCopyApi-wcnDUzMV.mjs +129 -0
- package/dist/GlobalCopyApi-wcnDUzMV.mjs.map +1 -0
- package/dist/GoalsUtil-C9EnLWvC.mjs +108 -0
- package/dist/GoalsUtil-C9EnLWvC.mjs.map +1 -0
- package/dist/HeaderCell-P8w6CmfO.mjs +7 -0
- package/dist/HeaderCell-P8w6CmfO.mjs.map +1 -0
- package/dist/Help-CkQTjORd.mjs +300 -0
- package/dist/Help-CkQTjORd.mjs.map +1 -0
- package/dist/Help-aERwhajy.mjs +3210 -0
- package/dist/Help-aERwhajy.mjs.map +1 -0
- package/dist/IconBacking-DgT8DCeh.mjs +40 -0
- package/dist/IconBacking-DgT8DCeh.mjs.map +1 -0
- package/dist/InformationTooltip-4su8bn1e.mjs +42 -0
- package/dist/InformationTooltip-4su8bn1e.mjs.map +1 -0
- package/dist/InvestmentUtil-BItV7uEs.mjs +135 -0
- package/dist/InvestmentUtil-BItV7uEs.mjs.map +1 -0
- package/dist/LineChart-CUfiH86G.mjs +613 -0
- package/dist/LineChart-CUfiH86G.mjs.map +1 -0
- package/dist/ListItemAction-BqUCLj_w.mjs +70 -0
- package/dist/ListItemAction-BqUCLj_w.mjs.map +1 -0
- package/dist/ListItemRow-kH1rn8Xu.mjs +68 -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 +22 -0
- package/dist/Loader-CxeBwuPG.mjs.map +1 -0
- package/dist/Localization-DnoVyBNK.mjs +39 -0
- package/dist/Localization-DnoVyBNK.mjs.map +1 -0
- package/dist/ManageIncome-Be9WHv-s.mjs +906 -0
- package/dist/ManageIncome-Be9WHv-s.mjs.map +1 -0
- package/dist/MicroWidgetContainer-B2NnKBgW.mjs +46 -0
- package/dist/MicroWidgetContainer-B2NnKBgW.mjs.map +1 -0
- package/dist/MiniWidgetContainer-Bmv_WeUd.mjs +67 -0
- package/dist/MiniWidgetContainer-Bmv_WeUd.mjs.map +1 -0
- package/dist/NetWorthUtils-Dj7CgAg2.mjs +96 -0
- package/dist/NetWorthUtils-Dj7CgAg2.mjs.map +1 -0
- package/dist/Notification-DTNYSd8P.mjs +8 -0
- package/dist/Notification-DTNYSd8P.mjs.map +1 -0
- package/dist/NotificationSettings-CW7okUrk.mjs +678 -0
- package/dist/NotificationSettings-CW7okUrk.mjs.map +1 -0
- package/dist/NotificationUtils-BRGFTePr.mjs +24 -0
- package/dist/NotificationUtils-BRGFTePr.mjs.map +1 -0
- package/dist/NumberFormatting--XMeeBfr.mjs +50 -0
- package/dist/NumberFormatting--XMeeBfr.mjs.map +1 -0
- package/dist/OriginalBalanceAction-YrvxBYAl.mjs +115 -0
- package/dist/OriginalBalanceAction-YrvxBYAl.mjs.map +1 -0
- package/dist/RecurringSettings-kRqAViNn.mjs +89 -0
- package/dist/RecurringSettings-kRqAViNn.mjs.map +1 -0
- package/dist/RecurringTransactionsUtil-CHWmqvW5.mjs +299 -0
- package/dist/RecurringTransactionsUtil-CHWmqvW5.mjs.map +1 -0
- package/dist/ResponsiveButton-CC9F_Ezk.mjs +46 -0
- package/dist/ResponsiveButton-CC9F_Ezk.mjs.map +1 -0
- package/dist/SearchBox-Cpgu_gdO.mjs +51 -0
- package/dist/SearchBox-Cpgu_gdO.mjs.map +1 -0
- package/dist/Select-CSpkK5cR.mjs +62 -0
- package/dist/Select-CSpkK5cR.mjs.map +1 -0
- package/dist/SelectionBox-B4xELRgp.mjs +49 -0
- package/dist/SelectionBox-B4xELRgp.mjs.map +1 -0
- package/dist/SingleSegmentDonut-7Uy6VEld.mjs +70 -0
- package/dist/SingleSegmentDonut-7Uy6VEld.mjs.map +1 -0
- package/dist/Sizes-DISGrlUg.mjs +7 -0
- package/dist/Sizes-DISGrlUg.mjs.map +1 -0
- package/dist/SkeletonLoader-BaNboJjD.mjs +39 -0
- package/dist/SkeletonLoader-BaNboJjD.mjs.map +1 -0
- package/dist/SpendingData-Fii_xATx.mjs +54 -0
- package/dist/SpendingData-Fii_xATx.mjs.map +1 -0
- package/dist/SpendingLegend-CxvNOg3c.mjs +204 -0
- package/dist/SpendingLegend-CxvNOg3c.mjs.map +1 -0
- package/dist/StatusBar-CPfSXe80.mjs +31 -0
- package/dist/StatusBar-CPfSXe80.mjs.map +1 -0
- package/dist/TabContentContainer-B0eYJP5p.mjs +49 -0
- package/dist/TabContentContainer-B0eYJP5p.mjs.map +1 -0
- package/dist/ToggleListItem-Dl1lXNwj.mjs +92 -0
- package/dist/ToggleListItem-Dl1lXNwj.mjs.map +1 -0
- package/dist/TransactionDetails-roZ5xLq8.mjs +1708 -0
- package/dist/TransactionDetails-roZ5xLq8.mjs.map +1 -0
- package/dist/TransactionUtils-BphBJBbU.mjs +235 -0
- package/dist/TransactionUtils-BphBJBbU.mjs.map +1 -0
- package/dist/TrendsUtil-D9z3kIj_.mjs +70 -0
- package/dist/TrendsUtil-D9z3kIj_.mjs.map +1 -0
- package/dist/UserStore-BjnNCO5a.mjs +3121 -0
- package/dist/UserStore-BjnNCO5a.mjs.map +1 -0
- package/dist/ViewMoreMicroCard-fnwE0hqd.mjs +1280 -0
- package/dist/ViewMoreMicroCard-fnwE0hqd.mjs.map +1 -0
- package/dist/WidgetContainer-DJnp6t6c.mjs +483 -0
- package/dist/WidgetContainer-DJnp6t6c.mjs.map +1 -0
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsDrawer.d.ts +6 -0
- package/dist/accounts/index.d.ts +1 -0
- package/dist/accounts/index.es.js +784 -12
- package/dist/accounts/index.es.js.map +1 -0
- package/dist/analytics/index.es.js +140 -155
- package/dist/analytics/index.es.js.map +1 -0
- package/dist/budgets/index.es.js +1267 -1317
- package/dist/budgets/index.es.js.map +1 -0
- package/dist/cashflow/context/hooks.d.ts +7 -6
- package/dist/cashflow/index.es.js +944 -1076
- package/dist/cashflow/index.es.js.map +1 -0
- package/dist/categories/index.es.js +5 -4
- package/dist/categories/index.es.js.map +1 -0
- package/dist/common/components/DataRow.d.ts +1 -0
- package/dist/common/components/ListItemWrapper.d.ts +2 -1
- package/dist/common/constants/Analytics.d.ts +3 -0
- package/dist/common/index.es.js +310 -101
- package/dist/common/index.es.js.map +1 -0
- package/dist/core/index.es.js +105 -80
- package/dist/core/index.es.js.map +1 -0
- package/dist/core/stores/CashflowStore.d.ts +8 -7
- package/dist/core/stores/RecurringTransactionsStore.d.ts +53 -1
- package/dist/core/stores/TransactionStore.d.ts +1 -0
- package/dist/core/types/localization/RecurringCopy.d.ts +14 -1
- package/dist/core/types/localization/SpendingCopy.d.ts +1 -0
- package/dist/core/utils/AccountUtils.d.ts +8 -0
- package/dist/core/utils/DateUtil.d.ts +2 -0
- package/dist/core/utils/RecurringTransactionsUtil.d.ts +2 -1
- package/dist/dashboard/index.es.js +142 -185
- package/dist/dashboard/index.es.js.map +1 -0
- package/dist/debts/index.es.js +1273 -1384
- package/dist/debts/index.es.js.map +1 -0
- package/dist/finstrong/index.es.js +3473 -3367
- package/dist/finstrong/index.es.js.map +1 -0
- package/dist/goals/index.es.js +984 -1103
- package/dist/goals/index.es.js.map +1 -0
- package/dist/help/index.es.js +26 -3
- package/dist/help/index.es.js.map +1 -0
- package/dist/hooks-97sNJ_lf.mjs +78 -0
- package/dist/hooks-97sNJ_lf.mjs.map +1 -0
- package/dist/insights/components/insights/WeeklyNoSpendDays/BubbleWeek.d.ts +4 -1
- package/dist/insights/components/insights/WeeklyNoSpendDays/WeeklyNoSpendDays.d.ts +4 -2
- package/dist/insights/index.es.js +4871 -93
- package/dist/insights/index.es.js.map +1 -0
- package/dist/investments/index.es.js +1523 -1533
- package/dist/investments/index.es.js.map +1 -0
- package/dist/merchants/index.es.js +65 -75
- package/dist/merchants/index.es.js.map +1 -0
- package/dist/microinsights/index.es.js +826 -15
- package/dist/microinsights/index.es.js.map +1 -0
- package/dist/networth/index.es.js +504 -550
- package/dist/networth/index.es.js.map +1 -0
- package/dist/notifications/index.es.js +162 -169
- package/dist/notifications/index.es.js.map +1 -0
- package/dist/recurringtransactions/components/RecurringTransactionDetails.d.ts +3 -2
- package/dist/recurringtransactions/components/RecurringTransactionDetailsDrawer.d.ts +3 -0
- package/dist/recurringtransactions/components/RecurringTransactionList.d.ts +11 -0
- package/dist/recurringtransactions/components/UpcomingRecurrenceCard.d.ts +8 -0
- package/dist/recurringtransactions/components/actions/LinkTransactionDrawer.d.ts +10 -0
- package/dist/recurringtransactions/components/actions/MarkAsPaidDialog.d.ts +7 -0
- package/dist/recurringtransactions/components/actions/MarkAsUnpaidDialog.d.ts +7 -0
- package/dist/recurringtransactions/index.es.js +1012 -10
- package/dist/recurringtransactions/index.es.js.map +1 -0
- package/dist/settings/index.es.js +892 -13
- package/dist/settings/index.es.js.map +1 -0
- package/dist/spending/index.es.js +457 -400
- 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 +604 -10
- package/dist/transactions/index.es.js.map +1 -0
- package/dist/trends/index.es.js +1408 -1268
- package/dist/trends/index.es.js.map +1 -0
- package/dist/useAccountDisplayName-BsiXA0qf.mjs +24 -0
- package/dist/useAccountDisplayName-BsiXA0qf.mjs.map +1 -0
- package/dist/useAriaLive-MkYebyUR.mjs +36 -0
- package/dist/useAriaLive-MkYebyUR.mjs.map +1 -0
- package/dist/useDimensions-CeDR9V8N.mjs +37 -0
- package/dist/useDimensions-CeDR9V8N.mjs.map +1 -0
- package/dist/useInsightsEnabled-D5Sdm0TJ.mjs +12 -0
- package/dist/useInsightsEnabled-D5Sdm0TJ.mjs.map +1 -0
- package/dist/useScreenSize-mWpmnh5w.mjs +37 -0
- package/dist/useScreenSize-mWpmnh5w.mjs.map +1 -0
- package/dist/useWidgetLoadTimer-B0tB-yzL.mjs +20 -0
- package/dist/useWidgetLoadTimer-B0tB-yzL.mjs.map +1 -0
- package/package.json +30 -30
- package/dist/Analytics-BKzTPees.mjs +0 -61
- package/dist/GlobalCopyApi-BeXzaDH9.mjs +0 -487
- package/dist/HeaderCell-EhCUSjvj.mjs +0 -10
- package/dist/Loader-BlVzRtUd.mjs +0 -73
- package/dist/MiniWidgetContainer-COwnjfy7.mjs +0 -110
- package/dist/OriginalBalanceAction-sbiqaxok.mjs +0 -110
- package/dist/SpendingLegend-D15ixlQ1.mjs +0 -222
- package/dist/accounts-DkyAiLpg.mjs +0 -15632
- package/dist/core-BexP5oiV.mjs +0 -4047
- package/dist/help-CctDYrAH.mjs +0 -2308
- 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
- package/dist/microinsights-CRf3ChsJ.mjs +0 -1814
- package/dist/recurringtransactions-gbJ_NA8u.mjs +0 -1564
- package/dist/settings-ZMHe439l.mjs +0 -1526
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurrencyInput-DaGEQaLW.mjs","sources":["../src/common/components/CurrencyInput.tsx"],"sourcesContent":["import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport type { TextFieldProps as MuiTextFieldProps } from '@mui/material/TextField'\n\nimport { P, TextField } from '@mxenabled/mxui'\n\nimport { getLocale } from '../../core'\nimport { CurrencyCodes, MAX_MONEY_INPUT } from '../../core/constants/Numbers'\nimport { formatCurrency, getCurrencyCodes } from '../../core/utils/NumberFormatting'\nimport { CurrencyInputCopy } from '../../core'\nimport { useGlobalCopyStore } from '../context'\nimport { buildDynamicCopy } from '../../core/utils/Localization'\n\ntype CurrencyInputProps = {\n allowDecimals?: boolean\n amountIsRequired?: boolean\n ariaLabel?: string\n amount: string | number\n copy?: CurrencyInputCopy\n customValidate?: () => boolean\n errorText?: string\n label?: string\n minAmount?: number\n setAmount: (s: string) => void\n setHasValidInput?: (b: boolean) => void\n} & MuiTextFieldProps\n\nconst CurrencyInput: React.FC<CurrencyInputProps> = ({\n allowDecimals = true,\n ariaLabel,\n amount,\n amountIsRequired = true,\n copy,\n customValidate = () => true,\n errorText = '',\n label,\n minAmount = 1,\n setAmount,\n setHasValidInput,\n ...rest\n}) => {\n const [errorMsg, setErrorMsg] = React.useState('')\n const { common: commonCopy } = useGlobalCopyStore()\n const customCopy = copy ? copy : commonCopy.currency_input\n\n const styles = getStyles()\n\n const numbersOnly = /^[0-9]*$/\n // disabling this lint rule because this \"useless\" escape is not useless and breaks functionality if removed\n // eslint-disable-next-line no-useless-escape\n const numbersWithComma = /^(\\d)*(\\,)?([0-9]{1,2})?$/\n const numbersWithDecimal = /^(\\d)*(\\.)?([0-9]{1,2})?$/\n let pattern: RegExp\n\n const nameRef = React.useRef(uuidv4())\n\n if (allowDecimals) {\n switch (getCurrencyCodes()) {\n case CurrencyCodes.CAD:\n pattern = numbersWithComma\n break\n default:\n pattern = numbersWithDecimal\n break\n }\n } else {\n pattern = numbersOnly\n }\n\n React.useEffect(() => {\n handleValidation(amount)\n }, [amount])\n\n const handleValidation = (value: string | number) => {\n if (!amountIsRequired && (value === '' || value === '.' || value === ',')) {\n // don't display error in these instances, but indicate the input isn't valid\n setErrorMsg('')\n setHasValidInput?.(false)\n } else if (Number(value) < minAmount) {\n // display error if number is negative\n setErrorMsg(\n buildDynamicCopy(\n customCopy.error_amount_must_be_equal_to,\n formatCurrency(minAmount, '0'),\n ) as string,\n )\n setHasValidInput?.(false)\n } else if (Number(value) > MAX_MONEY_INPUT) {\n // display error if number is greater than max amount allowed\n setErrorMsg(\n buildDynamicCopy(\n customCopy.error_amount_must_be_less_than_or_equal_to,\n formatCurrency(MAX_MONEY_INPUT, allowDecimals ? '0,0.00' : '0,0', Math.floor),\n ) as string,\n )\n setHasValidInput?.(false)\n } else if (!value.toString().match(pattern)) {\n // check that input is valid and display error on special characters, etc\n setErrorMsg(customCopy.error_amount_is_invalid)\n setHasValidInput?.(false)\n } else if (!customValidate()) {\n // if custom error validation returns false, error passed in by parent is displayed\n setErrorMsg(errorText)\n setHasValidInput?.(false)\n } else {\n // input is valid!\n setErrorMsg('')\n setHasValidInput?.(true)\n }\n\n setAmount(value.toString())\n }\n\n return (\n <TextField\n className={`mx-cmn-currency-input ${styles}`}\n error={Boolean(errorMsg)}\n helperText={errorMsg}\n hiddenLabel={!label}\n id={`currency-input-${nameRef.current}`}\n inputMode={allowDecimals ? 'decimal' : 'numeric'}\n label={label}\n name={`currency-input-${nameRef.current}`}\n onChange={(e: any) => handleValidation(e.target.value)}\n slotProps={{\n input: {\n endAdornment: getLocale().includes('fr-ca') ? <P>$</P> : undefined,\n startAdornment: !getLocale().includes('fr-ca') ? <P>$</P> : undefined,\n },\n htmlInput: {\n 'aria-label': ariaLabel || customCopy.enter_amount,\n noValidate: true,\n pattern: allowDecimals ? '[0-9]*\\\\.?[0-9]*' : '[0-9]*',\n },\n }}\n value={amount}\n {...rest}\n />\n )\n}\n\nconst getStyles = () =>\n css({\n '& .MuiInputBase-adornedStart > .p': {\n marginRight: 4,\n },\n })\n\nexport default CurrencyInput\n"],"names":["CurrencyInput","allowDecimals","ariaLabel","amount","amountIsRequired","copy","customValidate","errorText","label","minAmount","setAmount","setHasValidInput","rest","errorMsg","setErrorMsg","React","commonCopy","useGlobalCopyStore","customCopy","styles","getStyles","numbersOnly","numbersWithComma","numbersWithDecimal","pattern","nameRef","uuidv4","getCurrencyCodes","CurrencyCodes","handleValidation","value","buildDynamicCopy","formatCurrency","MAX_MONEY_INPUT","jsx","TextField","getLocale","P","css"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs as i } from "react/jsx-runtime";
|
|
2
|
+
import { P as u } from "@mxenabled/mxui";
|
|
3
|
+
import { f as a } from "./NumberFormatting--XMeeBfr.mjs";
|
|
4
|
+
const y = ({
|
|
5
|
+
isIncome: e = !1,
|
|
6
|
+
amount: o = 0,
|
|
7
|
+
bold: s,
|
|
8
|
+
color: r,
|
|
9
|
+
formatString: m,
|
|
10
|
+
sx: n,
|
|
11
|
+
symbol: t,
|
|
12
|
+
variant: c,
|
|
13
|
+
...f
|
|
14
|
+
}) => /* @__PURE__ */ i(u, { bold: s, color: r || (e ? "success.main" : "text.primary"), sx: n, variant: c, ...f, children: [
|
|
15
|
+
t && t,
|
|
16
|
+
a(Number(o), m ?? "0,0.00")
|
|
17
|
+
] });
|
|
18
|
+
export {
|
|
19
|
+
y as C
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=CurrencyText-CCbE6MmF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurrencyText-CCbE6MmF.mjs","sources":["../src/common/components/CurrencyText.tsx"],"sourcesContent":["import React from 'react'\nimport { SxProps } from '@mui/material/styles'\nimport { P } from '@mxenabled/mxui'\nimport { TypographyProps } from '@mui/material/Typography'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface CurrencyTextProps extends TypographyProps {\n isIncome?: boolean\n amount: number | string\n bold?: boolean\n color?: string\n formatString?: string\n sx?: SxProps\n symbol?: string\n variant?: TypographyProps['variant']\n}\n\nexport const CurrencyText: React.FC<CurrencyTextProps> = ({\n isIncome = false,\n amount = 0,\n bold,\n color,\n formatString,\n sx,\n symbol,\n variant,\n ...rest\n}) => {\n const textColor = () => {\n if (color) {\n return color\n } else {\n return isIncome ? 'success.main' : 'text.primary'\n }\n }\n\n return (\n <P bold={bold} color={textColor()} sx={sx} variant={variant} {...rest}>\n {symbol && symbol}\n {formatCurrency(Number(amount), formatString ?? '0,0.00')}\n </P>\n )\n}\n"],"names":["CurrencyText","isIncome","amount","bold","color","formatString","sx","symbol","variant","rest","jsxs","P","formatCurrency"],"mappings":";;;AAiBO,MAAMA,IAA4C,CAAC;AAAA,EACxD,UAAAC,IAAW;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,IAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,MAUI,gBAAAC,EAACC,KAAE,MAAAR,GAAY,OARXC,MAGKH,IAAW,iBAAiB,iBAKF,IAAAK,GAAQ,SAAAE,GAAmB,GAAGC,GAC9D,UAAA;AAAA,EAAAF,KAAUA;AAAA,EACVK,EAAe,OAAOV,CAAM,GAAGG,KAAgB,QAAQ;AAAA,GAC1D;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { intlFormat as t } from "date-fns/intlFormat";
|
|
2
|
+
import { g as r } from "./Localization-DnoVyBNK.mjs";
|
|
3
|
+
const _ = "do", a = {
|
|
4
|
+
TIME_STAMP_HOUR_MINUTE: {
|
|
5
|
+
hour: "numeric",
|
|
6
|
+
minute: "numeric"
|
|
7
|
+
},
|
|
8
|
+
DAY: {
|
|
9
|
+
day: "numeric"
|
|
10
|
+
},
|
|
11
|
+
DAY_OF_WEEK: {
|
|
12
|
+
weekday: "long"
|
|
13
|
+
},
|
|
14
|
+
DAY_OF_WEEK_MONTH_DAY: {
|
|
15
|
+
day: "numeric",
|
|
16
|
+
month: "long",
|
|
17
|
+
weekday: "long"
|
|
18
|
+
},
|
|
19
|
+
FULL_MONTH_DAY: {
|
|
20
|
+
day: "numeric",
|
|
21
|
+
month: "long"
|
|
22
|
+
},
|
|
23
|
+
MONTH: {
|
|
24
|
+
month: "short"
|
|
25
|
+
},
|
|
26
|
+
MONTH_DAY: {
|
|
27
|
+
day: "numeric",
|
|
28
|
+
month: "short"
|
|
29
|
+
},
|
|
30
|
+
MONTH_LONG: {
|
|
31
|
+
month: "long"
|
|
32
|
+
},
|
|
33
|
+
MONTH_SHORT: {
|
|
34
|
+
month: "short"
|
|
35
|
+
},
|
|
36
|
+
MONTH_SHORT_YEAR: {
|
|
37
|
+
month: "short",
|
|
38
|
+
year: "numeric"
|
|
39
|
+
},
|
|
40
|
+
MONTH_YEAR: {
|
|
41
|
+
month: "long",
|
|
42
|
+
year: "numeric"
|
|
43
|
+
},
|
|
44
|
+
YEAR_MONTH_DAY: {
|
|
45
|
+
day: "2-digit",
|
|
46
|
+
month: "2-digit",
|
|
47
|
+
year: "numeric"
|
|
48
|
+
},
|
|
49
|
+
MONTH_DAY_YEAR: {
|
|
50
|
+
month: "short",
|
|
51
|
+
day: "2-digit",
|
|
52
|
+
year: "numeric"
|
|
53
|
+
},
|
|
54
|
+
MED_MONTH_SHORT_DAY_FULL_YEAR: {
|
|
55
|
+
month: "short",
|
|
56
|
+
day: "numeric",
|
|
57
|
+
year: "numeric"
|
|
58
|
+
}
|
|
59
|
+
}, i = (o, n) => t(new Date(o), Object.assign(n), { locale: r() });
|
|
60
|
+
export {
|
|
61
|
+
a as D,
|
|
62
|
+
_ as O,
|
|
63
|
+
i as f
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=DateFormats-HudZ3Bjs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateFormats-HudZ3Bjs.mjs","sources":["../src/core/constants/DateFormats.ts"],"sourcesContent":["import { intlFormat } from 'date-fns/intlFormat'\nimport { getLocale } from '../utils'\n\nexport const ORDINAL_DATE_FORMAT = 'do'\nexport const ORDINAL_MONTH_DAY_YEAR_FORMAT = 'MMM do, yyyy'\n\n// Documentation on the options for formatting int'l dates\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat\nexport const DATE_FORMATS_INTL = {\n TIME_STAMP_HOUR_MINUTE: {\n hour: 'numeric',\n minute: 'numeric',\n },\n DAY: {\n day: 'numeric',\n },\n DAY_OF_WEEK: {\n weekday: 'long',\n },\n DAY_OF_WEEK_MONTH_DAY: {\n day: 'numeric',\n month: 'long',\n weekday: 'long',\n },\n FULL_MONTH_DAY: {\n day: 'numeric',\n month: 'long',\n },\n MONTH: {\n month: 'short',\n },\n MONTH_DAY: {\n day: 'numeric',\n month: 'short',\n },\n MONTH_LONG: {\n month: 'long',\n },\n MONTH_SHORT: {\n month: 'short',\n },\n MONTH_SHORT_YEAR: {\n month: 'short',\n year: 'numeric',\n },\n MONTH_YEAR: {\n month: 'long',\n year: 'numeric',\n },\n YEAR_MONTH_DAY: {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n },\n MONTH_DAY_YEAR: {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n },\n MED_MONTH_SHORT_DAY_FULL_YEAR: {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n },\n}\n\nexport interface Day {\n day: string\n}\n\nexport interface DayOfWeek {\n weekday: string\n}\n\nexport interface DayOfWeekMonthDay {\n day: string\n month: string\n weekday: string\n}\n\nexport interface MonthDay {\n day: string\n month: string\n}\n\nexport interface MonthLong {\n month: string\n}\n\nexport interface MonthShort {\n month: string\n}\n\nexport interface MonthYear {\n month: string\n year: string\n}\n\nexport interface TimeStamp {\n hour: string\n minute: string\n}\n\nexport interface YearMonthDay {\n day: string\n month: string\n year: string\n}\n\nexport const formatDate = (\n date: string | Date,\n dFormat:\n | Day\n | DayOfWeek\n | DayOfWeekMonthDay\n | MonthDay\n | MonthLong\n | MonthShort\n | MonthYear\n | TimeStamp\n | YearMonthDay,\n) => intlFormat(new Date(date), Object.assign(dFormat), { locale: getLocale() })\n"],"names":["ORDINAL_DATE_FORMAT","DATE_FORMATS_INTL","formatDate","date","dFormat","intlFormat","getLocale"],"mappings":";;AAGO,MAAMA,IAAsB,MAKtBC,IAAoB;AAAA,EAC/B,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA;AAAA,EAEV,KAAK;AAAA,IACH,KAAK;AAAA,EAAA;AAAA,EAEP,aAAa;AAAA,IACX,SAAS;AAAA,EAAA;AAAA,EAEX,uBAAuB;AAAA,IACrB,KAAK;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAEX,gBAAgB;AAAA,IACd,KAAK;AAAA,IACL,OAAO;AAAA,EAAA;AAAA,EAET,OAAO;AAAA,IACL,OAAO;AAAA,EAAA;AAAA,EAET,WAAW;AAAA,IACT,KAAK;AAAA,IACL,OAAO;AAAA,EAAA;AAAA,EAET,YAAY;AAAA,IACV,OAAO;AAAA,EAAA;AAAA,EAET,aAAa;AAAA,IACX,OAAO;AAAA,EAAA;AAAA,EAET,kBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,YAAY;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,gBAAgB;AAAA,IACd,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EAAA;AAAA,EAER,+BAA+B;AAAA,IAC7B,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EAAA;AAEV,GA6CaC,IAAa,CACxBC,GACAC,MAUGC,EAAW,IAAI,KAAKF,CAAI,GAAG,OAAO,OAAOC,CAAO,GAAG,EAAE,QAAQE,EAAA,GAAa;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { addMonths as i } from "date-fns/addMonths";
|
|
2
|
+
import { addQuarters as l } from "date-fns/addQuarters";
|
|
3
|
+
import { addWeeks as x } from "date-fns/addWeeks";
|
|
4
|
+
import { addYears as T } from "date-fns/addYears";
|
|
5
|
+
import { endOfMonth as h } from "date-fns/endOfMonth";
|
|
6
|
+
import { getDay as u } from "date-fns/getDay";
|
|
7
|
+
import { isBefore as n } from "date-fns/isBefore";
|
|
8
|
+
import { nextDay as p } from "date-fns/nextDay";
|
|
9
|
+
import { setDate as d } from "date-fns/setDate";
|
|
10
|
+
import { startOfToday as r } from "date-fns/startOfToday";
|
|
11
|
+
import { fromUnixTime as c } from "date-fns/fromUnixTime";
|
|
12
|
+
import { f as y, D as g } from "./DateFormats-HudZ3Bjs.mjs";
|
|
13
|
+
const F = (e) => {
|
|
14
|
+
const t = u(e);
|
|
15
|
+
let o = p(e, t);
|
|
16
|
+
for (; n(o, r()); )
|
|
17
|
+
o = x(o, 1);
|
|
18
|
+
return o;
|
|
19
|
+
}, Q = (e) => {
|
|
20
|
+
let t = e;
|
|
21
|
+
for (; n(t, r()); )
|
|
22
|
+
t = x(t, 2);
|
|
23
|
+
return t;
|
|
24
|
+
}, M = (e, t) => {
|
|
25
|
+
const o = r(), [a, D] = [e, t].sort((m, f) => m - f), s = (m, f) => f >= 28 ? h(m) : d(m, f);
|
|
26
|
+
return [
|
|
27
|
+
s(o, a),
|
|
28
|
+
s(o, D),
|
|
29
|
+
s(i(o, 1), a),
|
|
30
|
+
s(i(o, 1), D),
|
|
31
|
+
s(i(o, 2), a),
|
|
32
|
+
s(i(o, 2), D)
|
|
33
|
+
];
|
|
34
|
+
}, H = (e, t) => {
|
|
35
|
+
const o = r(), a = M(e, t);
|
|
36
|
+
return a.find((D) => !n(D, o)) ?? a[a.length - 1];
|
|
37
|
+
}, R = (e) => {
|
|
38
|
+
let t = d(r(), e.getDate());
|
|
39
|
+
for (; n(t, r()); )
|
|
40
|
+
t = i(t, 1);
|
|
41
|
+
return t;
|
|
42
|
+
}, b = (e) => {
|
|
43
|
+
let t = e;
|
|
44
|
+
for (; n(t, r()); )
|
|
45
|
+
t = i(t, 2);
|
|
46
|
+
return t;
|
|
47
|
+
}, j = (e) => {
|
|
48
|
+
let t = l(e, 1);
|
|
49
|
+
for (; n(t, r()); )
|
|
50
|
+
t = l(t, 1);
|
|
51
|
+
return t;
|
|
52
|
+
}, I = (e) => {
|
|
53
|
+
let t = e;
|
|
54
|
+
for (; n(t, r()); )
|
|
55
|
+
t = l(t, 2);
|
|
56
|
+
return t;
|
|
57
|
+
}, K = (e) => T(e, 1), L = (e) => {
|
|
58
|
+
const t = c(e);
|
|
59
|
+
return new Date(t.getUTCFullYear(), t.getUTCMonth(), t.getUTCDate());
|
|
60
|
+
}, S = (e) => y(c(e), g.DAY_OF_WEEK_MONTH_DAY), q = (e) => e ? y(c(e), g.MONTH_YEAR) : "";
|
|
61
|
+
export {
|
|
62
|
+
I as a,
|
|
63
|
+
j as b,
|
|
64
|
+
b as c,
|
|
65
|
+
R as d,
|
|
66
|
+
H as e,
|
|
67
|
+
Q as f,
|
|
68
|
+
K as g,
|
|
69
|
+
F as h,
|
|
70
|
+
M as i,
|
|
71
|
+
L as j,
|
|
72
|
+
S as k,
|
|
73
|
+
q as l
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=DateUtil-CzBmbjmA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateUtil-CzBmbjmA.mjs","sources":["../src/core/utils/DateUtil.ts"],"sourcesContent":["import { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { getDay } from 'date-fns/getDay'\nimport { isBefore } from 'date-fns/isBefore'\nimport { nextDay } from 'date-fns/nextDay'\nimport { setDate } from 'date-fns/setDate'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { type Day } from 'date-fns/types'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\n\nexport const getNextWeeklyDate = (date: Date): Date => {\n const dayOfWeek = getDay(date)\n let nextDate = nextDay(date, dayOfWeek as Day)\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addWeeks(nextDate, 1)\n }\n return nextDate\n}\n\nexport const getNextBiWeeklyDate = (date: Date): Date => {\n let nextDate = date\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addWeeks(nextDate, 2)\n }\n return nextDate\n}\n\nexport const getTwiceMonthlyDates = (day1: number, day2: number): Date[] => {\n const today = startOfToday()\n const [firstDay, secondDay] = [day1, day2].sort((a, b) => a - b)\n const makeDateForDay = (month: Date, day: number) =>\n day >= 28 ? endOfMonth(month) : setDate(month, day)\n\n return [\n makeDateForDay(today, firstDay),\n makeDateForDay(today, secondDay),\n makeDateForDay(addMonths(today, 1), firstDay),\n makeDateForDay(addMonths(today, 1), secondDay),\n makeDateForDay(addMonths(today, 2), firstDay),\n makeDateForDay(addMonths(today, 2), secondDay),\n ]\n}\n\nexport const getNextTwiceMonthlyDate = (day1: number, day2: number): Date => {\n const today = startOfToday()\n const candidates = getTwiceMonthlyDates(day1, day2)\n return candidates.find((c) => !isBefore(c, today)) ?? candidates[candidates.length - 1]\n}\n\nexport const getNextMonthlyDate = (date: Date): Date => {\n let nextDate = setDate(startOfToday(), date.getDate())\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addMonths(nextDate, 1)\n }\n return nextDate\n}\n\nexport const getNextBiMonthlyDate = (date: Date): Date => {\n let nextDate = date\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addMonths(nextDate, 2)\n }\n return nextDate\n}\n\nexport const getNextQuarterlyDate = (date: Date): Date => {\n let nextDate = addQuarters(date, 1)\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addQuarters(nextDate, 1)\n }\n return nextDate\n}\n\nexport const getNextBiQuarterlyDate = (date: Date): Date => {\n let nextDate = date\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addQuarters(nextDate, 2)\n }\n return nextDate\n}\n\nexport const getNextYearlyDate = (date: Date): Date => {\n return addYears(date, 1)\n}\n\nexport const fromUnixUTC = (utcTime: number) => {\n const date = fromUnixTime(utcTime)\n return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())\n}\n\nexport const fromUnixToDayOfWeekAndDate = (date: number) =>\n formatDate(fromUnixTime(date), DATE_FORMATS_INTL.DAY_OF_WEEK_MONTH_DAY)\n\nexport const fromTimestampToMonthYear = (timestamp?: number) =>\n timestamp ? formatDate(fromUnixTime(timestamp), DATE_FORMATS_INTL.MONTH_YEAR) : ''\n"],"names":["getNextWeeklyDate","date","dayOfWeek","getDay","nextDate","nextDay","isBefore","startOfToday","addWeeks","getNextBiWeeklyDate","getTwiceMonthlyDates","day1","day2","today","firstDay","secondDay","a","b","makeDateForDay","month","day","endOfMonth","setDate","addMonths","getNextTwiceMonthlyDate","candidates","c","getNextMonthlyDate","getNextBiMonthlyDate","getNextQuarterlyDate","addQuarters","getNextBiQuarterlyDate","getNextYearlyDate","addYears","fromUnixUTC","utcTime","fromUnixTime","fromUnixToDayOfWeekAndDate","formatDate","DATE_FORMATS_INTL","fromTimestampToMonthYear","timestamp"],"mappings":";;;;;;;;;;;;AAeO,MAAMA,IAAoB,CAACC,MAAqB;AACrD,QAAMC,IAAYC,EAAOF,CAAI;AAC7B,MAAIG,IAAWC,EAAQJ,GAAMC,CAAgB;AAC7C,SAAOI,EAASF,GAAUG,EAAA,CAAc;AACtC,IAAAH,IAAWI,EAASJ,GAAU,CAAC;AAEjC,SAAOA;AACT,GAEaK,IAAsB,CAACR,MAAqB;AACvD,MAAIG,IAAWH;AACf,SAAOK,EAASF,GAAUG,EAAA,CAAc;AACtC,IAAAH,IAAWI,EAASJ,GAAU,CAAC;AAEjC,SAAOA;AACT,GAEaM,IAAuB,CAACC,GAAcC,MAAyB;AAC1E,QAAMC,IAAQN,EAAA,GACR,CAACO,GAAUC,CAAS,IAAI,CAACJ,GAAMC,CAAI,EAAE,KAAK,CAACI,GAAGC,MAAMD,IAAIC,CAAC,GACzDC,IAAiB,CAACC,GAAaC,MACnCA,KAAO,KAAKC,EAAWF,CAAK,IAAIG,EAAQH,GAAOC,CAAG;AAEpD,SAAO;AAAA,IACLF,EAAeL,GAAOC,CAAQ;AAAA,IAC9BI,EAAeL,GAAOE,CAAS;AAAA,IAC/BG,EAAeK,EAAUV,GAAO,CAAC,GAAGC,CAAQ;AAAA,IAC5CI,EAAeK,EAAUV,GAAO,CAAC,GAAGE,CAAS;AAAA,IAC7CG,EAAeK,EAAUV,GAAO,CAAC,GAAGC,CAAQ;AAAA,IAC5CI,EAAeK,EAAUV,GAAO,CAAC,GAAGE,CAAS;AAAA,EAAA;AAEjD,GAEaS,IAA0B,CAACb,GAAcC,MAAuB;AAC3E,QAAMC,IAAQN,EAAA,GACRkB,IAAaf,EAAqBC,GAAMC,CAAI;AAClD,SAAOa,EAAW,KAAK,CAACC,MAAM,CAACpB,EAASoB,GAAGb,CAAK,CAAC,KAAKY,EAAWA,EAAW,SAAS,CAAC;AACxF,GAEaE,IAAqB,CAAC1B,MAAqB;AACtD,MAAIG,IAAWkB,EAAQf,EAAA,GAAgBN,EAAK,SAAS;AACrD,SAAOK,EAASF,GAAUG,EAAA,CAAc;AACtC,IAAAH,IAAWmB,EAAUnB,GAAU,CAAC;AAElC,SAAOA;AACT,GAEawB,IAAuB,CAAC3B,MAAqB;AACxD,MAAIG,IAAWH;AACf,SAAOK,EAASF,GAAUG,EAAA,CAAc;AACtC,IAAAH,IAAWmB,EAAUnB,GAAU,CAAC;AAElC,SAAOA;AACT,GAEayB,IAAuB,CAAC5B,MAAqB;AACxD,MAAIG,IAAW0B,EAAY7B,GAAM,CAAC;AAClC,SAAOK,EAASF,GAAUG,EAAA,CAAc;AACtC,IAAAH,IAAW0B,EAAY1B,GAAU,CAAC;AAEpC,SAAOA;AACT,GAEa2B,IAAyB,CAAC9B,MAAqB;AAC1D,MAAIG,IAAWH;AACf,SAAOK,EAASF,GAAUG,EAAA,CAAc;AACtC,IAAAH,IAAW0B,EAAY1B,GAAU,CAAC;AAEpC,SAAOA;AACT,GAEa4B,IAAoB,CAAC/B,MACzBgC,EAAShC,GAAM,CAAC,GAGZiC,IAAc,CAACC,MAAoB;AAC9C,QAAMlC,IAAOmC,EAAaD,CAAO;AACjC,SAAO,IAAI,KAAKlC,EAAK,eAAA,GAAkBA,EAAK,YAAA,GAAeA,EAAK,YAAY;AAC9E,GAEaoC,IAA6B,CAACpC,MACzCqC,EAAWF,EAAanC,CAAI,GAAGsC,EAAkB,qBAAqB,GAE3DC,IAA2B,CAACC,MACvCA,IAAYH,EAAWF,EAAaK,CAAS,GAAGF,EAAkB,UAAU,IAAI;"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { getDate as D } from "date-fns/getDate";
|
|
2
|
+
import { addMonths as M } from "date-fns/addMonths";
|
|
3
|
+
import { fromUnixTime as d } from "date-fns/fromUnixTime";
|
|
4
|
+
import { getUnixTime as A } from "date-fns/getUnixTime";
|
|
5
|
+
import { startOfMonth as I } from "date-fns/startOfMonth";
|
|
6
|
+
import { c as w } from "./Account-DR7Plrqy.mjs";
|
|
7
|
+
const H = 12, C = 100;
|
|
8
|
+
var y = /* @__PURE__ */ ((t) => (t[t.FASTEST_PAYOFF_FIRST = 1] = "FASTEST_PAYOFF_FIRST", t[t.HIGHEST_INTEREST = 2] = "HIGHEST_INTEREST", t[t.LOWEST_BALANCE = 3] = "LOWEST_BALANCE", t[t.HIGHEST_BALANCE = 4] = "HIGHEST_BALANCE", t))(y || {});
|
|
9
|
+
const N = {
|
|
10
|
+
unnamed_label: "Unnamed Debt"
|
|
11
|
+
}, W = (t, n, e = 0) => {
|
|
12
|
+
const o = t.map((r) => ({ ...r }));
|
|
13
|
+
L(o, n);
|
|
14
|
+
const s = /* @__PURE__ */ new Date(), a = [];
|
|
15
|
+
let i = 0, m = 1;
|
|
16
|
+
for (const r of o)
|
|
17
|
+
a.push({
|
|
18
|
+
...r,
|
|
19
|
+
// Start with the initial balance
|
|
20
|
+
dataset: [{ x: new Date(s), y: r.balance }]
|
|
21
|
+
});
|
|
22
|
+
for (; o.some((r) => r.balance >= 0.01 && !r.is_impossible); ) {
|
|
23
|
+
let r = !1, _ = !1, l = !1;
|
|
24
|
+
for (const [p, c] of o.entries()) {
|
|
25
|
+
if (c.balance <= 0.01) continue;
|
|
26
|
+
const u = a[p].dataset, x = (c.interest_rate ?? 0) / 100 / 12, E = c.balance * x, T = c.monthly_payment ?? 0;
|
|
27
|
+
let S = T, h = 0;
|
|
28
|
+
!l && e > 0 && (S += e, l = !0), !_ && i > 0 && (h = i, _ = !0), c.balance += E;
|
|
29
|
+
const f = Math.min(c.balance, S + h);
|
|
30
|
+
if (f <= E) {
|
|
31
|
+
c.is_impossible = !0, a[p].is_impossible = !0, a[p].priority = void 0, u.push({ x: new Date(s), y: c.balance });
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
c.balance -= f, c.balance = c.balance < 0.01 ? 0 : c.balance, u.push({
|
|
35
|
+
x: new Date(s),
|
|
36
|
+
y: Math.max(0, c.balance),
|
|
37
|
+
payment: f,
|
|
38
|
+
extra: h
|
|
39
|
+
}), c.balance <= 0 && (i += T, a[p].projected_payoff_date = new Date(s)), f > 0 && (r = !0);
|
|
40
|
+
}
|
|
41
|
+
r && s.setMonth(s.getMonth() + 1);
|
|
42
|
+
}
|
|
43
|
+
return a.forEach((r) => {
|
|
44
|
+
(r.interest_rate === void 0 || r.monthly_payment === void 0) && (r.projected_payoff_date = void 0);
|
|
45
|
+
}), a.forEach((r) => {
|
|
46
|
+
r.priority = !r.is_paid_off && !r.is_impossible ? m++ : void 0;
|
|
47
|
+
}), a;
|
|
48
|
+
}, Y = (t, n, e) => ({
|
|
49
|
+
description: n ? t.empty_state_description : t.empty_state_description_no_aggregation,
|
|
50
|
+
header: n ? t.empty_state_header : t.empty_state_header_no_aggregation,
|
|
51
|
+
onClickHandler: n ? e : void 0,
|
|
52
|
+
primaryButton: n ? t.connect_accounts : void 0
|
|
53
|
+
});
|
|
54
|
+
function K(t, n) {
|
|
55
|
+
const e = t.filter((a) => a.account_type === w.CHECKING_LINE_OF_CREDIT ? Number(a.balance) <= 0 : a.is_excluded_from_debts !== !0), o = n.filter((a) => e.some((i) => i.guid === a.account_guid)).map(
|
|
56
|
+
(a) => F(e.find((i) => i.guid === a.account_guid), a)
|
|
57
|
+
), s = e.filter((a) => !o.some((i) => i.account.guid === a.guid)).map((a) => F(a));
|
|
58
|
+
return [...o, ...s];
|
|
59
|
+
}
|
|
60
|
+
function F(t, n) {
|
|
61
|
+
const e = { account: t, goal: n, guid: t.guid };
|
|
62
|
+
if (n) {
|
|
63
|
+
const o = n.payment_due_at ? D(d(n.payment_due_at)) : 1, s = I(/* @__PURE__ */ new Date()).setDate(o);
|
|
64
|
+
e.balance = Math.abs(n.amount - n.current_amount), e.interest_rate = n.interest_rate, e.is_paid_off = n.is_complete, e.monthly_payment = n.monthly_payment, e.name = n.name, e.original_balance = n.initial_amount, e.payment_due_date = s;
|
|
65
|
+
} else {
|
|
66
|
+
const o = t.payment_due_at ? D(d(t.payment_due_at)) : 1, s = I(/* @__PURE__ */ new Date()).setDate(o), a = t.balance ?? 0, i = t.minimum_payment ?? void 0, m = t.interest_rate ?? t.apr ?? t.apy;
|
|
67
|
+
e.balance = Math.max(a, 0), e.interest_rate = m, e.is_paid_off = a === 0, e.monthly_payment = i, e.name = t?.name ?? N.unnamed_label, e.original_balance = t.original_balance, e.payment_due_date = s;
|
|
68
|
+
}
|
|
69
|
+
return e.is_impossible = !1, e.priority = void 0, e.projected_payoff_date = void 0, e;
|
|
70
|
+
}
|
|
71
|
+
const v = (t) => (t[t.length - 1] || {}).timestamp, L = (t, n) => {
|
|
72
|
+
const [e, o] = t.reduce(
|
|
73
|
+
([s, a], i) => (i.is_paid_off || i.is_impossible ? a.push({ ...i, minimumPayments: [] }) : s.push(R(i)), [s, a]),
|
|
74
|
+
[[], []]
|
|
75
|
+
);
|
|
76
|
+
switch (n) {
|
|
77
|
+
case y.FASTEST_PAYOFF_FIRST:
|
|
78
|
+
e.sort((s, a) => (s.minimumFinalPayment ?? 0) - (a.minimumFinalPayment ?? 0));
|
|
79
|
+
break;
|
|
80
|
+
case y.HIGHEST_INTEREST:
|
|
81
|
+
e.sort((s, a) => (a.interest_rate ?? 0) - (s.interest_rate ?? 0));
|
|
82
|
+
break;
|
|
83
|
+
case y.LOWEST_BALANCE:
|
|
84
|
+
e.sort((s, a) => s.balance - a.balance);
|
|
85
|
+
break;
|
|
86
|
+
case y.HIGHEST_BALANCE:
|
|
87
|
+
e.sort((s, a) => a.balance - s.balance);
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
e.sort((s, a) => s.balance - a.balance);
|
|
91
|
+
}
|
|
92
|
+
t.splice(0, t.length, ...e, ...o);
|
|
93
|
+
}, R = (t) => {
|
|
94
|
+
const { monthly_payment: n, interest_rate: e, balance: o, payment_due_date: s } = t, a = O(o, e ?? 0, n ?? 0), i = B(
|
|
95
|
+
a,
|
|
96
|
+
o,
|
|
97
|
+
e ?? 0,
|
|
98
|
+
n ?? 0,
|
|
99
|
+
s
|
|
100
|
+
), m = v(i);
|
|
101
|
+
return {
|
|
102
|
+
...t,
|
|
103
|
+
minimumFinalPayment: m,
|
|
104
|
+
minimumPayments: i
|
|
105
|
+
};
|
|
106
|
+
}, O = (t, n = 0, e = 0) => {
|
|
107
|
+
if (e === 0) return 0;
|
|
108
|
+
const o = n / (H * C);
|
|
109
|
+
return Math.ceil(
|
|
110
|
+
o === 0 ? t / e : -Math.log(1 - o * t / e) / Math.log(1 + o)
|
|
111
|
+
);
|
|
112
|
+
}, B = (t, n, e, o, s) => {
|
|
113
|
+
const a = [];
|
|
114
|
+
if (e === 0) {
|
|
115
|
+
for (let m = 0; m < t; m++) {
|
|
116
|
+
const r = n - o * (m + 1), _ = n - o * m, l = r >= 0 ? o : _;
|
|
117
|
+
a.push({
|
|
118
|
+
balance: r >= 0 ? r : 0,
|
|
119
|
+
interest: e,
|
|
120
|
+
payment: l,
|
|
121
|
+
principal: l,
|
|
122
|
+
timestamp: A(
|
|
123
|
+
M(
|
|
124
|
+
d(s),
|
|
125
|
+
// convert seconds → Date
|
|
126
|
+
m + 1
|
|
127
|
+
// add (index + 1) months
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return a;
|
|
133
|
+
}
|
|
134
|
+
const i = e / 1200;
|
|
135
|
+
for (let m = 0; m < t; m++) {
|
|
136
|
+
const r = A(M(d(s), m + 1)), _ = Math.pow(1 + i, m), l = n * _ - o * ((_ - 1) / i), p = Math.pow(1 + i, m + 1), c = n * p - o * ((p - 1) / i), u = o + Math.min(c, 0), b = l * i;
|
|
137
|
+
a.push({
|
|
138
|
+
balance: Math.max(0, c),
|
|
139
|
+
interest: b,
|
|
140
|
+
payment: u,
|
|
141
|
+
principal: u - b,
|
|
142
|
+
timestamp: r
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return a;
|
|
146
|
+
};
|
|
147
|
+
export {
|
|
148
|
+
y as D,
|
|
149
|
+
Y as b,
|
|
150
|
+
K as l,
|
|
151
|
+
L as s,
|
|
152
|
+
W as t
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=DebtUtils-i4pI2Uoe.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DebtUtils-i4pI2Uoe.mjs","sources":["../src/core/constants/Debts.ts","../src/core/utils/DebtUtils.ts"],"sourcesContent":["export const MONTHS = 12\nexport const INTEREST_TO_DECIMAL = 100\n\nexport enum DebtPriority {\n FASTEST_PAYOFF_FIRST = 1,\n HIGHEST_INTEREST = 2,\n LOWEST_BALANCE = 3,\n HIGHEST_BALANCE = 4,\n}\n","import { getDate } from 'date-fns/getDate'\nimport { addMonths } from 'date-fns/addMonths'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport { DebtPriority, INTEREST_TO_DECIMAL, MONTHS } from '../constants/Debts'\nimport { AccountType, type Account, type Debt, type DebtsCopy, type Goal } from '../types'\n\nconst copy = {\n unnamed_label: 'Unnamed Debt',\n}\n\ntype DataPoint = { x: Date; y: number; payment?: number; extra?: number }\ntype Dataset = DataPoint[]\n\nexport interface DebtChartData extends Debt {\n dataset: Dataset\n}\n\ninterface MonthlyPayment {\n balance: number\n interest: number\n payment: number\n principal: number\n timestamp: number\n}\n\ninterface DebtWithPayments extends Debt {\n minimumPayments: MonthlyPayment[]\n minimumFinalPayment?: number | undefined\n}\n\nexport const transformDebtsChartData = (\n debts: Debt[],\n debtPriority: DebtPriority,\n extraPaydown = 0,\n): DebtChartData[] => {\n // Copy debts to avoid overwiting balance during payoff calculation\n const sortedDebts = debts.map((d) => ({ ...d }))\n sortDebtsByPrioriy(sortedDebts, debtPriority)\n\n const currentDate = new Date()\n const chartData: DebtChartData[] = []\n let monthlyExtra = 0\n let priorityCounter = 1\n\n // Initialize chartData for each debt\n for (const debt of sortedDebts) {\n chartData.push({\n ...debt,\n // Start with the initial balance\n dataset: [{ x: new Date(currentDate), y: debt.balance }],\n })\n }\n\n // Process debts using the Snowball method\n while (sortedDebts.some((debt) => debt.balance >= 0.01 && !debt.is_impossible)) {\n let madePayment = false // Track if any payment was made this month\n let hasAppliedSnowballExtra = false // Track if snowball extra has been applied this month\n let hasAppliedExtraPaydown = false // Track if extraPaydown has been applied this month\n\n for (const [index, debt] of sortedDebts.entries()) {\n // Skip if debt is already paid off\n if (debt.balance <= 0.01) continue\n\n const dataset = chartData[index].dataset\n const interestRate = (debt.interest_rate ?? 0) / 100\n const monthlyRate = interestRate / 12\n const monthlyInterest = debt.balance * monthlyRate\n const baseMonthlyPayment = debt.monthly_payment ?? 0\n let monthlyPayment = baseMonthlyPayment\n let extraThisMonth = 0\n\n // Add extra payment to the highest priority unpaid debt (first unpaid debt in sorted order)\n if (!hasAppliedExtraPaydown && extraPaydown > 0) {\n monthlyPayment += extraPaydown\n hasAppliedExtraPaydown = true\n }\n\n // Add snowball extra payment to the highest priority unpaid debt\n if (!hasAppliedSnowballExtra && monthlyExtra > 0) {\n extraThisMonth = monthlyExtra\n hasAppliedSnowballExtra = true\n }\n\n // Apply interest before payment\n debt.balance += monthlyInterest\n // Apply monthly payment with any extra payment from snowball\n const appliedPayment = Math.min(debt.balance, monthlyPayment + extraThisMonth)\n\n // If payment doesn't reduce balance, mark as stagnant\n if (appliedPayment <= monthlyInterest) {\n debt.is_impossible = true\n chartData[index].is_impossible = true\n chartData[index].priority = undefined\n dataset.push({ x: new Date(currentDate), y: debt.balance })\n continue\n }\n\n debt.balance -= appliedPayment\n // Avoid floating-point precision issues\n debt.balance = debt.balance < 0.01 ? 0 : debt.balance\n // Add a data point for the current debt balance\n dataset.push({\n x: new Date(currentDate),\n y: Math.max(0, debt.balance),\n payment: appliedPayment,\n extra: extraThisMonth,\n })\n\n // Roll over payments when debt gets paid off (snowball effect)\n // Only roll over the base monthly payment to avoid double-counting extraPaydown\n if (debt.balance <= 0) {\n monthlyExtra += baseMonthlyPayment\n chartData[index].projected_payoff_date = new Date(currentDate)\n }\n\n if (appliedPayment > 0) madePayment = true\n }\n\n if (madePayment) currentDate.setMonth(currentDate.getMonth() + 1)\n }\n\n // Don't project a debt as paid off until missing info is provided\n chartData.forEach((d) => {\n if (d.interest_rate === undefined || d.monthly_payment === undefined) {\n d.projected_payoff_date = undefined\n }\n })\n\n // Set priorities after all calculations\n chartData.forEach((debt) => {\n debt.priority = !debt.is_paid_off && !debt.is_impossible ? priorityCounter++ : undefined\n })\n\n return chartData\n}\n\nexport const buildEmptyStateProps = (\n copy: DebtsCopy,\n hasAggregation: boolean,\n handler: () => void,\n) => ({\n description: hasAggregation\n ? copy.empty_state_description\n : copy.empty_state_description_no_aggregation,\n header: hasAggregation ? copy.empty_state_header : copy.empty_state_header_no_aggregation,\n onClickHandler: hasAggregation ? handler : undefined,\n primaryButton: hasAggregation ? copy.connect_accounts : undefined,\n})\n\nexport function loadDebts(accounts: Account[], goals: Goal[]): Debt[] {\n const debtAccounts = accounts.filter((acc) => {\n // Exclude checking line of credit accounts with positive balance\n // Q: Because CLOC spending is represented by negative? (this logic is from raja)\n if (acc.account_type === AccountType.CHECKING_LINE_OF_CREDIT) {\n return Number(acc.balance) <= 0\n }\n // Exclude explicity excluded acccounts\n return acc.is_excluded_from_debts !== true\n })\n\n // Creat debts with associated goals\n const goalDebts = goals\n .filter((goal) => debtAccounts.some((acc) => acc.guid === goal.account_guid))\n .map((goal) =>\n createDebt(debtAccounts.find((acc) => acc.guid === goal.account_guid) as Account, goal),\n )\n\n // Create debts without associated goals, but are based on liabity accounts\n const liabilityDebts = debtAccounts\n .filter((acc) => !goalDebts.some((debt) => debt.account.guid === acc.guid))\n .map((account) => createDebt(account))\n\n return [...goalDebts, ...liabilityDebts]\n}\n\nexport function createDebt(account: Account, goal?: Goal): Debt {\n const debt = { account, goal, guid: account.guid } as Debt\n\n if (goal) {\n // Derive next payment date; default to 1st of month\n const paymentDay = goal.payment_due_at ? getDate(fromUnixTime(goal.payment_due_at)) : 1\n const paymentDueDate = startOfMonth(new Date()).setDate(paymentDay)\n\n debt.balance = Math.abs(goal.amount - goal.current_amount)\n debt.interest_rate = goal.interest_rate\n debt.is_paid_off = goal.is_complete\n debt.monthly_payment = goal.monthly_payment\n debt.name = goal.name\n debt.original_balance = goal.initial_amount // TODO: Does a debt need this?\n debt.payment_due_date = paymentDueDate\n } else {\n // Derive next payment date; default to 1st of month\n const paymentDay = account.payment_due_at ? getDate(fromUnixTime(account.payment_due_at)) : 1\n const paymentDueDate = startOfMonth(new Date()).setDate(paymentDay)\n const balance = account.balance ?? 0\n const monthlyPayment = account.minimum_payment ?? undefined\n const rate = account.interest_rate ?? account.apr ?? account.apy\n\n debt.balance = Math.max(balance, 0) // Don't use overpaid/negative balances for debt calculations\n debt.interest_rate = rate\n debt.is_paid_off = balance === 0\n debt.monthly_payment = monthlyPayment\n debt.name = account?.name ?? copy.unnamed_label\n debt.original_balance = account.original_balance // TODO: Does a debt need this?\n debt.payment_due_date = paymentDueDate\n }\n\n debt.is_impossible = false\n debt.priority = undefined\n debt.projected_payoff_date = undefined\n\n return debt\n}\n\nexport const calculateFinalPayment = (monthlyPayments: MonthlyPayment[]) => {\n const lastPayment = monthlyPayments[monthlyPayments.length - 1] || {}\n\n return lastPayment.timestamp\n}\n\n// Sorts (in place) the passed debts array, according to the given priority\nexport const sortDebtsByPrioriy = (debts: Debt[], debtPriority: DebtPriority) => {\n // Separate valid debts that can be prioritized from those that can't be\n\n const [activeDebts, inactiveDebts] = debts.reduce<[DebtWithPayments[], DebtWithPayments[]]>(\n ([active, inactive], debt) => {\n if (debt.is_paid_off || debt.is_impossible) {\n inactive.push({ ...debt, minimumPayments: [] })\n } else {\n active.push(calculateMinimumPayments(debt))\n }\n return [active, inactive]\n },\n [[], []],\n )\n\n switch (debtPriority) {\n case DebtPriority.FASTEST_PAYOFF_FIRST:\n activeDebts.sort((a, b) => (a.minimumFinalPayment ?? 0) - (b.minimumFinalPayment ?? 0))\n break\n case DebtPriority.HIGHEST_INTEREST:\n activeDebts.sort((a, b) => (b.interest_rate ?? 0) - (a.interest_rate ?? 0))\n break\n case DebtPriority.LOWEST_BALANCE:\n activeDebts.sort((a, b) => a.balance - b.balance)\n break\n case DebtPriority.HIGHEST_BALANCE:\n activeDebts.sort((a, b) => b.balance - a.balance)\n break\n default:\n activeDebts.sort((a, b) => a.balance - b.balance) // Default to lowest balance\n }\n\n // Reorder debts to begin with sorted/active and end with paid/impossible\n debts.splice(0, debts.length, ...activeDebts, ...inactiveDebts)\n}\n\nconst calculateMinimumPayments = (debt: Debt): DebtWithPayments => {\n const { monthly_payment, interest_rate, balance, payment_due_date } = debt\n const paymentCount = getPaymentCount(balance, interest_rate ?? 0, monthly_payment ?? 0)\n\n const minimumPayments = getMonthlyPayments(\n paymentCount,\n balance,\n interest_rate ?? 0,\n monthly_payment ?? 0,\n payment_due_date,\n )\n\n const minimumFinalPayment = calculateFinalPayment(minimumPayments)\n\n return {\n ...debt,\n minimumFinalPayment,\n minimumPayments,\n }\n}\n\nconst getPaymentCount = (\n balance: number,\n interestRate: number | undefined = 0,\n minimumPayment: number | undefined = 0,\n) => {\n if (minimumPayment === 0) return 0\n\n const monthlyInterestRate = interestRate / (MONTHS * INTEREST_TO_DECIMAL)\n\n return Math.ceil(\n monthlyInterestRate === 0\n ? balance / minimumPayment\n : -Math.log(1 - (monthlyInterestRate * balance) / minimumPayment) /\n Math.log(1 + monthlyInterestRate),\n )\n}\n\nconst getMonthlyPayments = (\n paymentCount: number,\n startingBalance: number,\n interestRate: number,\n scheduledPayment: number,\n startingDate: number,\n) => {\n const monthlyPayments = []\n // If the interest rate is zero, getting the monthly payment is easier, so\n // keep its logic separate from actual interest rate calculations.\n\n if (interestRate === 0) {\n for (let i = 0; i < paymentCount; i++) {\n const newBalance = startingBalance - scheduledPayment * (i + 1)\n const prevBalance = startingBalance - scheduledPayment * i\n const payment = newBalance >= 0 ? scheduledPayment : prevBalance\n monthlyPayments.push({\n balance: newBalance >= 0 ? newBalance : 0,\n interest: interestRate,\n payment,\n principal: payment,\n timestamp: getUnixTime(\n addMonths(\n fromUnixTime(startingDate), // convert seconds → Date\n i + 1, // add (index + 1) months\n ),\n ),\n })\n }\n return monthlyPayments\n }\n const monthlyRate = interestRate / 1200\n\n for (let index = 0; index < paymentCount; index++) {\n const timestamp = getUnixTime(addMonths(fromUnixTime(startingDate), index + 1))\n\n const priorPow = Math.pow(1 + monthlyRate, index)\n const priorBalance =\n startingBalance * priorPow - scheduledPayment * ((priorPow - 1) / monthlyRate)\n\n const pow = Math.pow(1 + monthlyRate, index + 1)\n const balance = startingBalance * pow - scheduledPayment * ((pow - 1) / monthlyRate)\n\n const payment = scheduledPayment + Math.min(balance, 0)\n const interest = priorBalance * monthlyRate\n\n monthlyPayments.push({\n balance: Math.max(0, balance),\n interest,\n payment,\n principal: payment - interest,\n timestamp,\n })\n }\n\n return monthlyPayments\n}\n"],"names":["MONTHS","INTEREST_TO_DECIMAL","DebtPriority","copy","transformDebtsChartData","debts","debtPriority","extraPaydown","sortedDebts","d","sortDebtsByPrioriy","currentDate","chartData","monthlyExtra","priorityCounter","debt","madePayment","hasAppliedSnowballExtra","hasAppliedExtraPaydown","index","dataset","monthlyRate","monthlyInterest","baseMonthlyPayment","monthlyPayment","extraThisMonth","appliedPayment","buildEmptyStateProps","hasAggregation","handler","loadDebts","accounts","goals","debtAccounts","acc","AccountType","goalDebts","goal","createDebt","liabilityDebts","account","paymentDay","getDate","fromUnixTime","paymentDueDate","startOfMonth","balance","rate","calculateFinalPayment","monthlyPayments","activeDebts","inactiveDebts","active","inactive","calculateMinimumPayments","a","b","monthly_payment","interest_rate","payment_due_date","paymentCount","getPaymentCount","minimumPayments","getMonthlyPayments","minimumFinalPayment","interestRate","minimumPayment","monthlyInterestRate","startingBalance","scheduledPayment","startingDate","i","newBalance","prevBalance","payment","getUnixTime","addMonths","timestamp","priorPow","priorBalance","pow","interest"],"mappings":";;;;;;AAAO,MAAMA,IAAS,IACTC,IAAsB;AAE5B,IAAKC,sBAAAA,OACVA,EAAAA,EAAA,uBAAuB,CAAA,IAAvB,wBACAA,EAAAA,EAAA,mBAAmB,CAAA,IAAnB,oBACAA,EAAAA,EAAA,iBAAiB,CAAA,IAAjB,kBACAA,EAAAA,EAAA,kBAAkB,CAAA,IAAlB,mBAJUA,IAAAA,KAAA,CAAA,CAAA;ACMZ,MAAMC,IAAO;AAAA,EACX,eAAe;AACjB,GAsBaC,IAA0B,CACrCC,GACAC,GACAC,IAAe,MACK;AAEpB,QAAMC,IAAcH,EAAM,IAAI,CAACI,OAAO,EAAE,GAAGA,IAAI;AAC/C,EAAAC,EAAmBF,GAAaF,CAAY;AAE5C,QAAMK,wBAAkB,KAAA,GAClBC,IAA6B,CAAA;AACnC,MAAIC,IAAe,GACfC,IAAkB;AAGtB,aAAWC,KAAQP;AACjB,IAAAI,EAAU,KAAK;AAAA,MACb,GAAGG;AAAA;AAAA,MAEH,SAAS,CAAC,EAAE,GAAG,IAAI,KAAKJ,CAAW,GAAG,GAAGI,EAAK,QAAA,CAAS;AAAA,IAAA,CACxD;AAIH,SAAOP,EAAY,KAAK,CAACO,MAASA,EAAK,WAAW,QAAQ,CAACA,EAAK,aAAa,KAAG;AAC9E,QAAIC,IAAc,IACdC,IAA0B,IAC1BC,IAAyB;AAE7B,eAAW,CAACC,GAAOJ,CAAI,KAAKP,EAAY,WAAW;AAEjD,UAAIO,EAAK,WAAW,KAAM;AAE1B,YAAMK,IAAUR,EAAUO,CAAK,EAAE,SAE3BE,KADgBN,EAAK,iBAAiB,KAAK,MACd,IAC7BO,IAAkBP,EAAK,UAAUM,GACjCE,IAAqBR,EAAK,mBAAmB;AACnD,UAAIS,IAAiBD,GACjBE,IAAiB;AAGrB,MAAI,CAACP,KAA0BX,IAAe,MAC5CiB,KAAkBjB,GAClBW,IAAyB,KAIvB,CAACD,KAA2BJ,IAAe,MAC7CY,IAAiBZ,GACjBI,IAA0B,KAI5BF,EAAK,WAAWO;AAEhB,YAAMI,IAAiB,KAAK,IAAIX,EAAK,SAASS,IAAiBC,CAAc;AAG7E,UAAIC,KAAkBJ,GAAiB;AACrC,QAAAP,EAAK,gBAAgB,IACrBH,EAAUO,CAAK,EAAE,gBAAgB,IACjCP,EAAUO,CAAK,EAAE,WAAW,QAC5BC,EAAQ,KAAK,EAAE,GAAG,IAAI,KAAKT,CAAW,GAAG,GAAGI,EAAK,SAAS;AAC1D;AAAA,MACF;AAEA,MAAAA,EAAK,WAAWW,GAEhBX,EAAK,UAAUA,EAAK,UAAU,OAAO,IAAIA,EAAK,SAE9CK,EAAQ,KAAK;AAAA,QACX,GAAG,IAAI,KAAKT,CAAW;AAAA,QACvB,GAAG,KAAK,IAAI,GAAGI,EAAK,OAAO;AAAA,QAC3B,SAASW;AAAA,QACT,OAAOD;AAAA,MAAA,CACR,GAIGV,EAAK,WAAW,MAClBF,KAAgBU,GAChBX,EAAUO,CAAK,EAAE,wBAAwB,IAAI,KAAKR,CAAW,IAG3De,IAAiB,MAAGV,IAAc;AAAA,IACxC;AAEA,IAAIA,KAAaL,EAAY,SAASA,EAAY,SAAA,IAAa,CAAC;AAAA,EAClE;AAGA,SAAAC,EAAU,QAAQ,CAACH,MAAM;AACvB,KAAIA,EAAE,kBAAkB,UAAaA,EAAE,oBAAoB,YACzDA,EAAE,wBAAwB;AAAA,EAE9B,CAAC,GAGDG,EAAU,QAAQ,CAACG,MAAS;AAC1B,IAAAA,EAAK,WAAW,CAACA,EAAK,eAAe,CAACA,EAAK,gBAAgBD,MAAoB;AAAA,EACjF,CAAC,GAEMF;AACT,GAEae,IAAuB,CAClCxB,GACAyB,GACAC,OACI;AAAA,EACJ,aAAaD,IACTzB,EAAK,0BACLA,EAAK;AAAA,EACT,QAAQyB,IAAiBzB,EAAK,qBAAqBA,EAAK;AAAA,EACxD,gBAAgByB,IAAiBC,IAAU;AAAA,EAC3C,eAAeD,IAAiBzB,EAAK,mBAAmB;AAC1D;AAEO,SAAS2B,EAAUC,GAAqBC,GAAuB;AACpE,QAAMC,IAAeF,EAAS,OAAO,CAACG,MAGhCA,EAAI,iBAAiBC,EAAY,0BAC5B,OAAOD,EAAI,OAAO,KAAK,IAGzBA,EAAI,2BAA2B,EACvC,GAGKE,IAAYJ,EACf,OAAO,CAACK,MAASJ,EAAa,KAAK,CAACC,MAAQA,EAAI,SAASG,EAAK,YAAY,CAAC,EAC3E;AAAA,IAAI,CAACA,MACJC,EAAWL,EAAa,KAAK,CAACC,MAAQA,EAAI,SAASG,EAAK,YAAY,GAAcA,CAAI;AAAA,EAAA,GAIpFE,IAAiBN,EACpB,OAAO,CAACC,MAAQ,CAACE,EAAU,KAAK,CAACrB,MAASA,EAAK,QAAQ,SAASmB,EAAI,IAAI,CAAC,EACzE,IAAI,CAACM,MAAYF,EAAWE,CAAO,CAAC;AAEvC,SAAO,CAAC,GAAGJ,GAAW,GAAGG,CAAc;AACzC;AAEO,SAASD,EAAWE,GAAkBH,GAAmB;AAC9D,QAAMtB,IAAO,EAAE,SAAAyB,GAAS,MAAAH,GAAM,MAAMG,EAAQ,KAAA;AAE5C,MAAIH,GAAM;AAER,UAAMI,IAAaJ,EAAK,iBAAiBK,EAAQC,EAAaN,EAAK,cAAc,CAAC,IAAI,GAChFO,IAAiBC,EAAa,oBAAI,MAAM,EAAE,QAAQJ,CAAU;AAElE,IAAA1B,EAAK,UAAU,KAAK,IAAIsB,EAAK,SAASA,EAAK,cAAc,GACzDtB,EAAK,gBAAgBsB,EAAK,eAC1BtB,EAAK,cAAcsB,EAAK,aACxBtB,EAAK,kBAAkBsB,EAAK,iBAC5BtB,EAAK,OAAOsB,EAAK,MACjBtB,EAAK,mBAAmBsB,EAAK,gBAC7BtB,EAAK,mBAAmB6B;AAAA,EAC1B,OAAO;AAEL,UAAMH,IAAaD,EAAQ,iBAAiBE,EAAQC,EAAaH,EAAQ,cAAc,CAAC,IAAI,GACtFI,IAAiBC,EAAa,oBAAI,MAAM,EAAE,QAAQJ,CAAU,GAC5DK,IAAUN,EAAQ,WAAW,GAC7BhB,IAAiBgB,EAAQ,mBAAmB,QAC5CO,IAAOP,EAAQ,iBAAiBA,EAAQ,OAAOA,EAAQ;AAE7D,IAAAzB,EAAK,UAAU,KAAK,IAAI+B,GAAS,CAAC,GAClC/B,EAAK,gBAAgBgC,GACrBhC,EAAK,cAAc+B,MAAY,GAC/B/B,EAAK,kBAAkBS,GACvBT,EAAK,OAAOyB,GAAS,QAAQrC,EAAK,eAClCY,EAAK,mBAAmByB,EAAQ,kBAChCzB,EAAK,mBAAmB6B;AAAA,EAC1B;AAEA,SAAA7B,EAAK,gBAAgB,IACrBA,EAAK,WAAW,QAChBA,EAAK,wBAAwB,QAEtBA;AACT;AAEO,MAAMiC,IAAwB,CAACC,OAChBA,EAAgBA,EAAgB,SAAS,CAAC,KAAK,CAAA,GAEhD,WAIRvC,IAAqB,CAACL,GAAeC,MAA+B;AAG/E,QAAM,CAAC4C,GAAaC,CAAa,IAAI9C,EAAM;AAAA,IACzC,CAAC,CAAC+C,GAAQC,CAAQ,GAAGtC,OACfA,EAAK,eAAeA,EAAK,gBAC3BsC,EAAS,KAAK,EAAE,GAAGtC,GAAM,iBAAiB,CAAA,GAAI,IAE9CqC,EAAO,KAAKE,EAAyBvC,CAAI,CAAC,GAErC,CAACqC,GAAQC,CAAQ;AAAA,IAE1B,CAAC,CAAA,GAAI,CAAA,CAAE;AAAA,EAAA;AAGT,UAAQ/C,GAAA;AAAA,IACN,KAAKJ,EAAa;AAChB,MAAAgD,EAAY,KAAK,CAACK,GAAGC,OAAOD,EAAE,uBAAuB,MAAMC,EAAE,uBAAuB,EAAE;AACtF;AAAA,IACF,KAAKtD,EAAa;AAChB,MAAAgD,EAAY,KAAK,CAACK,GAAGC,OAAOA,EAAE,iBAAiB,MAAMD,EAAE,iBAAiB,EAAE;AAC1E;AAAA,IACF,KAAKrD,EAAa;AAChB,MAAAgD,EAAY,KAAK,CAACK,GAAGC,MAAMD,EAAE,UAAUC,EAAE,OAAO;AAChD;AAAA,IACF,KAAKtD,EAAa;AAChB,MAAAgD,EAAY,KAAK,CAACK,GAAGC,MAAMA,EAAE,UAAUD,EAAE,OAAO;AAChD;AAAA,IACF;AACE,MAAAL,EAAY,KAAK,CAACK,GAAGC,MAAMD,EAAE,UAAUC,EAAE,OAAO;AAAA,EAAA;AAIpD,EAAAnD,EAAM,OAAO,GAAGA,EAAM,QAAQ,GAAG6C,GAAa,GAAGC,CAAa;AAChE,GAEMG,IAA2B,CAACvC,MAAiC;AACjE,QAAM,EAAE,iBAAA0C,GAAiB,eAAAC,GAAe,SAAAZ,GAAS,kBAAAa,MAAqB5C,GAChE6C,IAAeC,EAAgBf,GAASY,KAAiB,GAAGD,KAAmB,CAAC,GAEhFK,IAAkBC;AAAA,IACtBH;AAAA,IACAd;AAAA,IACAY,KAAiB;AAAA,IACjBD,KAAmB;AAAA,IACnBE;AAAA,EAAA,GAGIK,IAAsBhB,EAAsBc,CAAe;AAEjE,SAAO;AAAA,IACL,GAAG/C;AAAA,IACH,qBAAAiD;AAAA,IACA,iBAAAF;AAAA,EAAA;AAEJ,GAEMD,IAAkB,CACtBf,GACAmB,IAAmC,GACnCC,IAAqC,MAClC;AACH,MAAIA,MAAmB,EAAG,QAAO;AAEjC,QAAMC,IAAsBF,KAAgBjE,IAASC;AAErD,SAAO,KAAK;AAAA,IACVkE,MAAwB,IACpBrB,IAAUoB,IACV,CAAC,KAAK,IAAI,IAAKC,IAAsBrB,IAAWoB,CAAc,IAC5D,KAAK,IAAI,IAAIC,CAAmB;AAAA,EAAA;AAE1C,GAEMJ,IAAqB,CACzBH,GACAQ,GACAH,GACAI,GACAC,MACG;AACH,QAAMrB,IAAkB,CAAA;AAIxB,MAAIgB,MAAiB,GAAG;AACtB,aAASM,IAAI,GAAGA,IAAIX,GAAcW,KAAK;AACrC,YAAMC,IAAaJ,IAAkBC,KAAoBE,IAAI,IACvDE,IAAcL,IAAkBC,IAAmBE,GACnDG,IAAUF,KAAc,IAAIH,IAAmBI;AACrD,MAAAxB,EAAgB,KAAK;AAAA,QACnB,SAASuB,KAAc,IAAIA,IAAa;AAAA,QACxC,UAAUP;AAAA,QACV,SAAAS;AAAA,QACA,WAAWA;AAAA,QACX,WAAWC;AAAA,UACTC;AAAA,YACEjC,EAAa2B,CAAY;AAAA;AAAA,YACzBC,IAAI;AAAA;AAAA,UAAA;AAAA,QACN;AAAA,MACF,CACD;AAAA,IACH;AACA,WAAOtB;AAAA,EACT;AACA,QAAM5B,IAAc4C,IAAe;AAEnC,WAAS9C,IAAQ,GAAGA,IAAQyC,GAAczC,KAAS;AACjD,UAAM0D,IAAYF,EAAYC,EAAUjC,EAAa2B,CAAY,GAAGnD,IAAQ,CAAC,CAAC,GAExE2D,IAAW,KAAK,IAAI,IAAIzD,GAAaF,CAAK,GAC1C4D,IACJX,IAAkBU,IAAWT,MAAqBS,IAAW,KAAKzD,IAE9D2D,IAAM,KAAK,IAAI,IAAI3D,GAAaF,IAAQ,CAAC,GACzC2B,IAAUsB,IAAkBY,IAAMX,MAAqBW,IAAM,KAAK3D,IAElEqD,IAAUL,IAAmB,KAAK,IAAIvB,GAAS,CAAC,GAChDmC,IAAWF,IAAe1D;AAEhC,IAAA4B,EAAgB,KAAK;AAAA,MACnB,SAAS,KAAK,IAAI,GAAGH,CAAO;AAAA,MAC5B,UAAAmC;AAAA,MACA,SAAAP;AAAA,MACA,WAAWA,IAAUO;AAAA,MACrB,WAAAJ;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO5B;AACT;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx as i, jsxs as x } from "react/jsx-runtime";
|
|
2
|
+
import y from "@mui/material/Dialog";
|
|
3
|
+
import P from "@mui/material/DialogContent";
|
|
4
|
+
import { DialogHeader as S, DialogFooter as A } from "@mxenabled/mxui";
|
|
5
|
+
import { u as M } from "./useScreenSize-mWpmnh5w.mjs";
|
|
6
|
+
const W = ({
|
|
7
|
+
className: l,
|
|
8
|
+
copy: o,
|
|
9
|
+
disablePrimaryButton: t = !1,
|
|
10
|
+
isOpen: n = !1,
|
|
11
|
+
onClose: a,
|
|
12
|
+
onPrimaryAction: s,
|
|
13
|
+
primaryColor: c = "primary",
|
|
14
|
+
primaryText: m = "Confirm",
|
|
15
|
+
onSecondaryAction: e,
|
|
16
|
+
secondaryColor: p = "primary",
|
|
17
|
+
secondaryText: d = "Cancel",
|
|
18
|
+
children: g,
|
|
19
|
+
...f
|
|
20
|
+
}) => {
|
|
21
|
+
const r = o?.title ?? "", u = o?.close_aria ?? "Close", { isSmallMobile: h } = M(), D = () => {
|
|
22
|
+
s?.(), a();
|
|
23
|
+
}, b = () => {
|
|
24
|
+
e && e(), a();
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ i("div", { className: `mx-cmn-dialog ${l}`, children: /* @__PURE__ */ x(
|
|
27
|
+
y,
|
|
28
|
+
{
|
|
29
|
+
"aria-label": r,
|
|
30
|
+
"aria-labelledby": void 0,
|
|
31
|
+
maxWidth: "xs",
|
|
32
|
+
onClose: a,
|
|
33
|
+
open: n,
|
|
34
|
+
slotProps: {
|
|
35
|
+
paper: { "aria-label": r }
|
|
36
|
+
},
|
|
37
|
+
sx: {
|
|
38
|
+
"& .MuiDialog-paperScrollPaper": {
|
|
39
|
+
backgroundColor: "background.default"
|
|
40
|
+
},
|
|
41
|
+
...h && { "& .MuiDialog-paper": { minWidth: "100%" } },
|
|
42
|
+
height: "100%"
|
|
43
|
+
},
|
|
44
|
+
...f,
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ i(S, { copy: { title: r, close_aria: u }, onClose: a, truncate: !0 }),
|
|
47
|
+
/* @__PURE__ */ i(P, { sx: { lineHeight: 1.5 }, children: g }),
|
|
48
|
+
/* @__PURE__ */ i(
|
|
49
|
+
A,
|
|
50
|
+
{
|
|
51
|
+
isPrimaryDisabled: t,
|
|
52
|
+
onPrimaryAction: D,
|
|
53
|
+
onSecondaryAction: b,
|
|
54
|
+
primaryColor: c,
|
|
55
|
+
primaryText: m,
|
|
56
|
+
secondaryColor: p,
|
|
57
|
+
secondaryText: d
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
) });
|
|
63
|
+
};
|
|
64
|
+
export {
|
|
65
|
+
W as D
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=Dialog-Bvd2n8hz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog-Bvd2n8hz.mjs","sources":["../src/common/components/dialog/Dialog.tsx"],"sourcesContent":["import React from 'react'\n\nimport MuiDialog from '@mui/material/Dialog'\nimport { DialogProps as MuiDialogProps } from '@mui/material/Dialog'\nimport DialogContent from '@mui/material/DialogContent'\n\nimport { DialogFooter, DialogHeader } from '@mxenabled/mxui'\nimport { useScreenSize } from '../../hooks'\n\nexport type CopyObject = {\n close_aria?: string\n title: string\n}\n\nexport interface DialogProps extends Omit<MuiDialogProps, 'open'> {\n className?: string\n copy: CopyObject\n disablePrimaryButton?: boolean\n isOpen: boolean\n onClose: () => void\n onPrimaryAction?: () => void\n onSecondaryAction?: () => void\n primaryColor?: 'primary' | 'inherit' | 'secondary' | 'success' | 'error' | 'info' | 'warning'\n primaryText?: string\n secondaryColor?: 'primary' | 'inherit' | 'secondary' | 'success' | 'error' | 'info' | 'warning'\n secondaryText?: string\n}\n\nconst Dialog: React.FC<React.PropsWithChildren<DialogProps>> = ({\n className,\n copy,\n disablePrimaryButton = false,\n isOpen = false,\n onClose,\n onPrimaryAction,\n primaryColor = 'primary',\n primaryText = 'Confirm',\n onSecondaryAction,\n secondaryColor = 'primary',\n secondaryText = 'Cancel',\n children,\n ...rest\n}) => {\n const title = copy?.title ?? ''\n const closeAria = copy?.close_aria ?? 'Close'\n\n const { isSmallMobile } = useScreenSize()\n\n const handlePrimaryAction = () => {\n onPrimaryAction?.()\n onClose()\n }\n\n const handleSecondaryAction = () => {\n if (onSecondaryAction) {\n onSecondaryAction()\n }\n onClose()\n }\n\n return (\n <div className={`mx-cmn-dialog ${className}`}>\n <MuiDialog\n aria-label={title}\n aria-labelledby={undefined}\n maxWidth=\"xs\"\n onClose={onClose}\n open={isOpen}\n slotProps={{\n paper: { 'aria-label': title },\n }}\n sx={{\n '& .MuiDialog-paperScrollPaper': {\n backgroundColor: 'background.default',\n },\n ...(isSmallMobile && { '& .MuiDialog-paper': { minWidth: '100%' } }),\n height: '100%',\n }}\n {...rest}\n >\n <DialogHeader copy={{ title, close_aria: closeAria }} onClose={onClose} truncate={true} />\n\n <DialogContent sx={{ lineHeight: 1.5 }}>{children}</DialogContent>\n\n <DialogFooter\n isPrimaryDisabled={disablePrimaryButton}\n onPrimaryAction={handlePrimaryAction}\n onSecondaryAction={handleSecondaryAction}\n primaryColor={primaryColor}\n primaryText={primaryText}\n secondaryColor={secondaryColor}\n secondaryText={secondaryText}\n />\n </MuiDialog>\n </div>\n )\n}\n\nexport default Dialog\n"],"names":["Dialog","className","copy","disablePrimaryButton","isOpen","onClose","onPrimaryAction","primaryColor","primaryText","onSecondaryAction","secondaryColor","secondaryText","children","rest","title","closeAria","isSmallMobile","useScreenSize","handlePrimaryAction","handleSecondaryAction","jsx","jsxs","MuiDialog","DialogHeader","DialogContent","DialogFooter"],"mappings":";;;;;AA4BA,MAAMA,IAAyD,CAAC;AAAA,EAC9D,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,sBAAAC,IAAuB;AAAA,EACvB,QAAAC,IAAS;AAAA,EACT,SAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,mBAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,eAAAC,IAAgB;AAAA,EAChB,UAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAQZ,GAAM,SAAS,IACvBa,IAAYb,GAAM,cAAc,SAEhC,EAAE,eAAAc,EAAA,IAAkBC,EAAA,GAEpBC,IAAsB,MAAM;AAChC,IAAAZ,IAAA,GACAD,EAAA;AAAA,EACF,GAEMc,IAAwB,MAAM;AAClC,IAAIV,KACFA,EAAA,GAEFJ,EAAA;AAAA,EACF;AAEA,SACE,gBAAAe,EAAC,OAAA,EAAI,WAAW,iBAAiBnB,CAAS,IACxC,UAAA,gBAAAoB;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,cAAYR;AAAA,MACZ,mBAAiB;AAAA,MACjB,UAAS;AAAA,MACT,SAAAT;AAAA,MACA,MAAMD;AAAA,MACN,WAAW;AAAA,QACT,OAAO,EAAE,cAAcU,EAAA;AAAA,MAAM;AAAA,MAE/B,IAAI;AAAA,QACF,iCAAiC;AAAA,UAC/B,iBAAiB;AAAA,QAAA;AAAA,QAEnB,GAAIE,KAAiB,EAAE,sBAAsB,EAAE,UAAU,SAAO;AAAA,QAChE,QAAQ;AAAA,MAAA;AAAA,MAET,GAAGH;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAO,EAACG,GAAA,EAAa,MAAM,EAAE,OAAAT,GAAO,YAAYC,KAAa,SAAAV,GAAkB,UAAU,GAAA,CAAM;AAAA,0BAEvFmB,GAAA,EAAc,IAAI,EAAE,YAAY,IAAA,GAAQ,UAAAZ,GAAS;AAAA,QAElD,gBAAAQ;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,mBAAmBtB;AAAA,YACnB,iBAAiBe;AAAA,YACjB,mBAAmBC;AAAA,YACnB,cAAAZ;AAAA,YACA,aAAAC;AAAA,YACA,gBAAAE;AAAA,YACA,eAAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsxs as d, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import R from "react";
|
|
3
|
+
import { selectAll as b, interpolateString as m, arc as x } from "d3";
|
|
4
|
+
import u from "@mui/material/Box";
|
|
5
|
+
import { useTheme as I, darken as S, lighten as E } from "@mui/material/styles";
|
|
6
|
+
const _ = 100, v = 140, B = 10, K = ({
|
|
7
|
+
data: h,
|
|
8
|
+
hoveredId: p,
|
|
9
|
+
onClick: a,
|
|
10
|
+
onMouseEnter: l,
|
|
11
|
+
onMouseLeave: s,
|
|
12
|
+
selectedId: i,
|
|
13
|
+
size: t = 300,
|
|
14
|
+
children: f
|
|
15
|
+
}) => {
|
|
16
|
+
const c = I();
|
|
17
|
+
let r = 0;
|
|
18
|
+
const g = (o, n) => {
|
|
19
|
+
(o.key === "Enter" || o.key === " ") && (o.preventDefault(), a?.(n));
|
|
20
|
+
}, y = (o) => {
|
|
21
|
+
l?.(o);
|
|
22
|
+
}, k = (o) => {
|
|
23
|
+
s?.(o);
|
|
24
|
+
};
|
|
25
|
+
return R.useEffect(() => {
|
|
26
|
+
b(".arc-outer").transition("roll").duration(500).attrTween("transform", () => m("rotate(0)", "rotate(360)"));
|
|
27
|
+
}, []), /* @__PURE__ */ d(u, { height: t, position: "relative", width: t, children: [
|
|
28
|
+
/* @__PURE__ */ e(u, { height: "100%", width: "100%", children: f }),
|
|
29
|
+
/* @__PURE__ */ d(
|
|
30
|
+
"svg",
|
|
31
|
+
{
|
|
32
|
+
height: t,
|
|
33
|
+
style: { position: "absolute", top: 0, left: 0, touchAction: "manipulation" },
|
|
34
|
+
viewBox: "-150 -150 300 300",
|
|
35
|
+
width: t,
|
|
36
|
+
children: [
|
|
37
|
+
/* @__PURE__ */ e("style", { children: `
|
|
38
|
+
.arc-outer:focus,
|
|
39
|
+
.arc-outer:focus-visible {
|
|
40
|
+
stroke: ${c.palette.primary.main};
|
|
41
|
+
stroke-width: 3;
|
|
42
|
+
stroke-opacity: 0.8;
|
|
43
|
+
}
|
|
44
|
+
` }),
|
|
45
|
+
/* @__PURE__ */ e("g", { children: h.map((o) => {
|
|
46
|
+
const n = r;
|
|
47
|
+
r = r + 2 * Math.PI * (o.value / 100);
|
|
48
|
+
const w = r, A = x().cornerRadius(4)({
|
|
49
|
+
innerRadius: _,
|
|
50
|
+
outerRadius: v + (o.id === i || o.id === p ? B : 0),
|
|
51
|
+
startAngle: n,
|
|
52
|
+
endAngle: w,
|
|
53
|
+
padAngle: 0.025
|
|
54
|
+
});
|
|
55
|
+
return /* @__PURE__ */ e(
|
|
56
|
+
"path",
|
|
57
|
+
{
|
|
58
|
+
"aria-label": o.label || `Segment ${o.id}`,
|
|
59
|
+
"aria-pressed": o.id === i,
|
|
60
|
+
className: "arc-outer",
|
|
61
|
+
d: A,
|
|
62
|
+
fill: o.color,
|
|
63
|
+
onBlur: () => k(o.id),
|
|
64
|
+
onClick: () => a?.(o.id),
|
|
65
|
+
onFocus: () => y(o.id),
|
|
66
|
+
onKeyDown: (D) => g(D, o.id),
|
|
67
|
+
onMouseEnter: () => l?.(o.id),
|
|
68
|
+
onMouseLeave: () => s?.(o.id),
|
|
69
|
+
role: "button",
|
|
70
|
+
stroke: c.palette.mode === "light" ? S(o.color, 0.3) : E(o.color, 0.3),
|
|
71
|
+
strokeWidth: 2,
|
|
72
|
+
style: {
|
|
73
|
+
cursor: "pointer",
|
|
74
|
+
outline: "none"
|
|
75
|
+
},
|
|
76
|
+
tabIndex: 0
|
|
77
|
+
},
|
|
78
|
+
o.id
|
|
79
|
+
);
|
|
80
|
+
}) })
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] });
|
|
85
|
+
};
|
|
86
|
+
export {
|
|
87
|
+
K as D
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=Donut-SzzfZDHF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Donut-SzzfZDHF.mjs","sources":["../src/common/components/charts/Donut.tsx"],"sourcesContent":["import React from 'react'\nimport { arc, selectAll, interpolateString } from 'd3'\n\nimport Box from '@mui/material/Box'\nimport { darken, lighten, useTheme } from '@mui/material/styles'\n\nconst INNER_RADIUS = 100\nconst OUT_RADIUS = 140\nconst SELECTION_RADIUS = 10\n\nexport interface DonutData {\n id: string\n label?: string\n color: string\n value: number\n}\n\nexport interface DonutProps {\n data: DonutData[]\n hoveredId?: string\n onClick?: (id: string) => void\n onMouseEnter?: (id: string) => void\n onMouseLeave?: (id: string) => void\n selectedId?: string\n size?: number\n}\n\nconst Donut: React.FC<React.PropsWithChildren<DonutProps>> = ({\n data,\n hoveredId,\n onClick,\n onMouseEnter,\n onMouseLeave,\n selectedId,\n size = 300,\n children,\n}) => {\n const theme = useTheme()\n let offset = 0\n\n const handleKeyDown = (event: React.KeyboardEvent, id: string) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onClick?.(id)\n }\n }\n\n const handleFocus = (id: string) => {\n onMouseEnter?.(id)\n }\n\n const handleBlur = (id: string) => {\n onMouseLeave?.(id)\n }\n\n React.useEffect(() => {\n selectAll('.arc-outer')\n .transition('roll')\n .duration(500)\n .attrTween('transform', () => interpolateString('rotate(0)', 'rotate(360)'))\n }, [])\n\n return (\n <Box height={size} position=\"relative\" width={size}>\n <Box height=\"100%\" width=\"100%\">\n {children}\n </Box>\n <svg\n height={size}\n style={{ position: 'absolute', top: 0, left: 0, touchAction: 'manipulation' }}\n viewBox={`-150 -150 300 300`}\n width={size}\n >\n <style>\n {`\n .arc-outer:focus,\n .arc-outer:focus-visible {\n stroke: ${theme.palette.primary.main};\n stroke-width: 3;\n stroke-opacity: 0.8;\n }\n `}\n </style>\n <g>\n {data.map((item) => {\n const startAngle = offset\n offset = offset + 2 * Math.PI * (item.value / 100)\n const endAngle = offset\n\n const segment = arc().cornerRadius(4)({\n innerRadius: INNER_RADIUS,\n outerRadius:\n OUT_RADIUS +\n (item.id === selectedId || item.id === hoveredId ? SELECTION_RADIUS : 0),\n startAngle,\n endAngle,\n padAngle: 0.025,\n }) as string\n\n return (\n <path\n aria-label={item.label || `Segment ${item.id}`}\n aria-pressed={item.id === selectedId}\n className=\"arc-outer\"\n d={segment}\n fill={item.color}\n key={item.id}\n onBlur={() => handleBlur(item.id)}\n onClick={() => onClick?.(item.id)}\n onFocus={() => handleFocus(item.id)}\n onKeyDown={(e) => handleKeyDown(e, item.id)}\n onMouseEnter={() => onMouseEnter?.(item.id)}\n onMouseLeave={() => onMouseLeave?.(item.id)}\n role=\"button\"\n stroke={\n theme.palette.mode === 'light'\n ? darken(item.color, 0.3)\n : lighten(item.color, 0.3)\n }\n strokeWidth={2}\n style={{\n cursor: 'pointer',\n outline: 'none',\n }}\n tabIndex={0}\n />\n )\n })}\n </g>\n </svg>\n </Box>\n )\n}\n\nexport default Donut\n"],"names":["INNER_RADIUS","OUT_RADIUS","SELECTION_RADIUS","Donut","data","hoveredId","onClick","onMouseEnter","onMouseLeave","selectedId","size","children","theme","useTheme","offset","handleKeyDown","event","id","handleFocus","handleBlur","React","selectAll","interpolateString","Box","jsx","jsxs","item","startAngle","endAngle","segment","arc","e","darken","lighten"],"mappings":"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"}
|