@mx-cartographer/experiences 9.3.0-alpha.bb2 → 9.3.0
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 +42 -0
- package/dist/accounts/AccountsMiniWidget.es.js.map +1 -1
- package/dist/accounts/AccountsWidget.es.js.map +1 -1
- package/dist/accounts/ConnectMiniWidget.es.js.map +1 -1
- package/dist/accounts/components/AccountListItem.es.js.map +1 -1
- package/dist/accounts/components/AccountsList.es.js.map +1 -1
- package/dist/accounts/components/AccountsListCompact.es.js.map +1 -1
- package/dist/accounts/components/ConnectImage.es.js.map +1 -1
- package/dist/accounts/components/ConnectMiniWidgetCard.es.js.map +1 -1
- package/dist/accounts/components/ConnectionStatusIcons.es.js.map +1 -1
- package/dist/accounts/components/ConnectionsDrawer.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountActions.es.js +40 -37
- package/dist/accounts/components/detailsdrawer/Accounts/AccountActions.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountActionsRow.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountConnection.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailEdit.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetails.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsChart.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsContent.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsDrawer.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/AccountDetailsHeader.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Accounts/ConnectionErrorMessage.es.js.map +1 -1
- package/dist/accounts/components/detailsdrawer/Transactions/TransactionsTab.es.js.map +1 -1
- package/dist/accounts/utils/AccountFields.es.js +4 -1
- package/dist/accounts/utils/AccountFields.es.js.map +1 -1
- package/dist/analytics/SurveyMiniWidget.es.js.map +1 -1
- package/dist/analytics/components/RatingScale.es.js.map +1 -1
- package/dist/budgets/BubbleBudgetsMiniWidget.es.js +46 -44
- package/dist/budgets/BubbleBudgetsMiniWidget.es.js.map +1 -1
- package/dist/budgets/BubbleBudgetsWidget.es.js.map +1 -1
- package/dist/budgets/components/AddBudgets.es.js.map +1 -1
- package/dist/budgets/components/BubbleBudgets.es.js.map +1 -1
- package/dist/budgets/components/BubbleChart.es.js +12 -12
- package/dist/budgets/components/BubbleChart.es.js.map +1 -1
- package/dist/budgets/components/BudgetDetailsDrawer.es.js.map +1 -1
- package/dist/budgets/components/BudgetDetailsDrawerV2.es.js.map +1 -1
- package/dist/budgets/components/BudgetList.es.js.map +1 -1
- package/dist/budgets/components/MerchantBudgetDetailsDrawer.es.js.map +1 -1
- package/dist/budgets/components/Overview.es.js.map +1 -1
- package/dist/budgets/components/addbudget/Header.es.js.map +1 -1
- package/dist/budgets/components/addbudget/RecalculateBudgets.es.js.map +1 -1
- package/dist/budgets/components/addbudget/UnbudgetedRow.es.js.map +1 -1
- package/dist/budgets/components/bubblechart/Bubble.es.js.map +1 -1
- package/dist/budgets/components/bubblechart/Mercury.es.js +13 -11
- package/dist/budgets/components/bubblechart/Mercury.es.js.map +1 -1
- package/dist/budgets/components/budgetdetails/AddSubBudget.es.js.map +1 -1
- package/dist/budgets/components/budgetdetails/BudgetDetails.es.js.map +1 -1
- package/dist/budgets/components/budgetdetails/Header.es.js.map +1 -1
- package/dist/budgets/components/budgetdetails/SubBudgetList.es.js.map +1 -1
- package/dist/budgets/components/budgetlist/BudgetRow.es.js.map +1 -1
- package/dist/budgets/components/budgetlist/SubBudgetRow.es.js.map +1 -1
- package/dist/budgets/components/budgetlist/SubBudgetZeroState.es.js.map +1 -1
- package/dist/budgets/components/shared/BudgetAmount.es.js.map +1 -1
- package/dist/budgets/components/shared/BudgetDetailsTopSection.es.js.map +1 -1
- package/dist/budgets/utils/BubblesSVG.es.js +10 -10
- package/dist/budgets/utils/BubblesSVG.es.js.map +1 -1
- package/dist/cashflow/CashflowMiniWidget.es.js.map +1 -1
- package/dist/cashflow/CashflowOnboarding.es.js.map +1 -1
- package/dist/cashflow/CashflowWidget.es.js.map +1 -1
- package/dist/cashflow/components/CashflowAmountHeading.es.js.map +1 -1
- package/dist/cashflow/components/CashflowContent.es.js.map +1 -1
- package/dist/cashflow/components/CashflowHeading.es.js.map +1 -1
- package/dist/cashflow/components/CashflowWidgetContent.es.js.map +1 -1
- package/dist/cashflow/components/DetailsExpenseHeader.es.js.map +1 -1
- package/dist/cashflow/components/DetailsExpenseRow.es.js.map +1 -1
- package/dist/cashflow/components/DetailsFooter.es.js.map +1 -1
- package/dist/cashflow/components/DetailsTab.es.js.map +1 -1
- package/dist/cashflow/components/RemainingCash.es.js.map +1 -1
- package/dist/cashflow/components/SummaryTab.es.js.map +1 -1
- package/dist/cashflow/components/onboarding/StepOne.es.js.map +1 -1
- package/dist/cashflow/components/onboarding/StepTwo.es.js.map +1 -1
- package/dist/categories/components/CategoryList.es.js +24 -24
- package/dist/categories/components/CategoryList.es.js.map +1 -1
- package/dist/categories/components/CategoryRow.es.js +6 -6
- package/dist/categories/components/CategoryRow.es.js.map +1 -1
- package/dist/categories/components/CategorySelector.es.js +36 -32
- package/dist/categories/components/CategorySelector.es.js.map +1 -1
- package/dist/categories/components/CategorySelectorDrawer.es.js.map +1 -1
- package/dist/categories/components/CustomCategories/AddSubcategory.es.js.map +1 -1
- package/dist/categories/components/CustomCategories/CustomCategoryModal.es.js +0 -1
- package/dist/categories/components/CustomCategories/CustomCategoryModal.es.js.map +1 -1
- package/dist/categories/components/SubcategoryList.es.js.map +1 -1
- package/dist/categories/components/SubcategoryRow.es.js.map +1 -1
- package/dist/common/components/Banner.es.js.map +1 -1
- package/dist/common/components/ConnectCard.es.js.map +1 -1
- package/dist/common/components/ConnectDrawer.es.js.map +1 -1
- package/dist/common/components/ConnectStatus.es.js.map +1 -1
- package/dist/common/components/CurrencyDialog.es.js.map +1 -1
- package/dist/common/components/CurrencyInput.es.js +11 -11
- package/dist/common/components/CurrencyText.es.js.map +1 -1
- package/dist/common/components/DataRow.es.js +7 -7
- package/dist/common/components/DataRow.es.js.map +1 -1
- package/dist/common/components/EmptyState.es.js.map +1 -1
- package/dist/common/components/Error.es.js.map +1 -1
- package/dist/common/components/ErrorBoundary.es.js.map +1 -1
- package/dist/common/components/GlobalAccountFilter.es.js.map +1 -1
- package/dist/common/components/IconBacking.es.js.map +1 -1
- package/dist/common/components/InformationTooltip.es.js.map +1 -1
- package/dist/common/components/ListItemAction.es.js.map +1 -1
- package/dist/common/components/ListItemRow.es.js +1 -1
- package/dist/common/components/ListItemRow.es.js.map +1 -1
- package/dist/common/components/ListItemWrapper.es.js.map +1 -1
- package/dist/common/components/Loader.es.js.map +1 -1
- package/dist/common/components/MicroWidgetContainer.es.js.map +1 -1
- package/dist/common/components/MiniWidgetContainer.es.js.map +1 -1
- package/dist/common/components/ResponsiveButton.es.js.map +1 -1
- package/dist/common/components/SearchBox.es.js.map +1 -1
- package/dist/common/components/Select.es.js.map +1 -1
- package/dist/common/components/SelectionBox.es.js.map +1 -1
- package/dist/common/components/SkeletonLoader.es.js.map +1 -1
- package/dist/common/components/SubheaderRow.es.js.map +1 -1
- package/dist/common/components/TabContentContainer.es.js.map +1 -1
- package/dist/common/components/TinyBarChart.es.js.map +1 -1
- package/dist/common/components/WidgetContainer.es.js.map +1 -1
- package/dist/common/components/WidgetDateRangeSelector.es.js +28 -28
- package/dist/common/components/WidgetDateRangeSelector.es.js.map +1 -1
- package/dist/common/components/addaccounts/AddAccounts.es.js +13 -13
- package/dist/common/components/addaccounts/AddAccounts.es.js.map +1 -1
- package/dist/common/components/calendar/Calendar.es.js.map +1 -1
- package/dist/common/components/calendar/Day.es.js.map +1 -1
- package/dist/common/components/calendar/Header.es.js +26 -23
- package/dist/common/components/calendar/Header.es.js.map +1 -1
- package/dist/common/components/charts/Donut.es.js.map +1 -1
- package/dist/common/components/charts/LineChart.es.js.map +1 -1
- package/dist/common/components/charts/StackedLineChart.es.js.map +1 -1
- package/dist/common/components/charts/StatusBar.es.js.map +1 -1
- package/dist/common/components/charts/linechart/CustomLegend.es.js.map +1 -1
- package/dist/common/components/charts/linechart/CustomLine.es.js.map +1 -1
- package/dist/common/components/charts/linechart/CustomMark.es.js.map +1 -1
- package/dist/common/components/charts/linechart/CustomTooltip.es.js.map +1 -1
- package/dist/common/components/charts/stackedlinechart/CategoryIconLabel.es.js.map +1 -1
- package/dist/common/components/charts/stackedlinechart/CustomAreaTooltip.es.js.map +1 -1
- package/dist/common/components/charts/stackedlinechart/CustomLegend.es.js.map +1 -1
- package/dist/common/components/charts/stackedlinechart/CustomPointTooltip.es.js.map +1 -1
- package/dist/common/components/daterangeselector/DateRangeSelector.d.ts +14 -0
- package/dist/common/components/daterangeselector/DateRangeSelector.es.js +113 -101
- package/dist/common/components/daterangeselector/DateRangeSelector.es.js.map +1 -1
- package/dist/common/components/dialog/Dialog.es.js.map +1 -1
- package/dist/common/components/donuts/MultiSegmentDonut.es.js.map +1 -1
- package/dist/common/components/donuts/SingleSegmentDonut.es.js.map +1 -1
- package/dist/common/components/drawer/Drawer.es.js.map +1 -1
- package/dist/common/components/drawer/Footer.es.js.map +1 -1
- package/dist/common/components/drawer/Header.es.js.map +1 -1
- package/dist/common/components/globalaccountfilter/GlobalAccountFilterList.es.js +71 -87
- package/dist/common/components/globalaccountfilter/GlobalAccountFilterList.es.js.map +1 -1
- package/dist/common/components/listitems/CollapseExpandListItem.es.js +4 -4
- package/dist/common/components/listitems/CollapseExpandListItem.es.js.map +1 -1
- package/dist/common/components/listitems/ToggleButtonListItem.es.js +6 -6
- package/dist/common/components/listitems/ToggleButtonListItem.es.js.map +1 -1
- package/dist/common/components/listitems/ToggleListItem.es.js.map +1 -1
- package/dist/common/hooks/useAriaLive.es.js.map +1 -1
- package/dist/common/utils/AccountFilter.es.js.map +1 -1
- package/dist/core/constants/Category.es.js.map +1 -1
- package/dist/core/stores/CategoryStore.d.ts +2 -0
- package/dist/core/stores/CategoryStore.es.js +55 -47
- package/dist/core/stores/CategoryStore.es.js.map +1 -1
- package/dist/core/stores/DebtsStore.es.js +10 -10
- package/dist/core/stores/DebtsStore.es.js.map +1 -1
- package/dist/core/stores/FinstrongStore.es.js +4 -4
- package/dist/core/stores/FinstrongStore.es.js.map +1 -1
- package/dist/core/stores/TrendsStore.es.js +6 -6
- package/dist/core/types/Account.es.js.map +1 -1
- package/dist/core/utils/DateUtil.es.js +24 -23
- package/dist/core/utils/DateUtil.es.js.map +1 -1
- package/dist/core/utils/DebtUtils.es.js +28 -28
- package/dist/core/utils/DebtUtils.es.js.map +1 -1
- package/dist/core/utils/GoalsUtil.es.js +11 -8
- package/dist/core/utils/GoalsUtil.es.js.map +1 -1
- package/dist/core/utils/InvestmentUtil.es.js +26 -23
- package/dist/core/utils/InvestmentUtil.es.js.map +1 -1
- package/dist/core/utils/NotificationUtils.es.js +11 -8
- package/dist/core/utils/NotificationUtils.es.js.map +1 -1
- package/dist/core/utils/RecurringTransactionsUtil.es.js +5 -8
- package/dist/core/utils/RecurringTransactionsUtil.es.js.map +1 -1
- package/dist/core/utils/SettingsUtil.es.js.map +1 -1
- package/dist/core/utils/TransactionUtils.es.js.map +1 -1
- package/dist/dashboard/Dashboard.es.js.map +1 -1
- package/dist/dashboard/Greeting.es.js.map +1 -1
- package/dist/debts/DebtsWidget.es.js.map +1 -1
- package/dist/debts/components/DebtDrawer.es.js.map +1 -1
- package/dist/debts/components/DebtsChart.es.js +36 -36
- package/dist/debts/components/DebtsChart.es.js.map +1 -1
- package/dist/debts/components/DebtsTable.es.js +13 -13
- package/dist/debts/components/DebtsTable.es.js.map +1 -1
- package/dist/debts/components/PaydownDrawer.es.js.map +1 -1
- package/dist/debts/components/SnowballCard.es.js.map +1 -1
- package/dist/debts/components/SnowballDrawer.es.js.map +1 -1
- package/dist/debts/components/actions/DebtsPriorityAction.es.js +23 -23
- package/dist/debts/components/actions/DebtsPriorityAction.es.js.map +1 -1
- package/dist/debts/components/actions/ExtraPaymentAction.es.js.map +1 -1
- package/dist/debts/components/actions/InterestRateAction.es.js.map +1 -1
- package/dist/debts/components/actions/MonthlyPaymentAction.es.js.map +1 -1
- package/dist/debts/components/actions/OriginalBalanceAction.es.js.map +1 -1
- package/dist/debts/components/debtsdrawer/DebtDetailsChart.es.js.map +1 -1
- package/dist/debts/components/debtsdrawer/DebtDetailsContent.es.js.map +1 -1
- package/dist/debts/components/debtsdrawer/DebtDetailsTab.es.js.map +1 -1
- package/dist/debts/components/debtsdrawer/DebtScheduleTab.es.js.map +1 -1
- package/dist/debts/components/debtsdrawer/DebtStatusCard.es.js.map +1 -1
- package/dist/debts/components/debtspaydown/PaydownButton.es.js.map +1 -1
- package/dist/debts/components/debtspaydown/PaydownContent.es.js.map +1 -1
- package/dist/debts/components/debtspriority/DebtsPriorityButton.es.js.map +1 -1
- package/dist/debts/components/debtspriority/DebtsPrioriyPopover.es.js.map +1 -1
- package/dist/debts/components/debtstable/AccountCell.es.js.map +1 -1
- package/dist/debts/components/debtstable/PriorityCell.es.js.map +1 -1
- package/dist/finstrong/FinancialStrengthCard.es.js.map +1 -1
- package/dist/finstrong/FinstrongWidget.es.js.map +1 -1
- package/dist/finstrong/components/ConnectMoreAccountsCard.es.js.map +1 -1
- package/dist/finstrong/components/CreditScore/CreditScoreContent.es.js.map +1 -1
- package/dist/finstrong/components/CreditScore/CreditScoreHeader.es.js.map +1 -1
- package/dist/finstrong/components/HaveManageableDebt/DebtPaymentTabContent.es.js.map +1 -1
- package/dist/finstrong/components/HaveManageableDebt/HaveManageableDebtComponent.es.js.map +1 -1
- package/dist/finstrong/components/HaveManageableDebt/HaveManageableDebtProgressBar.es.js.map +1 -1
- package/dist/finstrong/components/HaveManageableDebt/IncomeTabContent.es.js.map +1 -1
- package/dist/finstrong/components/HealthChart.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsBorrowTab.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsDrawer.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsSaveTab.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsSpendTab.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsTabItem.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsTabItemDrawer.es.js.map +1 -1
- package/dist/finstrong/components/KeyIndicatorsTabsWidget.es.js.map +1 -1
- package/dist/finstrong/components/MaintainingEmergencySavings/EstimatedContributionCalculator.es.js.map +1 -1
- package/dist/finstrong/components/MaintainingEmergencySavings/MaintainingEmergencySavingsContent.es.js.map +1 -1
- package/dist/finstrong/components/MaintainingEmergencySavings/MaintainingEmergencySavingsSticky.es.js.map +1 -1
- package/dist/finstrong/components/ManageCreditScore.es.js.map +1 -1
- package/dist/finstrong/components/ManageDOB.es.js.map +1 -1
- package/dist/finstrong/components/MissingData.es.js.map +1 -1
- package/dist/finstrong/components/ProfileDrawer.es.js.map +1 -1
- package/dist/finstrong/components/ProfileList.es.js.map +1 -1
- package/dist/finstrong/components/ProfileProgressBar.es.js.map +1 -1
- package/dist/finstrong/components/ProgressBar.es.js.map +1 -1
- package/dist/finstrong/components/SaveEnoughToLiveOn/AvailableTabContent.es.js.map +1 -1
- package/dist/finstrong/components/SaveEnoughToLiveOn/SaveEnoughToLiveOnDrawerContent.es.js.map +1 -1
- package/dist/finstrong/components/SaveEnoughToLiveOn/SaveEnoughToLiveOnProgressBar.es.js.map +1 -1
- package/dist/finstrong/components/SaveEnoughToLiveOn/SpendingTabContent.es.js.map +1 -1
- package/dist/finstrong/components/ScoreHistoryDrawer.es.js.map +1 -1
- package/dist/finstrong/components/ScoreRubricDrawer.es.js.map +1 -1
- package/dist/finstrong/components/SpendLessThanYouMake/SpendLessThanYouMakeComponent.es.js.map +1 -1
- package/dist/finstrong/components/SpendLessThanYouMake/SpendLessThanYouMakeProgressBar.es.js.map +1 -1
- package/dist/finstrong/components/StatusChip.es.js.map +1 -1
- package/dist/finstrong/components/onboarding/Onboarding.es.js.map +1 -1
- package/dist/finstrong/components/onboarding/OnboardingAddMonthlyIncome.es.js.map +1 -1
- package/dist/finstrong/components/onboarding/OnboardingBirthday.es.js.map +1 -1
- package/dist/finstrong/components/onboarding/OnboardingCreditScore.es.js.map +1 -1
- package/dist/finstrong/components/onboarding/OnboardingStepsDrawer.es.js +15 -18
- package/dist/finstrong/components/onboarding/OnboardingStepsDrawer.es.js.map +1 -1
- package/dist/finstrong/components/onboarding/OnboardingStepsHeader.es.js.map +1 -1
- package/dist/finstrong/components/paybillsontime/PayBillsOnTimeDrawerComponent.es.js.map +1 -1
- package/dist/finstrong/components/paybillsontime/PayBillsOnTimeStickyComponent.es.js.map +1 -1
- package/dist/finstrong/components/shared/Accounts.es.js.map +1 -1
- package/dist/finstrong/components/shared/CustomDoubleBarPlot.es.js.map +1 -1
- package/dist/finstrong/components/shared/CustomPieArc.es.js.map +1 -1
- package/dist/finstrong/components/shared/DialScoreCard.es.js +27 -27
- package/dist/finstrong/components/shared/DialScoreCard.es.js.map +1 -1
- package/dist/finstrong/components/shared/DoubleBarChart.es.js.map +1 -1
- package/dist/finstrong/components/shared/LineGraph.es.js +20 -19
- package/dist/finstrong/components/shared/LineGraph.es.js.map +1 -1
- package/dist/finstrong/components/shared/ScoreHistoryTimeline.es.js +28 -28
- package/dist/finstrong/components/shared/ScoreHistoryTimeline.es.js.map +1 -1
- package/dist/finstrong/components/shared/ScoreHistoryTimelineItem.es.js.map +1 -1
- package/dist/finstrong/components/shared/TotalCard.es.js.map +1 -1
- package/dist/finstrong/components/shared/Transactions.es.js.map +1 -1
- package/dist/finstrong/util/finstrongUtils.es.js +4 -1
- package/dist/finstrong/util/finstrongUtils.es.js.map +1 -1
- package/dist/goals/GoalsMicroWidget.es.js.map +1 -1
- package/dist/goals/GoalsWidget.es.js.map +1 -1
- package/dist/goals/components/AccountSelectionDrawer.es.js.map +1 -1
- package/dist/goals/components/AddGoal.es.js.map +1 -1
- package/dist/goals/components/GoalDetails.es.js.map +1 -1
- package/dist/goals/components/GoalDetailsDrawer.es.js.map +1 -1
- package/dist/goals/components/GoalList.es.js.map +1 -1
- package/dist/goals/components/GoalStatusCard.es.js.map +1 -1
- package/dist/goals/components/ManageGoals.es.js.map +1 -1
- package/dist/goals/components/TabTitle.es.js.map +1 -1
- package/dist/goals/components/actions/AccountAction.es.js.map +1 -1
- package/dist/goals/components/actions/AddRetirementAccountAction.es.js.map +1 -1
- package/dist/goals/components/actions/AmountToSaveAction.es.js.map +1 -1
- package/dist/goals/components/actions/BirthdayAction.es.js.map +1 -1
- package/dist/goals/components/actions/ChangeAccountAction.es.js.map +1 -1
- package/dist/goals/components/actions/ContributionAction.es.js.map +1 -1
- package/dist/goals/components/actions/GoalNameAction.es.js.map +1 -1
- package/dist/goals/components/actions/InterestRateAction.es.js.map +1 -1
- package/dist/goals/components/actions/MonthlyPaymentAction.es.js.map +1 -1
- package/dist/goals/components/actions/OriginalBalanceAction.es.js.map +1 -1
- package/dist/goals/components/actions/RetirementAgeAction.es.js.map +1 -1
- package/dist/goals/components/addgoal/AddGoalListItem.es.js +5 -5
- package/dist/goals/components/addgoal/AddGoalListItem.es.js.map +1 -1
- package/dist/goals/components/managegoals/CompleteListItem.es.js.map +1 -1
- package/dist/goals/components/managegoals/OngoingListItem.es.js.map +1 -1
- package/dist/goals/components/micro/GoalMicroStatusCard.es.js.map +1 -1
- package/dist/goals/components/micro/GoalsMicroEmptyState.es.js.map +1 -1
- package/dist/help/HelpWidget.es.js.map +1 -1
- package/dist/help/components/Help.es.js.map +1 -1
- package/dist/help/components/HelpList.es.js +32 -32
- package/dist/help/components/HelpList.es.js.map +1 -1
- package/dist/help/components/content/BottomImageContent.es.js.map +1 -1
- package/dist/help/components/content/ContentItem.es.js.map +1 -1
- package/dist/help/components/content/Header.es.js.map +1 -1
- package/dist/help/components/content/LeftImageContent.es.js.map +1 -1
- package/dist/help/components/content/NoImageContent.es.js.map +1 -1
- package/dist/help/components/content/RightImageContent.es.js.map +1 -1
- package/dist/help/components/content/TopImageContent.es.js.map +1 -1
- package/dist/help/components/requestsupport/ContactSupport.es.js.map +1 -1
- package/dist/help/components/requestsupport/HelpByCategoryList.es.js.map +1 -1
- package/dist/help/components/requestsupport/MissingInstitution.es.js.map +1 -1
- package/dist/help/components/requestsupport/PopularTopicsDrawer.es.js.map +1 -1
- package/dist/help/components/requestsupport/PopularTopicsList.es.js.map +1 -1
- package/dist/help/components/requestsupport/PopularTopicsRow.es.js +6 -6
- package/dist/help/components/requestsupport/PopularTopicsRow.es.js.map +1 -1
- package/dist/help/components/requestsupport/RequestSupport.es.js.map +1 -1
- package/dist/help/components/requestsupport/RequestSupportFooter.es.js.map +1 -1
- package/dist/help/components/requestsupport/RequestSupportHeader.es.js.map +1 -1
- package/dist/help/components/requestsupport/RequestSupportInstitution.es.js.map +1 -1
- package/dist/help/components/requestsupport/SupportSuccessMessage.es.js.map +1 -1
- package/dist/insights/components/feed/Header.es.js.map +1 -1
- package/dist/insights/components/insights/AmericanUpcomingTaxDeadlineAlert/AmericanUpcomingTaxDeadlineAlert.es.js.map +1 -1
- package/dist/insights/components/insights/BillAmountNotStandard/BillAmountNotStandard.es.js.map +1 -1
- package/dist/insights/components/insights/BillAmountNotStandard/BillAmountNotStandardMUI.es.js.map +1 -1
- package/dist/insights/components/insights/CashBack/CashBack.es.js.map +1 -1
- package/dist/insights/components/insights/CategoryBudget/CategoryBudget.es.js +17 -17
- package/dist/insights/components/insights/CategoryBudget/CategoryBudget.es.js.map +1 -1
- package/dist/insights/components/insights/CategorySpendingV2/CategorySpendingV2.es.js.map +1 -1
- package/dist/insights/components/insights/CategorySpendingV2/CategorySpendingV2MUI.es.js.map +1 -1
- package/dist/insights/components/insights/CelebrateCreditCardPayoff/CelebrateCreditCardPayoff.es.js.map +1 -1
- package/dist/insights/components/insights/CustomTransaction/CustomTransaction.es.js.map +1 -1
- package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsBody.es.js.map +1 -1
- package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsLearnMoreDrawerContent.es.js +6 -6
- package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsLearnMoreDrawerContent.es.js.map +1 -1
- package/dist/insights/components/insights/DiscoveredAccounts/DiscoveredAccountsMiniInsight.es.js.map +1 -1
- package/dist/insights/components/insights/FederalBankHoliday/FederalBankHoliday.es.js.map +1 -1
- package/dist/insights/components/insights/FederalBankHoliday/FederalBankHolidayMUI.es.js.map +1 -1
- package/dist/insights/components/insights/MarketingHub/Offer.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlyDebtToIncomeComparisonV2/MonthlyDebtToIncomeComparisonV2.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlyEmergencyFundReview/LastMonthsContributionSection.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlyEmergencyFundReview/MonthlyEmergencyFundReviewBody.es.js +38 -35
- package/dist/insights/components/insights/MonthlyEmergencyFundReview/MonthlyEmergencyFundReviewBody.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlyEmergencyFundReview/ProjectedCompletionSection.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlyEmergencyFundReview/TotalSection.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlySavingsToIncomeComparison/MonthlySavingsToIncomeComparison.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlySpendToIncomeComparisonV2/MonthlySpendToIncomeComparisonV2.es.js.map +1 -1
- package/dist/insights/components/insights/MonthlySpendingComparisonV2/MonthlySpendingComparisonV2.es.js.map +1 -1
- package/dist/insights/components/insights/P2pCategorization/P2pCategorization.es.js.map +1 -1
- package/dist/insights/components/insights/P2pCategorization/shared/P2pCategorizationMultipleTransactions.es.js.map +1 -1
- package/dist/insights/components/insights/P2pCategorization/shared/P2pCategorizationSingleTransaction.es.js.map +1 -1
- package/dist/insights/components/insights/SavingsAccountBalancesSummary/SavingsAccountBalancesSummary.es.js.map +1 -1
- package/dist/insights/components/insights/SharedDeposit/SharedDeposit.es.js.map +1 -1
- package/dist/insights/components/insights/SwitchDirectDeposit/AccountBox.es.js.map +1 -1
- package/dist/insights/components/insights/SwitchDirectDeposit/SwitchDirectDepositMainContainer.es.js.map +1 -1
- package/dist/insights/components/insights/UnifiedDeposit/UnifiedDeposit.es.js.map +1 -1
- package/dist/insights/components/insights/UnifiedDeposit/UnifiedDepositBody.es.js.map +1 -1
- package/dist/insights/components/insights/UserFeedback/UserFeedback.es.js.map +1 -1
- package/dist/insights/components/insights/WeeklyNoSpendDays/BubbleWeek.es.js.map +1 -1
- package/dist/insights/components/insights/WeeklyNoSpendDays/WeeklyNoSpendDays.es.js.map +1 -1
- package/dist/insights/components/shared/ChartDrawerTemplate/ChartDrawerTemplate.es.js +22 -22
- package/dist/insights/components/shared/ChartDrawerTemplate/ChartDrawerTemplate.es.js.map +1 -1
- package/dist/insights/components/shared/ChartDrawerTemplate/TipSection.es.js.map +1 -1
- package/dist/insights/components/shared/ChartTransactionWithDrillDown.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/BarChart.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/BarChartV2.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/ChartLegend.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/ChartLegendV2.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/CustomBarPlot.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/CustomBarPlotV2.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/CustomDoubleBarPlot.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/CustomDoubleBarPlotMXUI.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/DoubleBarChart.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/DoubleBarChartLegend.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/DoubleBarChartLegendMXUI.es.js.map +1 -1
- package/dist/insights/components/shared/Charts/BarChart/DoubleBarChartMXUI.es.js.map +1 -1
- package/dist/insights/components/shared/ConnectionCard.es.js.map +1 -1
- package/dist/insights/components/shared/Coupon.es.js.map +1 -1
- package/dist/insights/components/shared/DeepLinks/DeepLinkDialog.es.js.map +1 -1
- package/dist/insights/components/shared/DeepLinks/DirectDeposit/DirectDepositDeepLink.es.js.map +1 -1
- package/dist/insights/components/shared/DeepLinks/DirectDeposit/Dot.es.js.map +1 -1
- package/dist/insights/components/shared/DirectDeposit/DirectDeposit.es.js.map +1 -1
- package/dist/insights/components/shared/DirectDeposit/DirectDepositSubHeader.es.js.map +1 -1
- package/dist/insights/components/shared/DirectDeposit/FullFeedBodyHeader.es.js.map +1 -1
- package/dist/insights/components/shared/DirectDeposit/LeftBox.es.js.map +1 -1
- package/dist/insights/components/shared/DirectDeposit/MiniBodyHeader.es.js.map +1 -1
- package/dist/insights/components/shared/DirectDeposit/RightBox.es.js.map +1 -1
- package/dist/insights/components/shared/DiscoveredAccountsConnect.es.js.map +1 -1
- package/dist/insights/components/shared/DrillDownCalculation/BalanceStepper.es.js.map +1 -1
- package/dist/insights/components/shared/DrillDownCalculation/DrillDownCalculation.es.js.map +1 -1
- package/dist/insights/components/shared/ErrorCard/ErrorCard.es.js.map +1 -1
- package/dist/insights/components/shared/GenericFeedback/FeedbackButtons.es.js.map +1 -1
- package/dist/insights/components/shared/GenericFeedback/FeedbackDescription.es.js.map +1 -1
- package/dist/insights/components/shared/GenericFeedback/FeedbackHeader.es.js.map +1 -1
- package/dist/insights/components/shared/GenericFeedback/FeedbackOptions.es.js.map +1 -1
- package/dist/insights/components/shared/GenericFeedback/FeedbackText.es.js.map +1 -1
- package/dist/insights/components/shared/GoalProgress.es.js.map +1 -1
- package/dist/insights/components/shared/GradientBox.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/BeatCard.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/BeatCardMUI.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/CardButtonSection.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/CardError.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/CardFooter.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/CardLoading.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/ClientConfigurableCta.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/ContentAndDescription.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/ContentAndDescriptionMUI.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/Description.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/DescriptionMUI.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/EmbeddedCard.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/FeedbackCard.es.js +4 -4
- package/dist/insights/components/shared/InsightsCard/FeedbackCard.es.js.map +1 -1
- package/dist/insights/components/shared/InsightsCard/InsightButton.es.js.map +1 -1
- package/dist/insights/components/shared/MenuAction.es.js +4 -4
- package/dist/insights/components/shared/MenuAction.es.js.map +1 -1
- package/dist/insights/components/shared/MiniInsightCard.es.js.map +1 -1
- package/dist/insights/components/shared/P2P/P2PMultipleCategorization.es.js +23 -23
- package/dist/insights/components/shared/P2P/P2PMultipleCategorization.es.js.map +1 -1
- package/dist/insights/components/shared/P2PCategorizationSingleAccount/P2PCategorizationSingleAccount.es.js +24 -24
- package/dist/insights/components/shared/P2PCategorizationSingleAccount/P2PCategorizationSingleAccount.es.js.map +1 -1
- package/dist/insights/components/shared/ProgressBar.es.js.map +1 -1
- package/dist/insights/components/shared/SaveAnExtra100/SaveAnExtra100.es.js.map +1 -1
- package/dist/insights/components/shared/SaveEnoughToLiveOnBottomSection.es.js.map +1 -1
- package/dist/insights/components/shared/StatusIndicator.es.js.map +1 -1
- package/dist/insights/components/shared/ThemedSVGImage.es.js.map +1 -1
- package/dist/insights/components/shared/TransactionCard.es.js.map +1 -1
- package/dist/insights/components/shared/ZeroState/LinedCardZeroState.es.js.map +1 -1
- package/dist/investments/InvestmentsWidget.es.js.map +1 -1
- package/dist/investments/components/Allocation.es.js.map +1 -1
- package/dist/investments/components/Analysis.es.js.map +1 -1
- package/dist/investments/components/AnalysisDetails.es.js.map +1 -1
- package/dist/investments/components/EmptyStateFooterComponent.es.js.map +1 -1
- package/dist/investments/components/HeaderCell.es.js.map +1 -1
- package/dist/investments/components/HoldingDrawer.es.js.map +1 -1
- package/dist/investments/components/HoldingTable.es.js +167 -164
- package/dist/investments/components/HoldingTable.es.js.map +1 -1
- package/dist/investments/components/InfoToolTip.es.js.map +1 -1
- package/dist/investments/components/Overview.es.js.map +1 -1
- package/dist/investments/components/TabTitle.es.js.map +1 -1
- package/dist/investments/components/allocation/InvestementAllocationList.es.js.map +1 -1
- package/dist/investments/components/allocation/InvestmentsAllocationChart.es.js.map +1 -1
- package/dist/merchants/components/MerchantLookup.es.js.map +1 -1
- package/dist/microinsights/InsightsMicroWidget.es.js.map +1 -1
- package/dist/microinsights/MicroCardTemplate.es.js.map +1 -1
- package/dist/microinsights/Spinner.es.js.map +1 -1
- package/dist/microinsights/beaticons/BeatCategoryIcon.es.js +8 -8
- package/dist/microinsights/beaticons/BeatCategoryIcon.es.js.map +1 -1
- package/dist/microinsights/beaticons/BeatMaterialIcon.es.js.map +1 -1
- package/dist/microinsights/beaticons/ChartFilledIcon.es.js.map +1 -1
- package/dist/microinsights/beaticons/ZeroStateIcon.es.js.map +1 -1
- package/dist/microinsights/cards/ViewMoreMicroCard.d.ts +1 -0
- package/dist/microinsights/cards/ViewMoreMicroCard.es.js.map +1 -1
- package/dist/microinsights/carousel/BeatList.es.js +17 -17
- package/dist/microinsights/carousel/BeatList.es.js.map +1 -1
- package/dist/microinsights/carousel/CarouselControls.es.js.map +1 -1
- package/dist/microinsights/carousel/CarouselHeader.es.js.map +1 -1
- package/dist/microinsights/carousel/MicroBeatCarousel.es.js.map +1 -1
- package/dist/microinsights/constants/Analytics.es.js.map +1 -1
- package/dist/networth/NetWorthMicroWidget.es.js.map +1 -1
- package/dist/networth/NetWorthWidget.es.js.map +1 -1
- package/dist/networth/components/AssetsLiabilitiesDetail.es.js +1 -1
- package/dist/networth/components/AssetsLiabilitiesDetail.es.js.map +1 -1
- package/dist/networth/components/GainsLossesDetail.es.js.map +1 -1
- package/dist/networth/components/NetWorthChange.es.js.map +1 -1
- package/dist/networth/components/NetWorthChart.es.js.map +1 -1
- package/dist/networth/components/NetWorthList.es.js.map +1 -1
- package/dist/networth/components/NetWorthListItem.es.js.map +1 -1
- package/dist/networth/components/NetWorthSummary.es.js.map +1 -1
- package/dist/networth/components/micro/NetworthData.es.js.map +1 -1
- package/dist/networth/components/micro/ZeroState.es.js.map +1 -1
- package/dist/notifications/components/DateRow.es.js.map +1 -1
- package/dist/notifications/components/NotificationBadge.es.js.map +1 -1
- package/dist/notifications/components/NotificationCard.es.js.map +1 -1
- package/dist/notifications/components/NotificationDrawer.es.js.map +1 -1
- package/dist/notifications/components/NotificationList.es.js +33 -30
- package/dist/notifications/components/NotificationList.es.js.map +1 -1
- package/dist/notifications/components/NotificationsEmptyState.es.js.map +1 -1
- package/dist/recurringtransactions/RecurringTransactionsMicroWidget.es.js.map +1 -1
- package/dist/recurringtransactions/RecurringTransactionsMiniWidget.es.js.map +1 -1
- package/dist/recurringtransactions/RecurringTransactionsWidget.es.js.map +1 -1
- package/dist/recurringtransactions/ZeroStateMicroWidget.es.js.map +1 -1
- package/dist/recurringtransactions/components/MicroWidgetContent.es.js.map +1 -1
- package/dist/recurringtransactions/components/MiniWidgetContent.es.js.map +1 -1
- package/dist/recurringtransactions/components/PaymentSchedule.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurrenceBadges.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurrenceList.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurrenceRow.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurringSettingsDrawer.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurringStatus.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurringTransactionDetails.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurringTransactionDetailsDrawer.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurringTransactionList.es.js.map +1 -1
- package/dist/recurringtransactions/components/RecurringTransactions.es.js.map +1 -1
- package/dist/recurringtransactions/components/UpcomingRecurrenceCard.es.js.map +1 -1
- package/dist/recurringtransactions/components/actions/LinkTransactionDrawer.es.js.map +1 -1
- package/dist/recurringtransactions/components/actions/MarkAsPaidDialog.es.js.map +1 -1
- package/dist/recurringtransactions/components/actions/MarkAsUnpaidDialog.es.js.map +1 -1
- package/dist/recurringtransactions/components/actions/PaymentScheduleAction.es.js.map +1 -1
- package/dist/recurringtransactions/components/micro/MerchantLogosRow.es.js.map +1 -1
- package/dist/recurringtransactions/components/micro/OverlappingMerchantLogos.es.js.map +1 -1
- package/dist/recurringtransactions/components/micro/RecurrenceLegend.es.js.map +1 -1
- package/dist/recurringtransactions/components/recurrencecalendar/Legend.es.js.map +1 -1
- package/dist/recurringtransactions/components/recurrencecalendar/RecurrenceCalendar.es.js.map +1 -1
- package/dist/recurringtransactions/components/recurrencecalendar/RecurrenceDay.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/RecurringSettings.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransaction.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/AddRecurringTransactionDetails.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/ManageExpenses.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/ManageIncome.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/RecurringRow.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/RecurringSettingsZeroState.es.js.map +1 -1
- package/dist/recurringtransactions/components/shared/recurringsettings/SelectTransaction.es.js.map +1 -1
- package/dist/settings/NotificationSettingsWidget.es.js.map +1 -1
- package/dist/settings/SettingsWidget.es.js.map +1 -1
- package/dist/settings/TransactionRulesWidget.es.js.map +1 -1
- package/dist/settings/components/SettingsWidgetContents.es.js.map +1 -1
- package/dist/settings/components/devices/DeviceDialog.es.js.map +1 -1
- package/dist/settings/components/devices/DeviceList.es.js.map +1 -1
- package/dist/settings/components/devices/DeviceTab.es.js.map +1 -1
- package/dist/settings/components/devices/DeviceTable.es.js +82 -82
- package/dist/settings/components/devices/DeviceTable.es.js.map +1 -1
- package/dist/settings/components/notifications/AccountNotificationProfile.es.js.map +1 -1
- package/dist/settings/components/notifications/AccountNotificationProfiles.es.js.map +1 -1
- package/dist/settings/components/notifications/AccountProfileListItem.es.js.map +1 -1
- package/dist/settings/components/notifications/DeliveryMethods.es.js.map +1 -1
- package/dist/settings/components/notifications/NotificationProfile.es.js.map +1 -1
- package/dist/settings/components/notifications/NotificationSettings.es.js.map +1 -1
- package/dist/settings/components/notifications/PersonalDetails.es.js.map +1 -1
- package/dist/settings/components/profile/ProfileTab.es.js.map +1 -1
- package/dist/settings/components/profile/actions/VerifyEmailAction.es.js.map +1 -1
- package/dist/settings/components/profile/actions/VerifyPhoneAction.es.js.map +1 -1
- package/dist/settings/components/profile/actions/VerifyTokenAction.es.js.map +1 -1
- package/dist/settings/components/transactionrules/TransactionRulesTab.es.js.map +1 -1
- package/dist/settings/components/transactionrules/actions/DeleteRuleAction.es.js.map +1 -1
- package/dist/settings/components/transactionrules/actions/EditPayeeAction.es.js.map +1 -1
- package/dist/settings/components/transactionrules/components/EditRuleDetails.es.js.map +1 -1
- package/dist/settings/components/transactionrules/components/RuleListItem.es.js +24 -21
- package/dist/settings/components/transactionrules/components/RuleListItem.es.js.map +1 -1
- package/dist/spending/SpendingMiniWidget.es.js.map +1 -1
- package/dist/spending/SpendingWidget.es.js +48 -39
- package/dist/spending/SpendingWidget.es.js.map +1 -1
- package/dist/spending/components/MiniSpendingChart.es.js.map +1 -1
- package/dist/spending/components/Spending.es.js.map +1 -1
- package/dist/spending/components/SpendingChart.es.js.map +1 -1
- package/dist/spending/components/SpendingDonut.es.js.map +1 -1
- package/dist/spending/components/SpendingLegend.es.js.map +1 -1
- package/dist/spending/components/SpendingList.es.js.map +1 -1
- package/dist/spending/components/SpendingTabLabel.es.js.map +1 -1
- package/dist/transactions/TransactionWidget.es.js.map +1 -1
- package/dist/transactions/components/shared/TransactionDetails.es.js.map +1 -1
- package/dist/transactions/components/shared/TransactionList.es.js.map +1 -1
- package/dist/transactions/components/shared/TransactionTable.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/Description.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/FlagTransaction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/ManualTransactionDetails.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/TransactionAmountHeader.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/TransactionDetailsView.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js +7 -7
- package/dist/transactions/components/shared/transactiondetails/actions/AddMerchantBudgetAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/CategoryAction.es.js +29 -29
- package/dist/transactions/components/shared/transactiondetails/actions/CategoryAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/DateAction.es.js +36 -36
- package/dist/transactions/components/shared/transactiondetails/actions/DateAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/DeleteAction.es.js +7 -7
- package/dist/transactions/components/shared/transactiondetails/actions/DeleteAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.es.js +7 -7
- package/dist/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/ExcludeAction.es.js +7 -7
- package/dist/transactions/components/shared/transactiondetails/actions/ExcludeAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/MemoAction.es.js +24 -24
- package/dist/transactions/components/shared/transactiondetails/actions/MemoAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/SplitAction.es.js +40 -40
- package/dist/transactions/components/shared/transactiondetails/actions/SplitAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiondetails/actions/TagsAction.es.js +34 -34
- package/dist/transactions/components/shared/transactiondetails/actions/TagsAction.es.js.map +1 -1
- package/dist/transactions/components/shared/transactionlist/TransactionRow.es.js.map +1 -1
- package/dist/transactions/components/shared/transactionlist/ZeroState.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/AccountCell.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/AmountCell.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/CategoryCell.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/DateCell.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/FlagCell.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/HeaderCell.es.js.map +1 -1
- package/dist/transactions/components/shared/transactiontable/cells/PayeeCell.es.js.map +1 -1
- package/dist/transactions/components/splitmanager/SplitManager.es.js.map +1 -1
- package/dist/transactions/components/splitmanager/SplitRow.es.js.map +1 -1
- package/dist/transactions/components/tagmanager/Header.es.js.map +1 -1
- package/dist/transactions/components/tagmanager/SearchBox.es.js.map +1 -1
- package/dist/transactions/components/tagmanager/TagManager.es.js.map +1 -1
- package/dist/transactions/components/tagmanager/TagRow.es.js +4 -4
- package/dist/transactions/components/tagmanager/TagRow.es.js.map +1 -1
- package/dist/transactions/components/transactionwidget/AddAccountModal.es.js.map +1 -1
- package/dist/transactions/components/transactionwidget/actions/EditCategoryAction.es.js.map +1 -1
- package/dist/transactions/components/transactionwidget/actions/ExportCsvAction.es.js.map +1 -1
- package/dist/transactions/utils/Transactions.es.js +20 -12
- package/dist/transactions/utils/Transactions.es.js.map +1 -1
- package/dist/trends/TrendsFullWidget.es.js +47 -47
- package/dist/trends/TrendsFullWidget.es.js.map +1 -1
- package/dist/trends/TrendsMicroWidget.es.js.map +1 -1
- package/dist/trends/TrendsMiniWidget.es.js.map +1 -1
- package/dist/trends/TrendsWidget.es.js +88 -89
- package/dist/trends/TrendsWidget.es.js.map +1 -1
- package/dist/trends/ZeroStateMicroWidget.es.js.map +1 -1
- package/dist/trends/components/CategoriesList.es.js.map +1 -1
- package/dist/trends/components/CategoryDetailChart.es.js.map +1 -1
- package/dist/trends/components/CategoryDetails.es.js.map +1 -1
- package/dist/trends/components/DateRangeText.es.js.map +1 -1
- package/dist/trends/components/TrendsChart.es.js.map +1 -1
- package/dist/trends/components/TrendsDrawer.es.js.map +1 -1
- package/dist/trends/components/TrendsInsights.es.js +21 -21
- package/dist/trends/components/TrendsInsights.es.js.map +1 -1
- package/dist/trends/components/TrendsMicroSpendingIncomeBox.es.js.map +1 -1
- package/dist/trends/components/TrendsTableContainer.es.js.map +1 -1
- package/dist/trends/components/TrendsViewToggle.es.js.map +1 -1
- package/dist/trends/components/trendstable/AccessibleSortIcon.es.js.map +1 -1
- package/dist/trends/components/trendstable/AmountCell.es.js.map +1 -1
- package/dist/trends/components/trendstable/CategoryCell.es.js.map +1 -1
- package/dist/trends/components/trendstable/HeaderCell.es.js.map +1 -1
- package/package.json +36 -35
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateUtil.es.js","names":[],"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'\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\n// UTC variant for post dates, which are absolute calendar dates that must not\n// shift across the day boundary when localized.\nexport const fromUnixUTCToDayOfWeekAndDate = (date: number) =>\n formatDate(fromUnixUTC(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"],"mappings":";;;;;;;;;;;;AAeA,IAAa,IAAA,CAAqB,MAAqB;
|
|
1
|
+
{"version":3,"file":"DateUtil.es.js","names":[],"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'\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\n// UTC variant for post dates, which are absolute calendar dates that must not\n// shift across the day boundary when localized.\nexport const fromUnixUTCToDayOfWeekAndDate = (date: number) =>\n formatDate(fromUnixUTC(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"],"mappings":";;;;;;;;;;;;AAeA,IAAa,IAAA,CAAqB,MAAqB;AACrD,QAAM,IAAY,EAAO,CAAI;AAC7B,MAAI,IAAW,EAAQ,GAAM,CAAgB;AAC7C,SAAO,EAAS,GAAU,EAAa,CAAC,IACtC,CAAA,IAAW,EAAS,GAAU,CAAC;AAEjC,SAAO;AACT,GAEa,IAAA,CAAuB,MAAqB;AACvD,MAAI,IAAW;AACf,SAAO,EAAS,GAAU,EAAa,CAAC,IACtC,CAAA,IAAW,EAAS,GAAU,CAAC;AAEjC,SAAO;AACT,GAEa,IAAA,CAAwB,GAAc,MAAyB;AAC1E,QAAM,IAAQ,EAAa,GACrB,CAAC,GAAU,CAAA,IAAa,CAAC,GAAM,CAAI,EAAE,KAAA,CAAM,GAAG,MAAM,IAAI,CAAC,GACzD,IAAA,CAAkB,GAAa,MACnC,KAAO,KAAK,EAAW,CAAK,IAAI,EAAQ,GAAO,CAAG;AAEpD,SAAO;AAAA,IACL,EAAe,GAAO,CAAQ;AAAA,IAC9B,EAAe,GAAO,CAAS;AAAA,IAC/B,EAAe,EAAU,GAAO,CAAC,GAAG,CAAQ;AAAA,IAC5C,EAAe,EAAU,GAAO,CAAC,GAAG,CAAS;AAAA,IAC7C,EAAe,EAAU,GAAO,CAAC,GAAG,CAAQ;AAAA,IAC5C,EAAe,EAAU,GAAO,CAAC,GAAG,CAAS;AAAA,EAC/C;AACF,GAEa,IAAA,CAA2B,GAAc,MAAuB;AAC3E,QAAM,IAAQ,EAAa,GACrB,IAAa,EAAqB,GAAM,CAAI;AAClD,SAAO,EAAW,KAAA,CAAM,MAAM,CAAC,EAAS,GAAG,CAAK,CAAC,KAAK,EAAW,EAAW,SAAS,CAAA;AACvF,GAEa,IAAA,CAAsB,MAAqB;AACtD,MAAI,IAAW,EAAQ,EAAa,GAAG,EAAK,QAAQ,CAAC;AACrD,SAAO,EAAS,GAAU,EAAa,CAAC,IACtC,CAAA,IAAW,EAAU,GAAU,CAAC;AAElC,SAAO;AACT,GAEa,IAAA,CAAwB,MAAqB;AACxD,MAAI,IAAW;AACf,SAAO,EAAS,GAAU,EAAa,CAAC,IACtC,CAAA,IAAW,EAAU,GAAU,CAAC;AAElC,SAAO;AACT,GAEa,IAAA,CAAwB,MAAqB;AACxD,MAAI,IAAW,EAAY,GAAM,CAAC;AAClC,SAAO,EAAS,GAAU,EAAa,CAAC,IACtC,CAAA,IAAW,EAAY,GAAU,CAAC;AAEpC,SAAO;AACT,GAEa,IAAA,CAA0B,MAAqB;AAC1D,MAAI,IAAW;AACf,SAAO,EAAS,GAAU,EAAa,CAAC,IACtC,CAAA,IAAW,EAAY,GAAU,CAAC;AAEpC,SAAO;AACT,GAEa,IAAA,CAAqB,MACzB,EAAS,GAAM,CAAC,GAGZ,IAAA,CAAe,MAAoB;AAC9C,QAAM,IAAO,EAAa,CAAO;AACjC,SAAO,IAAI,KAAK,EAAK,eAAe,GAAG,EAAK,YAAY,GAAG,EAAK,WAAW,CAAC;AAC9E,GAEa,IAAA,CAA8B,MACzC,EAAW,EAAa,CAAI,GAAG,EAAkB,qBAAqB,GAI3D,IAAA,CAAiC,MAC5C,EAAW,EAAY,CAAI,GAAG,EAAkB,qBAAqB,GAE1D,IAAA,CAA4B,MACvC,IAAY,EAAW,EAAa,CAAS,GAAG,EAAkB,UAAU,IAAI"}
|
|
@@ -6,24 +6,24 @@ import { getUnixTime as w } from "date-fns/getUnixTime";
|
|
|
6
6
|
import { getDate as T } from "date-fns/getDate";
|
|
7
7
|
import { fromUnixTime as d } from "date-fns/fromUnixTime";
|
|
8
8
|
var F = { unnamed_label: "Unnamed Debt" }, G = (a, n, t = 0) => {
|
|
9
|
-
const
|
|
10
|
-
S(
|
|
9
|
+
const o = a.map((s) => ({ ...s }));
|
|
10
|
+
S(o, n);
|
|
11
11
|
const i = /* @__PURE__ */ new Date(), e = [];
|
|
12
|
-
let
|
|
13
|
-
for (const s of
|
|
12
|
+
let r = 0, m = 1;
|
|
13
|
+
for (const s of o) e.push({
|
|
14
14
|
...s,
|
|
15
15
|
dataset: [{
|
|
16
16
|
x: new Date(i),
|
|
17
17
|
y: s.balance
|
|
18
18
|
}]
|
|
19
19
|
});
|
|
20
|
-
for (;
|
|
21
|
-
let s = !1,
|
|
22
|
-
for (const [_, l] of
|
|
20
|
+
for (; o.some((s) => s.balance >= 0.01 && !s.is_impossible); ) {
|
|
21
|
+
let s = !1, c = !1, p = !1;
|
|
22
|
+
for (const [_, l] of o.entries()) {
|
|
23
23
|
if (l.balance <= 0.01) continue;
|
|
24
24
|
const y = e[_].dataset, u = (l.interest_rate ?? 0) / 100 / 12, D = l.balance * u, v = l.monthly_payment ?? 0;
|
|
25
25
|
let M = v, h = 0;
|
|
26
|
-
!
|
|
26
|
+
!p && t > 0 && (M += t, p = !0), !c && r > 0 && (h = r, c = !0), l.balance += D;
|
|
27
27
|
const f = Math.min(l.balance, M + h);
|
|
28
28
|
if (f <= D) {
|
|
29
29
|
l.is_impossible = !0, e[_].is_impossible = !0, e[_].priority = void 0, y.push({
|
|
@@ -37,7 +37,7 @@ var F = { unnamed_label: "Unnamed Debt" }, G = (a, n, t = 0) => {
|
|
|
37
37
|
y: Math.max(0, l.balance),
|
|
38
38
|
payment: f,
|
|
39
39
|
extra: h
|
|
40
|
-
}), l.balance <= 0 && (
|
|
40
|
+
}), l.balance <= 0 && (r += v, e[_].projected_payoff_date = new Date(i)), f > 0 && (s = !0);
|
|
41
41
|
}
|
|
42
42
|
s && i.setMonth(i.getMonth() + 1);
|
|
43
43
|
}
|
|
@@ -53,8 +53,8 @@ var F = { unnamed_label: "Unnamed Debt" }, G = (a, n, t = 0) => {
|
|
|
53
53
|
primaryButton: n ? a.connect_accounts : void 0
|
|
54
54
|
});
|
|
55
55
|
function K(a, n) {
|
|
56
|
-
const t = a.filter((e) => e.account_type === C.CHECKING_LINE_OF_CREDIT ? Number(e.balance) <= 0 : e.is_excluded_from_debts !== !0),
|
|
57
|
-
return [...
|
|
56
|
+
const t = a.filter((e) => e.account_type === C.CHECKING_LINE_OF_CREDIT ? Number(e.balance) <= 0 : e.is_excluded_from_debts !== !0), o = n.filter((e) => t.some((r) => r.guid === e.account_guid)).map((e) => P(t.find((r) => r.guid === e.account_guid), e)), i = t.filter((e) => !o.some((r) => r.account.guid === e.guid)).map((e) => P(e));
|
|
57
|
+
return [...o, ...i];
|
|
58
58
|
}
|
|
59
59
|
function P(a, n) {
|
|
60
60
|
const t = {
|
|
@@ -63,19 +63,19 @@ function P(a, n) {
|
|
|
63
63
|
guid: a.guid
|
|
64
64
|
};
|
|
65
65
|
if (n) {
|
|
66
|
-
const
|
|
66
|
+
const o = n.payment_due_at ? T(d(n.payment_due_at)) : 1, i = x(/* @__PURE__ */ new Date()).setDate(o);
|
|
67
67
|
t.balance = Math.abs(n.amount - n.current_amount), t.interest_rate = n.interest_rate, t.is_paid_off = n.is_complete, t.monthly_payment = n.monthly_payment, t.name = n.name, t.original_balance = n.initial_amount, t.payment_due_date = i;
|
|
68
68
|
} else {
|
|
69
|
-
const
|
|
70
|
-
t.balance = Math.max(e, 0), t.interest_rate = m, t.is_paid_off = e === 0, t.monthly_payment =
|
|
69
|
+
const o = a.payment_due_at ? T(d(a.payment_due_at)) : 1, i = x(/* @__PURE__ */ new Date()).setDate(o), e = a.balance ?? 0, r = a.minimum_payment ?? void 0, m = a.interest_rate ?? void 0;
|
|
70
|
+
t.balance = Math.max(e, 0), t.interest_rate = m, t.is_paid_off = e === 0, t.monthly_payment = r, t.name = a?.name ?? F.unnamed_label, t.original_balance = a.original_balance, t.payment_due_date = i;
|
|
71
71
|
}
|
|
72
72
|
return t.is_impossible = !1, t.priority = void 0, t.projected_payoff_date = void 0, t;
|
|
73
73
|
}
|
|
74
74
|
var I = (a) => (a[a.length - 1] || {}).timestamp, S = (a, n) => {
|
|
75
|
-
const [t,
|
|
76
|
-
...
|
|
75
|
+
const [t, o] = a.reduce(([i, e], r) => (r.is_paid_off || r.is_impossible ? e.push({
|
|
76
|
+
...r,
|
|
77
77
|
minimumPayments: []
|
|
78
|
-
}) : i.push(A(
|
|
78
|
+
}) : i.push(A(r)), [i, e]), [[], []]);
|
|
79
79
|
switch (n) {
|
|
80
80
|
case b.FASTEST_PAYOFF_FIRST:
|
|
81
81
|
t.sort((i, e) => (i.minimumFinalPayment ?? 0) - (e.minimumFinalPayment ?? 0));
|
|
@@ -92,36 +92,36 @@ var I = (a) => (a[a.length - 1] || {}).timestamp, S = (a, n) => {
|
|
|
92
92
|
default:
|
|
93
93
|
t.sort((i, e) => i.balance - e.balance);
|
|
94
94
|
}
|
|
95
|
-
a.splice(0, a.length, ...t, ...
|
|
95
|
+
a.splice(0, a.length, ...t, ...o);
|
|
96
96
|
}, A = (a) => {
|
|
97
|
-
const { monthly_payment: n, interest_rate: t, balance:
|
|
97
|
+
const { monthly_payment: n, interest_rate: t, balance: o, payment_due_date: i } = a, e = H(o, t ?? 0, n ?? 0), r = N(e, o, t ?? 0, n ?? 0, i), m = I(r);
|
|
98
98
|
return {
|
|
99
99
|
...a,
|
|
100
100
|
minimumFinalPayment: m,
|
|
101
|
-
minimumPayments:
|
|
101
|
+
minimumPayments: r
|
|
102
102
|
};
|
|
103
103
|
}, H = (a, n = 0, t = 0) => {
|
|
104
104
|
if (t === 0) return 0;
|
|
105
|
-
const
|
|
106
|
-
return Math.ceil(
|
|
107
|
-
}, N = (a, n, t,
|
|
105
|
+
const o = n / 1200;
|
|
106
|
+
return Math.ceil(o === 0 ? a / t : -Math.log(1 - o * a / t) / Math.log(1 + o));
|
|
107
|
+
}, N = (a, n, t, o, i) => {
|
|
108
108
|
const e = [];
|
|
109
109
|
if (t === 0) {
|
|
110
110
|
for (let m = 0; m < a; m++) {
|
|
111
|
-
const s = n -
|
|
111
|
+
const s = n - o * (m + 1), c = n - o * m, p = s >= 0 ? o : c;
|
|
112
112
|
e.push({
|
|
113
113
|
balance: s >= 0 ? s : 0,
|
|
114
114
|
interest: t,
|
|
115
|
-
payment:
|
|
116
|
-
principal:
|
|
115
|
+
payment: p,
|
|
116
|
+
principal: p,
|
|
117
117
|
timestamp: w(E(d(i), m + 1))
|
|
118
118
|
});
|
|
119
119
|
}
|
|
120
120
|
return e;
|
|
121
121
|
}
|
|
122
|
-
const
|
|
122
|
+
const r = t / 1200;
|
|
123
123
|
for (let m = 0; m < a; m++) {
|
|
124
|
-
const s = w(E(d(i), m + 1)),
|
|
124
|
+
const s = w(E(d(i), m + 1)), c = Math.pow(1 + r, m), p = n * c - o * ((c - 1) / r), _ = Math.pow(1 + r, m + 1), l = n * _ - o * ((_ - 1) / r), y = o + Math.min(l, 0), u = p * r;
|
|
125
125
|
e.push({
|
|
126
126
|
balance: Math.max(0, l),
|
|
127
127
|
interest: u,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DebtUtils.es.js","names":[],"sources":["../../../src/core/utils/DebtUtils.ts"],"sourcesContent":["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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DebtUtils.es.js","names":[],"sources":["../../../src/core/utils/DebtUtils.ts"],"sourcesContent":["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 ?? undefined\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"],"mappings":"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"}
|
|
@@ -4,20 +4,20 @@ import { MetaType as r, TrackType as o } from "../types/Goal.es.js";
|
|
|
4
4
|
import { formatPercentage as u } from "./NumberFormatting.es.js";
|
|
5
5
|
import { addYears as d } from "date-fns/addYears";
|
|
6
6
|
import { getUnixTime as R } from "date-fns/getUnixTime";
|
|
7
|
-
import { fromUnixTime as
|
|
7
|
+
import { fromUnixTime as m } from "date-fns/fromUnixTime";
|
|
8
8
|
function O(e, t) {
|
|
9
|
-
const
|
|
10
|
-
let a = t.current_amount /
|
|
9
|
+
const i = t.track_type === o.DEBT_TRACK ? t.initial_amount : t.amount;
|
|
10
|
+
let a = t.current_amount / i;
|
|
11
11
|
a > 1 && (a = 1), a = t.track_type === o.DEBT_TRACK ? 1 - a : a, isNaN(a) && (a = 1);
|
|
12
|
-
let
|
|
13
|
-
t.track_type === o.DEBT_TRACK ? (_ = "common.white",
|
|
12
|
+
let c = "chart.chart1", _ = "common.black";
|
|
13
|
+
t.track_type === o.DEBT_TRACK ? (_ = "common.white", c = "chart.chart5") : t.track_type === o.RETIREMENT_TRACK && (c = "chart.chart6");
|
|
14
14
|
const s = {
|
|
15
15
|
style: "percent",
|
|
16
16
|
minimumFractionDigits: 0,
|
|
17
17
|
maximumFractionDigits: 0
|
|
18
|
-
},
|
|
18
|
+
}, l = t.is_complete ? t.completed_at : t.projected_to_complete_at, T = l ? m(l) : /* @__PURE__ */ new Date(), g = n(e.goal_percentage, u(a, s)), p = n(t.is_complete ? e.completed_label : e.goal_projection, E(T, b.MONTH_SHORT_YEAR));
|
|
19
19
|
return {
|
|
20
|
-
backgroundColor:
|
|
20
|
+
backgroundColor: c,
|
|
21
21
|
color: _,
|
|
22
22
|
percentage: a,
|
|
23
23
|
percentageText: g,
|
|
@@ -102,7 +102,10 @@ var k = (e, t) => {
|
|
|
102
102
|
default:
|
|
103
103
|
return n(t.zero_state_ongoing, "retirement");
|
|
104
104
|
}
|
|
105
|
-
}, I = (e, t) =>
|
|
105
|
+
}, I = (e, t) => {
|
|
106
|
+
const i = m(t), a = d(i, e);
|
|
107
|
+
return R(a);
|
|
108
|
+
};
|
|
106
109
|
export {
|
|
107
110
|
O as getGoalStatusData,
|
|
108
111
|
y as getGoalTypes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoalsUtil.es.js","names":[],"sources":["../../../src/core/utils/GoalsUtil.ts"],"sourcesContent":["import { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { addYears } from 'date-fns/addYears'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport { type Goal, type GoalsCopy, MetaType, TrackType } from '../index'\nimport { formatPercentage } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport interface GoalStatusData {\n backgroundColor: string\n color: string\n percentage: number\n percentageText: string\n projectedText: string\n}\n\nexport type GoalType = {\n bgcolor: string\n icon: string\n label: string\n description: string\n subTypes: {\n icon: string\n label: string\n metaType: MetaType\n }[]\n type: TrackType\n}\n\nexport function getGoalStatusData(copy: GoalsCopy, goal: Goal): GoalStatusData {\n const amount = goal.track_type === TrackType.DEBT_TRACK ? goal.initial_amount : goal.amount\n\n let percentage = goal.current_amount / amount\n if (percentage > 1) percentage = 1\n // For Debts, the percentage is inversed.\n percentage = goal.track_type === TrackType.DEBT_TRACK ? 1 - percentage : percentage\n\n // Handle cases where both amounts are 0 producing NaN\n if (isNaN(percentage)) percentage = 1\n\n let backgroundColor = 'chart.chart1'\n let color = 'common.black'\n if (goal.track_type === TrackType.DEBT_TRACK) {\n color = 'common.white'\n backgroundColor = 'chart.chart5'\n } else if (goal.track_type === TrackType.RETIREMENT_TRACK) {\n backgroundColor = 'chart.chart6'\n }\n\n const percentageStyle = {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n } as Intl.NumberFormatOptions\n\n const completionDateUnixTime = goal.is_complete\n ? goal.completed_at\n : goal.projected_to_complete_at\n const completionDate = completionDateUnixTime ? fromUnixTime(completionDateUnixTime) : new Date()\n\n const percentageText = buildDynamicCopy(\n copy.goal_percentage,\n formatPercentage(percentage, percentageStyle),\n ) as string\n\n const projectedText = buildDynamicCopy(\n goal.is_complete ? copy.completed_label : copy.goal_projection,\n formatDate(completionDate, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n ) as string\n\n return {\n backgroundColor,\n color,\n percentage,\n percentageText,\n projectedText,\n }\n}\n\nexport function getGoalTypes(copy: GoalsCopy): GoalType[] {\n return [\n {\n bgcolor: 'chart.chart1',\n icon: 'attach_money',\n label: copy.saving_goal_label,\n description: copy.saving_goal_description,\n subTypes: [\n {\n icon: 'ecg_heart',\n label: copy.saving_goal_emergency_fund,\n metaType: MetaType.EMERGENCY_FUND,\n },\n {\n icon: 'directions_car',\n label: copy.saving_gaol_automobile,\n metaType: MetaType.AUTOMOBILE,\n },\n { icon: 'school', label: copy.saving_goal_college, metaType: MetaType.COLLEGE },\n { icon: 'home', label: copy.saving_goal_home, metaType: MetaType.HOUSE },\n {\n icon: 'mountain_flag',\n label: copy.saving_goal_recreational,\n metaType: MetaType.RECREATIONAL_VEHICLE,\n },\n { icon: 'airplane_ticket', label: copy.saving_goal_vacation, metaType: MetaType.VACATION },\n {\n icon: 'desktop_windows',\n label: copy.saving_goal_electronic,\n metaType: MetaType.ELECTRONIC,\n },\n { icon: 'payments', label: copy.saving_goal_other, metaType: MetaType.OTHER },\n ],\n type: TrackType.SAVINGS_TRACK,\n },\n {\n bgcolor: 'chart.chart5',\n icon: 'note_stack',\n label: copy.debt_goal_label,\n description: copy.debt_goal_description,\n subTypes: [],\n type: TrackType.DEBT_TRACK,\n },\n {\n bgcolor: 'chart.chart6',\n icon: 'person',\n label: copy.retirement_goal_label,\n description: copy.retirement_goal_description,\n subTypes: [],\n type: TrackType.RETIREMENT_TRACK,\n },\n ]\n}\n\nexport const getZeroStateOngoing = (trackType: TrackType, copy: GoalsCopy) => {\n switch (trackType) {\n case TrackType.DEBT_TRACK:\n return buildDynamicCopy(copy.zero_state_ongoing, 'debt') as string\n case TrackType.SAVINGS_TRACK:\n return buildDynamicCopy(copy.zero_state_ongoing, 'saving') as string\n default:\n return buildDynamicCopy(copy.zero_state_ongoing, 'retirement') as string\n }\n}\n\nexport const getProjectedRetirementDate = (retirementAge: number, userBirthday: number) => {\n const birthDate = fromUnixTime(userBirthday)\n const retirementDate = addYears(birthDate, retirementAge)\n return getUnixTime(retirementDate)\n}\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GoalsUtil.es.js","names":[],"sources":["../../../src/core/utils/GoalsUtil.ts"],"sourcesContent":["import { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { addYears } from 'date-fns/addYears'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport { type Goal, type GoalsCopy, MetaType, TrackType } from '../index'\nimport { formatPercentage } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport interface GoalStatusData {\n backgroundColor: string\n color: string\n percentage: number\n percentageText: string\n projectedText: string\n}\n\nexport type GoalType = {\n bgcolor: string\n icon: string\n label: string\n description: string\n subTypes: {\n icon: string\n label: string\n metaType: MetaType\n }[]\n type: TrackType\n}\n\nexport function getGoalStatusData(copy: GoalsCopy, goal: Goal): GoalStatusData {\n const amount = goal.track_type === TrackType.DEBT_TRACK ? goal.initial_amount : goal.amount\n\n let percentage = goal.current_amount / amount\n if (percentage > 1) percentage = 1\n // For Debts, the percentage is inversed.\n percentage = goal.track_type === TrackType.DEBT_TRACK ? 1 - percentage : percentage\n\n // Handle cases where both amounts are 0 producing NaN\n if (isNaN(percentage)) percentage = 1\n\n let backgroundColor = 'chart.chart1'\n let color = 'common.black'\n if (goal.track_type === TrackType.DEBT_TRACK) {\n color = 'common.white'\n backgroundColor = 'chart.chart5'\n } else if (goal.track_type === TrackType.RETIREMENT_TRACK) {\n backgroundColor = 'chart.chart6'\n }\n\n const percentageStyle = {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n } as Intl.NumberFormatOptions\n\n const completionDateUnixTime = goal.is_complete\n ? goal.completed_at\n : goal.projected_to_complete_at\n const completionDate = completionDateUnixTime ? fromUnixTime(completionDateUnixTime) : new Date()\n\n const percentageText = buildDynamicCopy(\n copy.goal_percentage,\n formatPercentage(percentage, percentageStyle),\n ) as string\n\n const projectedText = buildDynamicCopy(\n goal.is_complete ? copy.completed_label : copy.goal_projection,\n formatDate(completionDate, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n ) as string\n\n return {\n backgroundColor,\n color,\n percentage,\n percentageText,\n projectedText,\n }\n}\n\nexport function getGoalTypes(copy: GoalsCopy): GoalType[] {\n return [\n {\n bgcolor: 'chart.chart1',\n icon: 'attach_money',\n label: copy.saving_goal_label,\n description: copy.saving_goal_description,\n subTypes: [\n {\n icon: 'ecg_heart',\n label: copy.saving_goal_emergency_fund,\n metaType: MetaType.EMERGENCY_FUND,\n },\n {\n icon: 'directions_car',\n label: copy.saving_gaol_automobile,\n metaType: MetaType.AUTOMOBILE,\n },\n { icon: 'school', label: copy.saving_goal_college, metaType: MetaType.COLLEGE },\n { icon: 'home', label: copy.saving_goal_home, metaType: MetaType.HOUSE },\n {\n icon: 'mountain_flag',\n label: copy.saving_goal_recreational,\n metaType: MetaType.RECREATIONAL_VEHICLE,\n },\n { icon: 'airplane_ticket', label: copy.saving_goal_vacation, metaType: MetaType.VACATION },\n {\n icon: 'desktop_windows',\n label: copy.saving_goal_electronic,\n metaType: MetaType.ELECTRONIC,\n },\n { icon: 'payments', label: copy.saving_goal_other, metaType: MetaType.OTHER },\n ],\n type: TrackType.SAVINGS_TRACK,\n },\n {\n bgcolor: 'chart.chart5',\n icon: 'note_stack',\n label: copy.debt_goal_label,\n description: copy.debt_goal_description,\n subTypes: [],\n type: TrackType.DEBT_TRACK,\n },\n {\n bgcolor: 'chart.chart6',\n icon: 'person',\n label: copy.retirement_goal_label,\n description: copy.retirement_goal_description,\n subTypes: [],\n type: TrackType.RETIREMENT_TRACK,\n },\n ]\n}\n\nexport const getZeroStateOngoing = (trackType: TrackType, copy: GoalsCopy) => {\n switch (trackType) {\n case TrackType.DEBT_TRACK:\n return buildDynamicCopy(copy.zero_state_ongoing, 'debt') as string\n case TrackType.SAVINGS_TRACK:\n return buildDynamicCopy(copy.zero_state_ongoing, 'saving') as string\n default:\n return buildDynamicCopy(copy.zero_state_ongoing, 'retirement') as string\n }\n}\n\nexport const getProjectedRetirementDate = (retirementAge: number, userBirthday: number) => {\n const birthDate = fromUnixTime(userBirthday)\n const retirementDate = addYears(birthDate, retirementAge)\n return getUnixTime(retirementDate)\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { AnalysisType as V, EquityClassificationTypes as b, EquityClassificationValues as m, FixedIncomeClassificationTypes as L, FixedIncomeClassificationValues as f } from "../constants/Investments.es.js";
|
|
2
2
|
import x from "numeral";
|
|
3
|
-
var d = (e,
|
|
4
|
-
const
|
|
5
|
-
for (let t = 0; t <
|
|
3
|
+
var d = (e, a = 3) => {
|
|
4
|
+
const r = Object.keys(e).map(Number).filter((t) => t !== 0).sort((t, i) => t - i), s = [];
|
|
5
|
+
for (let t = 0; t < r.length; t += a) s.push(r.slice(t, t + a).map((i) => e[i]));
|
|
6
6
|
return s;
|
|
7
7
|
}, A = d(f), G = d(m), D = (e) => {
|
|
8
|
-
const
|
|
8
|
+
const a = p(e, k), r = p(e, w), s = (t, i) => {
|
|
9
9
|
const c = t.reduce((o, n) => o + O(n), 0), u = t.reduce((o, n) => {
|
|
10
10
|
const l = i(n);
|
|
11
11
|
return Object.keys(l).forEach((_) => o[_] = (o[_] || 0) + l[_]), o;
|
|
@@ -13,24 +13,27 @@ var d = (e, r = 3) => {
|
|
|
13
13
|
return Object.fromEntries(Object.entries(u).map(([o, n]) => [o, n / c * 100]));
|
|
14
14
|
};
|
|
15
15
|
return {
|
|
16
|
-
stocks: s(
|
|
17
|
-
bonds: s(
|
|
16
|
+
stocks: s(a, y),
|
|
17
|
+
bonds: s(r, h)
|
|
18
18
|
};
|
|
19
19
|
}, N = (e) => {
|
|
20
|
-
const
|
|
20
|
+
const a = e.filter((t) => !isNaN(t.equity_classification)), r = e.filter((t) => !isNaN(t.fixed_income_classification)), s = (t, i, c) => t.reduce((u, o) => {
|
|
21
21
|
const n = i(o);
|
|
22
22
|
return Object.keys(c).forEach((l) => {
|
|
23
23
|
u[l] = (u[l] || 0) + (n[l] || 0);
|
|
24
24
|
}), u;
|
|
25
25
|
}, {});
|
|
26
26
|
return {
|
|
27
|
-
stocks: s(
|
|
28
|
-
bonds: s(
|
|
27
|
+
stocks: s(a, y, b),
|
|
28
|
+
bonds: s(r, h, L)
|
|
29
29
|
};
|
|
30
|
-
}, C = (e,
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
}, C = (e, a) => Object.fromEntries(Object.entries(e).map(([r, s]) => [r, s * a / 100])), h = (e) => E(e, w, f), w = (e) => {
|
|
31
|
+
const a = e.fixed_income_classification;
|
|
32
|
+
return { [f[a]]: 100 };
|
|
33
|
+
}, y = (e) => E(e, k, m), k = (e) => {
|
|
34
|
+
const { large_core_weight: a, large_growth_weight: r, large_value_weight: s, mid_core_weight: t, mid_growth_weight: i, mid_value_weight: c, small_core_weight: u, small_growth_weight: o, small_value_weight: n, unknown_weight: l, equity_classification: _ } = e, v = {
|
|
35
|
+
LARGE_CORE: a ?? 0,
|
|
36
|
+
LARGE_GROWTH: r ?? 0,
|
|
34
37
|
LARGE_VALUE: s ?? 0,
|
|
35
38
|
MID_CORE: t ?? 0,
|
|
36
39
|
MID_GROWTH: i ?? 0,
|
|
@@ -41,21 +44,21 @@ var d = (e, r = 3) => {
|
|
|
41
44
|
UNKNOWN: l ?? 0
|
|
42
45
|
};
|
|
43
46
|
return g(v) === 0 && _ !== void 0 ? { [m[_]]: 100 } : v;
|
|
44
|
-
}, E = (e,
|
|
45
|
-
const s =
|
|
47
|
+
}, E = (e, a, r) => {
|
|
48
|
+
const s = a(e), t = O(e), i = C(s, t);
|
|
46
49
|
if (g(i) === 0) {
|
|
47
50
|
const c = String(e.equity_classification ?? e.fixed_income_classification);
|
|
48
|
-
if (c in
|
|
51
|
+
if (c in r) return { [r[c]]: t };
|
|
49
52
|
console.error(`Invalid classification key: ${c}`);
|
|
50
53
|
}
|
|
51
54
|
return i;
|
|
52
|
-
}, I = (e) => e.split("_").map((
|
|
53
|
-
const s = r
|
|
55
|
+
}, I = (e) => e.split("_").map((a) => a.charAt(0).toUpperCase() + a.slice(1).toLowerCase()).join(" "), W = (e) => e >= 1 ? `${x(e).format("0")}%` : "< 1%", O = (e) => e.calculated_market_value ?? e.market_value, p = (e, a) => e.filter((r) => {
|
|
56
|
+
const s = a(r), t = g(s);
|
|
54
57
|
return t > 80 && t < 120;
|
|
55
|
-
}), M = (e,
|
|
56
|
-
const
|
|
57
|
-
return !s || Object.keys(s).length === 0 ?
|
|
58
|
-
}, g = (e) => Object.values(e).reduce((
|
|
58
|
+
}), M = (e, a) => {
|
|
59
|
+
const r = a === V.Stocks ? G : A, s = e[a];
|
|
60
|
+
return !s || Object.keys(s).length === 0 ? r.map((t) => t.map(() => "0%")) : r.map((t) => t.map((i) => W(s[i] ?? 0)));
|
|
61
|
+
}, g = (e) => Object.values(e).reduce((a, r) => a + r, 0);
|
|
59
62
|
export {
|
|
60
63
|
D as analysisChartData,
|
|
61
64
|
N as analysisDetailsData,
|
|
@@ -63,7 +66,7 @@ export {
|
|
|
63
66
|
C as calculateWeightedValue,
|
|
64
67
|
d as createGroups,
|
|
65
68
|
w as extractBondWeight,
|
|
66
|
-
|
|
69
|
+
k as extractStockWeight,
|
|
67
70
|
E as extractValueFromWeight,
|
|
68
71
|
I as formatKey,
|
|
69
72
|
W as formatPercent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvestmentUtil.es.js","names":[],"sources":["../../../src/core/utils/InvestmentUtil.ts"],"sourcesContent":["import numeral from 'numeral'\n\nimport type { Holding } from '../types'\n\nimport {\n AnalysisType,\n EquityClassificationTypes,\n EquityClassificationValues,\n FixedIncomeClassificationTypes,\n FixedIncomeClassificationValues,\n} from '../constants/Investments'\n\ntype WeightMap = Record<string, number>\n\nexport const createGroups = (classificationObj: Record<number, string>, groupSize = 3) => {\n const keys = Object.keys(classificationObj)\n .map(Number)\n .filter((k) => k !== 0)\n .sort((a, b) => a - b)\n\n const groups = []\n for (let i = 0; i < keys.length; i += groupSize) {\n groups.push(keys.slice(i, i + groupSize).map((key) => classificationObj[key]))\n }\n return groups\n}\n\nexport const bondGroups = createGroups(FixedIncomeClassificationValues)\nexport const stockGroups = createGroups(EquityClassificationValues)\n\nexport const analysisChartData = (holdings: Holding[]) => {\n const stocks = getValidHoldings(holdings, extractStockWeight)\n const bonds = getValidHoldings(holdings, extractBondWeight)\n\n const processGroupData = (group: Holding[], extractValueFn: (holding: Holding) => WeightMap) => {\n const totalValue = group.reduce((acc, holding) => acc + getHoldingValue(holding), 0)\n const groupValues = group.reduce((acc, holding) => {\n const value = extractValueFn(holding)\n Object.keys(value).forEach((key) => (acc[key] = (acc[key] || 0) + value[key]))\n return acc\n }, {} as WeightMap)\n\n return Object.fromEntries(\n Object.entries(groupValues).map(([key, value]) => [key, (value / totalValue) * 100]),\n )\n }\n\n const data = {\n stocks: processGroupData(stocks, extractStockValueFromWeight),\n bonds: processGroupData(bonds, extractBondValueFromWeight),\n }\n\n return data\n}\n\nexport const analysisDetailsData = (holdings: Holding[]) => {\n const stocks = holdings.filter((holding) => !isNaN(holding.equity_classification))\n const bonds = holdings.filter((holding) => !isNaN(holding.fixed_income_classification))\n\n const aggregateValues = (\n holdings: Holding[],\n extractValueFn: (holding: Holding) => WeightMap,\n classificationTypes: Record<string, number>,\n ) => {\n return holdings.reduce((acc, holding) => {\n const values = extractValueFn(holding)\n Object.keys(classificationTypes).forEach((sector) => {\n acc[sector] = (acc[sector] || 0) + (values[sector] || 0)\n })\n return acc\n }, {} as WeightMap)\n }\n\n return {\n stocks: aggregateValues(stocks, extractStockValueFromWeight, EquityClassificationTypes),\n bonds: aggregateValues(bonds, extractBondValueFromWeight, FixedIncomeClassificationTypes),\n }\n}\n\nexport const calculateWeightedValue = (weights: WeightMap, value: number): WeightMap => {\n return Object.fromEntries(\n Object.entries(weights).map(([key, weight]) => [key, (weight * value) / 100]),\n )\n}\n\nconst extractBondValueFromWeight = (bond: Holding) =>\n extractValueFromWeight(bond, extractBondWeight, FixedIncomeClassificationValues)\n\nexport const extractBondWeight = (bond: Holding): WeightMap => {\n const classificationKey = bond.fixed_income_classification\n return {\n [FixedIncomeClassificationValues[\n classificationKey as keyof typeof FixedIncomeClassificationValues\n ]]: 100,\n }\n}\n\nconst extractStockValueFromWeight = (stock: Holding) =>\n extractValueFromWeight(stock, extractStockWeight, EquityClassificationValues)\n\nexport const extractStockWeight = (stock: Holding): WeightMap => {\n const {\n large_core_weight,\n large_growth_weight,\n large_value_weight,\n mid_core_weight,\n mid_growth_weight,\n mid_value_weight,\n small_core_weight,\n small_growth_weight,\n small_value_weight,\n unknown_weight,\n equity_classification,\n } = stock\n\n const data: WeightMap = {\n LARGE_CORE: large_core_weight ?? 0,\n LARGE_GROWTH: large_growth_weight ?? 0,\n LARGE_VALUE: large_value_weight ?? 0,\n MID_CORE: mid_core_weight ?? 0,\n MID_GROWTH: mid_growth_weight ?? 0,\n MID_VALUE: mid_value_weight ?? 0,\n SMALL_CORE: small_core_weight ?? 0,\n SMALL_GROWTH: small_growth_weight ?? 0,\n SMALL_VALUE: small_value_weight ?? 0,\n UNKNOWN: unknown_weight ?? 0,\n }\n\n if (sumValues(data) === 0 && equity_classification !== undefined) {\n const key =\n EquityClassificationValues[equity_classification as keyof typeof EquityClassificationValues]\n return { [key]: 100 }\n }\n\n return data\n}\n\nexport const extractValueFromWeight = (\n holding: Holding,\n extractWeightFn: (h: Holding) => WeightMap,\n classificationValues: Record<string, string>,\n): WeightMap => {\n const weights = extractWeightFn(holding)\n const value = getHoldingValue(holding)\n const weightedValues = calculateWeightedValue(weights, value)\n\n if (sumValues(weightedValues) === 0) {\n const classificationKey = String(\n holding.equity_classification ?? holding.fixed_income_classification,\n )\n\n if (classificationKey in classificationValues) {\n return { [classificationValues[classificationKey]]: value }\n } else {\n console.error(`Invalid classification key: ${classificationKey}`)\n }\n }\n\n return weightedValues\n}\n\nexport const formatKey = (key: string): string =>\n key\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n\nexport const formatPercent = (value: number): string =>\n value >= 1 ? `${numeral(value).format('0')}%` : '< 1%'\n\nexport const getHoldingValue = (holding: Holding): number =>\n holding.calculated_market_value ?? holding.market_value\n\nexport const getValidHoldings = (\n holdings: Holding[],\n extractWeightFn: (holding: Holding) => WeightMap,\n): Holding[] => {\n return holdings.filter((holding) => {\n const weight = extractWeightFn(holding)\n const total = sumValues(weight)\n return total > 80 && total < 120\n })\n}\n\nexport const mapDataToPercentageGrid = (\n data: Record<AnalysisType, Record<string, number>>,\n analysisType: AnalysisType,\n): string[][] => {\n const groups = analysisType === AnalysisType.Stocks ? stockGroups : bondGroups\n\n const selected = data[analysisType]\n if (!selected || Object.keys(selected).length === 0)\n return groups.map((group) => group.map(() => '0%'))\n\n return groups.map((group) => group.map((key) => formatPercent(selected[key] ?? 0)))\n}\n\nexport const sumValues = (obj: WeightMap): number =>\n Object.values(obj).reduce((acc, val) => acc + val, 0)\n"],"mappings":";;AAcA,IAAa,IAAA,CAAgB,GAA2C,IAAY,MAAM;AACxF,QAAM,IAAO,OAAO,KAAK,CAAiB,EACvC,IAAI,MAAM,EACV,OAAA,CAAQ,MAAM,MAAM,CAAC,EACrB,KAAA,CAAM,GAAG,MAAM,IAAI,CAAC,GAEjB,IAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK,EACpC,CAAA,EAAO,KAAK,EAAK,MAAM,GAAG,IAAI,CAAS,EAAE,IAAA,CAAK,MAAQ,EAAkB,CAAA,CAAI,CAAC;AAE/E,SAAO;AACT,GAEa,IAAa,EAAa,CAA+B,GACzD,IAAc,EAAa,CAA0B,GAErD,IAAA,CAAqB,MAAwB;AACxD,QAAM,IAAS,EAAiB,GAAU,CAAkB,GACtD,IAAQ,EAAiB,GAAU,CAAiB,GAEpD,IAAA,CAAoB,GAAkB,MAAoD;AAC9F,UAAM,IAAa,EAAM,OAAA,CAAQ,GAAK,MAAY,IAAM,EAAgB,CAAO,GAAG,CAAC,GAC7E,IAAc,EAAM,OAAA,CAAQ,GAAK,MAAY;AACjD,YAAM,IAAQ,EAAe,CAAO;AACpC,oBAAO,KAAK,CAAK,EAAE,QAAA,CAAS,MAAS,EAAI,CAAA,KAAQ,EAAI,CAAA,KAAQ,KAAK,EAAM,CAAA,CAAK,GACtE;AAAA,IACT,GAAG,CAAC,CAAc;AAElB,WAAO,OAAO,YACZ,OAAO,QAAQ,CAAW,EAAE,IAAA,CAAK,CAAC,GAAK,CAAA,MAAW,CAAC,GAAM,IAAQ,IAAc,GAAG,CAAC,CACrF;AAAA,EACF;AAOA,SAAO;AAAA,IAJL,QAAQ,EAAiB,GAAQ,CAA2B;AAAA,IAC5D,OAAO,EAAiB,GAAO,CAA0B;AAAA,EAGpD;AACT,GAEa,IAAA,CAAuB,MAAwB;AAC1D,QAAM,IAAS,EAAS,OAAA,CAAQ,MAAY,CAAC,MAAM,EAAQ,qBAAqB,CAAC,GAC3E,IAAQ,EAAS,OAAA,CAAQ,MAAY,CAAC,MAAM,EAAQ,2BAA2B,CAAC,GAEhF,IAAA,CACJ,GACA,GACA,MAEO,EAAS,OAAA,CAAQ,GAAK,MAAY;AACvC,UAAM,IAAS,EAAe,CAAO;AACrC,kBAAO,KAAK,CAAmB,EAAE,QAAA,CAAS,MAAW;AACnD,MAAA,EAAI,CAAA,KAAW,EAAI,CAAA,KAAW,MAAM,EAAO,CAAA,KAAW;AAAA,IACxD,CAAC,GACM;AAAA,EACT,GAAG,CAAC,CAAc;AAGpB,SAAO;AAAA,IACL,QAAQ,EAAgB,GAAQ,GAA6B,CAAyB;AAAA,IACtF,OAAO,EAAgB,GAAO,GAA4B,CAA8B;AAAA,EAC1F;AACF,GAEa,IAAA,CAA0B,GAAoB,MAClD,OAAO,YACZ,OAAO,QAAQ,CAAO,EAAE,IAAA,CAAK,CAAC,GAAK,CAAA,MAAY,CAAC,GAAM,IAAS,IAAS,GAAG,CAAC,CAC9E,GAGI,IAAA,CAA8B,MAClC,EAAuB,GAAM,GAAmB,CAA+B,GAEpE,IAAA,CAAqB,
|
|
1
|
+
{"version":3,"file":"InvestmentUtil.es.js","names":[],"sources":["../../../src/core/utils/InvestmentUtil.ts"],"sourcesContent":["import numeral from 'numeral'\n\nimport type { Holding } from '../types'\n\nimport {\n AnalysisType,\n EquityClassificationTypes,\n EquityClassificationValues,\n FixedIncomeClassificationTypes,\n FixedIncomeClassificationValues,\n} from '../constants/Investments'\n\ntype WeightMap = Record<string, number>\n\nexport const createGroups = (classificationObj: Record<number, string>, groupSize = 3) => {\n const keys = Object.keys(classificationObj)\n .map(Number)\n .filter((k) => k !== 0)\n .sort((a, b) => a - b)\n\n const groups = []\n for (let i = 0; i < keys.length; i += groupSize) {\n groups.push(keys.slice(i, i + groupSize).map((key) => classificationObj[key]))\n }\n return groups\n}\n\nexport const bondGroups = createGroups(FixedIncomeClassificationValues)\nexport const stockGroups = createGroups(EquityClassificationValues)\n\nexport const analysisChartData = (holdings: Holding[]) => {\n const stocks = getValidHoldings(holdings, extractStockWeight)\n const bonds = getValidHoldings(holdings, extractBondWeight)\n\n const processGroupData = (group: Holding[], extractValueFn: (holding: Holding) => WeightMap) => {\n const totalValue = group.reduce((acc, holding) => acc + getHoldingValue(holding), 0)\n const groupValues = group.reduce((acc, holding) => {\n const value = extractValueFn(holding)\n Object.keys(value).forEach((key) => (acc[key] = (acc[key] || 0) + value[key]))\n return acc\n }, {} as WeightMap)\n\n return Object.fromEntries(\n Object.entries(groupValues).map(([key, value]) => [key, (value / totalValue) * 100]),\n )\n }\n\n const data = {\n stocks: processGroupData(stocks, extractStockValueFromWeight),\n bonds: processGroupData(bonds, extractBondValueFromWeight),\n }\n\n return data\n}\n\nexport const analysisDetailsData = (holdings: Holding[]) => {\n const stocks = holdings.filter((holding) => !isNaN(holding.equity_classification))\n const bonds = holdings.filter((holding) => !isNaN(holding.fixed_income_classification))\n\n const aggregateValues = (\n holdings: Holding[],\n extractValueFn: (holding: Holding) => WeightMap,\n classificationTypes: Record<string, number>,\n ) => {\n return holdings.reduce((acc, holding) => {\n const values = extractValueFn(holding)\n Object.keys(classificationTypes).forEach((sector) => {\n acc[sector] = (acc[sector] || 0) + (values[sector] || 0)\n })\n return acc\n }, {} as WeightMap)\n }\n\n return {\n stocks: aggregateValues(stocks, extractStockValueFromWeight, EquityClassificationTypes),\n bonds: aggregateValues(bonds, extractBondValueFromWeight, FixedIncomeClassificationTypes),\n }\n}\n\nexport const calculateWeightedValue = (weights: WeightMap, value: number): WeightMap => {\n return Object.fromEntries(\n Object.entries(weights).map(([key, weight]) => [key, (weight * value) / 100]),\n )\n}\n\nconst extractBondValueFromWeight = (bond: Holding) =>\n extractValueFromWeight(bond, extractBondWeight, FixedIncomeClassificationValues)\n\nexport const extractBondWeight = (bond: Holding): WeightMap => {\n const classificationKey = bond.fixed_income_classification\n return {\n [FixedIncomeClassificationValues[\n classificationKey as keyof typeof FixedIncomeClassificationValues\n ]]: 100,\n }\n}\n\nconst extractStockValueFromWeight = (stock: Holding) =>\n extractValueFromWeight(stock, extractStockWeight, EquityClassificationValues)\n\nexport const extractStockWeight = (stock: Holding): WeightMap => {\n const {\n large_core_weight,\n large_growth_weight,\n large_value_weight,\n mid_core_weight,\n mid_growth_weight,\n mid_value_weight,\n small_core_weight,\n small_growth_weight,\n small_value_weight,\n unknown_weight,\n equity_classification,\n } = stock\n\n const data: WeightMap = {\n LARGE_CORE: large_core_weight ?? 0,\n LARGE_GROWTH: large_growth_weight ?? 0,\n LARGE_VALUE: large_value_weight ?? 0,\n MID_CORE: mid_core_weight ?? 0,\n MID_GROWTH: mid_growth_weight ?? 0,\n MID_VALUE: mid_value_weight ?? 0,\n SMALL_CORE: small_core_weight ?? 0,\n SMALL_GROWTH: small_growth_weight ?? 0,\n SMALL_VALUE: small_value_weight ?? 0,\n UNKNOWN: unknown_weight ?? 0,\n }\n\n if (sumValues(data) === 0 && equity_classification !== undefined) {\n const key =\n EquityClassificationValues[equity_classification as keyof typeof EquityClassificationValues]\n return { [key]: 100 }\n }\n\n return data\n}\n\nexport const extractValueFromWeight = (\n holding: Holding,\n extractWeightFn: (h: Holding) => WeightMap,\n classificationValues: Record<string, string>,\n): WeightMap => {\n const weights = extractWeightFn(holding)\n const value = getHoldingValue(holding)\n const weightedValues = calculateWeightedValue(weights, value)\n\n if (sumValues(weightedValues) === 0) {\n const classificationKey = String(\n holding.equity_classification ?? holding.fixed_income_classification,\n )\n\n if (classificationKey in classificationValues) {\n return { [classificationValues[classificationKey]]: value }\n } else {\n console.error(`Invalid classification key: ${classificationKey}`)\n }\n }\n\n return weightedValues\n}\n\nexport const formatKey = (key: string): string =>\n key\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n\nexport const formatPercent = (value: number): string =>\n value >= 1 ? `${numeral(value).format('0')}%` : '< 1%'\n\nexport const getHoldingValue = (holding: Holding): number =>\n holding.calculated_market_value ?? holding.market_value\n\nexport const getValidHoldings = (\n holdings: Holding[],\n extractWeightFn: (holding: Holding) => WeightMap,\n): Holding[] => {\n return holdings.filter((holding) => {\n const weight = extractWeightFn(holding)\n const total = sumValues(weight)\n return total > 80 && total < 120\n })\n}\n\nexport const mapDataToPercentageGrid = (\n data: Record<AnalysisType, Record<string, number>>,\n analysisType: AnalysisType,\n): string[][] => {\n const groups = analysisType === AnalysisType.Stocks ? stockGroups : bondGroups\n\n const selected = data[analysisType]\n if (!selected || Object.keys(selected).length === 0)\n return groups.map((group) => group.map(() => '0%'))\n\n return groups.map((group) => group.map((key) => formatPercent(selected[key] ?? 0)))\n}\n\nexport const sumValues = (obj: WeightMap): number =>\n Object.values(obj).reduce((acc, val) => acc + val, 0)\n"],"mappings":"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"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import { InsightNotificationTypes as
|
|
2
|
-
import { fromUnixTime as
|
|
3
|
-
var
|
|
1
|
+
import { InsightNotificationTypes as s } from "../types/Notification.es.js";
|
|
2
|
+
import { fromUnixTime as n, isSameDay as l } from "date-fns";
|
|
3
|
+
var o = null, f = () => (o || (o = new Set(Object.values(s).filter((e) => typeof e == "number"))), o), _ = (e, t) => {
|
|
4
|
+
const r = n(t[e].delivered_at), i = n(t[e - 1]?.delivered_at);
|
|
5
|
+
return !l(r, i);
|
|
6
|
+
};
|
|
4
7
|
function m(e) {
|
|
5
|
-
const
|
|
6
|
-
return e.filter((
|
|
7
|
-
const a =
|
|
8
|
-
return
|
|
8
|
+
const r = Math.floor(Date.now() / 1e3);
|
|
9
|
+
return e.filter((i) => {
|
|
10
|
+
const a = i.delivered_at;
|
|
11
|
+
return r - a <= 2592e3;
|
|
9
12
|
});
|
|
10
13
|
}
|
|
11
14
|
export {
|
|
12
15
|
m as filterRecentNotifications,
|
|
13
|
-
|
|
16
|
+
f as getInsightNotificationTypeValues,
|
|
14
17
|
_ as shouldShowDate
|
|
15
18
|
};
|
|
16
19
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationUtils.es.js","names":[],"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"],"mappings":";;AAKA,IAAI,IAAqD,MAE5C,IAAA,OACN,MACH,IAAiC,IAAI,IACnC,OAAO,OAAO,CAAwB,EAAE,OAAA,CACrC,MAAU,OAAO,KAAU,QAC9B,CACF,IAEK,IAOI,IAAA,CAAkB,GAAe,
|
|
1
|
+
{"version":3,"file":"NotificationUtils.es.js","names":[],"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"],"mappings":";;AAKA,IAAI,IAAqD,MAE5C,IAAA,OACN,MACH,IAAiC,IAAI,IACnC,OAAO,OAAO,CAAwB,EAAE,OAAA,CACrC,MAAU,OAAO,KAAU,QAC9B,CACF,IAEK,IAOI,IAAA,CAAkB,GAAe,MAAkC;AAC9E,QAAM,IAAc,EAAa,EAAc,CAAA,EAAO,YAAY,GAC5D,IAAe,EAAa,EAAc,IAAQ,CAAA,GAAI,YAAY;AAExE,SAAO,CAAC,EAAU,GAAa,CAAY;AAC7C;AASA,SAAgB,EAA0B,GAA+C;AAEvF,QAAM,IAAc,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAEhD,SAAO,EAAc,OAAA,CAAQ,MAA+B;AAC1D,UAAM,IAAc,EAAa;AACjC,WAAO,IAAc,KAAe;AAAA,EACtC,CAAC;AACH"}
|
|
@@ -20,7 +20,7 @@ import { addQuarters as G } from "date-fns/addQuarters";
|
|
|
20
20
|
import { addWeeks as k } from "date-fns/addWeeks";
|
|
21
21
|
import { formatISO as Z } from "date-fns/formatISO";
|
|
22
22
|
import { lastDayOfMonth as T } from "date-fns/lastDayOfMonth";
|
|
23
|
-
import { nextDay as
|
|
23
|
+
import { nextDay as M } from "date-fns/nextDay";
|
|
24
24
|
import { parseISO as S } from "date-fns/parseISO";
|
|
25
25
|
import { setDate as E } from "date-fns/setDate";
|
|
26
26
|
import { setDay as ee } from "date-fns/setDay";
|
|
@@ -75,22 +75,21 @@ var re = (e) => {
|
|
|
75
75
|
break;
|
|
76
76
|
case s.EveryYear:
|
|
77
77
|
r.push(...me(u, o, d));
|
|
78
|
-
break;
|
|
79
78
|
}
|
|
80
79
|
const D = /* @__PURE__ */ new Set();
|
|
81
80
|
for (const m of r) {
|
|
82
|
-
const
|
|
81
|
+
const b = e.transactions.filter((y) => y.repeating_transaction_guid === e.guid && !D.has(y.guid)), v = b.find((y) => y.date > f(Y(m.expectedDate, 5)) && y.date < f(Q(m.expectedDate, 5))) || (i(m.expectedDate, x()) ? b.reduce((y, w) => Math.abs(w.date - f(m.expectedDate)) < (y ? Math.abs(y.date - f(m.expectedDate)) : 1 / 0) ? w : y, void 0) : void 0);
|
|
83
82
|
v ? (D.add(v.guid), m.transaction = v, m.status = _.Paid, m.occurredOnDate = X(v.date)) : i(m.expectedDate, Y(x(), 3)) && (m.status = _.Missed);
|
|
84
83
|
}
|
|
85
84
|
return r;
|
|
86
85
|
}, ce = (e, c, r) => {
|
|
87
86
|
const n = [];
|
|
88
|
-
let t =
|
|
87
|
+
let t = M(c, e.recurrenceDay);
|
|
89
88
|
for (; i(t, r); )
|
|
90
89
|
n.push({
|
|
91
90
|
...e,
|
|
92
91
|
expectedDate: t
|
|
93
|
-
}), t =
|
|
92
|
+
}), t = M(t, e.recurrenceDay);
|
|
94
93
|
return n;
|
|
95
94
|
}, ne = (e, c, r) => {
|
|
96
95
|
const n = [];
|
|
@@ -195,7 +194,7 @@ var re = (e) => {
|
|
|
195
194
|
recurrences: [r]
|
|
196
195
|
}), c;
|
|
197
196
|
}, []), Ce = (e, c, r) => {
|
|
198
|
-
const n =
|
|
197
|
+
const n = M(x(), c.recurrence_day), t = B(x(), c.recurrence_day), a = N(c.recurrence_day), u = c.second_recurrence_day ? N(c.second_recurrence_day) : "";
|
|
199
198
|
let o = r ? p(e.monthly_ordinal, a) : e.monthly;
|
|
200
199
|
switch (c.recurrence_type) {
|
|
201
200
|
case s.EveryQuarter:
|
|
@@ -218,7 +217,6 @@ var re = (e) => {
|
|
|
218
217
|
break;
|
|
219
218
|
case s.TwiceAMonth:
|
|
220
219
|
o = r ? p(e.twice_a_month_ordinal, a, u) : e.twice_a_month;
|
|
221
|
-
break;
|
|
222
220
|
}
|
|
223
221
|
return o;
|
|
224
222
|
}, ye = (e, c, r, n) => {
|
|
@@ -249,7 +247,6 @@ var re = (e) => {
|
|
|
249
247
|
break;
|
|
250
248
|
case s.EveryYear:
|
|
251
249
|
a = C(t);
|
|
252
|
-
break;
|
|
253
250
|
}
|
|
254
251
|
return a;
|
|
255
252
|
}, He = (e, c) => {
|