{"version":3,"sources":["components/common/lightTheme.js","components/common/darkTheme.js","components/layout/ThemeWrapper.js","components/common/styles.js","components/users/AuthLayout.js","components/error/ErrorBoundary.js","components/error/Error404.js","components/loading/Loading.js","components/loading/AuthLoading.js","actions/types.js","actions/messages.js","actions/profile.js","actions/membership.js","actions/auth.js","components/common/Idle.js","components/loading/HeaderLoading.js","components/layout/navigation/ProfileMenu.js","components/common/SortContainer.js","components/common/DragHandle.js","components/utilities/numbers.js","components/account/SortAccounts.js","actions/accountId.js","actions/accountKey.js","actions/collections.js","actions/accountGroups.js","components/utilities/tables.js","actions/holdings.js","actions/categoryBudgets.js","actions/categories.js","actions/link.js","actions/payees.js","actions/transfers.js","actions/splits.js","actions/transactions.js","actions/securities.js","actions/accounts.js","components/account/Accounts.js","components/accountGroups/SortAccountGroups.js","components/accountGroups/AccountGroups.js","components/common/MonthPickerInput.js","components/layout/MonthPicker.js","actions/budgetMonth.js","components/layout/HeaderSummary.js","components/layout/DraggableDialogWrapper.js","components/utilities/dialogs.js","components/layout/MoveBudgetForm.js","components/layout/Header.js","components/layout/Alerts.js","components/layout/Message.js","components/layout/ToastWrapper.js","utilities/continueWithSocialAuth.js","utilities/index.js","components/users/AppleAuthButton.js","components/users/Login.js","components/utilities/isMounted.js","components/users/AuthGoogle.js","components/users/AuthApple.js","components/users/Register.js","components/users/RegisterAcknowledge.js","components/utilities/withRouter.js","components/users/Activate.js","components/users/ResetPassword.js","components/users/ResetPasswordAcknowledge.js","components/users/ResetPasswordConfirm.js","actions/transactionFlags.js","actions/history.js","components/loading/AppLoading.js","actions/theme.js","actions/accountTypes.js","actions/flagColors.js","actions/recurring.js","components/users/Settings.js","components/layout/AccountForm.js","components/users/SettingsDashboard.js","components/membership/Membership.js","components/common/PrivateRoute.js","components/chart/charts.js","actions/reports.js","components/dashboard/SpendingVsLastMonth.js","components/common/HorizontalProgressBar.js","actions/categoryBudgetId.js","components/dashboard/OverspentCategories.js","components/dashboard/FundShortCategories.js","components/utilities/dates.js","components/layout/FlagForm.js","components/layout/LinkTransactionForm.js","components/dashboard/LinkTransactions.js","components/layout/CategoryBudgetForm.js","components/link/Link.js","components/layout/LinkForm.js","actions/collectionId.js","actions/categoryId.js","actions/holdingId.js","actions/transactionId.js","components/layout/ActionButtons.js","components/layout/CollectionForm.js","components/layout/CategoryForm.js","components/layout/HoldingForm.js","components/layout/TransactionForm.js","actions/categoryBalanceId.js","components/layout/MoveBalanceForm.js","components/dashboard/Overview.js","components/link/OAuthResponse.js","components/dashboard/Dashboard.js","components/category/SortCategories.js","components/category/Categories.js","components/collection/SortCollections.js","components/common/ProgressCircle.js","components/common/CompareActivityBar.js","components/category/RecentTransactions.js","components/category/CategoryDetail.js","components/collection/Collections.js","components/budget/Budget.js","components/budget/BudgetDashboard.js","components/recurring/RecurringCalendar.js","components/recurring/RecurringTransactionList.js","components/layout/RecurringDateDetail.js","components/layout/RecurringTransactionDetail.js","components/recurring/Dashboard.js","components/recurring/index.js","components/history/HistoryTransactionList.js","components/history/Dashboard.js","components/history/index.js","components/transaction/TransactionList.js","components/transaction/Transactions.js","components/holdings/HoldingList.js","components/holdings/Holdings.js","components/account/AccountDetail.js","components/transaction/TransactionDashboard.js","components/holdings/HoldingDetail.js","components/layout/TabPanel.js","components/report/IncomeVsExpense.js","components/report/NetWorth.js","components/report/CategorizedExpenses.js","components/report/ReportDashboard.js","components/layout/LinkAccountForm.js","components/link/LinkAccount.js","components/link/LinkAccountDashboard.js","components/layout/PayeeForm.js","components/payee/Payee.js","components/payee/PayeeDashboard.js","components/layout/ArchiveForm.js","components/archive/Archive.js","components/archive/ArchiveDashboard.js","components/membership/MembershipDashboard.js","reducers/budgetMonth.js","reducers/transactions.js","reducers/transactionFlags.js","reducers/flagColors.js","reducers/transactionId.js","reducers/accountKey.js","reducers/accounts.js","reducers/accountId.js","reducers/accountGroups.js","reducers/accountTypes.js","reducers/payees.js","reducers/transfers.js","reducers/splits.js","reducers/reports.js","reducers/categories.js","reducers/categoryId.js","reducers/categoryBudgets.js","reducers/categoryBudgetId.js","reducers/categoryBalanceId.js","reducers/collections.js","reducers/collectionId.js","reducers/holdings.js","reducers/holdingId.js","reducers/securities.js","reducers/link.js","reducers/recurring.js","reducers/history.js","reducers/membership.js","reducers/errors.js","reducers/messages.js","reducers/auth.js","reducers/profile.js","reducers/theme.js","reducers/index.js","store.js","components/App.js","index.js"],"names":["lightTheme","createTheme","palette","mode","primary","light","main","dark","contrastText","secondary","accent","components","MuiTextField","defaultProps","variant","MuiAccordionSummary","styleOverrides","root","background","color","minHeight","padding","content","margin","expandIconWrapper","MuiAccordionDetails","MuiCheckbox","colorPrimary","colorSecondary","indeterminate","MuiTableRow","backgroundColor","lighten","MuiPickersDay","MUIDataTableToolbarSelect","typography","fontWeightBold","h6","fontWeight","subtitle1","subtitle2","body2","button","textTransform","darkTheme","MuiFormLabel","MuiInput","underline","borderBottom","ThemeWrapper","state","theme","prevProps","prevState","snapshot","profile","this","props","theme_id","setState","StyledEngineProvider","injectFirst","ThemeProvider","children","Component","connect","profileReducer","drawerWidth","sharedStyles","appBar","zIndex","breakpoints","up","width","marginLeft","budgetRow","position","display","progressBar","transition","height","left","bottom","sideNavAccountItem","down","spacing","budgetCardsContent","cardActivity","cardActivityIcon","cardAvailable","cardAvailableIcon","cardBudget","cardBudgetIcon","cardInflow","cardInflowIcon","cardIcon","top","right","fontSize","cardText","categoryLabel","fontWeightRegular","centerText","textAlign","collectionLabel","maxWidth","flexGrow","paddingLeft","paddingRight","accountCategoryIcon","dragHandleParent","visibility","dragHandleButton","dragHandle","cursor","moveCursor","drawer","flexShrink","drawerPaper","overflowX","dangerButton","error","borderColor","fab","fabButton","fabAction","fabLabel","dialogActionLeftButton","floatLeft","float","floatRight","budgetError","marginRight","borderRadius","fontError","fontWeightMedium","fontWarning","warning","icon","line19","lineHeight","line30","listItemMoreButton","m0","ml1","mb1","marginBottom","menuButton","dropdownListItem","dropdownListItemError","splitGroup","divider","firstSplit","borderTopLeftRadius","borderTopRightRadius","lastSplit","borderBottomLeftRadius","borderBottomRightRadius","splitAddButton","marginTop","p0","pl0","pr1","pl1","pt1","paddingTop","tableLabel","rightTableHead","centerTableHead","tableHeader","selectedRow","toolbar","mixins","topIndex","customButton","border","textDecoration","verticalAlign","textLinks","positiveStats","success","paddingHorizontal","negativeStats","SwitchPositive","withStyles","switchBase","checked","track","Switch","TabBar","AppBar","TabList","indicator","Tabs","TabButton","outline","selected","Tab","Copyright","Typography","align","Date","getFullYear","href","image","centerGrid","paper","flexDirection","alignItems","centerCard","avatar","authLayout","withTheme","classes","heading","className","style","Grid","container","CssBaseline","item","xs","sm","md","Avatar","alt","src","Box","p","component","noWrap","fontFamily","justifyContent","Paper","elevation","square","mt","mb","ErrorBoundary","auth","accountTypeError","accountError","collectionError","categoryError","categoryBudgetError","transactionError","isLoading","isAuthenticated","gutterBottom","Button","fullWidth","type","onClick","window","location","Home","reload","Refresh","authReducer","accountTypeReducer","accountReducer","collectionReducer","categoryReducer","categoryBudgetReducer","transactionReducer","Error404","to","Loading","LinearProgress","AuthLoading","loading","loadHelpScoutBeacon","user","email","signature","web_signature","name","first_name","last_name","Beacon","GET_BUDGET_MONTH","EDIT_BUDGET_MONTH","GET_ACCOUNT_GROUPS","EDIT_ACCOUNT_GROUPS","REORDER_ACCOUNT_GROUPS","ACCOUNT_GROUPS_LOADING","ACCOUNT_GROUPS_FAIL","GET_TRANSACTIONS","DELETE_TRANSACTION","ADD_TRANSACTION","EDIT_TRANSACTION","TRANSACTION_FAIL","TRANSACTION_LOADING","GET_TRANSACTION_ID","EDIT_TRANSACTION_ID","GET_HOLDINGS","GET_HOLDING_HISTORY","EDIT_HOLDING","DELETE_HOLDING","ADD_HOLDING","HOLDING_LOADING","HOLDING_FAIL","HOLDING_HISTORY_LOADING","HOLDING_HISTORY_FAIL","GET_HOLDING_ID","EDIT_HOLDING_ID","GET_SECURITIES","EDIT_SECURITY","DELETE_SECURITY","ADD_SECURITY","SECURITY_LOADING","SECURITY_FAIL","GET_TRANSACTION_FLAGS","EDIT_TRANSACTION_FLAGS","TRANSACTION_FLAG_LOADING","TRANSACTION_FLAG_FAIL","GET_FLAG_COLORS","FLAG_COLOR_LOADING","FLAG_COLOR_FAIL","GET_CATEGORIES","EDIT_CATEGORY","REORDER_CATEGORIES","ADD_CATEGORY","DELETE_CATEGORY","CATEGORY_LOADING","CATEGORY_FAIL","GET_CATEGORY_ID","EDIT_CATEGORY_ID","GET_CATEGORY_BUDGETS","EDIT_CATEGORY_BUDGET","CATEGORY_BUDGET_LOADING","CATEGORY_BUDGET_FAIL","GET_CATEGORY_BUDGET_ID","EDIT_CATEGORY_BUDGET_ID","GET_CATEGORY_BALANCE_ID","EDIT_CATEGORY_BALANCE_ID","GET_COLLECTION_ID","EDIT_COLLECTION_ID","GET_COLLECTIONS","EDIT_COLLECTION","REORDER_COLLECTIONS","DELETE_COLLECTION","ADD_COLLECTION","COLLECTION_LOADING","COLLECTION_FAIL","GET_ACCOUNT_TYPES","ACCOUNT_TYPE_LOADING","ACCOUNT_TYPE_FAIL","GET_PAYEES","EDIT_PAYEES","PAYEE_LOADING","PAYEE_FAIL","GET_REPORTS","REPORT_LOADING","REPORT_FAIL","GET_TRANSFERS","TRANSFER_LOADING","TRANSFER_FAIL","GET_SPLITS","SPLIT_LOADING","SPLIT_FAIL","GET_ACCOUNT_KEY","EDIT_ACCOUNT_KEY","GET_ACCOUNTS","EDIT_ACCOUNT","REORDER_ACCOUNTS","DELETE_ACCOUNT","ADD_ACCOUNT","ACCOUNT_LOADING","ACCOUNT_FAIL","GET_ACCOUNT_ID","EDIT_ACCOUNT_ID","GET_ERRORS","CREATE_TOAST","CREATE_MESSAGE","CLEAR_MESSAGES","USER_LOADING","USER_LOADED","AUTH_ERROR","AUTHENTICATED_SUCCESS","AUTHENTICATED_FAIL","LOGIN_SUCCESS","LOGIN_FAIL","LOGOUT_SUCCESS","REGISTER_SUCCESS","REGISTER_FAIL","ACTIVATION_SUCCESS","ACTIVATION_FAIL","DELETE_USER_ACCOUNT","DELETE_USER_ACCOUNT_FAIL","GET_PROFILE_SETTINGS","ADD_PROFILE_SETTINGS","EDIT_PROFILE_SETTINGS","PROFILE_SETTINGS_LOADING","PROFILE_SETTINGS_FAIL","GET_THEMES","THEME_LOADING","THEME_FAIL","EDIT_PROFILE","PASSWORD_RESET_SUCCESS","PASSWORD_RESET_FAIL","PASSWORD_RESET_CONFIRM_SUCCESS","PASSWORD_RESET_CONFIRM_FAIL","CREATE_LINK_TOKEN","CREATE_LINK_TOKEN_FAIL","DELETE_LINK_TOKEN_SUCCESS","CREATE_FIX_TOKEN","CREATE_FIX_TOKEN_FAIL","DELETE_FIX_TOKEN_SUCCESS","GET_LINK_ACCOUNTS","LINK_ACCOUNTS_LOADING","LINK_ACCOUNTS_FAIL","CREATE_LINK_TRANSACTIONS","GET_LINK_TRANSACTIONS","EDIT_LINK_TRANSACTION","LINK_TRANSACTIONS_LOADING","LINK_TRANSACTIONS_FAIL","GET_RECURRING_TRANSACTIONS","RECURRING_TRANSACTIONS_LOADING","RECURRING_TRANSACTIONS_FAIL","GET_HISTORY_TRANSACTIONS","HISTORY_TRANSACTION_LOADING","HISTORY_TRANSACTION_FAIL","GET_CUSTOMER","CREATE_CHECKOUT_SESSION","DELETE_CHECKOUT_SESSION","CUSTOMER_LOADING","CREATE_CHECKOUT_SESSION_FAIL","createToast","msg","payload","returnErrors","status","proxy","process","PROXY","loadUser","dispatch","getState","a","axios","get","tokenConfig","response","data","then","res","catch","err","responseData","customer_id","customerId","amplitude","login","password","body","JSON","stringify","post","withCredentials","headers","Accept","logout","socialLogin","provider","code","options","credentials","url","encodeURIComponent","appleSocialLogin","getAppleCookies","tokens","refresh","Idle","idleTimer","onIdle","bind","e","ref","element","document","debounce","timeout","mapDispatchToProps","HeaderLoading","accountsLoaded","isLoaded","useStyles","makeStyles","menuList","popperIcon","selectedAnchor","borderLeft","React","useState","open","setOpen","setSelected","anchorRef","useRef","pathname","useLocation","handleClose","event","current","contains","target","handleListKeyDown","key","preventDefault","prevOpen","useEffect","focus","ListItem","undefined","ListItemIcon","AccountBox","ListItemText","Popper","anchorEl","placement","disablePortal","TransitionProps","Grow","ClickAwayListener","onClickAway","MenuList","autoFocusItem","id","onKeyDown","Link","Receipt","Inventory","Divider","Loyalty","MenuItem","Lock","SortContainer","SortableContainer","List","DragHandle","SortableHandle","moneyInput","input","test","formatMoneyLabel","numeral","format","formatMoney","formatPercentLabel","isInt","value","isNaN","parseInt","Number","SortableAccounts","SortableElement","accountClick","account","linkAccount","count","balanceColor","available_balance","accountMoreButton","MoreVert","LinkOff","StyledBadge","styled","Badge","dense","disableGutters","IconButton","size","secondaryTypographyProps","badgeContent","max","anchorOrigin","vertical","horizontal","editAccountId","editAccountKey","accountKey","getCollections","yearMonth","mParm","getAccountGroups","ROWS_PER_PAGE_OPTIONS","TableHeader","title","subtitle","disableTypography","sx","boxShadow","getHoldings","getCategoryBudgets","editCategoryBudget","budget","put","updateCategoryBudget","getAccounts","bulkCategoryBudgetUpdate","getCategories","createLinkToken","getLinkAccounts","addLinkTransactions","publicToken","getLinkTransactions","getPayees","getTransfers","getSplits","getTransactions","filter","fParm","addTransaction","transaction","getSecurities","Accounts","onSortEnd","oldIndex","newIndex","accounts","reorderAccounts","oldPositionElement","deriveProps","arrayMove","new_index","setTimeout","linkAccounts","linkTransactions","group","useDragHandle","map","index","find","link","link_id","t","pending","account_id","length","groupId","group_id","archived","updateAccount","linkReducer","SortableAccountGroups","handleGroupClick","openAccountForm","Accordion","expanded","opened","onChange","AccordionSummary","expandIcon","ExpandMore","group_total","direction","notificationIconContainer","notificationIcon","AccordionDetails","ListItemButton","AccountBalance","AccountGroups","editAccountGroups","accountGroups","reorderAccountGroups","totalAvailable","total_available","accountLinkIds","includes","l","updateGroup","accountGroupReducer","MonthPickerInput","dwp","disablePadding","Hidden","smUp","smDown","forwardRef","MonthPicker","handleChange","date","editBudgetMonth","getMonth","categoryBudgetMonthChange","categoryBudgets","budgetYear","substring","budgetMonth","budgetDate","budgetDateRange","budgetDateMin","DateTime","local","toJSDate","budgetDateMax","min","fromISO","todayButton","minDate","maxDate","dateFormat","showMonthYearPicker","customInput","budgetMonthReducer","HeaderSummary","transactions","totalInflow","total_inflow","goal","budgeted","overspent","fund","add","balance","fundShort","subtract","overspentColor","marginY","DraggableDialogWrapper","handle","fullScreen","windowWidth","innerWidth","values","Transition","Slide","createFilterOptions","MoveBudgetForm","handleCategoryBudgetUpdate","category","categoryBudget","category_id","categoryBudgetId","categoryBudgetBudgeted","handleCategoryOptions","categories","filteredCategories","c","cb","styles","toLowerCase","trim","label","push","clearForm","amount","closeBudgetForm","handleBudgetAll","needToBudget","need_to_budget","handleInputChange","handleCategoryChange","reason","handleSubmit","newBudgeted","Math","abs","user_id","helperText","Dialog","TransitionComponent","PaperComponent","DialogTitle","DoneAll","onSubmit","DialogContent","TextField","required","autoFocus","inputProps","inputMode","Autocomplete","clearOnEscape","openOnFocus","autoComplete","autoHighlight","includeInputInList","isOptionEqualToValue","option","getOptionLabel","inputValue","filterOptions","params","renderOption","renderInput","DialogActions","Save","Cancel","drawerContainer","appTitle","text","beta","withPropsValidation","PropTypes","checkPropTypes","propTypes","object","array","isRequired","bool","Header","useSelector","budgetDialogOpen","setBudgetDialogOpen","setNeedToBudget","needToBudgetColor","setNeedToBudgetColor","useTheme","handleDrawerToggle","handleBudgetDialogToggle","paddingBottom","Explore","MapOutlined","EventRepeat","BarChart","ManageSearch","Toolbar","edge","Menu","implementation","Drawer","anchor","onClose","ModalProps","keepMounted","mdDown","Container","Alerts","showAlert","show","toast","hideAlert","Array","isArray","detail","new_password","token","join","collection_id","non_field_errors","re_password","registration","passwordsNotMatch","addCategoryBudget","payee","updateTransaction","deleteTransaction","holding","addHolding","updateHolding","deleteHolding","addCategory","updateCategory","deleteCategory","addCollection","updateCollection","deleteCollection","addAccount","deleteAccount","linkAPI","stripeAPI","updateProfile","holdingInfo","Snackbar","autoHideDuration","Alert","severity","AlertTitle","errorReducer","messageReducer","message","displayMessage","setDisplayMessage","useDispatch","DialogContentText","buttons","ToastWrapper","pauseOnHover","continueWithSocialAuth","redirect","fetch","method","json","replace","authorization_url","string","continueWithGoogle","appleButton","borderWidth","whiteSpace","minWidth","appleIcon","appleText","WebkitFlexGrow","overflow","textOverflow","AppleAuthButton","useNavigate","authOptions","clientId","scope","redirectURI","usePopup","uiType","noDefaultStyle","buttonExtraChildren","onSuccess","onError","skipScript","render","forgotButton","gsiMaterialButton","MozUserSelect","WebkitUserSelect","msUserSelect","WebkitAppearance","backgroundImage","WebkitBorderRadius","WebkitBoxSizing","boxSizing","letterSpacing","WebkitTransition","gsiMaterialButtonIcon","gsiMaterialButtonContentWrapper","WebkitAlignItems","WebkitFlexDirection","WebkitFlexWrap","flexWrap","gsiMaterialButtonContents","gsiMaterialButtonState","opacity","Login","formData","setFormData","normalizedEmail","version","xmlns","viewBox","xmlnsXlink","fill","d","useIsMountedRef","isMountedRef","AuthGoogle","navigate","effectRan","authenticate","urlParams","URLSearchParams","search","has","ok","AuthApple","id_token","platform_origin","socialResponse","Register","firstName","lastName","rePassword","newUser","register","accountCreated","RegisterAcknowledge","resendActivationEmail","accountActivated","Send","withRouter","Children","match","useParams","Activate","activateAccount","uid","activate","PasswordReset","resetPassword","resetPasswordRequested","ResetPasswordAcknowledge","PasswordResetConfirm","newPassword","reNewPassword","resetPasswordConfirm","resetPasswordSuccess","re_new_password","getTransactionFlags","getTransactionHistory","page","pageSize","query","startDate","endDate","flags","payeeQuery","posted","pageParam","pageSizeParam","start","end","flagParams","payeeQueryParam","accountParams","categoryParams","postedParam","archivedParam","header","ps","q","sd","ed","f","pq","po","ar","downloadTransactionHistory","columns","filters","cl","fileName","URL","createObjectURL","Blob","createElement","setAttribute","appendChild","click","remove","downloadFile","AppLoading","themeLoaded","accountGroupsLoaded","accountTypesLoaded","payeesLoaded","transfersLoaded","splitsLoaded","collectionsLoaded","categoriesLoaded","categoryBudgetsLoaded","transactionsLoaded","transactionFlagsLoaded","flagColorsLoaded","linkAccountsLoaded","linkTransactionsLoaded","recurringTransactionsLoaded","historyTransactionsLoaded","holdingsLoaded","securitiesLoaded","getThemes","getAccountTypes","getFlagColors","getRecurringTransactions","themeReducer","payeeReducer","transferReducer","splitReducer","transactionFlagReducer","flagColorReducer","isAccountLoaded","isTransactionLoaded","isRecurringTransactionsLoaded","historyReducer","holdingReducer","securityReducer","Settings","handleAutocompleteChange","editProfile","editProfileSettings","addProfileSettings","authProfile","handlePasswordChange","confirmPassword","isValidPassword","passwordError","showDeleteConfirmation","confirmationDialog","handleDelete","deleteUserAccount","current_password","themeId","themes","Card","raised","CardContent","CardHeader","subheader","Delete","disabled","DeleteForever","currentPassword","config","delete","AccountForm","amountPositive","typeId","accountTypeCode","availableBalance","canDelete","categoryHelperText","handleAmountPositive","updateCategoryOptions","categoryOptions","handleAccountTypeChange","accountTypes","toUpperCase","handleLinkAccountChange","accountId","linkAccountId","categoryId","netAmount","type_id","editAccount","current_balance","handleRefresh","refreshLinkTransactions","handleFix","fixLinkToken","onExit","metadata","deleteFixToken","public_token","linkCategory","type_code","can_delete","fixToken","deleteButton","fixButton","refreshButton","disableEnforceFocus","Build","FormControl","InputLabel","Select","labelId","FormHelperText","official_name","wrap","accountIdReducer","SettingsDashboard","createCheckoutSession","priceId","price_id","createCustomerPortal","customer","membershipReducer","checkoutSessionURL","descriptionContainer","description","descriptionIcon","currentDate","toISODate","checkoutSession","customerSince","created","toLocaleString","membershipActive","subscriptions","subscriptionKey","subscription","subscriptionStatus","subscriptionPeriodEnd","subscriptionStore","subscriber","member","entitlements","Object","keys","expires_date","product_identifier","period_type","store","titleTypographyProps","Today","CardGiftcard","membership","rest","verticalLine","afterDraw","chart","ease","tooltip","_active","activePoint","ctx","x","topY","scales","y","bottomY","save","beginPath","moveTo","lineTo","lineWidth","strokeStyle","stroke","restore","backgroundColors","borderColors","getReports","ChartJS","CategoryScale","LinearScale","PointElement","LineElement","Title","Tooltip","Legend","Filler","noDataIcon","spendingText","lastMonthText","middleAlign","gridSpacing","reports","isFetching","SpendingVsLastMonth","reportReducer","labels","previousMonth","currentMonth","showChart","setData","spendingDate","setSpendingDate","spendingDifference","setSpendingDifference","previousValue","setPreviousValue","currentValue","setCurrentValue","spendingReport","spending_last_month_report","previousMonthReport","previous_month","currentMonthReport","current_month","currentBudgetYear","toFormat","currentBudgetMonth","isCurrentMonth","previousMonthLabels","report","plus","months","month","day","currentMonthLabels","currentDateLabel","Set","sort","b","currentLabel","currentSpendingDate","found","total","currentLabelIndex","indexOf","currentPreviousValue","currentCurrentValue","currentSpendingDifference","getSpendingDifference","chartData","datasets","plugins","enabled","callbacks","xDatapoint","raw","dataset","yDatapoint","tension","responsive","interaction","intersect","elements","point","radius","ticks","maxRotation","minRotation","callback","SpendingDifference","changeClass","arrowIcon","ArrowRight","ArrowDropDown","ArrowDropUp","percentChange","absolutePercentChange","absoluteSpendingDifference","isFinite","Insights","BorderLinearProgress","linearProgressClasses","grey","bar","step","number","steps","HorizontalProgressBar","setValue","progressColor","setProgressColor","floor","editCategoryBudgetId","positiveAmount","negativeAmount","tableRow","OverspentCategories","overspentCategories","setOverspentCategories","isExpanded","setIsExpanded","budgets","cat","row","balanceClass","FundShortCategories","fundShortCategories","setFundShortCategories","formatISODateTime","DATETIME_FULL","formatISODate","FlagForm","updateFlags","transactionFlagColors","closeForm","handleClick","handleFlagClick","editTransactionFlags","flagId","Checkbox","LabelOutlined","checkedIcon","Label","placeholder","transactionFlags","LinkTransactionForm","updateAccountOptions","accountOptions","usersTransactionFlags","flagColors","flagColor","transactionFlag","color_id","colorId","updatePayeeOptions","payees","payeeOptions","splitPayeeOptions","debt","transfer","splitCategoryOptions","linkCategories","clearLinkTransaction","splitCategories","notes","remainingSplitAmount","reconciled","transferAccountId","flagFormOpen","remaining","getRemainingSplitAmount","handleNameChange","linkCategoryId","handleAccountChange","handleReconciled","handleDateChange","handleSplitAmountChange","handleSplitNameChange","handleSplitNotesChange","handleSplitCategoryChange","linkTransaction","splitTransactionCategory","parse","sc","splitAmount","transaction_id","split_categories","flag_id","transfer_account_id","editLinkTransaction","handleSplitCategoryAdd","handleSplitCategoryRemove","splice","splitCategory","openFlagForm","closeFlagForm","datePickerOpen","linkAmount","linkName","merchant_name","linkDate","isASplit","isATransfer","isAnAdjustment","isALoanAccount","FormControlLabel","labelPlacement","control","DatePicker","showTodayButton","autoOk","animateYearScrolling","showDaysOutsideCurrentMonth","clearable","toolbarFormat","readOnly","okText","cancelText","todayText","groupBy","filtered","isExisting","some","groupStyling","Add","LabelOffOutlined","Edit","transfers","splits","LinkTransactions","setLinkTransaction","pendingTransactions","setPendingTransactions","postedTransactions","setPostedTransactions","handleLinkTransactionClick","rowData","amountClasses","CategoryBudgetForm","goalPositive","budgetedPositive","goal_id","handleGoalPositive","handleBudgetedPositive","categoryName","categoryBudgetIdReducer","linkToken","useCallback","duplicate","institution","institution_id","mask","onEvent","eventName","error_code","usePlaidLink","ready","LinkForm","handleFormClose","onFormClose","CheckCircle","editCollectionId","editCategoryId","editHoldingId","editTransactionId","ActionButtons","handleActionButtonToggle","handleLinkClick","linkConnectOpen","handleLinkFormClose","handleAccountClick","handleCollectionClick","handleCategoryClick","handleHoldingClick","handleTransactionClick","actions","ReceiptLong","ShowChart","Category","ViewAgenda","SpeedDial","ariaLabel","transitionDuration","enter","exit","SpeedDialIcon","action","SpeedDialAction","tooltipTitle","staticTooltipLabel","tooltipOpen","CollectionForm","collectionId","collection","editCollection","collections","collectionIdReducer","CategoryForm","handleCollectionChange","editCategory","categoryIdReducer","HoldingForm","ticker","shares","costBasis","marketValue","handleTickerChange","holdingId","ticker_symbol","quantity","cost_basis","institution_value","institution_price_as_of","editHolding","history","link_account_id","holdingIdReducer","TransactionForm","transactionId","addAnother","addAnotherTransaction","newAmountPositive","typeCode","editTransaction","to_transaction_id","trans","from_transaction_id","split","splitPayee","isAnEdit","transactionIdReducer","editCategoryBalanceId","MoveBalanceForm","categoryBalanceId","toCategory","toBudget","toCategoryAmount","amountNeeded","toCategoryName","toCategoryId","fromCategory","moveFromCategory","moveToCategory","Error","moveAmount","categoryBalanceIdReducer","Overview","stateId","oAuthConfirmation","receivedRedirectUri","Dashboard","setStateId","SortableCategories","checkboxChange","categoryClick","categoryBudgetClick","categoryBalanceClick","accountCategoryId","categoryActivity","activity","categoryBudgetGoal","categoryBalance","goalProgressColor","goalProgress","categoryBalanceTitle","categoryBudgetedColor","categoryBudgetedTitle","lg","zeroMinWidth","lgUp","lgDown","Categories","reorderCategories","balanceDialogOpen","categoriesChecked","handleCategoryCheckbox","accountCategory","SortableCollections","handleCollectionCheckbox","collectionClick","collectionsChecked","collectionItem","expandCollections","handleExpandClick","displayCategories","collectionTotalBudgeted","total_budgeted","collectionTotalGoal","total_goal","collectionTotalActivity","total_activity","collectionTotalBalance","total_balance","defaultExpanded","stopPropagation","ProgressCircle","chartProps","showLabel","CircularProgress","thickness","round","BarElement","legend","CompareActivityBar","previous","RecentTransactions","categoryIds","numberSelected","list","setList","setMonth","transactionCategory","splitTransaction","slice","monthIndex","Collapse","in","transactionClick","CategoryDetail","budgetedSummed","goalSummed","totalGoalProgress","activitySummed","previousActivity","balanceSummed","overbudget","actionClick","halfBudget","setHalfBudget","selectedCategory","setSelectedCategory","halfFund","divide","Collections","updateBudgetData","progressBudgeted","over","categoryPreviousActivity","previous_activity","set","lastMonthActivity","multiply","handleMultiActionClick","reorderCollections","categoryFilter","selectedCount","collectionCategories","cc","CategoryOutlined","Budget","setCollectionCategoryOptions","collectionOptions","o","underfundedCategories","handleUpdateFilter","checkAll","checkAllIndeterminate","handleCheckAllCheckbox","uniqueCategories","allChecked","newExpandCollections","collapseAllCollections","expandAllCollections","checkedCategoryCount","allCategoryCount","totalGoal","totalBudgeted","totalActivity","totalBalance","Flag","PieChart","ShoppingBasket","MonetizationOn","UnfoldMore","UnfoldLess","AllInclusive","ErrorOutline","WarningAmber","BudgetDashboard","localizer","luxonLocalizer","NOW","CURRENT_YEAR_MONTH","RecurringCalendar","events","onShowMore","onSelectEvent","calendarDate","setCalendarDate","dayOfMonth","eventPropGetter","isSelected","lastAmountPositive","getNow","defaultView","Views","MONTH","drilldownView","selectable","showAllEvents","onKeyPressEvent","calEvent","onDoubleClickEvent","onSelectSlot","onSelecting","onDrillDown","RecurringTransactionList","TableContainer","Table","TableHead","TableRow","TableCell","TableBody","hover","prettyFrequency","merchantName","prettyLastDate","lastAmount","isActive","prettyNextDate","statusIcon","RecurringDateDetail","recurringDate","fromJSDate","year","RecurringTransactionDetail","setTitle","setLinkTransactions","firstLinkTransaction","linkAccountOfficial","recurringTransactions","recurringReducer","calendarEvents","setCalendarEvents","setEvents","dateDetailOpen","setDateDetailOpen","transactionDetailOpen","setTransactionDetailOpen","dateEvents","setDateEvents","transactionDetails","setTransactionDetails","setRecurringDate","rt","last_amount","averageAmount","average_amount","lastDate","last_date","frequency","active","handleFrequency","nextEvent","prettyNextEvent","handleStatus","allDay","resourceId","nextDate","account_official","link_transactions","weeks","years","statusColor","Warning","Report","handleShowMore","handleSelectEvent","calendarEvent","Recurring","tableChips","tableAttributeContainer","HistoryTransactionList","searchText","setSearchText","filterList","setFilterList","startDateOpen","setStartDateOpen","endDateOpen","setEndDateOpen","setAccountOptions","setCategoryOptions","flagOptions","setFlagOptions","tableData","setTableData","tableOptions","setTableOptions","optionsRef","updateTable","rowsPerPage","page_size","selectableRows","rowsPerPageOptions","serverSide","rowHover","print","download","viewColumns","confirmFilters","searchPlaceholder","customSearchRender","debounceSearchRender","downloadOptions","useDisplayedColumnsOnly","useDisplayedRowsOnly","customFilterDialogFooter","currentFilterList","applyNewFilters","handleFilterSubmit","onDownload","buildHead","buildBody","displayColumns","downloadHistoryTransactions","onSearchChange","searchTransactions","onSearchClose","resetSearchTransactions","onChangePage","updatePage","onChangeRowsPerPage","numberOfRows","updateRowsPerPage","onFilterChipClose","removedFilter","setFilterChipProps","colIndex","colName","TableToolbar","sum","average","displayRow","updateTableData","newFilters","toString","filterAccounts","filterCategories","tableColumns","searchable","filterType","customFilterListOptions","v","column","FormLabel","FormGroup","customBodyRender","tableMeta","updateValue","selectedColors","flag","update","filterPos","multiple","renderValue","selectedAccounts","selectedCategories","setCellHeaderProps","clsx","setCellProps","transactionAmount","Verified","NewReleases","names","History","available","borderLeftColor","TransactionList","linkTransactionClick","handleColumnsBuild","flagName","logic","runningBalance","accountName","postedBalance","pendingBalance","currentTransactions","currentLinkTransactions","pendingLinkTransactions","postedLinkTransactions","onRowClick","colSpan","Transactions","currentAccount","posted_balance","total_posted","pending_balance","total_pending","LocalAtm","HoldingList","holdings","setColumns","companyName","profitLoss","plStyles","plArrow","holdingClick","Holdings","holdingList","setHoldingList","setAccount","updateHoldingList","accountHoldings","h","activeHoldings","soldHoldings","accountHolding","institutionValue","averagePrice","institutionPrice","institution_price","average_price","profit_loss","combinedList","concat","AccountDetail","accountKeyReducer","TransactionDashboard","handleAccountKeyUpdate","newKey","historyIsFetching","HoldingDetail","setHoldingId","currentHolding","setCurrentHolding","holdingKey","displayList","getHoldingHistory","TabPanel","other","role","hidden","stacked","incomeExpenseReport","income_expense_report","incomeExpenseTable","reverse","inflow","outflow","surplus","stack","netWorthReport","net_worth_report","netWorthTable","net_worth","percent_change","ArcElement","setBudgetDate","setChartData","dateList","setDateList","currentBudgetDate","end_month","end_year","categorizedExpenses","monthly_category_expense_report","monthlyExpenses","category_name","totalMonthlyExpenses","monthlyExpense","percent","forEach","newDate","newValue","ReportDashboard","tabIndex","setTabIndex","centered","LinkAccountForm","deleteLinkAccount","institution_primary_color","institution_name","institution_url","updated","LinkAccount","closeDialog","linkAccountClick","fontSecondary","sub_type","LinkAccountDashboard","PayeeForm","bulkPayeeUpdate","payeeForm","Payee","selectedPayees","selectedPayeesDataIndexes","payeeClick","selectPayees","selectedRows","displayData","rowIndex","dataIndex","selectableRowsOnClick","rowsSelected","customToolbarSelect","PayeeDashboard","ArchiveForm","handleUnarchive","unarchiveAccount","unarchiveCategory","table","Unarchive","accountColumns","CategoryColumns","Archive","handleAccountArchiveClick","rowId","handleCategoryArchiveClick","accountTableOptions","categoryTableOptions","ArchiveDashboard","MembershipDashboard","initialState","historyIsLoaded","securities","isAccountFetching","isTransactionFetching","isRecurringTransactionsFetching","appReducer","combineReducers","security","localStorage","removeItem","rootReducer","middleware","thunk","devTools","applyMiddleware","createStore","App","AMPLITUDE_KEY","autocapture","LocalizationProvider","dateAdapter","AdapterLuxon","exact","path","ResetPassword","ResetPasswordConfirm","ReactDOM","getElementById","addEventListener","navigator","serviceWorker"],"mappings":"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","file":"static/js/main.7940198f.chunk.js","sourcesContent":["import { createTheme, lighten } from '@mui/material/styles'\n\nexport const lightTheme = createTheme({\n palette: {\n mode: 'light',\n primary: {\n light: '#206470',\n main: '#0f4e5b',\n dark: '#023943',\n contrastText: '#fff'\n },\n secondary: {\n light: '#3A7985',\n main: '#3A7985',\n dark: '#0f4e5b',\n contrastText: '#fff'\n },\n accent: {\n main: '#FF7D00'\n }\n },\n components: {\n MuiTextField: {\n defaultProps: {\n variant: 'standard'\n }\n },\n MuiAccordionSummary: {\n styleOverrides: {\n root: {\n background: 'linear-gradient(to right, #0f4e5b, #206470) !important',\n color: '#fff',\n minHeight: '38px !important',\n padding: 0\n },\n content: {\n '&.Mui-expanded': {\n margin: 0\n },\n margin: 0\n },\n expandIconWrapper: {\n padding: '5px'\n }\n }\n },\n MuiAccordionDetails: {\n styleOverrides: {\n root: {\n padding: 0\n }\n }\n },\n MuiCheckbox: {\n styleOverrides: {\n root: {\n color: '#9e9e9e'\n },\n colorPrimary: {\n '&.Mui-checked': {\n color: '#FF7100'\n }\n },\n colorSecondary: {\n '&.Mui-checked': {\n color: '#FF7100'\n }\n },\n indeterminate: {\n color: '#9e9e9e !important'\n }\n }\n },\n MuiTableRow: {\n styleOverrides: {\n root: {\n '&.Mui-selected': {\n backgroundColor: lighten('#206470', 0.75) + ' !important'\n }\n }\n }\n },\n MuiPickersDay: {\n styleOverrides: {\n root: {\n '&.Mui-selected': {\n background: 'linear-gradient(to right, #0f4e5b, #206470) !important'\n }\n }\n }\n },\n MUIDataTableToolbarSelect: {\n styleOverrides: {\n root: {\n color: 'rgba(0, 0, 0, 0.87) !important',\n backgroundColor: lighten('#206470', 0.75) + ' !important'\n }\n }\n }\n },\n typography: {\n fontWeightBold: 600,\n h6: {\n fontWeight: 300\n },\n subtitle1: {\n fontWeight: 300\n },\n subtitle2: {\n fontWeight: 300\n },\n body2: {\n fontWeight: 300\n },\n button: {\n textTransform: 'none'\n }\n }\n})\n","import { createTheme, lighten } from '@mui/material/styles'\n\nexport const darkTheme = createTheme({\n palette: {\n mode: 'dark',\n primary: {\n light: '#206470',\n main: '#0f4e5b',\n dark: '#023943',\n contrastText: '#fff'\n },\n secondary: {\n light: '#3A7985',\n main: '#3A7985',\n dark: '#0f4e5b',\n contrastText: '#fff'\n },\n accent: {\n main: '#FF7D00'\n }\n },\n components: {\n MuiTextField: {\n defaultProps: {\n variant: 'standard'\n }\n },\n MuiAccordionSummary: {\n styleOverrides: {\n root: {\n background: 'linear-gradient(to right, #0f4e5b, #206470) !important',\n color: '#fff',\n minHeight: '38px !important',\n padding: 0\n },\n content: {\n '&.Mui-expanded': {\n margin: 0\n },\n margin: 0\n },\n expandIconWrapper: {\n padding: '5px'\n }\n }\n },\n MuiAccordionDetails: {\n styleOverrides: {\n root: {\n padding: 0\n }\n }\n },\n MuiCheckbox: {\n styleOverrides: {\n root: {\n color: '#bdbdbd'\n },\n colorPrimary: {\n '&.Mui-checked': {\n color: '#FF7100'\n }\n },\n colorSecondary: {\n '&.Mui-checked': {\n color: '#FF7100'\n }\n },\n indeterminate: {\n color: '#bdbdbd !important'\n }\n }\n },\n MuiFormLabel: {\n styleOverrides: {\n root: {\n '&.Mui-focused': {\n color: '#fff'\n }\n }\n }\n },\n MuiInput: {\n styleOverrides: {\n underline: {\n '&:after': {\n borderBottom: '2px solid #fff'\n }\n }\n }\n },\n MuiTableRow: {\n styleOverrides: {\n root: {\n '&.Mui-selected': {\n backgroundColor: lighten('#206470', 0.75) + ' !important'\n },\n '&.Mui-selected > *': {\n color: 'rgba(0, 0, 0, 0.87) !important'\n }\n }\n }\n },\n MuiPickersDay: {\n styleOverrides: {\n root: {\n '&.Mui-selected': {\n background: 'linear-gradient(to right, #0f4e5b, #206470) !important'\n }\n }\n }\n },\n MUIDataTableToolbarSelect: {\n styleOverrides: {\n root: {\n color: 'rgba(0, 0, 0, 0.87) !important',\n backgroundColor: lighten('#206470', 0.75) + ' !important'\n }\n }\n }\n },\n typography: {\n fontWeightBold: 600,\n h6: {\n fontWeight: 300\n },\n subtitle1: {\n fontWeight: 300\n },\n subtitle2: {\n fontWeight: 300\n },\n body2: {\n fontWeight: 300\n },\n button: {\n textTransform: 'none'\n }\n }\n})\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { ThemeProvider, StyledEngineProvider } from '@mui/material';\n\nimport { lightTheme } from '../common/lightTheme'\nimport { darkTheme } from '../common/darkTheme'\n\nclass ThemeWrapper extends Component {\n state = {\n theme: lightTheme\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { profile } = this.props\n\n if (profile && profile !== prevProps.profile) {\n const themeId = profile.theme_id\n const theme = themeId === 2 ? darkTheme : lightTheme\n this.setState({ theme })\n }\n }\n\n render() {\n const { theme } = this.state\n\n return (\n <StyledEngineProvider injectFirst>\n <ThemeProvider theme={theme}>\n {this.props.children}\n </ThemeProvider>\n </StyledEngineProvider>\n );\n }\n}\n\nThemeWrapper.propTypes = {\n profile: PropTypes.object.isRequired,\n}\n\nconst mapStateToProps = state => ({\n profile: state.profileReducer.profile,\n})\n\nexport default connect(mapStateToProps)(ThemeWrapper)","import { lighten } from '@mui/material/styles'\nimport withStyles from '@mui/styles/withStyles'\nimport { AppBar, Switch, Tabs, Tab } from '@mui/material'\n\nconst drawerWidth = 200\n\nexport const sharedStyles = theme => ({\n appBar: {\n zIndex: 1201,\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n [theme.breakpoints.up('md')]: {\n width: `calc(100% - ${drawerWidth}px)`,\n marginLeft: drawerWidth\n }\n },\n budgetRow: {\n position: 'relative',\n display: 'flex',\n borderBottom: '1px solid rgba(0, 0, 0, 0.12)'\n },\n progressBar: {\n transition: 'all 2s ease',\n position: 'absolute',\n height: '2px',\n content: '\"\"',\n left: 0,\n bottom: '-2px'\n },\n sideNavAccountItem: {\n padding: 0,\n [theme.breakpoints.down('sm')]: {\n padding: `0 0 0 ${theme.spacing(2)}`\n }\n },\n budgetCardsContent: {\n padding: '8px !important'\n },\n cardActivity: {\n position: 'relative',\n color: '#fff',\n background: 'linear-gradient(to right, #F45C43, #EB3349)'\n },\n cardActivityIcon: {\n color: 'rgba(244, 92, 67, 0.9)'\n },\n cardAvailable: {\n position: 'relative',\n color: '#fff',\n background: 'linear-gradient(to right, #3498db, #2c3e50)'\n },\n cardAvailableIcon: {\n color: 'rgba(52, 152, 219, 0.4)'\n },\n cardBudget: {\n position: 'relative',\n color: '#fff',\n background: 'linear-gradient(to right, #FFC837, #FF8008)'\n },\n cardBudgetIcon: {\n color: 'rgba(255, 200, 55, 0.3)'\n },\n cardInflow: {\n position: 'relative',\n color: '#fff',\n background: 'linear-gradient(to right, #a8e063, #56ab2f)'\n },\n cardInflowIcon: {\n color: 'rgba(168, 224, 99, 0.4)'\n },\n cardIcon: {\n top: '8px',\n right: '8px',\n position: 'absolute',\n fontSize: '56px'\n },\n cardText: {\n position: 'relative',\n zIndex: 1\n },\n categoryLabel: {\n fontWeight: theme.typography.fontWeightRegular\n },\n centerText: {\n textAlign: 'center'\n },\n collectionLabel: {\n fontWeight: theme.typography.fontWeightRegular\n },\n content: {\n maxWidth: '100%',\n flexGrow: 1,\n padding: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n paddingLeft: 0,\n paddingRight: 0\n },\n marginBottom: '200px',\n [theme.breakpoints.up('md')]: {\n marginLeft: drawerWidth,\n width: `calc(100% - ${drawerWidth}px)`\n }\n },\n accountCategoryIcon: {\n color: theme.palette.accent.main,\n position: 'absolute'\n },\n dragHandleParent: {\n '&:hover svg': {\n visibility: 'visible'\n },\n '&:hover $accountCategoryIcon': {\n visibility: 'hidden'\n }\n },\n dragHandleButton: {\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n },\n dragHandle: {\n cursor: 'move',\n visibility: 'hidden'\n },\n moveCursor: {\n cursor: 'move'\n },\n drawer: {\n [theme.breakpoints.up('md')]: {\n width: drawerWidth,\n flexShrink: 0\n }\n },\n drawerPaper: {\n width: drawerWidth,\n overflowX: 'hidden',\n zIndex: 999\n },\n dangerButton: {\n color: theme.palette.error.main,\n borderColor: theme.palette.error.light,\n '&:hover': {\n color: theme.palette.error.main,\n borderColor: theme.palette.error.main\n }\n },\n fab: {\n position: 'fixed',\n bottom: theme.spacing(2),\n right: theme.spacing(2),\n zIndex: 1201,\n cursor: 'pointer'\n },\n fabButton: {\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n '&:hover': {\n background: theme.palette.primary.dark\n }\n },\n fabAction: {\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n color: theme.palette.primary.contrastText,\n '&:hover': {\n background: theme.palette.primary.dark\n }\n },\n fabLabel: {\n // color: theme.palette.secondary.dark,\n },\n dialogActionLeftButton: {\n position: 'absolute',\n left: 0\n },\n floatLeft: {\n float: 'left'\n },\n floatRight: {\n float: 'right'\n },\n budgetError: {\n backgroundColor: theme.palette.error.main,\n color: '#fff',\n marginRight: theme.spacing(3),\n marginLeft: theme.spacing(3),\n borderRadius: theme.spacing(0.5)\n },\n fontError: {\n color: theme.palette.error.main,\n fontWeight: theme.typography.fontWeightMedium\n },\n fontWarning: {\n color: theme.palette.warning.main,\n fontWeight: theme.typography.fontWeightMedium\n },\n icon: {\n // color: theme.palette.primary.main,\n },\n line19: {\n lineHeight: '19px'\n },\n line30: {\n lineHeight: '30px'\n },\n listItemMoreButton: {\n position: 'absolute',\n right: 0\n },\n m0: {\n margin: 0\n },\n ml1: {\n marginLeft: theme.spacing(1)\n },\n mb1: {\n marginBottom: theme.spacing(1)\n },\n menuButton: {\n marginRight: theme.spacing(2),\n [theme.breakpoints.up('md')]: {\n display: 'none'\n }\n },\n dropdownListItem: {\n borderBottom: 'none'\n },\n dropdownListItemError: {\n color: theme.palette.error.main,\n fontWeight: theme.typography.fontWeightMedium,\n borderBottom: 'none'\n },\n splitGroup: {\n backgroundColor: theme.palette.divider\n },\n firstSplit: {\n borderTopLeftRadius: '4px',\n borderTopRightRadius: '4px'\n },\n lastSplit: {\n borderBottomLeftRadius: '4px',\n borderBottomRightRadius: '4px'\n },\n splitAddButton: {\n marginTop: '16px'\n },\n p0: {\n padding: 0\n },\n pl0: {\n paddingLeft: 0\n },\n pr1: {\n paddingRight: theme.spacing(1)\n },\n pl1: {\n paddingLeft: theme.spacing(1)\n },\n pt1: {\n paddingTop: theme.spacing(1)\n },\n tableLabel: {\n borderRadius: '4px',\n padding: 0,\n textAlign: 'center'\n },\n rightTableHead: {\n '& > div': {\n textAlign: 'right'\n }\n },\n centerTableHead: {\n '& > div': {\n textAlign: 'center'\n }\n },\n tableHeader: {\n // color: theme.palette.secondary.light\n },\n selectedRow: {\n // color: 'rgba(0, 0, 0, 0.87)',\n backgroundColor:\n theme.palette.mode === 'light'\n ? 'rgba(0, 0, 0, 0.1) !important'\n : 'rgba(255, 255, 255, 0.1) !important'\n // '&:hover svg': {\n // color: theme.palette.primary.main\n // }\n },\n // necessary for content to be below app bar\n toolbar: theme.mixins.toolbar,\n topIndex: {\n zIndex: 1201\n },\n customButton: {\n padding: '5px 15px !important',\n background: 'transparent !important',\n border: '1px solid rgba(6, 190, 182, 0.5) !important',\n '&:hover': {\n border: '1px solid #0f4e5b !important',\n backgroundColor: 'rgba(6, 190, 182, 0.04) !important',\n textDecoration: 'none !important'\n },\n verticalAlign: 'middle',\n borderRadius: '4px'\n },\n textLinks: {\n color: 'inherit',\n cursor: 'pointer',\n '&:hover': {\n textDecoration: 'underline'\n }\n },\n positiveStats: {\n backgroundColor: 'rgba(0, 255, 0, 0.2)',\n color: theme.palette.success.main,\n fontWeight: 500,\n borderRadius: theme.spacing(1),\n textAlign: 'center',\n paddingHorizontal: theme.spacing(1)\n },\n negativeStats: {\n backgroundColor: 'rgba(255, 0, 0, 0.2)',\n color: theme.palette.error.main,\n fontWeight: 500,\n borderRadius: theme.spacing(1),\n textAlign: 'center',\n paddingHorizontal: theme.spacing(1)\n }\n})\n\nexport const authLayout = theme => ({\n root: {\n height: '100vh',\n paddingTop: theme.spacing(5)\n },\n image: {\n height: '125px',\n width: '125px',\n margin: 'auto'\n },\n centerGrid: {\n margin: '0 auto 24px'\n },\n paper: {\n margin: theme.spacing(8, 4),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center'\n },\n centerCard: {\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n color: theme.palette.secondary.contrastText\n },\n avatar: {\n margin: theme.spacing(1),\n backgroundColor: theme.palette.primary.main\n }\n})\n\n// The styling for the switch is the same, so we just use the light theme.\nexport const SwitchPositive = withStyles(theme => ({\n switchBase: {\n color: theme.palette.error.main,\n '&$checked': {\n color: theme.palette.success.main\n },\n '&$checked + $track': {\n backgroundColor: theme.palette.success.light\n }\n },\n checked: {},\n track: {}\n}))(Switch)\n\n// Tab styling\nexport const TabBar = withStyles(theme => ({\n root: {\n backgroundColor: theme.palette.primary.main,\n color: '#fff',\n borderRadius: '4px',\n position: 'static',\n height: '64px'\n }\n}))(AppBar)\n\nexport const TabList = withStyles(theme => ({\n indicator: {\n height: '52px',\n borderRadius: '4px',\n bottom: '6px',\n backgroundColor: '#fff',\n zIndex: 0\n }\n}))(Tabs)\n\nexport const TabButton = withStyles(theme => ({\n root: {\n color: '#fff',\n borderRadius: '4px',\n margin: '6px',\n padding: '8px 12px',\n height: '52px',\n zIndex: 1,\n '&:hover': {\n backgroundColor: theme.palette.primary.light,\n color: '#fff'\n },\n '&:focus': {\n outline: 'none'\n }\n },\n selected: {\n color: `${theme.palette.primary.main} !important`,\n '&:hover': {\n backgroundColor: 'transparent'\n }\n }\n}))(Tab)\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { AppBar, Avatar, Box, Typography, Grid, Paper, CssBaseline, Link } from '@mui/material'\n\nimport { authLayout } from '../common/styles'\n\nconst styles = theme => ({\n ...authLayout(theme)\n})\n\nfunction Copyright() {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\" align=\"center\">\n {' © '}\n {new Date().getFullYear()}\n \n <Link color=\"inherit\" href=\"https://www.ploutosbudget.com\">\n Ploutos Studios\n </Link>\n </Typography>\n )\n}\n\nfunction AuthLayout(props) {\n const { classes, theme, children, heading } = props\n\n return (\n <Fragment>\n <AppBar position=\"fixed\" className={classes.appBar} style={{ padding: theme.spacing(2) }} />\n <Grid container className={classes.root}>\n <CssBaseline />\n <Grid item xs={12} sm={6} md={7}>\n <Avatar\n variant=\"circular\"\n className={classes.image}\n alt=\"Ploutos Budget Logo\"\n src=\"/static/ploutos.svg\"\n />\n <Box p={2}>\n <Typography\n variant=\"h6\"\n component=\"h1\"\n align=\"center\"\n noWrap\n style={{\n color: theme.palette.primary.main,\n fontWeight: 400\n }}\n >\n <p\n style={{\n marginTop: 0,\n marginBottom: 0,\n fontSize: '2rem',\n fontFamily: 'Yellowtail, Roboto, Helvetica, Arial, sans-serif'\n }}\n >\n Ploutos Budget\n </p>\n A Better Way To Manage Your Money\n </Typography>\n </Box>\n <Grid\n container\n item\n justifyContent=\"center\"\n xs={9}\n spacing={3}\n className={classes.centerGrid}\n >\n <Grid item xs={12}>\n <Paper className={classes.centerCard} elevation={3}>\n <Box p={2}>\n <Typography variant=\"h6\">Track all of your accounts</Typography>\n <Typography variant=\"body2\">\n Start off by adding all of your spending and saving accounts into your budget.\n </Typography>\n </Box>\n </Paper>\n </Grid>\n <Grid item xs={12}>\n <Paper className={classes.centerCard} elevation={3}>\n <Box p={2}>\n <Typography variant=\"h6\">Create goals</Typography>\n <Typography variant=\"body2\">\n For each month create goals for how much you want to spend in each category.\n </Typography>\n </Box>\n </Paper>\n </Grid>\n <Grid item xs={12}>\n <Paper className={classes.centerCard} elevation={3}>\n <Box p={2}>\n <Typography variant=\"h6\">Fund categories</Typography>\n <Typography variant=\"body2\">Budget all of the money in your accounts.</Typography>\n </Box>\n </Paper>\n </Grid>\n <Grid item xs={12}>\n <Paper className={classes.centerCard} elevation={3}>\n <Box p={2}>\n <Typography variant=\"h6\">Spend with confidence</Typography>\n <Typography variant=\"body2\">\n Your categories will tell you how much money you have left to spend.\n </Typography>\n </Box>\n </Paper>\n </Grid>\n </Grid>\n </Grid>\n\n <Grid item xs={12} sm={6} md={5} component={Paper} elevation={6} square>\n <div className={classes.paper}>\n <Typography component=\"h1\" variant=\"h5\">\n {heading}\n </Typography>\n {children}\n </div>\n <Box mt={5} mb={3}>\n <Copyright />\n </Box>\n </Grid>\n </Grid>\n </Fragment>\n )\n}\n\nAuthLayout.propTypes = {\n children: PropTypes.node,\n heading: PropTypes.string.isRequired\n}\n\nexport default withStyles(styles, { withTheme: true })(AuthLayout)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles';\nimport { Typography, Button, Grid, } from '@mui/material'\nimport { Home, Refresh } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport AuthLayout from '../users/AuthLayout'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass ErrorBoundary extends Component {\n state = { error: null }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const {\n auth, accountTypeError, accountError, collectionError,\n categoryError, categoryBudgetError, transactionError\n } = this.props\n\n // Only check for errors if the user is logged in\n if (!auth.isLoading && auth.isAuthenticated) {\n if (accountTypeError && accountTypeError !== prevProps.accountTypeError) {\n this.setState({ error: 'Error retrieving account types.' })\n }\n if (accountError && accountError !== prevProps.accountError) {\n this.setState({ error: 'Error retrieving your accounts.' })\n }\n if (collectionError && collectionError !== prevProps.collectionError) {\n this.setState({ error: 'Error retrieving your collections.' })\n }\n if (categoryError && categoryError !== prevProps.categoryError) {\n this.setState({ error: 'Error retrieving your categories.' })\n }\n if (categoryBudgetError && categoryBudgetError !== prevProps.categoryBudgetError) {\n this.setState({ error: 'Error retrieving your budget.' })\n }\n if (transactionError && transactionError !== prevProps.transactionError) {\n this.setState({ error: 'Error retrieving your transactions.' })\n }\n }\n\n }\n\n render() {\n const { error } = this.state\n const { classes } = this.props\n\n if (error) {\n return (\n <AuthLayout heading=\"Ope... Something went wrong.\">\n <Grid container\n spacing={3}>\n <Grid item xs={12}>\n <Typography variant=\"body1\" gutterBottom>\n {error}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\" gutterBottom>\n We are sorry for the inconvenience. If the problem persists please contact us.\n </Typography>\n </Grid>\n <Grid container item xs={6} justifyContent=\"center\">\n <Button fullWidth={true} type=\"submit\" color=\"primary\" variant=\"contained\"\n onClick={() => window.location.href = '/'}>\n <Home className={classes.pr1} fontSize=\"small\" />Home\n </Button>\n </Grid>\n <Grid container item xs={6} justifyContent=\"center\">\n <Button fullWidth={true} type=\"submit\" color=\"primary\" variant=\"contained\"\n onClick={() => window.location.reload(false)}>\n <Refresh className={classes.pr1} fontSize=\"small\" />Refresh\n </Button>\n </Grid>\n </Grid>\n </AuthLayout>\n )\n }\n\n return this.props.children\n }\n}\n\nErrorBoundary.propTypes = {\n auth: PropTypes.object.isRequired,\n accountTypeError: PropTypes.bool.isRequired,\n accountError: PropTypes.bool.isRequired,\n collectionError: PropTypes.bool.isRequired,\n categoryError: PropTypes.bool.isRequired,\n categoryBudgetError: PropTypes.bool.isRequired,\n transactionError: PropTypes.bool.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n accountTypeError: state.accountTypeReducer.error,\n accountError: state.accountReducer.error,\n collectionError: state.collectionReducer.error,\n categoryError: state.categoryReducer.error,\n categoryBudgetError: state.categoryBudgetReducer.error,\n transactionError: state.transactionReducer.error,\n})\n\nexport default connect(mapStateToProps)(withStyles(styles)(ErrorBoundary))\n","import React, { Component } from 'react'\nimport { Navigate } from 'react-router-dom'\n\nclass Error404 extends Component {\n render() {\n return <Navigate to=\"/\" />\n }\n}\n\nexport default Error404\n","import React from 'react'\nimport LinearProgress from '@mui/material/LinearProgress'\n\nexport const Loading = () => {\n return (\n <LinearProgress variant=\"indeterminate\" color=\"primary\" />\n )\n}","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\n\nimport { Loading } from './Loading'\n\nclass AuthLoading extends Component {\n state = {\n loading: true\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { isLoading, user } = this.props.auth\n const { profile } = this.props\n\n if (isLoading !== prevProps.auth.isLoading) {\n this.setState({ loading: isLoading })\n }\n\n if (user !== prevProps.auth.user || profile !== prevProps.profile) {\n this.loadHelpScoutBeacon()\n }\n }\n\n /**\n * Setup Help Scout Beacon to identify the logged-in user\n */\n loadHelpScoutBeacon = () => {\n const { user } = this.props.auth\n const { profile } = this.props\n const email = user && user.email ? user.email : null\n\n if (email) {\n const signature = profile && profile.web_signature ? profile.web_signature : ''\n const name = `${(user && user.first_name) || ''} ${(user && user.last_name) || ''}`\n\n Beacon('identify', {\n email: email,\n name: name,\n signature: signature\n })\n }\n }\n\n render() {\n return this.state.loading ? <Loading /> : this.props.children\n }\n}\n\nAuthLoading.propTypes = {\n auth: PropTypes.object.isRequired,\n profile: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n profile: state.profileReducer.profile\n})\n\nexport default connect(mapStateToProps)(AuthLoading)\n","// Budget Month\nexport const GET_BUDGET_MONTH = 'GET_BUDGET_MONTH'\nexport const EDIT_BUDGET_MONTH = 'EDIT_BUDGET_MONTH'\n\n// Account Group\nexport const GET_ACCOUNT_GROUPS = 'GET_ACCOUNT_GROUPS'\nexport const EDIT_ACCOUNT_GROUPS = 'EDIT_ACCOUNT_GROUPS'\nexport const REORDER_ACCOUNT_GROUPS = 'REORDER_ACCOUNT_GROUPS'\nexport const ACCOUNT_GROUPS_LOADING = 'ACCOUNT_GROUPS_LOADING'\nexport const ACCOUNT_GROUPS_FAIL = 'ACCOUNT_GROUPS_FAIL'\n\n// Transaction\nexport const GET_TRANSACTIONS = 'GET_TRANSACTIONS'\nexport const DELETE_TRANSACTION = 'DELETE_TRANSACTION'\nexport const ADD_TRANSACTION = 'ADD_TRANSACTION'\nexport const EDIT_TRANSACTION = 'EDIT_TRANSACTION'\nexport const TRANSACTION_FAIL = 'TRANSACTION_FAIL'\nexport const TRANSACTION_LOADING = 'TRANSACTION_LOADING'\nexport const GET_TRANSACTION_ID = 'GET_TRANSACTION_ID'\nexport const EDIT_TRANSACTION_ID = 'EDIT_TRANSACTION_ID'\n\n// Holdings\nexport const GET_HOLDINGS = 'GET_HOLDINGS'\nexport const GET_HOLDING_HISTORY = 'GET_HOLDING_HISTORY'\nexport const EDIT_HOLDING = 'EDIT_HOLDING'\nexport const DELETE_HOLDING = 'DELETE_HOLDING'\nexport const ADD_HOLDING = 'ADD_HOLDING'\nexport const HOLDING_LOADING = 'HOLDING_LOADING'\nexport const HOLDING_FAIL = 'HOLDING_FAIL'\nexport const HOLDING_HISTORY_LOADING = 'HOLDING_HISTORY_LOADING'\nexport const HOLDING_HISTORY_FAIL = 'HOLDING_HISTORY_FAIL'\n\nexport const GET_HOLDING_ID = 'GET_HOLDING_ID'\nexport const EDIT_HOLDING_ID = 'EDIT_HOLDING_ID'\n\n// Securities\nexport const GET_SECURITIES = 'GET_SECURITIES'\nexport const EDIT_SECURITY = 'EDIT_SECURITY'\nexport const DELETE_SECURITY = 'DELETE_SECURITY'\nexport const ADD_SECURITY = 'ADD_SECURITY'\nexport const SECURITY_LOADING = 'SECURITY_LOADING'\nexport const SECURITY_FAIL = 'SECURITY_FAIL'\n\n\n// Transaction Flag\nexport const GET_TRANSACTION_FLAGS = 'GET_TRANSACTION_FLAGS'\nexport const EDIT_TRANSACTION_FLAGS = 'EDIT_TRANSACTION_FLAGS'\nexport const TRANSACTION_FLAG_LOADING = 'TRANSACTION_FLAG_LOADING'\nexport const TRANSACTION_FLAG_FAIL = 'TRANSACTION_FLAG_FAIL'\n\n// Flag Color\nexport const GET_FLAG_COLORS = 'GET_FLAG_COLORS'\nexport const FLAG_COLOR_LOADING = 'FLAG_COLOR_LOADING'\nexport const FLAG_COLOR_FAIL = 'FLAG_COLOR_FAIL'\n\n// Category\nexport const GET_CATEGORIES = 'GET_CATEGORIES'\nexport const EDIT_CATEGORY = 'EDIT_CATEGORY'\nexport const REORDER_CATEGORIES = 'REORDER_CATEGORIES'\nexport const ADD_CATEGORY = 'ADD_CATEGORY'\nexport const DELETE_CATEGORY = 'DELETE_CATEGORY'\nexport const CATEGORY_LOADING = 'CATEGORY_LOADING'\nexport const CATEGORY_FAIL = 'CATEGORY_FAIL'\nexport const GET_CATEGORY_ID = 'GET_CATEGORY_ID'\nexport const EDIT_CATEGORY_ID = 'EDIT_CATEGORY_ID'\n\n// Category Budget\nexport const GET_CATEGORY_BUDGETS = 'GET_CATEGORY_BUDGETS'\nexport const EDIT_CATEGORY_BUDGET = 'EDIT_CATEGORY_BUDGET'\nexport const CATEGORY_BUDGET_LOADING = 'CATEGORY_BUDGET_LOADING'\nexport const CATEGORY_BUDGET_FAIL = 'CATEGORY_BUDGET_FAIL'\nexport const GET_CATEGORY_BUDGET_ID = 'GET_CATEGORY_BUDGET_ID'\nexport const EDIT_CATEGORY_BUDGET_ID = 'EDIT_CATEGORY_BUDGET_ID'\nexport const GET_CATEGORY_BALANCE_ID = 'GET_CATEGORY_BALANCE_ID'\nexport const EDIT_CATEGORY_BALANCE_ID = 'EDIT_CATEGORY_BALANCE_ID'\n\n// Collection\nexport const GET_COLLECTION_ID = 'GET_COLLECTION_ID'\nexport const EDIT_COLLECTION_ID = 'EDIT_COLLECTION_ID'\nexport const GET_COLLECTIONS = 'GET_COLLECTIONS'\nexport const EDIT_COLLECTION = 'EDIT_COLLECTION'\nexport const REORDER_COLLECTIONS = 'REORDER_COLLECTIONS'\nexport const DELETE_COLLECTION = 'DELETE_COLLECTION'\nexport const ADD_COLLECTION = 'ADD_COLLECTION'\nexport const COLLECTION_LOADING = 'COLLECTION_LOADING'\nexport const COLLECTION_FAIL = 'COLLECTION_FAIL'\n\n// Account Type\nexport const GET_ACCOUNT_TYPES = 'GET_ACCOUNT_TYPES'\nexport const ACCOUNT_TYPE_LOADING = 'ACCOUNT_TYPE_LOADING'\nexport const ACCOUNT_TYPE_FAIL = 'ACCOUNT_TYPE_FAIL'\n\n// Payee\nexport const GET_PAYEES = 'GET_PAYEES'\nexport const EDIT_PAYEES = 'EDIT_PAYEES'\nexport const PAYEE_LOADING = 'PAYEE_LOADING'\nexport const PAYEE_FAIL = 'PAYEE_FAIL'\n\n// Report\nexport const GET_REPORTS = 'GET_REPORTS'\nexport const REPORT_LOADING = 'REPORT_LOADING'\nexport const REPORT_FAIL = 'REPORT_FAIL'\n\n// Transfer\nexport const GET_TRANSFERS = 'GET_TRANSFERS'\nexport const TRANSFER_LOADING = 'TRANSFER_LOADING'\nexport const TRANSFER_FAIL = 'TRANSFER_FAIL'\n\n// Split\nexport const GET_SPLITS = 'GET_SPLITS'\nexport const SPLIT_LOADING = 'SPLIT_LOADING'\nexport const SPLIT_FAIL = 'SPLIT_FAIL'\n\n// Account\nexport const GET_ACCOUNT_KEY = 'GET_ACCOUNT_KEY'\nexport const EDIT_ACCOUNT_KEY = 'EDIT_ACCOUNT_KEY'\nexport const GET_ACCOUNTS = 'GET_ACCOUNTS'\nexport const EDIT_ACCOUNT = 'EDIT_ACCOUNT'\nexport const REORDER_ACCOUNTS = 'REORDER_ACCOUNTS'\nexport const DELETE_ACCOUNT = 'DELETE_ACCOUNT'\nexport const ADD_ACCOUNT = 'ADD_ACCOUNT'\nexport const ACCOUNT_LOADING = 'ACCOUNT_LOADING'\nexport const ACCOUNT_FAIL = 'ACCOUNT_FAIL'\nexport const GET_ACCOUNT_ID = 'GET_ACCOUNT_ID'\nexport const EDIT_ACCOUNT_ID = 'EDIT_ACCOUNT_ID'\n\n// Message\nexport const GET_ERRORS = 'GET_ERRORS'\nexport const CREATE_TOAST = 'CREATE_TOAST'\nexport const CREATE_MESSAGE = 'CREATE_MESSAGE'\nexport const CLEAR_MESSAGES = 'CLEAR_MESSAGES'\n\n// Auth\nexport const USER_LOADING = 'USER_LOADING'\nexport const USER_LOADED = 'USER_LOADED'\nexport const AUTH_ERROR = 'AUTH_ERROR'\nexport const AUTHENTICATED_SUCCESS = 'AUTHENTICATED_SUCCESS'\nexport const AUTHENTICATED_FAIL = 'AUTHENTICATED_FAIL'\nexport const LOGIN_SUCCESS = 'LOGIN_SUCCESS'\nexport const LOGIN_FAIL = 'LOGIN_FAIL'\nexport const LOGOUT_SUCCESS = 'LOGOUT_SUCCESS'\nexport const REGISTER_SUCCESS = 'REGISTER_SUCCESS'\nexport const REGISTER_FAIL = 'REGISTER_FAIL'\nexport const ACTIVATION_SUCCESS = 'ACTIVATION_SUCCESS'\nexport const ACTIVATION_FAIL = 'ACTIVATION_FAIL'\nexport const DELETE_USER_ACCOUNT = 'DELETE_USER_ACCOUNT'\nexport const DELETE_USER_ACCOUNT_FAIL = 'DELETE_USER_ACCOUNT_FAIL'\n\n// Settings\nexport const GET_PROFILE_SETTINGS = 'GET_PROFILE_SETTINGS'\nexport const ADD_PROFILE_SETTINGS = 'ADD_PROFILE_SETTINGS'\nexport const EDIT_PROFILE_SETTINGS = 'EDIT_PROFILE_SETTINGS'\nexport const PROFILE_SETTINGS_LOADING = 'PROFILE_SETTINGS_LOADING'\nexport const PROFILE_SETTINGS_FAIL = 'PROFILE_SETTINGS_FAIL'\n\n// Theme\nexport const GET_THEMES = 'GET_THEMES'\nexport const THEME_LOADING = 'THEME_LOADING'\nexport const THEME_FAIL = 'THEME_FAIL'\n\n// Profile\nexport const EDIT_PROFILE = 'EDIT_PROFILE'\nexport const PASSWORD_RESET_SUCCESS = 'PASSWORD_RESET_SUCCESS'\nexport const PASSWORD_RESET_FAIL = 'PASSWORD_RESET_FAIL'\nexport const PASSWORD_RESET_CONFIRM_SUCCESS = 'PASSWORD_RESET_CONFIRM_SUCCESS'\nexport const PASSWORD_RESET_CONFIRM_FAIL = 'PASSWORD_RESET_CONFIRM_FAIL'\n\n// Link\nexport const CREATE_LINK_TOKEN = 'CREATE_LINK_TOKEN'\nexport const CREATE_LINK_TOKEN_FAIL = 'CREATE_LINK_TOKEN_FAIL'\nexport const DELETE_LINK_TOKEN_SUCCESS = 'DELETE_LINK_TOKEN_SUCCESS'\nexport const CREATE_FIX_TOKEN = 'CREATE_FIX_TOKEN'\nexport const CREATE_FIX_TOKEN_FAIL = 'CREATE_FIX_TOKEN_FAIL'\nexport const DELETE_FIX_TOKEN_SUCCESS = 'DELETE_FIX_TOKEN_SUCCESS'\nexport const GET_LINK_ACCOUNTS = 'GET_LINK_ACCOUNTS'\nexport const LINK_ACCOUNTS_LOADING = 'LINK_ACCOUNTS_LOADING'\nexport const LINK_ACCOUNTS_FAIL = 'LINK_ACCOUNTS_FAIL'\nexport const CREATE_LINK_TRANSACTIONS = 'CREATE_LINK_TRANSACTIONS'\nexport const GET_LINK_TRANSACTIONS = 'GET_LINK_TRANSACTIONS'\nexport const EDIT_LINK_TRANSACTION = 'EDIT_LINK_TRANSACTION'\nexport const LINK_TRANSACTIONS_LOADING = 'LINK_TRANSACTIONS_LOADING'\nexport const LINK_TRANSACTIONS_FAIL = 'LINK_TRANSACTIONS_FAIL'\n\n// Recurring\nexport const GET_RECURRING_TRANSACTIONS = 'GET_RECURRING_TRANSACTIONS'\nexport const RECURRING_TRANSACTIONS_LOADING = 'RECURRING_TRANSACTIONS_LOADING'\nexport const RECURRING_TRANSACTIONS_FAIL = 'RECURRING_TRANSACTIONS_FAIL'\n\n// History Transactions\nexport const GET_HISTORY_TRANSACTIONS = 'GET_HISTORY_TRANSACTIONS'\nexport const HISTORY_TRANSACTION_LOADING = 'HISTORY_TRANSACTION_LOADING'\nexport const HISTORY_TRANSACTION_FAIL = 'HISTORY_TRANSACTION_FAIL'\n\n// Customer\nexport const GET_CUSTOMER = 'GET_CUSTOMER'\nexport const CREATE_CHECKOUT_SESSION = 'CREATE_CHECKOUT_SESSION'\nexport const DELETE_CHECKOUT_SESSION = 'DELETE_CHECKOUT_SESSION'\nexport const CUSTOMER_LOADING = 'CUSTOMER_LOADING'\nexport const CREATE_CHECKOUT_SESSION_FAIL = 'CREATE_CHECKOUT_SESSION_FAIL'\n","import { CREATE_TOAST, CREATE_MESSAGE, GET_ERRORS, CLEAR_MESSAGES } from './types'\n\n/**\n * Creates a user interactive message. The user must take action to\n * dismiss message.\n * @param {string} title - The title of the alert.\n * @param {string} [content] - The content of the alert.\n * @param {Object[]} [buttons] - Buttons attribute to override.\n * @param {string} buttons[].text - The text to display on the button.\n * @param {function} buttons[].onPress - The text to display on the button.\n * @param {('default', 'cancel', 'destructive')} buttons[].style - The text to display on the button.\n */\nexport const createMessage = (title, content, buttons) => {\n return {\n type: CREATE_MESSAGE,\n payload: { title, content, buttons }\n }\n}\n\n// Create Toast\nexport const createToast = msg => {\n return {\n type: CREATE_TOAST,\n payload: msg\n }\n}\n\n// Return errors\nexport const returnErrors = (msg, status) => {\n return {\n type: GET_ERRORS,\n payload: { msg, status }\n }\n}\n\n// Clear all messages\nexport const clearMessages = () => {\n return {\n type: CLEAR_MESSAGES\n }\n}\n","import axios from 'axios'\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_PROFILE_SETTINGS, ADD_PROFILE_SETTINGS, EDIT_PROFILE_SETTINGS,\n PROFILE_SETTINGS_LOADING, PROFILE_SETTINGS_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get profile settings\nexport const getProfileSettings = () => (dispatch, getState) => {\n dispatch({ type: PROFILE_SETTINGS_LOADING })\n axios.get(`${proxy}/v1/profiles/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_PROFILE_SETTINGS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: PROFILE_SETTINGS_FAIL })\n })\n}\n\n// Add Profile\nexport const addProfileSettings = (profile) => (dispatch, getState) => {\n axios.post(`${proxy}/v1/profiles/`, profile, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateProfile: 'Profile Updated' }))\n dispatch({\n type: ADD_PROFILE_SETTINGS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: PROFILE_SETTINGS_FAIL })\n })\n}\n\n// Edit Profile\nexport const editProfileSettings = (profile) => (dispatch, getState) => {\n axios.put(`${proxy}/v1/profiles/${profile.id}/`, profile, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateProfile: 'Profile Updated' }))\n dispatch({\n type: EDIT_PROFILE_SETTINGS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: PROFILE_SETTINGS_FAIL })\n })\n}\n","import axios from 'axios'\nimport * as amplitude from '@amplitude/analytics-browser'\n\nimport { returnErrors } from './messages'\nimport {\n GET_CUSTOMER,\n CREATE_CHECKOUT_SESSION,\n DELETE_CHECKOUT_SESSION,\n CUSTOMER_LOADING,\n CREATE_CHECKOUT_SESSION_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst PROXY = process.env.REACT_APP_PROXY\n\n// Get customer\nexport const getCustomer = () => (dispatch, getState) => {\n dispatch({ type: CUSTOMER_LOADING })\n dispatch({ type: DELETE_CHECKOUT_SESSION })\n axios\n .get(`${PROXY}/v1/customer/`, tokenConfig(getState))\n .then(res => {\n const responseData = res.data\n dispatch({\n type: GET_CUSTOMER,\n payload: responseData\n })\n\n // Use our customer Id to login to amplitude\n if (responseData && responseData[0] && responseData[0].customer_id) {\n const customerId = responseData[0].customer_id\n if (customerId) amplitude.setUserId(customerId)\n }\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: CREATE_CHECKOUT_SESSION_FAIL })\n })\n}\n\n// Create checkout session for user.\nexport const createCheckoutSession = priceId => (dispatch, getState) => {\n dispatch({ type: DELETE_CHECKOUT_SESSION })\n axios\n .post(`${PROXY}/v1/create_checkout_session/`, { price_id: priceId }, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: CREATE_CHECKOUT_SESSION,\n payload: res.data\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: CREATE_CHECKOUT_SESSION_FAIL\n })\n })\n}\n\n// Navigate to the customer portal\nexport const createCustomerPortal = () => (dispatch, getState) => {\n dispatch({ type: DELETE_CHECKOUT_SESSION })\n axios\n .post(`${PROXY}/v1/customer_portal/`, {}, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: CREATE_CHECKOUT_SESSION,\n payload: res.data\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: CREATE_CHECKOUT_SESSION_FAIL\n })\n })\n}\n","import axios from 'axios'\nimport { createMessage, createToast, returnErrors } from './messages'\nimport {\n USER_LOADED,\n USER_LOADING,\n AUTH_ERROR,\n AUTHENTICATED_SUCCESS,\n AUTHENTICATED_FAIL,\n LOGIN_SUCCESS,\n LOGIN_FAIL,\n LOGOUT_SUCCESS,\n REGISTER_SUCCESS,\n REGISTER_FAIL,\n ACTIVATION_SUCCESS,\n ACTIVATION_FAIL,\n PASSWORD_RESET_SUCCESS,\n PASSWORD_RESET_FAIL,\n PASSWORD_RESET_CONFIRM_SUCCESS,\n PASSWORD_RESET_CONFIRM_FAIL,\n EDIT_PROFILE,\n DELETE_USER_ACCOUNT,\n DELETE_USER_ACCOUNT_FAIL\n} from './types'\n\nimport { getProfileSettings } from './profile'\nimport { getCustomer } from './membership'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// export const checkAuthenticated = () => (dispatch, getState) => {\n//\n// if (localStorage.getItem('access')) {\n// axios.post('/v1/auth/jwt/verify/', tokenConfig(getState))\n// .then(res => {\n// if (res.data.code !== 'token_not_valid') {\n// dispatch({\n// type: AUTHENTICATED_SUCCESS\n// })\n// } else {\n// dispatch({\n// type: AUTHENTICATED_FAIL\n// })\n// }\n// })\n// .catch(err => {\n// dispatch(returnErrors(err.response.data, err.response.status))\n// dispatch({\n// type: AUTHENTICATED_FAIL\n// })\n// })\n// } else {\n// dispatch({\n// type: AUTHENTICATED_FAIL\n// })\n// }\n// }\n\n/**\n * Load user\n * @returns {Promise}\n */\nexport const loadUser = () => async (dispatch, getState) => {\n // User Loading\n dispatch({ type: USER_LOADING })\n\n try {\n const response = await axios.get(`${proxy}/v1/auth/users/me/`, tokenConfig(getState))\n await dispatch({ type: USER_LOADED, payload: response.data })\n await dispatch(getProfileSettings())\n await dispatch(getCustomer())\n return response\n } catch (err) {\n const error =\n err.response && err.response.data\n ? err.response.data\n : 'Unable to login. Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: AUTH_ERROR\n })\n }\n}\n\n// update user profile\nexport const editProfile = profile => (dispatch, getState) => {\n axios\n .put(`${proxy}/v1/auth/users/me/`, profile, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateProfile: 'Profile Updated' }))\n dispatch({\n type: EDIT_PROFILE,\n payload: res.data\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// LOGIN USER\nexport const login = (email, password) => dispatch => {\n // Request Options\n const options = {\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n const body = JSON.stringify({ email, password })\n\n axios\n .post(`${proxy}/v1/auth/jwt/create/`, body, options)\n .then(res => {\n dispatch({\n type: LOGIN_SUCCESS,\n payload: res.data\n })\n dispatch(loadUser())\n })\n .catch(err => {\n const error =\n err.response && err.response.data\n ? err.response.data\n : 'Unable to login. Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: LOGIN_FAIL\n })\n })\n}\n\n// Register user\nexport const register =\n ({ first_name, last_name, email, password, re_password }) =>\n dispatch => {\n // Headers\n const config = {\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n // Request Body\n const body = JSON.stringify({\n first_name,\n last_name,\n email,\n password,\n re_password,\n platform_origin: 1\n })\n\n axios\n .post(`${proxy}/v1/auth/users/`, body, config)\n .then(res => {\n dispatch({\n type: REGISTER_SUCCESS,\n payload: email\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: REGISTER_FAIL\n })\n })\n }\n\n// Activate user\nexport const activate = (uid, token) => dispatch => {\n // Headers\n const config = {\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n // Request Body\n const body = JSON.stringify({ uid, token })\n\n axios\n .post(`${proxy}/v1/auth/users/activation/`, body, config)\n .then(res => {\n dispatch({\n type: ACTIVATION_SUCCESS\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({\n type: ACTIVATION_FAIL\n })\n })\n}\n\n// Resend activation email\nexport const resendActivationEmail = email => dispatch => {\n // Headers\n const config = {\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n // Request Body\n const body = JSON.stringify({ email })\n\n axios\n .post(`${proxy}/v1/auth/users/resend_activation/`, body, config)\n .then(res => {\n dispatch({\n type: REGISTER_SUCCESS,\n payload: email\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: REGISTER_FAIL\n })\n })\n}\n\n// Setup config with token - helper function\nexport const tokenConfig = getState => {\n // Get token from state\n // const token = getState().authReducer.access\n\n // Headers\n const config = {\n withCredentials: true,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n\n // If token, add to headers config\n // if (token) {\n // config.headers['Authorization'] = `JWT ${token}`\n // }\n\n return config\n}\n\n// Reset the users password\nexport const resetPassword = email => dispatch => {\n // Headers\n const config = {\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n // Request Body\n const body = JSON.stringify({ email })\n axios\n .post(`${proxy}/v1/auth/users/reset_password/`, body, config)\n .then(res => {\n dispatch({\n type: PASSWORD_RESET_SUCCESS\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: PASSWORD_RESET_FAIL\n })\n })\n}\n\n// Confirm new password\nexport const resetPasswordConfirm = (uid, token, new_password, re_new_password) => dispatch => {\n // Headers\n const config = {\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n // Request Body\n const body = JSON.stringify({ uid, token, new_password, re_new_password })\n axios\n .post(`${proxy}/v1/auth/users/reset_password_confirm/`, body, config)\n .then(res => {\n dispatch({\n type: PASSWORD_RESET_CONFIRM_SUCCESS\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: PASSWORD_RESET_CONFIRM_FAIL\n })\n })\n}\n\n// Logout user\nexport const logout = () => dispatch => {\n const options = {\n withCredentials: true,\n headers: {\n 'Content-Type': 'application/json'\n }\n }\n\n axios\n .post(`${proxy}/v1/auth/logout/`, {}, options)\n .then(res => {\n dispatch({ type: LOGOUT_SUCCESS })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: AUTH_ERROR\n })\n })\n}\n\n/**\n * *** DANGER! ***\n * This deletes a users account and all of their data. This is\n * permanent and cannot be undone.\n * NOTE: This does not auto-cancel a users subscriptions or unlink\n * Ploutos Budget from their banking institutions.\n * @param {Object} currentPassword\n * @param {string} currentPassword.current_password - The logged in\n * users current password.\n */\nexport const deleteUserAccount = currentPassword => async (dispatch, getState) => {\n const config = tokenConfig(getState)\n if (!config) return false\n\n // Add request body to config data attribute.\n config['data'] = currentPassword\n\n await axios\n .delete(`${proxy}/v1/auth/users/me/`, config)\n .then(res => {\n dispatch({\n type: DELETE_USER_ACCOUNT,\n payload: res.data\n })\n })\n .catch(err => {\n const error =\n err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch({ type: DELETE_USER_ACCOUNT_FAIL })\n dispatch(\n createMessage(\n 'Account Deletion Failed',\n 'Please verify you have the correct password and try again. If the problem persists please email support.'\n )\n )\n })\n}\n\n/**\n * Social login\n * @returns {Promise}\n */\nexport const socialLogin = (provider, state, code) => async dispatch => {\n // Request Options\n const options = {\n withCredentials: true,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n credentials: 'include'\n }\n const url = `${proxy}/auth/o/${provider}/?state=${encodeURIComponent(state)}&code=${encodeURIComponent(code)}`\n\n try {\n const response = await axios.post(url, {}, options)\n return response\n } catch (err) {\n const error =\n err.response && err.response.data\n ? err.response.data\n : 'Unable to login. Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: LOGIN_FAIL })\n }\n}\n\n/**\n * Social login\n * @param {Object} data - Auth data from Apple.\n * @param {string} data.id_token - Auth token from Apple.\n * @param {string} data.code - Auth code from Apple.\n * @param {number} data.platform_origin - Our origin code for\n * which platform is the request coming from.\n * @returns {Promise}\n */\nexport const appleSocialLogin = data => async dispatch => {\n // Request Options\n const options = {\n withCredentials: true,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n credentials: 'include'\n }\n const url = `${proxy}/v1/auth/apple/verify/`\n\n try {\n const response = await axios.post(url, data, options)\n\n return response\n } catch (err) {\n const error =\n err.response && err.response.data\n ? err.response.data\n : 'Unable to login. Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: LOGIN_FAIL })\n }\n}\n\n/**\n * Get cookeis for apple sign in.\n * @param {Object} - Access and refresh token.\n * @returns {Promise}\n */\nexport const getAppleCookies = tokens => async dispatch => {\n // Request Options\n const options = {\n withCredentials: true,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n credentials: 'include'\n }\n const refresh = tokens && tokens.refresh ? { refresh: tokens.refresh } : null\n\n if (!refresh) {\n return false\n }\n\n try {\n const url = `${proxy}/v1/auth/jwt/refresh/`\n const response = await axios.post(url, refresh, options)\n dispatch({\n type: LOGIN_SUCCESS,\n payload: res.data\n })\n return response\n } catch (err) {\n const error =\n err.response && err.response.data\n ? err.response.data\n : 'Unable to login. Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: LOGIN_FAIL })\n }\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport IdleTimer from 'react-idle-timer'\n\nimport { logout } from '../../actions/auth'\n\nconst TIMEOUT = 7200000 // 2 hours\nconst DEBOUNCE = 250\n\nclass Idle extends Component {\n constructor(props) {\n super(props)\n\n this.idleTimer = null\n this.onIdle = this.onIdle.bind(this)\n }\n\n static propTypes = {\n logout: PropTypes.func.isRequired,\n isAuthenticated: PropTypes.bool.isRequired,\n }\n\n onIdle(e) {\n if (this.props.isAuthenticated) this.props.logout()\n }\n\n render() {\n return (\n <IdleTimer\n ref={ref => {\n this.idleTimer = ref\n }}\n element={document}\n onIdle={this.onIdle}\n debounce={DEBOUNCE}\n timeout={TIMEOUT}\n />\n )\n }\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated\n})\n\nconst mapDispatchToProps = {\n logout\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Idle)","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\n\nclass HeaderLoading extends Component {\n\n render() {\n const { accountsLoaded, auth } = this.props\n return (auth.isLoading || !accountsLoaded) ? null : this.props.children\n }\n}\n\nHeaderLoading.propTypes = {\n auth: PropTypes.object.isRequired,\n accountsLoaded: PropTypes.bool.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n accountsLoaded: state.accountReducer.isLoaded,\n})\n\nexport default connect(mapStateToProps)(HeaderLoading)","import React, { useEffect } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {\n ListItem, ListItemText, ListItemIcon, Typography, ClickAwayListener,\n Grow, Paper, Popper, MenuList, MenuItem, Divider\n} from '@mui/material'\nimport makeStyles from '@mui/styles/makeStyles'\nimport {\n AccountBox, Settings, Loyalty, Receipt, Inventory, Link as LinkIcon, Lock\n} from '@mui/icons-material'\n\nimport { logout } from '../../../actions/auth'\n\n// This gets the topIndex plus 1\nconst useStyles = makeStyles((theme) => ({\n menuList: {\n zIndex: 10000\n },\n popperIcon: {\n padding: '0 16px'\n },\n selected: {\n color: theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.secondary.light,\n fontWeight: theme.typography.fontWeightBold,\n marginLeft: '-3px'\n },\n selectedAnchor: {\n borderLeft: '3px solid',\n borderColor: theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.secondary.light\n }\n}))\n\nfunction ProfileMenu({ user, logout }) {\n const [open, setOpen] = React.useState(false)\n const [selected, setSelected] = React.useState(false)\n\n const anchorRef = React.useRef(null)\n const { pathname } = useLocation()\n const classes = useStyles()\n\n const handleToggle = () => {\n setOpen((prevOpen) => !prevOpen)\n }\n\n /**\n * Close the popper menu.\n * @param {Object} event - The click event.\n */\n const handleClose = (event) => {\n if (anchorRef.current && anchorRef.current.contains(event.target)) {\n return\n }\n\n setOpen(false)\n }\n\n function handleListKeyDown(event) {\n if (event.key === 'Tab') {\n event.preventDefault()\n setOpen(false)\n }\n }\n\n /**\n * Closes the menu and calls logout.\n * @param {Object} event - The event object.\n */\n function handleLogout(event) {\n handleClose(event)\n logout()\n }\n\n /**\n * return focus to the button when we transitioned from !open -> open\n */\n const prevOpen = React.useRef(open)\n useEffect(() => {\n if (prevOpen.current === true && open === false) {\n anchorRef.current.focus()\n }\n\n prevOpen.current = open\n }, [open])\n\n /**\n * Check to see if a menu in the profile is selected.\n */\n useEffect(() => {\n if (pathname === '/payees' ||\n pathname === '/archives' ||\n pathname === '/link-accounts' ||\n pathname === '/membership' ||\n pathname === '/settings') {\n setSelected(true)\n } else {\n setSelected(false)\n }\n }, [pathname])\n\n return (\n <ListItem button key=\"Profile\" ref={anchorRef}\n aria-controls={open ? 'menu-list-grow' : undefined}\n aria-haspopup=\"true\"\n onClick={handleToggle}\n className={selected ? classes.selectedAnchor : null}\n >\n <ListItemIcon><AccountBox className={selected ? classes.selected : null} /></ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap className={selected ? classes.selected : null}>\n {user ? `${user.first_name} ${user.last_name}` : ''}\n </Typography>\n } />\n <Popper open={open}\n anchorEl={anchorRef.current}\n className={classes.menuList}\n placement=\"bottom\"\n transition disablePortal>\n {({ TransitionProps, placement }) => (\n <Grow {...TransitionProps}>\n <Paper>\n <ClickAwayListener onClickAway={handleClose}>\n <MenuList autoFocusItem={open} id=\"menu-list-grow\" onKeyDown={handleListKeyDown}>\n <ListItem button key=\"ManagePayees\" to=\"/payees\"\n component={Link} onClick={handleClose}\n className={pathname === '/payees' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <Receipt className={pathname === '/payees' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap\n className={pathname === '/payees' ? classes.selected : null}>\n Manage Payees\n </Typography>\n } />\n </ListItem>\n <ListItem button key=\"Archives\" to=\"/archives\"\n component={Link} onClick={handleClose}\n className={pathname === '/archives' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <Inventory className={pathname === '/archives' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap\n className={pathname === '/archives' ? classes.selected : null}\n >\n Archives\n </Typography>\n } />\n </ListItem>\n <ListItem button key=\"LinkAccounts\" to=\"/link-accounts\"\n component={Link} onClick={handleClose}\n className={pathname === '/link-accounts' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <LinkIcon className={pathname === '/link-accounts' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap\n className={pathname === '/link-accounts' ? classes.selected : null}\n >\n Link Accounts\n </Typography>\n } />\n </ListItem>\n <Divider variant=\"middle\" />\n <ListItem button key=\"Membership\" to=\"/membership\"\n component={Link} onClick={handleClose}\n className={pathname === '/membership' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <Loyalty className={pathname === '/membership' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap\n className={pathname === '/membership' ? classes.selected : null}\n >\n Membership\n </Typography>\n } />\n </ListItem>\n <ListItem button key=\"Settings\" to=\"/settings\"\n component={Link} onClick={handleClose}\n className={pathname === '/settings' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <Settings className={pathname === '/settings' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap\n className={pathname === '/settings' ? classes.selected : null}\n >\n Settings\n </Typography>\n } />\n </ListItem>\n <Divider variant=\"middle\" />\n <MenuItem onClick={e => handleLogout(e)}>\n <ListItemIcon><Lock className={classes.icon} /></ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap>\n Logout\n </Typography>\n } />\n </MenuItem>\n </MenuList>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n </ListItem>\n )\n}\n\nProfileMenu.propTypes = {\n user: PropTypes.object.isRequired,\n logout: PropTypes.func.isRequired,\n\n}\n\nconst mapDispatchToProps = {\n logout,\n}\n\nexport default connect(null, mapDispatchToProps)(ProfileMenu)\n","import React from 'react'\nimport { SortableContainer } from 'react-sortable-hoc'\nimport { List } from '@mui/material'\n\nexport const SortContainer = SortableContainer(({ children, ...props }) => {\n return <List {...props}>{children}</List>\n})\n","import React from 'react'\nimport { SortableHandle } from 'react-sortable-hoc'\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator'\n\nexport const DragHandle = SortableHandle(({ classes }) => (\n <DragIndicatorIcon fontSize=\"small\" className={classes.dragHandle} />\n))\n","import numeral from 'numeral'\n\n/**\n * Determine if the input is a valid money field input.\n * @param input - The users input\n * @returns {boolean} - True if valid money field input\n */\nexport const moneyInput = input => {\n // const re = /^[0-9]*\\.?[0-9]*$/\n const re = /^\\d*(\\.\\d{0,2})?$/\n return (re.test(input))\n}\n\n/**\n * Determine if the input is a valid investment number field input.\n * Investment quantity and prices are to 6 decimal places.\n * @param input - The users input\n * @returns {boolean} - True if valid investment field input\n */\nexport const investmentInput = input => {\n // const re = /^[0-9]*\\.?[0-9]*$/\n const re = /^\\d*(\\.\\d{0,6})?$/\n return (re.test(input))\n}\n\n/**\n * TODO: Add logic to adjust the return based on the users settings.\n * Format the money input to the logged-in users money field settings.\n * @param input\n * @returns {string} - The input formatted to the users money settings.\n */\nexport const formatMoneyLabel = input => {\n return numeral(input).format('$0,0.00')\n}\n\n/**\n * TODO: Add logic to adjust the return based on the users settings.\n * Format the money input to the logged in users money field settings.\n * @param input\n * @returns {number} - The input formatted to the users money settings.\n */\nexport const formatMoney = input => {\n return numeral(input).format('0.00')\n}\n\n/**\n * Format the input to a percent string.\n * @param input\n * @returns {string} - The input formatted to a percent string.\n */\nexport const formatPercentLabel = input => {\n return numeral(input).format('0,0.0%')\n}\n\n/**\n * TODO: Add logic to adjust the return based on the users settings.\n * Format the input to a whole percentage. e.g. 0.4 => 40\n * @param input\n * @returns {number} - value - The percentage\n */\nexport const formatPercent = input => {\n const percent = numeral(input).format('00.0')\n let value = 0\n if (!isNaN(percent)) {\n value = percent * 100\n }\n\n return value\n}\n\n/**\n * Checks if the passed value is an int.\n * @param {any} value\n * @return {boolean}\n */\nexport const isInt = value => {\n try {\n return !isNaN(value) && parseInt(Number(value)) == value && !isNaN(parseInt(value, 10))\n } catch (e) {\n return false\n }\n}\n","import React from 'react'\nimport { Link } from 'react-router-dom'\nimport { IconButton, ListItem, ListItemText, Badge } from '@mui/material'\nimport { styled } from '@mui/material/styles'\nimport { SortableElement } from 'react-sortable-hoc'\nimport { MoreVert, Link as LinkIcon, LinkOff } from '@mui/icons-material'\n\nimport { DragHandle } from '../common/DragHandle'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nexport const SortableAccounts = SortableElement(\n ({ accountClick, account, linkAccount, count, classes }) => {\n\n let balanceColor = (account.available_balance) > 0 ? ' green-text ' : ' red-text '\n let accountMoreButton = <MoreVert fontSize=\"small\" />\n if (linkAccount && linkAccount.id) {\n const status = linkAccount && (!linkAccount.status || linkAccount.status === '') ? null : linkAccount.status\n if (!status) accountMoreButton = <LinkIcon fontSize=\"small\" />\n else if (status && status !== '') accountMoreButton = <LinkOff fontSize=\"small\" />\n }\n\n const StyledBadge = styled(Badge)(({ theme }) => ({\n '& .MuiBadge-badge': {\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px',\n color: '#fff'\n },\n }))\n\n return (\n <ListItem dense\n className={`${classes.topIndex} ${classes.dragHandleParent} ${classes.p0} `}\n >\n <ListItem button dense disableGutters\n to={`/accounts/${account.id}`}\n component={Link}\n key={`account-${account.id}`}\n className={`${classes.sideNavAccountItem}`}\n >\n <IconButton aria-label=\"drag\" className={classes.dragHandleButton} size=\"small\">\n <DragHandle classes={classes} />\n </IconButton>\n <ListItemText\n primary={account.name}\n secondary={formatMoneyLabel(account.available_balance)}\n secondaryTypographyProps={{ className: `text-darken-2 ${balanceColor}` }}\n />\n </ListItem>\n <IconButton\n aria-label=\"Update account settings\"\n className={classes.listItemMoreButton}\n onClick={accountClick.bind(this, account.id)}\n size=\"small\">\n <StyledBadge color=\"accent\" badgeContent={count} max={99}\n anchorOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n >\n {accountMoreButton}\n </StyledBadge>\n </IconButton>\n </ListItem>\n )\n }\n)\n","import { GET_ACCOUNT_ID, EDIT_ACCOUNT_ID } from './types'\n\n// Get account Id\nexport const getAccountId = () => (dispatch, getState) => {\n dispatch({\n type: GET_ACCOUNT_ID,\n payload: getState\n })\n}\n\n// Edit account Id\nexport const editAccountId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_ACCOUNT_ID,\n payload: id\n })\n}\n","import { GET_ACCOUNT_KEY, EDIT_ACCOUNT_KEY } from './types'\n\n// Get account key\nexport const getAccountKey = () => (dispatch, getState) => {\n dispatch({\n type: GET_ACCOUNT_KEY,\n payload: getState\n })\n}\n\n// Edit account key\nexport const editAccountKey = (accountKey) => (dispatch, getState) => {\n dispatch({\n type: EDIT_ACCOUNT_KEY,\n payload: accountKey\n })\n}","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_COLLECTIONS, EDIT_COLLECTION, DELETE_COLLECTION, ADD_COLLECTION,\n REORDER_COLLECTIONS, COLLECTION_LOADING, COLLECTION_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\nimport { getCategories } from './categories'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Collections\nexport const getCollections = (yearMonth) => (dispatch, getState) => {\n dispatch({ type: COLLECTION_LOADING })\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/collections/?m=${mParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_COLLECTIONS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: COLLECTION_FAIL })\n })\n}\n\n// Edit Collection\nexport const editCollection = (collection) => (dispatch, getState) => {\n axios.put(`${proxy}/v1/collections/${collection.id}/`, collection, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCollection: 'Collection Updated' }))\n dispatch({\n type: EDIT_COLLECTION,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Reorder the Collections\nexport const reorderCollections = (collection, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.put(`${proxy}/v1/collections/reorder/${collection.id}/`, collection, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCollection: 'Collections Updated' }))\n dispatch({\n type: REORDER_COLLECTIONS,\n payload: res.data\n })\n dispatch(getCollections(mParm))\n dispatch(getCategories(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Delete Collection\nexport const deleteCollection = (id) => (dispatch, getState) => {\n axios.delete(`${proxy}/v1/collections/${id}/`, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ deleteCollection: 'Collection Deleted' }))\n dispatch({\n type: DELETE_COLLECTION,\n payload: id\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Add Collection\nexport const addCollection = (collection) => (dispatch, getState) => {\n axios.post(`${proxy}/v1/collections/`, collection, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ addCollection: 'Collection Added' }))\n dispatch({\n type: ADD_COLLECTION,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_ACCOUNT_GROUPS, EDIT_ACCOUNT_GROUPS, REORDER_ACCOUNT_GROUPS,\n ACCOUNT_GROUPS_LOADING, ACCOUNT_GROUPS_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Account groups\nexport const getAccountGroups = () => (dispatch, getState) => {\n dispatch({ type: ACCOUNT_GROUPS_LOADING })\n axios.get(`${proxy}/v1/account_group_preferences/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_ACCOUNT_GROUPS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: ACCOUNT_GROUPS_FAIL })\n })\n}\n\n/**\n * Used to edit account group preferences.\n * @param {object} group - The group preference object.\n * @returns {(function(*, *): void)|*}\n */\nexport const editAccountGroups = (group) => (dispatch, getState) => {\n axios.put(`${proxy}/v1/account_group_preferences/${group.id}/`, group, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateGroup: 'Group Updated' }))\n dispatch({\n type: EDIT_ACCOUNT_GROUPS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Reorder the account groups\nexport const reorderAccountGroups = (group) => (dispatch, getState) => {\n axios.put(`${proxy}/v1/account_group_preferences/reorder/${group.id}/`, group, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateGroup: 'Groups Updated' }))\n dispatch({\n type: REORDER_ACCOUNT_GROUPS,\n payload: res.data\n })\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import { Typography, Grid, ListItem, ListItemText } from '@mui/material'\n\n/**\n * Array of the table size options.\n * @type {number[]} - All of the options.\n */\nexport const ROWS_PER_PAGE_OPTIONS = [25, 50, 100, 200]\n\n/**\n * Download passed data as passed file name.\n * @param {Object} data\n * @param {string} [fileName=budgetDownload.csv]\n */\nexport const downloadFile = (data, fileName) => {\n try {\n fileName = (fileName || 'budgetDownload.csv')\n if (!data) return false\n const url = window.URL.createObjectURL(new Blob([data]))\n const link = document.createElement('a')\n\n link.href = url\n link.setAttribute('download', fileName)\n document.body.appendChild(link)\n link.click()\n link.remove()\n } catch (e) {\n\n }\n}\n\n/**\n * This builds and returns a table header.\n * @param {string} title - The name of the table.\n * @param {string} subtitle - The subtitle name of the table.\n * @return {JSX.Element}\n * @constructor\n */\nexport const TableHeader = ({ title, subtitle }) => {\n\n return (\n <Grid container>\n <Grid item xs={12}>\n <ListItem dense disableGutters>\n <ListItemText disableTypography\n sx={{\n position: 'relative',\n background: 'linear-gradient(to right, #3A7985, #0f4e5b, #0f4e5b, #3A7985)',\n borderRadius: '4px',\n border: '4px solid #3A7985',\n color: '#fff',\n boxShadow: '0px 2px 1px -1px rgb(0 0 0 / 20%), 0px 1px 1px 0px rgb(0 0 0 / 14%), 0px 1px 3px 0px rgb(0 0 0 / 12%)',\n '&:after, &:before': {\n left: '100%',\n top: '50%',\n border: 'solid transparent',\n content: '\"\"',\n height: 0,\n width: 0,\n position: 'absolute'\n }\n }}\n primary={\n <Typography align=\"center\" variant=\"body1\" noWrap>\n {title}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle1\" noWrap>\n {subtitle}\n </Typography>\n }\n />\n </ListItem>\n </Grid>\n </Grid>\n )\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_HOLDINGS, EDIT_HOLDING, DELETE_HOLDING, ADD_HOLDING, HOLDING_LOADING, HOLDING_FAIL,\n GET_HOLDING_HISTORY, HOLDING_HISTORY_LOADING, HOLDING_HISTORY_FAIL\n} from './types'\nimport { getAccounts } from './accounts'\nimport { getAccountGroups } from './accountGroups'\nimport { tokenConfig } from './auth'\nimport { isInt } from '../components/utilities/numbers'\nimport { ROWS_PER_PAGE_OPTIONS } from '../components/utilities/tables'\n\nconst PROXY = process.env.REACT_APP_PROXY\n\n// Get Holdings\nexport const getHoldings = () => (dispatch, getState) => {\n dispatch({ type: HOLDING_LOADING })\n\n axios.get(`${PROXY}/v1/holdings/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_HOLDINGS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: HOLDING_FAIL })\n })\n}\n\n/**\n * Get Holding History\n * @param {number} id - A holding id to pull the history for.\n * @param {number} [page=0] - The page of results to retrieve. 0 indexed.\n * @param {number} [pageSize] - The page size of results to retrieve.\n * Defaults to ROWS_PER_PAGE_OPTIONS[0].\n * @param {string} [startDate] - The starting date to search.\n * yyyymmdd format.\n * @param {string} [endDate] - The end date to search. yyyymmdd format.\n */\nexport const getHoldingHistory = (id, page, pageSize, startDate, endDate) => (dispatch, getState) => {\n dispatch({ type: HOLDING_HISTORY_LOADING })\n\n if (!isInt(id)) {\n dispatch(returnErrors('Unable to find holding.', 500))\n dispatch({ type: HOLDING_HISTORY_FAIL })\n return false\n }\n\n const pageParam = (page || 0)\n const pageSizeParam = (pageSize || ROWS_PER_PAGE_OPTIONS[0])\n const start = (startDate || '')\n const end = (endDate || '')\n\n\n const header = tokenConfig(getState)\n header.params = {\n id: id,\n p: pageParam,\n ps: pageSizeParam,\n sd: start,\n ed: end\n }\n\n axios.get(`${PROXY}/v1/holding_history/`, header)\n .then(res => {\n dispatch({\n type: GET_HOLDING_HISTORY,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: HOLDING_HISTORY_FAIL })\n })\n}\n\n// Edit Holding\nexport const editHolding = (holding, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n\n axios.put(`${PROXY}/v1/holdings/${holding.id}/`, holding, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateHolding: 'Holding Updated' }))\n dispatch({\n type: EDIT_HOLDING,\n payload: res.data\n })\n dispatch(getAccounts())\n dispatch(getHoldings())\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Delete Holding\nexport const deleteHolding = (id) => (dispatch, getState) => {\n axios.delete(`${PROXY}/v1/holdings/${id}/`, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ deleteHolding: 'Holding Deleted' }))\n dispatch({\n type: DELETE_HOLDING,\n payload: id\n })\n dispatch(getAccounts())\n dispatch(getHoldings())\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Add Holding\nexport const addHolding = (holding, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n\n axios.post(`${PROXY}/v1/holdings/`, holding, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ addHolding: 'Holding Added' }))\n dispatch({\n type: ADD_HOLDING,\n payload: res.data\n })\n dispatch(getAccounts())\n dispatch(getHoldings())\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import axios from 'axios'\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_CATEGORY_BUDGETS, EDIT_CATEGORY_BUDGET, CATEGORY_BUDGET_LOADING,\n CATEGORY_BUDGET_FAIL\n} from './types'\nimport { getAccounts } from './accounts'\nimport { tokenConfig } from './auth'\nimport { getCollections } from './collections'\nimport { getCategories } from './categories'\nimport { getTransactions } from './transactions'\nimport { getHoldings } from './holdings'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Categories Budgets\nexport const getCategoryBudgets = (yearMonth) => (dispatch, getState) => {\n dispatch({ type: CATEGORY_BUDGET_LOADING })\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/category_budgets/?m=${mParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_CATEGORY_BUDGETS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: CATEGORY_BUDGET_FAIL })\n })\n}\n\n/**\n * This function is used to update a category budget.\n * @param {Object} budget - The category budget form.\n * @param {string} yearMonth - The current yearMonth.\n */\nexport const editCategoryBudget = (budget, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.put(`${proxy}/v1/category_budgets/${budget.id}/?m=${mParm}`, budget, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCategoryBudget: 'Budget Updated' }))\n dispatch({\n type: EDIT_CATEGORY_BUDGET,\n payload: res.data\n })\n dispatch(getCategoryBudgets(mParm))\n dispatch(getCollections(mParm))\n dispatch(getAccounts())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n/**\n * This function is used to bulk update category budgets.\n * @param {Object} budget - Data needed to update a bulk list of\n * category budgets.\n * @param {string} yearMonth - The current yearMonth.\n */\nexport const bulkCategoryBudgetUpdate = (budget, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.post(`${proxy}/v1/category_budgets/`, budget, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCategoryBudget: 'Budget Updated' }))\n dispatch({\n type: EDIT_CATEGORY_BUDGET,\n payload: res.data\n })\n dispatch(getCategoryBudgets(mParm))\n dispatch(getCollections(mParm))\n dispatch(getAccounts())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n/**\n * When the user changes the budget month we need to update data.\n * Start with the category budget as collection data is based off it.\n * @param {string} yearMonth - The year and month as a string.\n */\nexport const categoryBudgetMonthChange = (yearMonth) => (dispatch, getState) => {\n dispatch({ type: CATEGORY_BUDGET_LOADING })\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/category_budgets/?m=${mParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_CATEGORY_BUDGETS,\n payload: res.data\n })\n dispatch(getCollections(mParm))\n dispatch(getCategories(mParm))\n dispatch(getTransactions(mParm))\n dispatch(getHoldings())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: CATEGORY_BUDGET_FAIL })\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_CATEGORIES, DELETE_CATEGORY, ADD_CATEGORY, EDIT_CATEGORY,\n REORDER_CATEGORIES, CATEGORY_LOADING, CATEGORY_FAIL,\n} from './types'\nimport { tokenConfig } from './auth'\nimport { getTransactions } from './transactions'\nimport { getCategoryBudgets } from './categoryBudgets'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Categories\nexport const getCategories = (yearMonth) => (dispatch, getState) => {\n dispatch({ type: CATEGORY_LOADING })\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/categories/?m=${mParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_CATEGORIES,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: CATEGORY_FAIL })\n })\n}\n\n// Edit Category\nexport const editCategory = (category, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.put(`${proxy}/v1/categories/${category.id}/`, category, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCategory: 'Categories Updated' }))\n dispatch({\n type: EDIT_CATEGORY,\n payload: res.data\n })\n dispatch(getCategories(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Reorder the Categories\nexport const reorderCategories = (category, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.put(`${proxy}/v1/categories/reorder/${category.id}/`, category, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCategory: 'Categories Updated' }))\n dispatch({\n type: REORDER_CATEGORIES,\n payload: res.data\n })\n dispatch(getCategories(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Delete Category\nexport const deleteCategory = (id, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n\n axios.delete(`${proxy}/v1/categories/${id}/`, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCategory: 'Categories Updated' }))\n dispatch({\n type: DELETE_CATEGORY,\n payload: id\n })\n dispatch(getCategories(mParm))\n dispatch(getTransactions(mParm, fParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Unarchive Category\nexport const unarchiveCategory = (category, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n\n axios.put(`${proxy}/v1/categories/${category.id}/`, category, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateCategory: 'Categories Updated' }))\n dispatch({\n type: EDIT_CATEGORY,\n payload: res.data\n })\n dispatch(getCategories(mParm))\n dispatch(getTransactions(mParm, fParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Add Category\nexport const addCategory = (category, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.post(`${proxy}/v1/categories/`, category, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ addCategory: 'Categories Added' }))\n dispatch({\n type: ADD_CATEGORY,\n payload: res.data\n })\n dispatch(getCategoryBudgets(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n CREATE_LINK_TOKEN, CREATE_LINK_TOKEN_FAIL, DELETE_LINK_TOKEN_SUCCESS,\n CREATE_FIX_TOKEN, CREATE_FIX_TOKEN_FAIL, DELETE_FIX_TOKEN_SUCCESS,\n GET_LINK_ACCOUNTS, LINK_ACCOUNTS_LOADING, LINK_ACCOUNTS_FAIL,\n CREATE_LINK_TRANSACTIONS, GET_LINK_TRANSACTIONS, EDIT_LINK_TRANSACTION,\n LINK_TRANSACTIONS_LOADING, LINK_TRANSACTIONS_FAIL\n} from './types'\n\nimport { tokenConfig } from './auth'\nimport { getAccounts } from './accounts'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Create link token\nexport const createLinkToken = () => (dispatch, getState) => {\n dispatch({ type: DELETE_LINK_TOKEN_SUCCESS })\n axios.post(`${proxy}/v1/link_tokens/`, {}, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: CREATE_LINK_TOKEN,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: CREATE_LINK_TOKEN_FAIL\n })\n })\n}\n\n/**\n * Fix the link token\n */\nexport const fixLinkToken = id => (dispatch, getState) => {\n dispatch({ type: DELETE_FIX_TOKEN_SUCCESS })\n axios.post(`${proxy}/v1/fix_link_tokens/`,\n { 'id': id }, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: CREATE_FIX_TOKEN,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({\n type: CREATE_FIX_TOKEN_FAIL\n })\n })\n}\n\n/**\n * Used to delete the fix token when done with it.\n * @return {function(*): void}\n */\nexport const deleteFixToken = () => (dispatch) => {\n dispatch({ type: DELETE_FIX_TOKEN_SUCCESS })\n}\n\n// Get link accounts.\nexport const getLinkAccounts = () => (dispatch, getState) => {\n dispatch({ type: LINK_ACCOUNTS_LOADING })\n axios.get(`${proxy}/v1/link_accounts/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_LINK_ACCOUNTS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: LINK_ACCOUNTS_FAIL })\n })\n}\n\n/**\n * Delete the link account.\n * @param {Object} linkAccount - The link account.\n * @return {function(*, *=): void}\n */\nexport const deleteLinkAccount = (linkAccount) => (dispatch, getState) => {\n axios.post(`${proxy}/v1/link_accounts/`, linkAccount, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ deleteAccount: 'Link Account Deleted' }))\n dispatch({\n type: LINK_ACCOUNTS_LOADING\n })\n dispatch(getLinkAccounts())\n dispatch(getLinkTransactions())\n dispatch(getAccounts())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Adds the plaid link service for transactions.\nexport const addLinkTransactions = publicToken => (dispatch, getState) => {\n dispatch({ type: LINK_TRANSACTIONS_LOADING })\n axios.post(`${proxy}/v1/plaid_transactions/`,\n { 'public_token': publicToken }, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: CREATE_LINK_TRANSACTIONS,\n payload: res.data\n })\n dispatch(getLinkAccounts())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: LINK_TRANSACTIONS_FAIL })\n })\n}\n\n// Get link transactions.\nexport const getLinkTransactions = () => (dispatch, getState) => {\n dispatch({ type: LINK_TRANSACTIONS_LOADING })\n axios.get(`${proxy}/v1/link_transactions/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_LINK_TRANSACTIONS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: LINK_TRANSACTIONS_FAIL })\n })\n}\n\n/**\n * Refresh link transactions.\n * This function is used to ping plaid to see if more transaction\n * data is available.\n */\nexport const refreshLinkTransactions = id => (dispatch, getState) => {\n dispatch({ type: LINK_TRANSACTIONS_LOADING })\n axios.post(`${proxy}/v1/link_transactions/`,\n { 'id': id }, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ linkAPI: 'Link transactions refreshed.' }))\n dispatch({\n type: LINK_TRANSACTIONS_LOADING,\n payload: res.data\n })\n dispatch(getLinkTransactions())\n dispatch(getLinkAccounts())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: LINK_TRANSACTIONS_FAIL })\n })\n}\n\n// Edit link transactions.\nexport const editLinkTransaction = linkTransaction => (dispatch, getState) => {\n axios.put(`${proxy}/v1/link_transactions/${linkTransaction.id}/`, linkTransaction, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ deleteTransaction: 'Transaction Deleted' }))\n dispatch({\n type: EDIT_LINK_TRANSACTION,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: LINK_TRANSACTIONS_FAIL })\n })\n}\n","import axios from 'axios'\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_PAYEES, EDIT_PAYEES, PAYEE_LOADING, PAYEE_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\nimport { getTransactions } from './transactions'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Payees\nexport const getPayees = () => (dispatch, getState) => {\n dispatch({ type: PAYEE_LOADING })\n axios.get(`${proxy}/v1/payees/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_PAYEES,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: PAYEE_FAIL })\n })\n}\n\n/**\n * This function is used to bulk update payees.\n * @param {Object} payeeForm - Data needed to update a bulk list of\n * payees.\n * @param {string} yearMonth - The year month prop.\n */\nexport const bulkPayeeUpdate = (payeeForm, yearMonth) => (dispatch, getState) => {\n axios.post(`${proxy}/v1/payees/`, payeeForm, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ payee: 'Payees Updated' }))\n dispatch({\n type: EDIT_PAYEES,\n payload: res.data\n })\n dispatch(getPayees())\n dispatch(getTransactions(yearMonth, null))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import axios from 'axios'\nimport { returnErrors } from './messages'\nimport {\n GET_TRANSFERS, TRANSFER_LOADING, TRANSFER_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Transfers\nexport const getTransfers = () => (dispatch, getState) => {\n dispatch({ type: TRANSFER_LOADING })\n axios.get(`${proxy}/v1/transfers/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_TRANSFERS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: TRANSFER_FAIL })\n })\n}\n","import axios from 'axios'\nimport { returnErrors } from './messages'\nimport {\n GET_SPLITS, SPLIT_LOADING, SPLIT_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Splits\nexport const getSplits = () => (dispatch, getState) => {\n dispatch({ type: SPLIT_LOADING })\n axios.get(`${proxy}/v1/splits/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_SPLITS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: SPLIT_FAIL })\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_TRANSACTIONS, EDIT_TRANSACTION, DELETE_TRANSACTION, ADD_TRANSACTION,\n TRANSACTION_LOADING, TRANSACTION_FAIL\n} from './types'\nimport { getAccounts } from './accounts'\nimport { getCategories } from './categories'\nimport { getCategoryBudgets } from './categoryBudgets'\nimport { getLinkTransactions } from './link'\nimport { getPayees } from './payees'\nimport { getTransfers } from './transfers'\nimport { getSplits } from './splits'\nimport { getAccountGroups } from './accountGroups'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Transactions\nexport const getTransactions = (yearMonth, filter) => (dispatch, getState) => {\n dispatch({ type: TRANSACTION_LOADING })\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/transactions/?m=${mParm}&f=${fParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_TRANSACTIONS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: TRANSACTION_FAIL })\n })\n}\n\n// Edit Transaction\nexport const editTransaction = (transaction, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n axios.put(`${proxy}/v1/transactions/${transaction.id}/`, transaction, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateTransaction: 'Transaction Updated' }))\n dispatch({\n type: EDIT_TRANSACTION,\n payload: res.data\n })\n dispatch(getTransactions(mParm, fParm))\n dispatch(getAccounts())\n dispatch(getCategories(mParm))\n dispatch(getCategoryBudgets(mParm))\n dispatch(getLinkTransactions())\n dispatch(getPayees())\n dispatch(getTransfers())\n dispatch(getSplits())\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Delete Transaction\nexport const deleteTransaction = (id, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n axios.delete(`${proxy}/v1/transactions/${id}/`, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ deleteTransaction: 'Transaction Deleted' }))\n dispatch({\n type: DELETE_TRANSACTION,\n payload: id\n })\n dispatch(getAccounts())\n dispatch(getCategories(mParm))\n dispatch(getCategoryBudgets(mParm))\n dispatch(getLinkTransactions())\n dispatch(getTransactions(mParm, fParm))\n dispatch(getPayees())\n dispatch(getTransfers())\n dispatch(getSplits())\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n/**\n * Add a transaction\n * @param transaction - The transaction form body to add.\n * @param yearMonth (optional) - If you want to add a yearMonth to fetching\n * @param filter (optional) - If you want to add a filter to fetching\n * categories and transactions on a successful transaction add.\n * @returns dispatch ADD_TRANSACTION reducer. Re-fetch Accounts,\n * Categories, and Transactions.\n */\nexport const addTransaction = (transaction, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n axios.post(`${proxy}/v1/transactions/`, transaction, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ addTransaction: 'Transaction Added' }))\n dispatch({\n type: ADD_TRANSACTION,\n payload: res.data\n })\n dispatch(getAccounts())\n dispatch(getCategories(mParm))\n dispatch(getCategoryBudgets(mParm))\n dispatch(getLinkTransactions())\n dispatch(getTransactions(mParm, fParm))\n dispatch(getPayees())\n dispatch(getTransfers())\n dispatch(getSplits())\n dispatch(getAccountGroups())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_SECURITIES, EDIT_SECURITY, DELETE_SECURITY, ADD_SECURITY, SECURITY_LOADING, SECURITY_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Securities\nexport const getSecurities = (yearMonth) => (dispatch, getState) => {\n dispatch({ type: SECURITY_LOADING })\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/securities/?m=${mParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_SECURITIES,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: SECURITY_FAIL })\n })\n}\n\n// Edit Security\nexport const editSecurity = (security) => (dispatch, getState) => {\n axios.put(`${proxy}/v1/securities/${security.id}/`, security, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateSecurity: 'Security Updated' }))\n dispatch({\n type: EDIT_SECURITY,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Delete Security\nexport const deleteSecurity = (id) => (dispatch, getState) => {\n axios.delete(`${proxy}/v1/securities/${id}/`, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ deleteSecurity: 'Security Deleted' }))\n dispatch({\n type: DELETE_SECURITY,\n payload: id\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Add Security\nexport const addSecurity = (security) => (dispatch, getState) => {\n axios.post(`${proxy}/v1/securities/`, security, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ addSecurity: 'Security Added' }))\n dispatch({\n type: ADD_SECURITY,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import axios from 'axios'\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_ACCOUNTS, EDIT_ACCOUNT, DELETE_ACCOUNT, ADD_ACCOUNT, REORDER_ACCOUNTS,\n ACCOUNT_LOADING, ACCOUNT_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\nimport { getTransactions } from './transactions'\nimport { getLinkTransactions } from './link'\nimport { getPayees } from './payees'\nimport { getAccountGroups } from './accountGroups'\nimport { getCategories } from './categories'\nimport { getHoldings } from './holdings'\nimport { getSecurities } from './securities'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get Accounts\nexport const getAccounts = () => (dispatch, getState) => {\n dispatch({ type: ACCOUNT_LOADING })\n axios.get(`${proxy}/v1/accounts/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_ACCOUNTS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: ACCOUNT_FAIL })\n })\n}\n\n// Edit Account\nexport const editAccount = (account, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n\n axios.put(`${proxy}/v1/accounts/${account.id}/`, account, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateAccount: 'Account Updated' }))\n dispatch({\n type: EDIT_ACCOUNT,\n payload: res.data\n })\n dispatch(getAccounts())\n dispatch(getTransactions(mParm, fParm))\n dispatch(getLinkTransactions())\n dispatch(getPayees())\n dispatch(getAccountGroups())\n dispatch(getCategories(mParm))\n dispatch(getHoldings())\n dispatch(getSecurities(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Reorder the accounts\nexport const reorderAccounts = (account) => (dispatch, getState) => {\n axios.put(`${proxy}/v1/accounts/reorder/${account.id}/`, account, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateAccount: 'Accounts Updated' }))\n dispatch({\n type: REORDER_ACCOUNTS,\n payload: res.data\n })\n dispatch(getAccounts())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Delete Account\nexport const deleteAccount = (id, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n\n axios.delete(`${proxy}/v1/accounts/${id}/`, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateAccount: 'Account Updated' }))\n dispatch({\n type: DELETE_ACCOUNT,\n payload: id\n })\n dispatch(getAccounts())\n dispatch(getTransactions(mParm, fParm))\n dispatch(getLinkTransactions())\n dispatch(getPayees())\n dispatch(getAccountGroups())\n dispatch(getHoldings())\n dispatch(getSecurities(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Unarchive Account\nexport const unarchiveAccount = (account, yearMonth, filter) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n let fParm = (typeof filter === 'undefined' || filter == null) ? '' : filter\n\n axios.put(`${proxy}/v1/accounts/${account.id}/`, account, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateAccount: 'Account Updated' }))\n dispatch({\n type: EDIT_ACCOUNT,\n payload: res.data\n })\n dispatch(getAccounts())\n dispatch(getTransactions(mParm, fParm))\n dispatch(getLinkTransactions())\n dispatch(getPayees())\n dispatch(getAccountGroups())\n dispatch(getHoldings())\n dispatch(getSecurities(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n\n// Add Account\nexport const addAccount = (account, yearMonth) => (dispatch, getState) => {\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.post(`${proxy}/v1/accounts/`, account, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ addAccount: 'Account Added' }))\n dispatch({\n type: ADD_ACCOUNT,\n payload: res.data\n })\n dispatch(getAccounts())\n dispatch(getAccountGroups())\n dispatch(getCategories(mParm))\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport arrayMove from 'array-move'\n\nimport { sharedStyles } from '../common/styles'\nimport { SortContainer } from '../common/SortContainer'\nimport { SortableAccounts } from './SortAccounts'\nimport { editAccountId } from '../../actions/accountId'\nimport { editAccountKey } from '../../actions/accountKey'\nimport { reorderAccounts } from '../../actions/accounts'\n\nconst styles = theme => ({\n ...sharedStyles(theme)\n})\n\nclass Accounts extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n deriveProps: true,\n accounts: this.props.accounts\n }\n\n this.accountClick = this.accountClick.bind(this)\n }\n\n /**\n * Update the edit account id. The edit account id is used to\n * decide whether to display the edit account form and which\n * account is trying to be edited.\n * @param {number} id - The edit account id to set.\n */\n accountClick = id => this.props.editAccountId(id)\n\n onSortEnd = ({ oldIndex, newIndex }) => {\n try {\n const { accounts, reorderAccounts } = this.props\n\n let oldPositionElement = accounts[oldIndex]\n let newPositionElement = accounts[newIndex]\n if (oldPositionElement !== newPositionElement) {\n this.setState({\n deriveProps: false, // Temporarily stop props affecting state\n accounts: arrayMove(accounts, oldIndex, newIndex),\n })\n oldPositionElement.new_index = newIndex\n reorderAccounts(oldPositionElement)\n\n // After a very short wait, allow props to affect state again\n setTimeout(() => {\n this.setState(() => ({\n deriveProps: true,\n }))\n }, 3000)\n }\n } catch (e) {\n // TODO: dispatch error\n }\n }\n\n /**\n * Update state with prop changes, except for a brief period after\n * the order has changed, to stop flickering from happening\n * @param props\n * @param state\n * @returns {{accounts: *}|null}\n */\n static getDerivedStateFromProps(props, state) {\n if (state.deriveProps) {\n return {\n accounts: props.accounts,\n }\n }\n return null\n }\n\n render() {\n const { classes, linkAccounts, linkTransactions, group } = this.props\n const { accounts } = this.state\n\n return (\n <SortContainer onSortEnd={this.onSortEnd} useDragHandle className={classes.p0}>\n {accounts.map((account, index) => {\n const linkAccount = linkAccounts.find((link) => account.link_id === link.id)\n const count = linkTransactions.filter(t => linkAccount && !t.pending && linkAccount.id === t.account_id).length\n const groupId = account && account.group_id ? account.group_id : null\n const archived = account.archived\n return !archived && (groupId === group.group_id)\n ? (\n <SortableAccounts\n key={`sortable-account-${account.id}`}\n index={index}\n accountClick={this.accountClick}\n account={account}\n linkAccount={linkAccount}\n count={count}\n classes={classes}\n />\n )\n : null\n })}\n </SortContainer>\n )\n }\n}\n\nAccounts.propTypes = {\n editAccountId: PropTypes.func.isRequired,\n editAccountKey: PropTypes.func.isRequired,\n reorderAccounts: PropTypes.func.isRequired,\n accounts: PropTypes.array.isRequired,\n group: PropTypes.object.isRequired,\n linkAccounts: PropTypes.array.isRequired,\n linkTransactions: PropTypes.array.isRequired\n}\n\nconst mapStateToProps = state => ({\n linkTransactions: state.linkReducer.linkTransactions\n})\n\nconst mapDispatchToProps = {\n editAccountId,\n editAccountKey,\n reorderAccounts,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(Accounts))\n","import React from 'react'\nimport { SortableElement } from 'react-sortable-hoc'\nimport {\n ListItem, ListItemButton, ListItemIcon, IconButton, ListItemText, Typography,\n Accordion, AccordionSummary, AccordionDetails, Grid\n} from '@mui/material'\nimport { ExpandMore, AccountBalance } from '@mui/icons-material'\n\nimport { DragHandle } from '../common/DragHandle'\nimport Accounts from '../account/Accounts'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nexport const SortableAccountGroups = SortableElement(\n ({\n group, index, accounts, linkAccounts, count, handleGroupClick, openAccountForm, classes\n }) => {\n\n return (\n <Accordion key={`accountGroup-${group.id}`}\n expanded={group.opened}\n square\n onChange={() => handleGroupClick(group)}\n className={`${classes.topIndex} ${classes.dragHandleParent} `}\n >\n\n <AccordionSummary expandIcon={<ExpandMore fontSize=\"small\" style={{ color: '#FFF' }} />}>\n <ListItem dense className={` ${classes.p0} `}>\n\n <IconButton aria-label=\"drag\" className={classes.dragHandleButton} size=\"small\" color=\"inherit\">\n <DragHandle classes={classes} />\n </IconButton>\n\n <ListItemText\n primary={\n <Typography variant=\"body2\" align=\"left\" noWrap={true}>\n {group.name}\n </Typography>\n }\n secondary={\n <Typography variant=\"body2\" align=\"left\" noWrap={true}>\n {formatMoneyLabel(group.group_total)}\n </Typography>\n }\n />\n </ListItem>\n\n {count && count > 0\n ? <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n className={classes.notificationIconContainer}\n >\n <Grid item className={classes.notificationIcon} />\n </Grid>\n : null\n }\n\n </AccordionSummary>\n\n <AccordionDetails>\n {group.count && group.count > 0\n ? <Accounts\n group={group}\n accounts={accounts}\n linkAccounts={linkAccounts}\n />\n : (\n <ListItem dense alignItems=\"center\" className={classes.p0}>\n <ListItemButton dense sx={{ justifyContent: 'center' }} onClick={openAccountForm}>\n <ListItemIcon sx={{ justifyContent: 'center' }}>\n <AccountBalance fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary=\"Add Account\" />\n </ListItemButton>\n </ListItem>\n )\n }\n </AccordionDetails>\n\n </Accordion>\n )\n }\n)\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport arrayMove from 'array-move'\nimport { Box, List, ListItem, ListItemText, Typography } from '@mui/material'\n\nimport { sharedStyles } from '../common/styles'\nimport { SortContainer } from '../common/SortContainer'\nimport { SortableAccountGroups } from './SortAccountGroups'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { editAccountId } from '../../actions/accountId'\nimport { editAccountGroups, reorderAccountGroups } from '../../actions/accountGroups'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n notificationIconContainer: {\n width: 8\n },\n notificationIcon: {\n backgroundColor: theme.palette.accent.main,\n height: 8,\n width: 8,\n borderRadius: 100,\n },\n})\n\nclass AccountGroups extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n deriveProps: true,\n accountGroups: this.props.accountGroups,\n }\n\n this.openAccountForm = this.openAccountForm.bind(this)\n this.handleGroupClick = this.handleGroupClick.bind(this)\n }\n\n /**\n * Open the new account form.\n */\n openAccountForm = () => this.props.editAccountId(0)\n\n /**\n * Handles collapsing and opening the account groups.\n * @param {Object} group - The account group.\n */\n handleGroupClick = group => {\n group['opened'] = group ? !group.opened : false\n\n this.props.editAccountGroups(group)\n }\n\n onSortEnd = ({ oldIndex, newIndex }) => {\n try {\n const { accountGroups, reorderAccountGroups } = this.props\n\n let oldPositionElement = accountGroups[oldIndex]\n let newPositionElement = accountGroups[newIndex]\n if (oldPositionElement !== newPositionElement) {\n this.setState({\n deriveProps: false, // Temporarily stop props affecting state\n accountGroups: arrayMove(accountGroups, oldIndex, newIndex),\n })\n oldPositionElement.new_index = newIndex\n reorderAccountGroups(oldPositionElement)\n\n // After a very short wait, allow props to affect state again\n setTimeout(() => {\n this.setState(() => ({\n deriveProps: true,\n }))\n }, 3000)\n }\n } catch (e) {\n // TODO: dispatch error\n }\n }\n\n // Update state with prop changes, except for a brief period after the order has changed,\n // to stop flickering from happening\n static getDerivedStateFromProps(props, state) {\n if (state.deriveProps) {\n return {\n accountGroups: props.accountGroups,\n }\n }\n return null\n }\n\n render() {\n const { classes, accounts, linkAccounts, linkTransactions } = this.props\n const { accountGroups } = this.state\n const totalAvailable = (accounts && accounts[0]) ? accounts[0].total_available : 0\n\n return (\n <Fragment>\n <Box mb={3}>\n\n <List dense>\n <ListItem dense>\n <ListItemText primary={\n <Typography variant=\"body2\" align=\"left\" noWrap={true}>\n Total\n </Typography>\n } />\n <ListItemText primary={\n <Typography variant=\"body2\" align=\"right\" noWrap={true}>\n {formatMoneyLabel(totalAvailable)}\n </Typography>\n } />\n </ListItem>\n </List>\n\n <SortContainer onSortEnd={this.onSortEnd} useDragHandle className={classes.p0}>\n {accountGroups.map((group, index) => {\n const accountLinkIds = accounts.filter((account) => account.group_id === group.group_id).map(a => a.link_id)\n const linkAccount = linkAccounts.filter((link) => accountLinkIds.includes(link.id)).map(l => l.id)\n const count = linkTransactions.filter(t => !t.pending && linkAccount.includes(t.account_id)).length\n return (\n <SortableAccountGroups key={group.id}\n index={index}\n group={group}\n accounts={accounts}\n linkAccounts={linkAccounts}\n count={count}\n handleGroupClick={this.handleGroupClick}\n openAccountForm={this.openAccountForm}\n classes={classes}\n />\n )\n })}\n </SortContainer>\n\n </Box>\n </Fragment>\n )\n }\n}\n\nAccountGroups.propTypes = {\n editAccountId: PropTypes.func.isRequired,\n accountGroups: PropTypes.array.isRequired,\n accounts: PropTypes.array.isRequired,\n linkAccounts: PropTypes.array.isRequired,\n linkTransactions: PropTypes.array.isRequired,\n editAccountGroups: PropTypes.func.isRequired,\n reorderAccountGroups: PropTypes.func.isRequired,\n}\n\nconst mapStateToProps = state => ({\n accountGroups: state.accountGroupReducer.accountGroups,\n accounts: state.accountReducer.accounts,\n linkAccounts: state.linkReducer.linkAccounts,\n linkTransactions: state.linkReducer.linkTransactions\n})\n\nconst mapDispatchToProps = {\n editAccountId,\n editAccountGroups,\n reorderAccountGroups,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(AccountGroups))\n","import React, { forwardRef } from 'react'\nimport { List, ListItem, ListItemText, Typography, Hidden } from '@mui/material'\n\nconst MonthPickerInput = (props, ref) => {\n const { onClick, value, dwp } = props\n\n return (\n <List disablePadding onClick={onClick}>\n <ListItem button dense disableGutters>\n <ListItemText\n primary={<Typography align=\"center\" variant=\"h6\" noWrap>\n {value}\n </Typography>}\n secondary={<Typography align=\"center\" variant=\"subtitle2\" noWrap>\n <Hidden smUp>\n DWP: \n </Hidden>\n <Hidden smDown>\n Days without paycheck: \n </Hidden>\n {dwp > 0 ? dwp : '???'}\n </Typography>} />\n </ListItem>\n </List>\n )\n}\n\nexport default forwardRef(MonthPickerInput)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { DateTime } from 'luxon'\nimport DatePicker from 'react-datepicker'\nimport 'react-datepicker/dist/react-datepicker.css'\n\nimport MonthPickerInput from '../common/MonthPickerInput'\nimport { categoryBudgetMonthChange } from '../../actions/categoryBudgets'\nimport { editBudgetMonth } from '../../actions/budgetMonth'\n\nclass MonthPicker extends Component {\n constructor(props) {\n super(props)\n\n this.handleChange = this.handleChange.bind(this)\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { yearMonth, categoryBudgetMonthChange } = this.props\n\n if (yearMonth !== prevProps.yearMonth) categoryBudgetMonthChange(yearMonth)\n }\n\n handleChange = date => this.props.editBudgetMonth(`${date.getFullYear()}${date.getMonth() + 1}`)\n\n render() {\n const { yearMonth, categoryBudgets, accounts } = this.props\n // Get the current budget date\n let budgetYear = yearMonth.substring(0, 4)\n let budgetMonth = yearMonth.substring(4, 6)\n const budgetDate = new Date(budgetYear, budgetMonth - 1, 1, 0, 0, 0)\n const dwp = (accounts && accounts[0]) ? accounts[0].dwp : 0\n\n\n // Get the min and max allowed dates to budget\n let budgetDateRange = categoryBudgets\n let budgetDateMin = DateTime.local().toJSDate()\n let budgetDateMax = DateTime.local().toJSDate()\n if (typeof budgetDateRange !== 'undefined' && budgetDateRange != null) budgetDateRange = categoryBudgets[0]\n if (typeof budgetDateRange !== 'undefined' && budgetDateRange != null) {\n const min = budgetDateRange['budget_month_min']\n const max = budgetDateRange['budget_month_max']\n if (typeof min !== 'undefined' && min != null) budgetDateMin = DateTime.fromISO(min).toJSDate()\n if (typeof max !== 'undefined' && max != null) budgetDateMax = DateTime.fromISO(max).toJSDate()\n }\n\n return (\n <DatePicker selected={budgetDate}\n todayButton=\"Current Month\"\n onChange={this.handleChange}\n minDate={budgetDateMin}\n maxDate={budgetDateMax}\n dateFormat=\"MMMM yyyy\"\n showMonthYearPicker\n customInput={<MonthPickerInput dwp={dwp} />}\n />\n )\n }\n}\n\nMonthPicker.propTypes = {\n editBudgetMonth: PropTypes.func.isRequired,\n categoryBudgetMonthChange: PropTypes.func.isRequired,\n yearMonth: PropTypes.string.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n accounts: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n yearMonth: state.budgetMonthReducer.yearMonth,\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n accounts: state.accountReducer.accounts,\n})\n\nconst mapDispatchToProps = {\n categoryBudgetMonthChange,\n editBudgetMonth\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MonthPicker)\n","import { GET_BUDGET_MONTH, EDIT_BUDGET_MONTH } from './types'\n\n// Get budget month\nexport const getBudgetMonth = () => (dispatch, getState) => {\n dispatch({\n type: GET_BUDGET_MONTH,\n payload: getState\n })\n}\n\n// Edit budget month\nexport const editBudgetMonth = (yearMonth) => (dispatch, getState) => {\n dispatch({\n type: EDIT_BUDGET_MONTH,\n payload: yearMonth\n })\n}","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport numeral from 'numeral'\nimport { Box, Typography, Grid } from '@mui/material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass HeaderSummary extends Component {\n\n\n render() {\n const { classes, categoryBudgets, transactions } = this.props\n\n let totalInflow = (transactions && transactions[0]) ? transactions[0].total_inflow : 0\n let goal = numeral(0)\n let budgeted = numeral(0)\n let overspent = numeral(0)\n let fund = numeral(0)\n\n // Sum budgeted, goal, and overspent\n for (const budget of categoryBudgets) {\n goal.add(budget.goal)\n budgeted.add(budget.budgeted)\n if (budget.balance < 0) overspent.add(budget.balance)\n if (budget.goal > budget.budgeted) {\n const fundShort = numeral(budget.goal).subtract(budget.budgeted)\n fund.add(fundShort.value())\n }\n }\n\n goal = goal.value()\n budgeted = budgeted.value()\n overspent = overspent.value()\n fund = fund.value()\n\n const overspentColor = overspent < 0 ? classes.budgetError : null\n\n return (\n <Box marginY={0.5}>\n <Grid container>\n <Grid item xs={12}>\n <Typography align=\"center\" variant=\"subtitle2\" noWrap\n title={formatMoneyLabel(totalInflow)}\n >\n Inflow: {formatMoneyLabel(totalInflow)}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography align=\"center\" variant=\"subtitle2\" noWrap\n title={formatMoneyLabel(fund)}\n >\n Fund Short: {formatMoneyLabel(fund)}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography align=\"center\" variant=\"subtitle2\" noWrap className={overspentColor}\n title={formatMoneyLabel(overspent)}\n >\n Overspent: {formatMoneyLabel(overspent)}\n </Typography>\n </Grid>\n </Grid>\n </Box>\n )\n }\n}\n\nHeaderSummary.propTypes = {\n categoryBudgets: PropTypes.array.isRequired,\n transactions: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n transactions: state.transactionReducer.transactions,\n})\n\nconst mapDispatchToProps = {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(HeaderSummary))\n","import React from 'react'\nimport { Paper } from '@mui/material'\nimport Draggable from 'react-draggable'\n\nfunction DraggableDialogWrapper(props) {\n return (\n <Draggable handle=\".MuiDialogTitle-root\">\n <Paper {...props} />\n </Draggable>\n )\n}\n\nexport default DraggableDialogWrapper\n","import React from 'react'\nimport { Slide } from '@mui/material'\n\n/**\n * Used to determine if the popup dialog should be fullscreen.\n * @param {theme} theme - The application theme.\n * @returns {boolean}\n */\nexport const fullScreen = theme => {\n try {\n const windowWidth = window.innerWidth\n return theme.breakpoints.values.sm >= windowWidth\n } catch (e) {\n return false\n }\n}\n\n/**\n * Used to return the transition styling component for popup dialogs.\n * @return {Component} Slide - The slide up component.\n */\nexport const Transition = React.forwardRef(function Transition(props, ref) {\n return <Slide direction=\"up\" ref={ref} {...props} />\n})\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle, Grid,\n ListItem, ListItemText\n} from '@mui/material'\nimport { Save, Cancel, DoneAll } from '@mui/icons-material'\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { editCategoryBudget } from '../../actions/categoryBudgets'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { moneyInput, formatMoney, formatMoneyLabel } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst filter = createFilterOptions()\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass MoveBudgetForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n amount: { error: null, helperText: '', },\n category: { error: null, helperText: '', },\n },\n filteredCategories: [],\n amount: '',\n categoryBudgetId: 0,\n categoryBudgetBudgeted: 0,\n category: { id: 0, name: '' },\n }\n\n this.handleCategoryBudgetUpdate = this.handleCategoryBudgetUpdate.bind(this)\n this.handleCategoryOptions = this.handleCategoryOptions.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.handleBudgetAll = this.handleBudgetAll.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleCategoryChange = this.handleCategoryChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n }\n\n componentDidMount() {\n this.handleCategoryOptions()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { category } = this.state\n const { categories, categoryBudgets } = this.props\n\n // Filter out budget from category options.\n if ((categoryBudgets !== prevProps.categoryBudgets) ||\n (categories !== prevProps.categories)) {\n this.handleCategoryOptions()\n }\n\n // Get the category budget for this category.\n if (category !== prevState.category) {\n this.handleCategoryBudgetUpdate()\n }\n }\n\n /**\n * Set the selected category budget information.\n */\n handleCategoryBudgetUpdate = () => {\n const { category } = this.state\n const { categoryBudgets } = this.props\n\n for (const categoryBudget of categoryBudgets) {\n if (category && category.id === categoryBudget.category_id) {\n this.setState({\n categoryBudgetId: categoryBudget.id,\n categoryBudgetBudgeted: categoryBudget.budgeted\n })\n // End loop\n break\n }\n }\n }\n\n /**\n * Populates the category options for the dropdown.\n */\n handleCategoryOptions = () => {\n const { classes, categories, categoryBudgets } = this.props\n let filteredCategories = []\n\n for (const c of categories) {\n for (const cb of categoryBudgets) {\n if (c.id === cb.category_id) {\n if (!c.archived) {\n const balance = cb.balance ? formatMoneyLabel(cb.balance) : '$0.00'\n const styles = cb.balance >= 0 ? classes.dropdownListItem : classes.dropdownListItemError\n const name = c.name ? c.name.toLowerCase().trim() : null\n\n if (name !== 'budget' && name !== 'split') {\n const label = `${c.name}: ${balance}`\n\n filteredCategories.push({\n id: c.id,\n name: c.name,\n balance: balance,\n label: label,\n styles: styles\n })\n }\n // End inner loop\n break\n }\n }\n }\n }\n\n this.setState({ filteredCategories })\n }\n\n /**\n * Used to clear the form and close the dialog.\n */\n clearForm = () => {\n this.setState({\n amount: '',\n categoryBudgetId: 0,\n categoryBudgetBudgeted: 0,\n category: { id: 0, name: '' },\n })\n\n this.props.closeBudgetForm()\n }\n\n /**\n * Applies the total amount available to budget to the amount input\n * field.\n */\n handleBudgetAll = () => {\n const { accounts } = this.props\n const needToBudget = (accounts && accounts[0] && accounts[0].need_to_budget) ? accounts[0].need_to_budget : 0\n\n if (needToBudget > 0) {\n this.setState({ amount: needToBudget })\n } else {\n this.props.returnErrors({ updateCategoryBudget: 'No available dollars to apply.' }, 500)\n }\n }\n\n handleInputChange = e => {\n if (moneyInput(e.target.value)) {\n this.setState({ [e.target.name]: e.target.value })\n }\n }\n\n handleCategoryChange = (e, values, reason) => {\n if (reason === 'clear') {\n this.setState({ category: { id: 0, name: '' } })\n } else if (values) {\n this.setState({ category: values })\n }\n }\n\n /**\n * Submit the budget form\n * @param {Object} e - The event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n try {\n const { amount, categoryBudgetId, categoryBudgetBudgeted, category } = this.state\n const { yearMonth, editCategoryBudget } = this.props\n const { user } = this.props.auth\n let budgetYear = yearMonth.substring(0, 4)\n let budgetMonth = yearMonth.substring(4, 6)\n let budgetDate = `${budgetYear}-${budgetMonth}-01`\n const netAmount = Math.abs(amount)\n let newBudgeted = netAmount + categoryBudgetBudgeted\n newBudgeted = formatMoney(newBudgeted)\n\n // Edit Budget\n const budget = {\n id: categoryBudgetId,\n budgeted: newBudgeted,\n category_id: category.id,\n user_id: user.id,\n date: budgetDate\n }\n\n editCategoryBudget(budget, yearMonth)\n this.clearForm()\n } catch (e) {\n this.props.returnErrors({ updateCategoryBudget: 'Unable to move money at this time. Please try again later.' }, 500)\n }\n }\n\n render() {\n const { error, filteredCategories, amount, category } = this.state\n const { classes, theme, open } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"move-budget-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n\n <DialogTitle className={classes.moveCursor}>\n Move Budget Money to Category\n\n <Button fullWidth color=\"primary\" variant=\"text\"\n aria-label=\"Apply all available dollars to the category.\"\n onClick={this.handleBudgetAll}\n sx={{ textTransform: 'capitalize' }}\n ><DoneAll fontSize=\"small\" /> Budget All\n </Button>\n </DialogTitle>\n\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={12}>\n <TextField required\n name=\"amount\"\n value={amount}\n autoFocus\n onChange={this.handleInputChange}\n error={error.amount.error}\n helperText={error.amount.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"transactionAmount\"\n label=\"Amount\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={12}>\n <Autocomplete\n name=\"category\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={category}\n options={filteredCategories}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => {\n if (option.inputValue) return option.inputValue\n else if (option.label) return option.label\n else return option.name\n }}\n onChange={this.handleCategoryChange}\n filterOptions={(options, params) => filter(options, params)}\n renderOption={(props, option) => (\n <ListItem key={option.id} {...props}>\n <ListItemText align=\"left\" primary={option.name} />\n <ListItemText align=\"right\" className={option.styles} primary={option.balance} />\n </ListItem>\n )}\n renderInput={(params) => (\n <TextField required\n error={error.category.error}\n helperText={error.category.helperText}\n margin=\"dense\"\n label=\"To Category\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={() => this.clearForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nMoveBudgetForm.propTypes = {\n open: PropTypes.bool.isRequired,\n closeBudgetForm: PropTypes.func.isRequired,\n yearMonth: PropTypes.string.isRequired,\n auth: PropTypes.object.isRequired,\n accounts: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n editCategoryBudget: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n accounts: state.accountReducer.accounts,\n categories: state.categoryReducer.categories,\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n})\n\nconst mapDispatchToProps = {\n editCategoryBudget,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(MoveBudgetForm))\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport {\n Container, Box, Typography, Toolbar, AppBar, Divider, Drawer, Hidden,\n IconButton, Grid, List, ListItem, ListItemIcon, ListItemText\n} from '@mui/material'\nimport {\n Menu,\n BarChart,\n Explore,\n MapOutlined,\n AccountBalance,\n EventRepeat,\n ManageSearch,\n Insights\n} from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport HeaderLoading from '../loading/HeaderLoading'\nimport ProfileMenu from './navigation/ProfileMenu'\nimport AccountGroups from '../accountGroups/AccountGroups'\nimport MonthPicker from '../layout/MonthPicker'\nimport HeaderSummary from './HeaderSummary'\nimport MoveBudgetForm from './MoveBudgetForm'\nimport { editAccountKey } from '../../actions/accountKey'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n drawerContainer: {\n marginBottom: theme.spacing(10)\n },\n appTitle: {\n fontFamily: 'Yellowtail, Roboto, Helvetica, Arial, sans-serif',\n color: theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.text.primary\n },\n selected: {\n color: theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.secondary.light,\n fontWeight: theme.typography.fontWeightBold,\n marginLeft: '-3px'\n },\n selectedAnchor: {\n borderLeft: '3px solid',\n borderColor: theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.secondary.light\n },\n beta: {\n color: theme.palette.accent.main,\n fontWeight: theme.typography.fontWeightRegular,\n float: 'right'\n }\n}))\n\nconst Header = (props) => {\n const { children, isAuthenticated, user, accounts } = withPropsValidation(\n useSelector(({ authReducer, accountReducer }) => ({\n isAuthenticated: authReducer.isAuthenticated,\n user: authReducer.user,\n accounts: accountReducer.accounts,\n children: props.children\n })))\n\n const [open, setOpen] = useState(false)\n const [budgetDialogOpen, setBudgetDialogOpen] = useState(false)\n const [needToBudget, setNeedToBudget] = useState(0)\n const [needToBudgetColor, setNeedToBudgetColor] = useState(null)\n\n const { pathname } = useLocation()\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Sets the need to budget amount and color.\n */\n useEffect(() => {\n const needToBudget = (accounts && accounts[0] && accounts[0].need_to_budget) ? accounts[0].need_to_budget : 0\n const needToBudgetColor = needToBudget >= 0 ? null : classes.budgetError\n\n setNeedToBudget(needToBudget)\n setNeedToBudgetColor(needToBudgetColor)\n }, [accounts])\n\n /**\n * This function handles when the accounts tab is clicked.\n * @param {number} id - 0 to show all.\n */\n const accountDetailClick = id => editAccountKey(id)\n\n /**\n * Handles opening and closing the navigation side drawer on smaller\n * screens.\n */\n const handleDrawerToggle = () => setOpen(!open)\n\n /**\n * Opens and closes the move budget money dialog\n */\n const handleBudgetDialogToggle = () => setBudgetDialogOpen(!budgetDialogOpen)\n\n const drawer = (\n <div className={classes.drawerContainer}>\n\n <List style={{\n paddingBottom: 0,\n }} align=\"center\">\n <img alt=\"Ploutos Budget logo\" height={40} src=\"/static/ploutos.svg\" />\n </List>\n\n <List>\n\n <ProfileMenu user={user} />\n\n <ListItem button key=\"Dashboard\" to=\"/dashboard\" component={Link}\n className={pathname === '/dashboard' || pathname === '/' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <Explore className={pathname === '/dashboard' || pathname === '/' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap\n className={pathname === '/dashboard' || pathname === '/' ? classes.selected : null}\n >\n Dashboard\n </Typography>\n } />\n </ListItem>\n\n <ListItem button key=\"Budget\" to=\"/budget\" component={Link}\n className={pathname === '/budget' ? classes.selectedAnchor : null}\n >\n <ListItemIcon><MapOutlined className={pathname === '/budget' ? classes.selected : null} /></ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap className={pathname === '/budget' ? classes.selected : null}>\n Budget\n </Typography>\n } />\n </ListItem>\n\n <ListItem button key=\"Recurring\" to=\"/recurring\" component={Link}\n className={pathname === '/recurring' ? classes.selectedAnchor : null}\n >\n <ListItemIcon>\n <EventRepeat className={pathname === '/recurring' ? classes.selected : null} />\n </ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap className={pathname === '/recurring' ? classes.selected : null}>\n Recurring\n {/*<i className={classes.beta}>Beta</i>*/}\n </Typography>\n } />\n </ListItem>\n\n <ListItem button key=\"Reports\" to=\"/reports\" component={Link}\n className={pathname === '/reports' ? classes.selectedAnchor : null}\n >\n <ListItemIcon><BarChart className={pathname === '/reports' ? classes.selected : null} /></ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap className={pathname === '/reports' ? classes.selected : null}>\n Reports\n </Typography>\n } />\n </ListItem>\n\n <ListItem button key=\"History\" to=\"/history\" component={Link}\n className={pathname === '/history' ? classes.selectedAnchor : null}\n >\n <ListItemIcon><ManageSearch className={pathname === '/history' ? classes.selected : null} /></ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap className={pathname === '/history' ? classes.selected : null}>\n History\n </Typography>\n } />\n </ListItem>\n\n <ListItem button key=\"Account\" to=\"/accounts\" component={Link}\n onClick={() => accountDetailClick(0)}\n className={pathname === '/accounts' ? classes.selectedAnchor : null}\n >\n <ListItemIcon><AccountBalance\n className={pathname === '/accounts' ? classes.selected : null} /></ListItemIcon>\n <ListItemText primary={\n <Typography variant=\"subtitle2\" noWrap className={pathname === '/accounts' ? classes.selected : null}>\n Accounts\n </Typography>\n } />\n </ListItem>\n\n {/*<ListItem button key=\"Investing\" to=\"/accounts\" component={Link}*/}\n {/* onClick={() => accountDetailClick(0)}>*/}\n {/* <ListItemIcon><Insights className={classes.icon} /></ListItemIcon>*/}\n {/* <ListItemText primary={*/}\n {/* <Typography variant=\"subtitle2\" noWrap>*/}\n {/* Investing*/}\n {/* </Typography>*/}\n {/* } />*/}\n {/*</ListItem>*/}\n\n </List>\n\n <Divider />\n\n <List>\n <AccountGroups />\n </List>\n\n </div>\n )\n\n // If not authorized don't show header\n return !isAuthenticated\n ? children\n : (\n <Fragment>\n <HeaderLoading>\n <AppBar position=\"fixed\" className={classes.appBar}>\n <Toolbar>\n <IconButton\n color=\"inherit\"\n aria-label=\"open drawer\"\n edge=\"start\"\n onClick={handleDrawerToggle}\n className={classes.menuButton}\n size=\"large\">\n <Menu />\n </IconButton>\n {/*Header content*/}\n <Grid container>\n <Grid item xs={4}>\n <MonthPicker />\n </Grid>\n <Grid item xs={4}>\n <List disablePadding>\n <ListItem button dense disableGutters onClick={handleBudgetDialogToggle}>\n <ListItemText disableTypography className={needToBudgetColor}\n primary={\n <Typography align=\"center\" variant=\"h6\" noWrap>\n {formatMoneyLabel(needToBudget)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Budget\n </Typography>\n }\n />\n </ListItem>\n </List>\n </Grid>\n <Grid item xs={4}>\n <HeaderSummary />\n </Grid>\n </Grid>\n </Toolbar>\n </AppBar>\n\n <nav className={classes.drawer} aria-label=\"accounts\">\n <Hidden smUp implementation=\"css\">\n <Drawer\n variant=\"temporary\"\n anchor=\"left\"\n open={open}\n onClose={handleDrawerToggle}\n classes={{\n paper: classes.drawerPaper,\n }}\n ModalProps={{\n keepMounted: true, // Better open performance on mobile.\n }}>\n {drawer}\n </Drawer>\n </Hidden>\n <Hidden mdDown implementation=\"css\">\n <Drawer\n variant=\"permanent\"\n open\n classes={{\n paper: classes.drawerPaper,\n }}>\n {drawer}\n </Drawer>\n </Hidden>\n </nav>\n\n </HeaderLoading>\n <Container className={classes.content}>\n <Box className={classes.toolbar} />\n {children}\n </Container>\n <MoveBudgetForm open={budgetDialogOpen} closeBudgetForm={handleBudgetDialogToggle} />\n </Fragment>\n )\n\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'Header')\n return props\n}\n\nconst propTypes = {\n user: PropTypes.object,\n children: PropTypes.array.isRequired,\n isAuthenticated: PropTypes.bool.isRequired,\n accounts: PropTypes.array.isRequired\n}\n\nexport default Header\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { Snackbar } from '@mui/material'\nimport { Alert, AlertTitle } from '@mui/material'\nimport { Transition } from '../utilities/dialogs'\n\nclass Alerts extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n show: false,\n status: '',\n toast: '',\n variant: ''\n }\n\n this.showAlert = this.showAlert.bind(this)\n this.hideAlert = this.hideAlert.bind(this)\n }\n\n componentDidUpdate(prevProps) {\n const { error, toast } = this.props\n\n if (error !== prevProps.error) {\n if (error.msg && !Array.isArray(error.msg)) this.showAlert(true, 'Error', error.msg, 'error')\n if (error.msg && Array.isArray(error.msg) && error.msg[0])\n this.showAlert(true, 'Error', error.msg[0], 'error')\n if (error.msg.detail) this.showAlert(true, 'Error', error.msg.detail, 'error')\n if (error.msg.new_password) this.showAlert(true, 'Error', error.msg.new_password, 'error')\n if (error.msg.token) this.showAlert(true, 'Error', error.msg.token, 'error')\n if (error.msg.amount)\n this.showAlert(true, 'Error', `Amount: ${error.msg.amount.join()}`, 'error')\n if (error.msg.name) this.showAlert(true, 'Error', `Name: ${error.msg.name.join()}`, 'error')\n if (error.msg.date) this.showAlert(true, 'Error', `Date: ${error.msg.date.join()}`, 'error')\n if (error.msg.account_id)\n this.showAlert(true, 'Error', `Account: ${error.msg.account_id.join()}`, 'error')\n if (error.msg.collection_id)\n this.showAlert(true, 'Error', `Collection: ${error.msg.collection_id.join()}`, 'error')\n if (error.msg.non_field_errors)\n this.showAlert(\n true,\n 'Error',\n 'Ope! Something went wrong. If the issue persists, please contact support.',\n 'error'\n )\n if (error.msg.first_name)\n this.showAlert(true, 'Error', `First Name: ${error.msg.first_name.join()}`, 'error')\n if (error.msg.last_name)\n this.showAlert(true, 'Error', `Last Name: ${error.msg.last_name.join()}`, 'error')\n if (error.msg.email)\n this.showAlert(true, 'Error', `Email: ${error.msg.email.join()}`, 'error')\n if (error.msg.password)\n this.showAlert(true, 'Error', `Password: ${error.msg.password.join()}`, 'error')\n if (error.msg.re_password)\n this.showAlert(true, 'Error', `Confirm Password: ${error.msg.re_password.join()}`, 'error')\n if (error.msg.registration) this.showAlert(true, 'Error', error.msg.registration, 'error')\n if (error.msg.profile) this.showAlert(true, 'Error', error.msg.profile, 'error')\n if (error.msg.passwordsNotMatch)\n this.showAlert(true, 'Error', error.msg.passwordsNotMatch, 'error')\n if (error.msg.goal) this.showAlert(true, 'Error', error.msg.goal.join(), 'error')\n if (error.msg.budgeted) this.showAlert(true, 'Error', error.msg.budgeted.join(), 'error')\n if (error.msg.addCategoryBudget)\n this.showAlert(true, 'Error', error.msg.addCategoryBudget, 'error')\n if (error.msg.updateCategoryBudget)\n this.showAlert(true, 'Error', error.msg.updateCategoryBudget, 'error')\n if (error.msg.payee) this.showAlert(true, 'Error', error.msg.payee, 'error')\n if (error.msg.addTransaction) this.showAlert(true, 'Error', error.msg.addTransaction, 'error')\n if (error.msg.updateTransaction)\n this.showAlert(true, 'Error', error.msg.updateTransaction, 'error')\n if (error.msg.deleteTransaction)\n this.showAlert(true, 'Error', error.msg.deleteTransaction, 'error')\n if (error.msg.holding) this.showAlert(true, 'Error', error.msg.holding, 'error')\n if (error.msg.addHolding) this.showAlert(true, 'Error', error.msg.addHolding, 'error')\n if (error.msg.updateHolding) this.showAlert(true, 'Error', error.msg.updateHolding, 'error')\n if (error.msg.deleteHolding) this.showAlert(true, 'Error', error.msg.deleteHolding, 'error')\n if (error.msg.addCategory) this.showAlert(true, 'Error', error.msg.addCategory, 'error')\n if (error.msg.updateCategory) this.showAlert(true, 'Error', error.msg.updateCategory, 'error')\n if (error.msg.deleteCategory) this.showAlert(true, 'Error', error.msg.deleteCategory, 'error')\n if (error.msg.addCollection) this.showAlert(true, 'Error', error.msg.addCollection, 'error')\n if (error.msg.updateCollection)\n this.showAlert(true, 'Error', error.msg.updateCollection, 'error')\n if (error.msg.deleteCollection)\n this.showAlert(true, 'Error', error.msg.deleteCollection, 'error')\n if (error.msg.addAccount) this.showAlert(true, 'Error', error.msg.addAccount, 'error')\n if (error.msg.updateAccount) this.showAlert(true, 'Error', error.msg.updateAccount, 'error')\n if (error.msg.deleteAccount) this.showAlert(true, 'Error', error.msg.deleteAccount, 'error')\n if (error.msg.updateGroup) this.showAlert(true, 'Error', error.msg.updateGroup, 'error')\n if (error.msg.available_balance)\n this.showAlert(true, 'Error', error.msg.available_balance, 'error')\n if (error.msg.linkAPI) this.showAlert(true, 'Error', error.msg.linkAPI, 'error')\n if (error.msg.stripeAPI) this.showAlert(true, 'Error', error.msg.stripeAPI, 'error')\n }\n\n if (toast && toast !== prevProps.toast) {\n // Success Toasts\n if (toast.deleteTransaction)\n this.showAlert(true, 'Success', toast.deleteTransaction, 'success')\n if (toast.addTransaction) this.showAlert(true, 'Success', toast.addTransaction, 'success')\n if (toast.updateTransaction)\n this.showAlert(true, 'Success', toast.updateTransaction, 'success')\n if (toast.addCollection) this.showAlert(true, 'Success', toast.addCollection, 'success')\n if (toast.deleteCollection) this.showAlert(true, 'Success', toast.deleteCollection, 'success')\n if (toast.updateCollection) this.showAlert(true, 'Success', toast.updateCollection, 'success')\n if (toast.addCategory) this.showAlert(true, 'Success', toast.addCategory, 'success')\n if (toast.deleteCategory) this.showAlert(true, 'Success', toast.deleteCategory, 'success')\n if (toast.updateCategory) this.showAlert(true, 'Success', toast.updateCategory, 'success')\n if (toast.addCategoryBudget)\n this.showAlert(true, 'Success', toast.addCategoryBudget, 'success')\n if (toast.updateCategoryBudget)\n this.showAlert(true, 'Success', toast.updateCategoryBudget, 'success')\n if (toast.addHolding) this.showAlert(true, 'Success', toast.addHolding, 'success')\n if (toast.updateHolding) this.showAlert(true, 'Success', toast.updateHolding, 'success')\n if (toast.deleteHolding) this.showAlert(true, 'Success', toast.deleteHolding, 'success')\n if (toast.payee) this.showAlert(true, 'Success', toast.payee, 'success')\n if (toast.addAccount) this.showAlert(true, 'Success', toast.addAccount, 'success')\n if (toast.updateAccount) this.showAlert(true, 'Success', toast.updateAccount, 'success')\n if (toast.deleteAccount) this.showAlert(true, 'Success', toast.deleteAccount, 'success')\n if (toast.updateGroup) this.showAlert(true, 'Success', toast.updateGroup, 'success')\n if (toast.updateProfile) this.showAlert(true, 'Success', toast.updateProfile, 'success')\n if (toast.linkAPI) this.showAlert(true, 'Success', toast.linkAPI, 'success')\n if (toast.stripeAPI) this.showAlert(true, 'Success', toast.stripeAPI, 'success')\n if (toast.email) this.showAlert(true, 'Error', `Email: ${error.msg.email.join()}`, 'error')\n if (toast.passwordsNotMatch) this.showAlert(true, 'Error', toast.passwordsNotMatch, 'error')\n\n // Info Toasts\n if (toast.holdingInfo) this.showAlert(true, 'Info', toast.holdingInfo, 'info')\n }\n }\n\n showAlert = (show, status, toast, variant) => {\n this.setState({\n show,\n status,\n toast,\n variant\n })\n }\n\n hideAlert = () => {\n this.setState({\n show: false,\n status: '',\n toast: '',\n variant: ''\n })\n }\n\n render() {\n const { show, status, toast, variant } = this.state\n if (!show) return <Fragment />\n\n return (\n <Snackbar\n open={show}\n autoHideDuration={6500}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'center'\n }}\n TransitionComponent={Transition}\n key={toast}\n onClose={this.hideAlert}\n >\n <Alert severity={variant} onClose={this.hideAlert}>\n <AlertTitle>{status}</AlertTitle>\n {toast}\n </Alert>\n </Snackbar>\n )\n }\n}\n\nAlerts.propTypes = {\n error: PropTypes.object,\n toast: PropTypes.object\n}\n\nconst mapStateToProps = state => ({\n error: state.errorReducer,\n toast: state.messageReducer.toast\n})\n\nexport default connect(mapStateToProps)(Alerts)\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Paper } from '@mui/material'\nimport { useSelector, useDispatch } from 'react-redux'\nimport withStyles from '@mui/styles/withStyles'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { clearMessages } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\n/**\n * Creates a user interactive message. The user must take action to\n * dismiss message.\n */\nconst Message = ({ classes }) => {\n const { message } = useSelector(({ messageReducer }) => messageReducer)\n\n const [open, setOpen] = useState(false)\n const [displayMessage, setDisplayMessage] = useState(null)\n\n const dispatch = useDispatch()\n\n /**\n * When message from prop store changes open dialog and\n * display new message.\n */\n useEffect(() => {\n if (message && message.title) {\n setOpen(true)\n setDisplayMessage(message)\n\n // Reset messages\n dispatch(clearMessages())\n }\n\n }, [message])\n\n const handleClose = () => {\n setOpen(false)\n }\n\n return !open\n ? <Fragment />\n : (\n <>\n <Dialog\n open={open}\n onClose={handleClose}\n PaperComponent={DraggableDialogWrapper}\n aria-labelledby=\"message-dialog\"\n >\n\n <DialogTitle className={classes.moveCursor}>{displayMessage && displayMessage.title}</DialogTitle>\n\n {displayMessage && displayMessage.content &&\n <DialogContent>\n <DialogContentText>{displayMessage.content}</DialogContentText>\n </DialogContent>\n }\n\n <DialogActions>\n {displayMessage && displayMessage.buttons\n ? displayMessage.buttons\n : <Button color=\"primary\" variant=\"contained\" onClick={handleClose}>OK</Button>\n }\n </DialogActions>\n\n </Dialog>\n </>\n )\n}\n\nexport default withStyles(styles, { withTheme: true })(Message)\n","import { ToastContainer } from 'react-toastify'\nimport 'react-toastify/dist/ReactToastify.css'\nimport { useTheme } from '@mui/styles'\n\nexport default function ToastWrapper() {\n const theme = useTheme()\n\n return <ToastContainer pauseOnHover theme={theme.palette.mode === 'light' ? 'light' : 'dark'} />\n}\n","import PropTypes from 'prop-types'\nimport { toast } from 'react-toastify'\n\nconst PROXY = process.env.REACT_APP_PROXY\nconst REDIRECT_PROXY = process.env.REACT_APP_REDIRECT_PROXY\n\nconst continueWithSocialAuth = async (provider, redirect) => {\n try {\n const url = `${PROXY}/auth/o/${provider}/?redirect_uri=${REDIRECT_PROXY}/${redirect}`\n const res = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json'\n },\n credentials: 'include'\n })\n const data = await res.json()\n\n if (res.status === 200 && typeof window !== 'undefined') {\n window.location.replace(data.authorization_url)\n } else {\n toast.error('Ope! Something went wrong.')\n }\n } catch (err) {\n toast.error('Ope! Something went wrong.')\n }\n}\n\ncontinueWithSocialAuth.propTypes = {\n provider: PropTypes.string.isRequired,\n redirect: PropTypes.string.isRequired\n}\n\nexport default continueWithSocialAuth\n","import continueWithSocialAuth from './continueWithSocialAuth'\n\nexport const continueWithGoogle = () => continueWithSocialAuth('google-oauth2', 'auth/google')\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport PropTypes from 'prop-types'\nimport AppleSignin from 'react-apple-signin-auth'\nimport { Button } from '@mui/material'\nimport { toast } from 'react-toastify'\nimport { useNavigate } from 'react-router-dom'\n\nimport { sharedStyles } from '../common/styles'\n\nconst PROXY = process.env.REACT_APP_PROXY\nconst CLIENT_ID = process.env.REACT_APP_APPLE_CLIENT_ID\n\nconst useStyles = makeStyles(theme => ({\n ...sharedStyles(theme),\n appleButton: {\n backgroundColor: '#fff',\n color: '#000',\n justifyContent: 'center',\n alignItems: 'center',\n borderColor: '#000',\n borderWidth: '1px',\n borderRadius: theme.spacing(0.5),\n verticalAlign: 'middle',\n whiteSpace: 'nowrap',\n width: '100%',\n minWidth: 'min-content',\n maxWidth: '400px',\n height: '40px'\n },\n appleIcon: {\n marginRight: '12px'\n },\n appleText: {\n WebkitFlexGrow: '0',\n flexGrow: 0,\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n verticalAlign: 'top'\n }\n}))\n\nfunction AppleAuthButton() {\n const dispatch = useDispatch()\n const navigate = useNavigate()\n const classes = useStyles()\n const theme = useTheme()\n\n /**\n * @param {Object} - The successful response object from\n * Apple. Otherwise undefined\n */\n // async function signInWithApple(response) {\n // try {\n // const authorization = response && response.authorization ? response.authorization : null\n // const state = authorization && authorization.state ? authorization.state : null\n // const code = authorization && authorization.code ? authorization.code : null\n // const id_token = authorization && authorization.id_token ? authorization.id_token : null\n // const user = response && response.user ? response.user : null\n //\n // console.log({ state })\n // console.log({ code })\n //\n // if (!state || !code) {\n // toast.error('Ope! Authorization by Apple failed.')\n // return false\n // }\n //\n // const data = {\n // code,\n // state,\n // id_token,\n // user\n // }\n //\n // const socialResponse = await dispatch(appleSocialLogin(response))\n // console.log('social', socialResponse)\n // const res = await dispatch(loadUser())\n // console.log('res', res)\n //\n // if (res.ok) {\n // navigate('/dashboard', { replace: true })\n // } else {\n // navigate('/login', { replace: true })\n // }\n // } catch (error) {\n // navigate('/login', { replace: true })\n // }\n // }\n\n /**\n * Called if an error is thrown on the Sign in with Apple\n * request.\n * @param {Object} - Error else undefined\n */\n // function signInWithAppleError(error) {\n // console.log({ error })\n // toast.error('Ope! Authorization by Apple failed.')\n // }\n\n return (\n <AppleSignin\n /** Auth options passed to AppleID.auth.init() */\n authOptions={{\n /** Client ID - eg: 'com.example.com' */\n clientId: `${CLIENT_ID}`,\n /** Requested scopes, seperated by spaces - eg: 'email name' */\n scope: 'email name',\n /** Apple's redirectURI - must be one of the URIs you added to the serviceID - the undocumented trick in apple docs is that you should call auth from a page that is listed as a redirectURI, localhost fails */\n redirectURI: `${PROXY}/v1/auth/o/apple-id/`,\n /** State string that is returned with the apple response */\n // state: 'state',\n /** Nonce */\n // nonce: 'nonce',\n /** Uses popup auth instead of redirection */\n usePopup: false\n }} // REQUIRED\n /** General props */\n uiType=\"light\"\n /** className */\n className={`apple-auth-btn ${classes.appleButton}`}\n /** Removes default style tag */\n noDefaultStyle={false}\n /** Allows to change the button's children, eg: for changing the button text */\n buttonExtraChildren=\"Continue with Apple\"\n /** Extra controlling props */\n /** Called upon signin success in case authOptions.usePopup = true -- which means auth is handled client side */\n onSuccess={response => false} // default = undefined\n /** Called upon signin error */\n onError={error => false} // default = undefined\n /** Skips loading the apple script if true */\n skipScript={false} // default = undefined\n /** Apple image props */\n // iconProp={{ style: { marginTop: '10px' } }} // default = undefined\n /** render function - called with all props - can be used to fully customize the UI by rendering your own component */\n render={props => (\n <Button\n {...props}\n fullWidth\n variant=\"outlined\"\n type=\"button\"\n className={`apple-auth-btn ${classes.appleButton}`}\n >\n <img\n alt=\"Apple logo\"\n className={classes.appleIcon}\n height={18}\n src=\"/static/apple_logo_black.png\"\n />\n <span className={classes.appleText}> Continue with Apple </span>\n </Button>\n )}\n />\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'AppleAuthButton')\n return props\n}\n\nconst propTypes = {}\n\nexport default AppleAuthButton\n","import React, { useState } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { Link, Navigate } from 'react-router-dom'\nimport PropTypes from 'prop-types'\nimport { Typography, TextField, Divider, Button, Grid } from '@mui/material'\nimport { useNavigate } from 'react-router-dom'\n\nimport { sharedStyles } from '../common/styles'\nimport { login } from '../../actions/auth'\nimport { continueWithGoogle } from '../../utilities'\nimport AuthLayout from './AuthLayout'\nimport AppleAuthButton from './AppleAuthButton'\n\nconst useStyles = makeStyles(theme => ({\n ...sharedStyles(theme),\n container: {\n width: '100%',\n minWidth: 'min-content',\n maxWidth: '400px'\n },\n forgotButton: {\n marginTop: theme.spacing(1)\n },\n gsiMaterialButton: {\n MozUserSelect: 'none',\n WebkitUserSelect: 'none',\n msUserSelect: 'none',\n WebkitAppearance: 'none',\n backgroundColor: 'WHITE',\n backgroundImage: 'none',\n border: '1px solid #747775',\n WebkitBorderRadius: '4px',\n borderRadius: '4px',\n WebkitBoxSizing: 'border-box',\n boxSizing: 'border-box',\n color: '#1f1f1f',\n cursor: 'pointer',\n fontFamily: \"'Roboto', arial, sans-serif\",\n fontSize: '14px',\n height: '40px',\n letterSpacing: '0.25px',\n outline: 'none',\n overflow: 'hidden',\n padding: '0 12px',\n position: 'relative',\n textAlign: 'center',\n WebkitTransition: 'background-color .218s, border-color .218s, box-shadow .218s',\n transition: 'background-color .218s, border-color .218s, box-shadow .218s',\n verticalAlign: 'middle',\n whiteSpace: 'nowrap',\n width: '100%',\n minWidth: 'min-content',\n maxWidth: '400px'\n },\n gsiMaterialButtonIcon: {\n height: '18px',\n marginRight: '12px',\n minWidth: '18px',\n width: '18px'\n },\n gsiMaterialButtonContentWrapper: {\n WebkitAlignItems: 'center',\n alignItems: 'center',\n display: 'flex',\n WebkitFlexDirection: 'row',\n flexDirection: 'row',\n WebkitFlexWrap: 'nowrap',\n flexWrap: 'nowrap',\n height: '100%',\n justifyContent: 'center',\n position: 'relative',\n width: '100%'\n },\n gsiMaterialButtonContents: {\n WebkitFlexGrow: '0',\n flexGrow: 0,\n fontFamily: \"'Roboto', arial, sans-serif\",\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n verticalAlign: 'top'\n },\n gsiMaterialButtonState: {\n WebkitTransition: 'opacity .218s',\n transition: 'opacity .218s',\n bottom: '0',\n left: '0',\n opacity: 0,\n position: 'absolute',\n right: '0',\n top: '0'\n }\n}))\n\nfunction Login() {\n const { isAuthenticated } = withPropsValidation(\n useSelector(({ authReducer }) => ({ isAuthenticated: authReducer.isAuthenticated }))\n )\n\n const [formData, setFormData] = useState({\n email: '',\n password: ''\n })\n\n const dispatch = useDispatch()\n const navigate = useNavigate()\n const classes = useStyles()\n const theme = useTheme()\n const { email, password } = formData\n\n /**\n * The on change event for the input fields.\n * @param {Object} event - The on change event from the input.\n */\n const onChange = event => {\n const { name, value } = event.target\n\n setFormData({ ...formData, [name]: value })\n }\n\n async function onSubmit(event) {\n event.preventDefault()\n\n try {\n const normalizedEmail = email ? email.toLowerCase() : ''\n\n dispatch(login(normalizedEmail, password))\n } catch (error) {\n // TODO: Handle error.\n }\n }\n\n return isAuthenticated ? (\n <Navigate to=\"/\" />\n ) : (\n <AuthLayout heading=\"Sign in\">\n <form onSubmit={onSubmit}>\n <Grid container spacing={3} className={classes.container}>\n <Grid item xs={12} justifyContent=\"center\" align=\"center\">\n <TextField\n required\n variant=\"standard\"\n onChange={onChange}\n value={email}\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={12} justifyContent=\"center\" align=\"center\">\n <TextField\n required\n variant=\"standard\"\n autoComplete=\"off\"\n onChange={onChange}\n value={password}\n name=\"password\"\n label=\"Password\"\n type=\"password\"\n fullWidth\n />\n\n <Grid container item xs={12} justifyContent=\"flex-end\" className={classes.forgotButton}>\n <Typography variant=\"body2\" noWrap>\n <Link to=\"/reset-password\" className={classes.textLinks}>\n Forgot password?\n </Link>\n </Typography>\n </Grid>\n </Grid>\n\n <Grid item xs={12}>\n <Button fullWidth type=\"submit\" color=\"primary\" variant=\"contained\">\n <Typography className={classes.pl1} variant=\"button\" align=\"center\" noWrap>\n Log in with email\n </Typography>\n </Button>\n </Grid>\n\n <Grid item xs={12}>\n <Divider>or</Divider>\n </Grid>\n\n <Grid item xs={12}>\n <AppleAuthButton />\n </Grid>\n\n <Grid item xs={12}>\n <Button\n fullWidth\n className={classes.gsiMaterialButton}\n variant=\"outlined\"\n type=\"button\"\n onClick={continueWithGoogle}\n >\n <div className={classes.gsiMaterialButtonState}></div>\n <div className={classes.gsiMaterialButtonContentWrapper}>\n <div className={classes.gsiMaterialButtonIcon}>\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 48 48\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n style={{ display: 'block' }}\n >\n <path\n fill=\"#EA4335\"\n d=\"M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z\"\n ></path>\n <path\n fill=\"#4285F4\"\n d=\"M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z\"\n ></path>\n <path\n fill=\"#FBBC05\"\n d=\"M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z\"\n ></path>\n <path\n fill=\"#34A853\"\n d=\"M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z\"\n ></path>\n <path fill=\"none\" d=\"M0 0h48v48H0z\"></path>\n </svg>\n </div>\n <span className={classes.gsiMaterialButtonContents}>Continue with Google</span>\n <span style={{ display: 'none' }}>Continue with Google</span>\n </div>\n </Button>\n </Grid>\n\n <Grid container item xs={12} justifyContent=\"center\" className={classes.pt1}>\n <Typography variant=\"body2\" noWrap>\n Don't have an account? \n <Link to=\"/register\" className={classes.textLinks}>\n Sign up\n </Link>\n </Typography>\n </Grid>\n </Grid>\n </form>\n </AuthLayout>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'Login')\n return props\n}\n\nconst propTypes = {\n isAuthenticated: PropTypes.bool.isRequired\n}\n\nexport default Login\n","import React, { useRef, useEffect } from 'react'\n\nexport function useIsMountedRef() {\n const isMountedRef = useRef(null)\n useEffect(() => {\n isMountedRef.current = true\n return () => (isMountedRef.current = false)\n })\n return isMountedRef\n}\n","import React, { useEffect, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { useNavigate } from 'react-router-dom'\nimport { Box } from '@mui/material'\n\nimport { loadUser, socialLogin } from '../../actions/auth'\nimport { useIsMountedRef } from '../utilities/isMounted'\nimport { Loading } from '../loading/Loading'\n\nfunction AuthGoogle() {\n const dispatch = useDispatch()\n const isMountedRef = useIsMountedRef()\n const navigate = useNavigate()\n const effectRan = useRef(false)\n\n async function authenticate() {\n const urlParams = new URLSearchParams(window.location.search)\n const state = urlParams.has('state') ? urlParams.get('state') : null\n const code = urlParams.has('code') ? urlParams.get('code') : null\n\n if (state && code) {\n try {\n const socialResponse = await dispatch(socialLogin('google-oauth2', state, code))\n const res = await dispatch(loadUser())\n if (res.ok) {\n navigate('/dashboard', { replace: true })\n } else {\n navigate('/login', { replace: true })\n }\n } catch (error) {\n navigate('/login', { replace: true })\n }\n } else {\n navigate('/login', { replace: true })\n }\n }\n\n /**\n * Used for social auth login. The user on social auth\n * gets redirected here with a state and code param that\n * can be used to authenticate them.\n */\n useEffect(() => {\n if (isMountedRef.current) {\n if (!effectRan.current) {\n authenticate()\n }\n\n return () => {\n effectRan.current = true\n }\n }\n }, [authenticate])\n\n return (\n <Box mb={1}>\n <Loading />\n </Box>\n )\n}\n\nexport default AuthGoogle\n","import React, { useEffect, useRef } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { useNavigate } from 'react-router-dom'\nimport { Box } from '@mui/material'\n\nimport { loadUser, appleSocialLogin, getAppleCookies } from '../../actions/auth'\nimport { useIsMountedRef } from '../utilities/isMounted'\nimport { Loading } from '../loading/Loading'\n\nfunction AuthApple() {\n const dispatch = useDispatch()\n const isMountedRef = useIsMountedRef()\n const navigate = useNavigate()\n const effectRan = useRef(false)\n\n async function authenticate() {\n const urlParams = new URLSearchParams(window.location.search)\n const id_token = urlParams.has('id_token') ? urlParams.get('id_token') : null\n const code = urlParams.has('code') ? urlParams.get('code') : null\n\n if (code && id_token) {\n const data = {\n id_token,\n code,\n platform_origin: 1\n }\n\n try {\n const socialResponse = await dispatch(appleSocialLogin(data))\n const tokens = socialResponse && socialResponse.data ? socialResponse.data : null\n const socialCookies = await dispatch(getAppleCookies(tokens))\n const res = await dispatch(loadUser())\n\n navigate('/dashboard', { replace: true })\n } catch (error) {\n navigate('/login', { replace: true })\n }\n } else {\n navigate('/login', { replace: true })\n }\n }\n\n /**\n * Used for social auth login. The user on social auth\n * gets redirected here with a state and code param that\n * can be used to authenticate them.\n */\n useEffect(() => {\n if (isMountedRef.current) {\n if (!effectRan.current) {\n authenticate()\n }\n\n return () => {\n effectRan.current = true\n }\n }\n }, [authenticate])\n\n return (\n <Box mb={1}>\n <Loading />\n </Box>\n )\n}\n\nexport default AuthApple\n","import React, { Component } from 'react'\nimport { Link, Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Typography, TextField, Divider, Button, Grid, Link as Anchor } from '@mui/material'\n\nimport { sharedStyles } from '../common/styles'\nimport { register } from '../../actions/auth'\nimport { continueWithGoogle } from '../../utilities'\nimport { createToast } from '../../actions/messages'\nimport AuthLayout from './AuthLayout'\nimport AppleAuthButton from './AppleAuthButton'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n container: {\n width: '100%',\n minWidth: 'min-content',\n maxWidth: '400px'\n },\n gsiMaterialButton: {\n MozUserSelect: 'none',\n WebkitUserSelect: 'none',\n msUserSelect: 'none',\n WebkitAppearance: 'none',\n backgroundColor: 'WHITE',\n backgroundImage: 'none',\n border: '1px solid #747775',\n WebkitBorderRadius: '4px',\n borderRadius: '4px',\n WebkitBoxSizing: 'border-box',\n boxSizing: 'border-box',\n color: '#1f1f1f',\n cursor: 'pointer',\n fontFamily: \"'Roboto', arial, sans-serif\",\n fontSize: '14px',\n height: '40px',\n letterSpacing: '0.25px',\n outline: 'none',\n overflow: 'hidden',\n padding: '0 12px',\n position: 'relative',\n textAlign: 'center',\n WebkitTransition: 'background-color .218s, border-color .218s, box-shadow .218s',\n transition: 'background-color .218s, border-color .218s, box-shadow .218s',\n verticalAlign: 'middle',\n whiteSpace: 'nowrap',\n width: '100%',\n minWidth: 'min-content',\n maxWidth: '400px'\n },\n gsiMaterialButtonIcon: {\n height: '20px',\n marginRight: '12px',\n minWidth: '20px',\n width: '20px'\n },\n gsiMaterialButtonContentWrapper: {\n WebkitAlignItems: 'center',\n alignItems: 'center',\n display: 'flex',\n WebkitFlexDirection: 'row',\n flexDirection: 'row',\n WebkitFlexWrap: 'nowrap',\n flexWrap: 'nowrap',\n height: '100%',\n justifyContent: 'center',\n position: 'relative',\n width: '100%'\n },\n gsiMaterialButtonContents: {\n WebkitFlexGrow: '0',\n flexGrow: 0,\n fontFamily: \"'Roboto', arial, sans-serif\",\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n verticalAlign: 'top'\n },\n gsiMaterialButtonState: {\n WebkitTransition: 'opacity .218s',\n transition: 'opacity .218s',\n bottom: '0',\n left: '0',\n opacity: 0,\n position: 'absolute',\n right: '0',\n top: '0'\n }\n})\n\nclass Register extends Component {\n state = {\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n rePassword: ''\n }\n\n onChange = e => this.setState({ [e.target.name]: e.target.value })\n\n onSubmit = e => {\n e.preventDefault()\n const { firstName, lastName, email, password, rePassword } = this.state\n if (password !== rePassword) {\n this.props.createToast({ passwordsNotMatch: 'Passwords do not match' })\n } else {\n const newUser = {\n first_name: firstName,\n last_name: lastName,\n email,\n password,\n re_password: rePassword\n }\n\n this.props.register(newUser)\n }\n }\n\n render() {\n if (this.props.isAuthenticated) return <Navigate to=\"/\" />\n if (this.props.accountCreated) return <Navigate to=\"/register-acknowledge\" />\n\n const { firstName, lastName, email, password, rePassword } = this.state\n const { classes } = this.props\n return (\n <AuthLayout heading=\"Create an account\">\n <form onSubmit={this.onSubmit}>\n <Grid container spacing={3} className={classes.container}>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={firstName}\n name=\"firstName\"\n type=\"text\"\n label=\"First Name\"\n fullWidth\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={lastName}\n name=\"lastName\"\n label=\"Last Name\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={email}\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n fullWidth\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={password}\n name=\"password\"\n label=\"Password\"\n type=\"password\"\n fullWidth={true}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={rePassword}\n name=\"rePassword\"\n label=\"Confirm Password\"\n type=\"password\"\n fullWidth\n />\n </Grid>\n <Grid item xs={12}>\n <Button fullWidth type=\"submit\" color=\"primary\" variant=\"contained\">\n <Typography className={classes.pl1} variant=\"button\" align=\"center\" noWrap>\n Sign up with email\n </Typography>\n </Button>\n </Grid>\n\n <Grid item xs={12}>\n <Divider>or</Divider>\n </Grid>\n\n <Grid item xs={12}>\n <AppleAuthButton />\n </Grid>\n\n <Grid item xs={12}>\n <Button\n fullWidth\n className={classes.gsiMaterialButton}\n type=\"button\"\n onClick={continueWithGoogle}\n >\n <div className={classes.gsiMaterialButtonState}></div>\n <div className={classes.gsiMaterialButtonContentWrapper}>\n <div className={classes.gsiMaterialButtonIcon}>\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 48 48\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n style={{ display: 'block' }}\n >\n <path\n fill=\"#EA4335\"\n d=\"M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z\"\n ></path>\n <path\n fill=\"#4285F4\"\n d=\"M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z\"\n ></path>\n <path\n fill=\"#FBBC05\"\n d=\"M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z\"\n ></path>\n <path\n fill=\"#34A853\"\n d=\"M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z\"\n ></path>\n <path fill=\"none\" d=\"M0 0h48v48H0z\"></path>\n </svg>\n </div>\n <span className={classes.gsiMaterialButtonContents}>Continue with Google</span>\n <span style={{ display: 'none' }}>Continue with Google</span>\n </div>\n </Button>\n </Grid>\n\n <Grid container item xs={12} justifyContent=\"center\" className={classes.pt1}>\n <Typography variant=\"body2\" noWrap>\n Already have an account? \n <Link to=\"/login\" className={classes.textLinks}>\n Sign in\n </Link>\n </Typography>\n </Grid>\n\n <Grid container item xs={12} justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"body2\">\n By creating an account, you agree to our \n </Typography>\n <Typography variant=\"body2\" noWrap>\n <Anchor\n underline=\"always\"\n target=\"_blank\"\n color=\"inherit\"\n href=\"https://www.ploutosbudget.com/terms\"\n >\n Terms of Use\n </Anchor>\n </Typography>\n <Typography variant=\"body2\"> and </Typography>\n <Typography variant=\"body2\" noWrap>\n <Anchor\n underline=\"always\"\n target=\"_blank\"\n color=\"inherit\"\n href=\"https://www.ploutosbudget.com/privacy\"\n >\n Privacy Policy\n </Anchor>\n </Typography>\n </Grid>\n </Grid>\n </form>\n </AuthLayout>\n )\n }\n}\n\nRegister.propTypes = {\n register: PropTypes.func.isRequired,\n isAuthenticated: PropTypes.bool,\n accountCreated: PropTypes.bool\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated,\n accountCreated: state.authReducer.accountCreated\n})\n\nconst mapDispatchToProps = {\n register,\n createToast\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(Register))\n","import React, { Component } from 'react'\nimport { Link, Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Box, Typography, Divider, Grid, Button } from '@mui/material'\nimport { Send } from '@mui/icons-material'\n\nimport AuthLayout from './AuthLayout'\nimport { resendActivationEmail } from '../../actions/auth'\nimport { sharedStyles } from '../common/styles'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass RegisterAcknowledge extends Component {\n\n onSubmit = e => {\n e.preventDefault()\n const { accountCreated } = this.props\n\n const normalizedEmail = accountCreated ? accountCreated.toLowerCase() : ''\n\n this.props.resendActivationEmail(normalizedEmail)\n }\n\n render() {\n const { classes, isAuthenticated, accountCreated, accountActivated } = this.props\n\n if (isAuthenticated) return <Navigate to=\"/\" />\n if (accountActivated) return <Navigate to=\"/login\" />\n\n return (\n <AuthLayout heading=\"Thank you for signing up!\">\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Typography>\n You should receive an email shortly to verify and activate your account. Once your email is verified,\n you will be able to log in.\n </Typography>\n </Grid>\n </Grid>\n\n {accountCreated &&\n <Box marginY={3}>\n <form onSubmit={this.onSubmit}>\n <Grid container spacing={3}>\n <Grid item xs={12} align=\"center\">\n <Typography>\n Email: <b>{accountCreated}</b>\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Button fullWidth={true} type=\"submit\" color=\"primary\" variant=\"contained\">\n <Send className={classes.pr1} fontSize=\"small\" />\n Resend Activation\n </Button>\n </Grid>\n </Grid>\n </form>\n </Box>\n }\n\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n Note: If you can't find the confirmation email in your inbox, please check your spam folder.\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n <Grid container item xs={12}\n justifyContent=\"center\">\n <Link to=\"/login\" className={classes.textLinks}>Login</Link>\n </Grid>\n\n <Divider />\n\n </Grid>\n </AuthLayout>\n )\n }\n}\n\nRegisterAcknowledge.propTypes = {\n isAuthenticated: PropTypes.bool.isRequired,\n accountActivated: PropTypes.bool.isRequired,\n resendActivationEmail: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated,\n accountCreated: state.authReducer.accountCreated,\n accountActivated: state.authReducer.accountActivated\n})\n\nconst mapDispatchToProps = {\n resendActivationEmail\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(RegisterAcknowledge))\n","import React from 'react'\nimport { useParams } from 'react-router-dom'\n\nexport function withRouter(Children) {\n return (props) => {\n\n const match = { params: useParams() }\n return <Children {...props} match={match} />\n }\n}\n","import React, { Component } from 'react'\nimport { Link, Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Typography, Divider, Grid } from '@mui/material'\nimport { toast } from 'react-toastify'\n\nimport { withRouter } from '../utilities/withRouter'\nimport { activate } from '../../actions/auth'\nimport AuthLayout from './AuthLayout'\nimport { sharedStyles } from '../common/styles'\n\nconst styles = theme => ({\n ...sharedStyles(theme)\n})\n\nclass Activate extends Component {\n componentDidMount() {\n this.activateAccount()\n }\n\n activateAccount = e => {\n try {\n const {\n match: { params }\n } = this.props\n\n if (typeof params !== 'undefined' && params != null) {\n const uid = params.uid\n const token = params.token\n this.props.activate(uid, token)\n toast.success('Account activated.')\n } else {\n toast.error('Unable to activate account at this time.')\n }\n } catch (error) {\n toast.error('Unable to activate account at this time.')\n }\n }\n\n render() {\n const { classes, isAuthenticated, accountActivated } = this.props\n\n if (isAuthenticated) return <Navigate to=\"/\" />\n if (accountActivated) return <Navigate to=\"/login\" />\n\n return (\n <AuthLayout heading=\"Welcome!\">\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Typography>\n Thank you for signing up! Your account is now active. You can log in and start\n creating your new budget.\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n <Grid container item xs={12} justifyContent=\"center\" className={classes.pt1}>\n <Typography variant=\"body2\" noWrap>\n <Link to=\"/login\" className={classes.textLinks}>\n Sign in\n </Link>\n </Typography>\n </Grid>\n\n <Divider />\n </Grid>\n </AuthLayout>\n )\n }\n}\n\nActivate.propTypes = {\n isAuthenticated: PropTypes.bool.isRequired,\n accountActivated: PropTypes.bool.isRequired\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated,\n accountActivated: state.authReducer.accountActivated\n})\n\nconst mapDispatchToProps = {\n activate\n}\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(withStyles(styles)(withRouter(Activate)))\n","import React, { Component } from 'react'\nimport { Link, Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { TextField, Divider, Button, Grid, } from '@mui/material'\nimport { Send } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { resetPassword } from '../../actions/auth'\nimport AuthLayout from './AuthLayout'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass PasswordReset extends Component {\n state = {\n email: '',\n }\n\n onChange = e => this.setState({ [e.target.name]: e.target.value })\n\n onSubmit = e => {\n e.preventDefault()\n const { email } = this.state\n const normalizedEmail = email ? email.toLowerCase() : ''\n\n this.props.resetPassword(normalizedEmail)\n }\n\n render() {\n if (this.props.isAuthenticated) return <Navigate to=\"/\" />\n if (this.props.resetPasswordRequested) return <Navigate to=\"/reset-password-acknowledge\" />\n\n const { email } = this.state\n const { classes } = this.props\n return (\n <AuthLayout heading=\"Request password reset\">\n <form onSubmit={this.onSubmit}>\n <Grid container spacing={3}>\n\n <Grid item xs={12}>\n <TextField required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={email}\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n fullWidth={true} />\n </Grid>\n\n <Grid item xs={12}>\n <Button fullWidth={true} type=\"submit\" color=\"primary\" variant=\"contained\">\n <Send className={classes.pr1} fontSize=\"small\" />Reset Password\n </Button>\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n <Grid container item xs={12}\n justifyContent=\"center\">\n <Link to=\"/login\" className={classes.textLinks}>Login</Link>\n </Grid>\n\n <Divider />\n\n </Grid>\n </form>\n </AuthLayout>\n )\n }\n}\n\nPasswordReset.propTypes = {\n resetPassword: PropTypes.func.isRequired,\n isAuthenticated: PropTypes.bool.isRequired,\n resetPasswordRequested: PropTypes.bool.isRequired,\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated,\n resetPasswordRequested: state.authReducer.resetPasswordRequested,\n})\n\nconst mapDispatchToProps = {\n resetPassword\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(PasswordReset))\n","import React, { Component } from 'react'\nimport { Link, Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport AuthLayout from './AuthLayout'\nimport withStyles from '@mui/styles/withStyles'\nimport { Typography, Divider, Grid, } from '@mui/material'\n\nimport { sharedStyles } from '../common/styles'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass ResetPasswordAcknowledge extends Component {\n\n render() {\n const { classes, isAuthenticated } = this.props\n\n if (isAuthenticated) return <Navigate to=\"/\" />\n\n return (\n <AuthLayout heading=\"Password reset requested!\">\n <Grid container spacing={3}>\n\n <Grid item xs={12}>\n <Typography>\n You should get an email soon with instructions on how to reset your password.\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Typography variant=\"body2\">\n Note: If you can't find the email in your inbox, please check your spam folder.\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n <Grid container item xs={12}\n justifyContent=\"center\">\n <Link to=\"/login\" className={classes.textLinks}>Login</Link>\n </Grid>\n\n <Divider />\n\n </Grid>\n </AuthLayout>\n )\n }\n}\n\nResetPasswordAcknowledge.propTypes = {\n isAuthenticated: PropTypes.bool.isRequired,\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated,\n})\n\nconst mapDispatchToProps = {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(ResetPasswordAcknowledge))\n","import React, { Component } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { TextField, Button, Grid, } from '@mui/material'\nimport { Save } from '@mui/icons-material'\n\nimport { withRouter } from '../utilities/withRouter'\nimport { sharedStyles } from '../common/styles'\nimport { resetPasswordConfirm } from '../../actions/auth'\nimport { createToast } from '../../actions/messages'\nimport AuthLayout from './AuthLayout'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass PasswordResetConfirm extends Component {\n state = {\n uid: '',\n token: '',\n newPassword: '',\n reNewPassword: ''\n }\n\n componentDidMount() {\n const { match: { params } } = this.props\n\n if (typeof params !== 'undefined' && params != null) {\n this.setState({\n uid: params.uid,\n token: params.token\n })\n }\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { match: { params } } = this.props\n\n if ((params.uid && prevProps.match.params.uid !== params.uid)\n || (params.token && prevProps.match.params.token !== params.token)) {\n this.setState({\n uid: params.uid,\n token: params.token\n })\n }\n }\n\n onChange = e => this.setState({ [e.target.name]: e.target.value })\n\n onSubmit = e => {\n e.preventDefault()\n const { uid, token, newPassword, reNewPassword } = this.state\n if (newPassword !== reNewPassword) {\n this.props.createToast({ passwordsNotMatch: 'Passwords do not match' })\n } else {\n this.props.resetPasswordConfirm(uid, token, newPassword, reNewPassword)\n }\n }\n\n render() {\n if (this.props.isAuthenticated) return <Navigate to=\"/\" />\n if (this.props.resetPasswordSuccess) return <Navigate to=\"/login\" />\n\n const { newPassword, reNewPassword } = this.state\n const { classes } = this.props\n return (\n <AuthLayout heading=\"Update password\">\n <form onSubmit={this.onSubmit}>\n <Grid container\n spacing={3}>\n <Grid item xs={12}>\n <TextField required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={newPassword}\n name=\"newPassword\"\n label=\"New Password\"\n type=\"password\"\n fullWidth={true} />\n </Grid>\n <Grid item xs={12}>\n <TextField required\n autoComplete=\"off\"\n onChange={this.onChange}\n value={reNewPassword}\n name=\"reNewPassword\"\n label=\"Confirm Password\"\n type=\"password\"\n fullWidth={true} />\n </Grid>\n <Grid item xs={12}>\n <Button fullWidth={true} type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save className={classes.pr1} fontSize=\"small\" />Update Password\n </Button>\n </Grid>\n </Grid>\n </form>\n </AuthLayout>\n )\n }\n}\n\nPasswordResetConfirm.propTypes = {\n resetPasswordConfirm: PropTypes.func.isRequired,\n isAuthenticated: PropTypes.bool.isRequired,\n resetPasswordSuccess: PropTypes.bool.isRequired,\n uid: PropTypes.string,\n token: PropTypes.string\n}\n\nconst mapStateToProps = state => ({\n isAuthenticated: state.authReducer.isAuthenticated,\n resetPasswordSuccess: state.authReducer.resetPasswordSuccess,\n})\n\nconst mapDispatchToProps = {\n resetPasswordConfirm,\n createToast,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(withRouter(PasswordResetConfirm)))\n","import axios from 'axios'\nimport { createMessage, createToast, returnErrors } from './messages'\nimport {\n GET_TRANSACTION_FLAGS, EDIT_TRANSACTION_FLAGS, TRANSACTION_FLAG_LOADING, TRANSACTION_FLAG_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get transaction flags\nexport const getTransactionFlags = () => (dispatch, getState) => {\n dispatch({ type: TRANSACTION_FLAG_LOADING })\n axios.get(`${proxy}/v1/transaction_flags/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_TRANSACTION_FLAGS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: TRANSACTION_FLAG_FAIL })\n })\n}\n\n/**\n * Edit transaction flags\n * @param {Object} transactionFlags - Transaction flag information\n * @param {number} transactionFlags.user_id - User Id\n * @param {Object[]} transactionFlags.flags - Array of all of the transaction\n * @param {number} transactionFlags[].id - The Id of all of the flags\n * @param {string} transactionFlags[].name - Label for the flag\n */\nexport const editTransactionFlags = (transactionFlags) => (dispatch, getState) => {\n axios.post(`${proxy}/v1/transaction_flags/`, transactionFlags, tokenConfig(getState))\n .then(res => {\n dispatch(createToast({ updateTransaction: 'Flags Updated' }))\n dispatch({\n type: EDIT_TRANSACTION_FLAGS,\n payload: res.data\n })\n dispatch(getTransactionFlags())\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n dispatch({ type: TRANSACTION_FLAG_FAIL })\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_HISTORY_TRANSACTIONS, HISTORY_TRANSACTION_LOADING, HISTORY_TRANSACTION_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\nimport { downloadFile, ROWS_PER_PAGE_OPTIONS } from '../components/utilities/tables'\n\nconst PROXY = process.env.REACT_APP_PROXY\n\n/**\n * Gets paginated transaction history\n * @param {number} [page=0] - The page of results to retrieve. 0 indexed.\n * @param {number} [pageSize] - The page size of results to retrieve.\n * Defaults to ROWS_PER_PAGE_OPTIONS[0].\n * @param {string} [query] - An optional search query to search\n * against. Currently, limits string to 10 characters.\n * @param {string} [startDate] - The starting date to search.\n * yyyymmdd format.\n * @param {string} [endDate] - The end date to search. yyyymmdd format.\n * @param {string} [flags] - A list of flags comma separated.\n * @param {string} [payeeQuery] - A search string to apply to payee\n * @param {string} [accounts] - A list of accounts comma separated.\n * @param {string} [categories] - A list of categories comma separated.\n * @param {boolean} [posted] - Filter on whether posted or not.\n * @param {boolean} [archived] - Filter on whether archived or not.\n * @returns {(function(*, *): void)|*}\n */\nexport const getTransactionHistory = (page, pageSize, query, startDate, endDate, flags, payeeQuery, accounts, categories, posted, archived) => (dispatch, getState) => {\n try {\n dispatch({ type: HISTORY_TRANSACTION_LOADING })\n const pageParam = (page || 0)\n const pageSizeParam = (pageSize || ROWS_PER_PAGE_OPTIONS[0])\n const search = query ? query.substring(0, 10) : ''\n const start = (startDate || '')\n const end = (endDate || '')\n const flagParams = (flags || '')\n const payeeQueryParam = payeeQuery ? payeeQuery.substring(0, 10) : ''\n const accountParams = (accounts || '')\n const categoryParams = (categories || '')\n const postedParam = posted === true ? 't' : posted === false ? 'f' : ''\n const archivedParam = archived === true ? 't' : archived === false ? 'f' : ''\n\n const header = tokenConfig(getState)\n header.params = {\n p: pageParam,\n ps: pageSizeParam,\n q: search,\n sd: start,\n ed: end,\n f: flagParams,\n pq: payeeQueryParam,\n a: accountParams,\n c: categoryParams,\n po: postedParam,\n ar: archivedParam\n }\n\n axios.get(`${PROXY}/v1/history_transactions/`, header)\n .then(res => {\n dispatch({\n type: GET_HISTORY_TRANSACTIONS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: HISTORY_TRANSACTION_FAIL })\n })\n } catch (e) {\n dispatch({ type: HISTORY_TRANSACTION_FAIL })\n }\n}\n\n/**\n * Downloads history transactions to a CSV file based on passed\n * filters.\n * @param {Array} columns - The list of columns to download.\n * @param {string} [query] - An optional search query to search\n * against. Currently, limits string to 10 characters.\n * @param {string} [startDate] - The starting date to search.\n * yyyymmdd format.\n * @param {string} [endDate] - The end date to search. yyyymmdd format.\n * @param {string} [flags] - A list of flags comma separated.\n * @param {string} [payeeQuery] - A search string to apply to payee\n * @param {string} [accounts] - A list of accounts comma separated.\n * @param {string} [categories] - A list of categories comma separated.\n * @param {boolean} [posted] - Filter on whether posted or not.\n * @param {boolean} [archived] - Filter on whether archived or not.\n * @returns {(function(*, *): void)|*}\n */\nexport const downloadTransactionHistory = (columns, query, startDate, endDate, flags, payeeQuery, accounts, categories, posted, archived) => (dispatch, getState) => {\n const search = query ? query.substring(0, 10) : ''\n const start = (startDate || '')\n const end = (endDate || '')\n const flagParams = (flags || '')\n const payeeQueryParam = payeeQuery ? payeeQuery.substring(0, 10) : ''\n const accountParams = (accounts || '')\n const categoryParams = (categories || '')\n const postedParam = posted === true ? 't' : posted === false ? 'f' : ''\n const archivedParam = archived === true ? 't' : archived === false ? 'f' : ''\n\n const filters = {\n cl: columns,\n q: search,\n sd: start,\n ed: end,\n f: flagParams,\n pq: payeeQueryParam,\n a: accountParams,\n c: categoryParams,\n po: postedParam,\n ar: archivedParam\n }\n\n axios.post(`${PROXY}/v1/history_transactions/`, filters, tokenConfig(getState))\n .then(res => {\n downloadFile(res.data, 'transactions.csv')\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n dispatch(returnErrors(error, status))\n })\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\n\nimport { Loading } from './Loading'\nimport { getThemes } from '../../actions/theme'\nimport { getAccountGroups } from '../../actions/accountGroups'\nimport { getAccountTypes } from '../../actions/accountTypes'\nimport { getPayees } from '../../actions/payees'\nimport { getTransfers } from '../../actions/transfers'\nimport { getSplits } from '../../actions/splits'\nimport { getAccounts } from '../../actions/accounts'\nimport { getCollections } from '../../actions/collections'\nimport { getCategories } from '../../actions/categories'\nimport { getCategoryBudgets } from '../../actions/categoryBudgets'\nimport { getTransactions } from '../../actions/transactions'\nimport { getTransactionFlags } from '../../actions/transactionFlags'\nimport { getFlagColors } from '../../actions/flagColors'\nimport { getLinkAccounts, getLinkTransactions } from '../../actions/link'\nimport { getRecurringTransactions } from '../../actions/recurring'\nimport { getTransactionHistory } from '../../actions/history'\nimport { getHoldings } from '../../actions/holdings'\nimport { getSecurities } from '../../actions/securities'\n\nclass AppLoading extends Component {\n\n componentDidMount() {\n const {\n yearMonth, themeLoaded, accountGroupsLoaded, accountTypesLoaded, payeesLoaded, transfersLoaded,\n splitsLoaded, accountsLoaded, collectionsLoaded, categoriesLoaded,\n categoryBudgetsLoaded, transactionsLoaded, transactionFlagsLoaded,\n flagColorsLoaded, linkAccountsLoaded, linkTransactionsLoaded, recurringTransactionsLoaded,\n historyTransactionsLoaded, holdingsLoaded, securitiesLoaded\n } = this.props\n\n if (!themeLoaded) this.props.getThemes()\n if (!accountGroupsLoaded) this.props.getAccountGroups()\n if (!accountTypesLoaded) this.props.getAccountTypes()\n if (!payeesLoaded) this.props.getPayees()\n if (!transfersLoaded) this.props.getTransfers()\n if (!splitsLoaded) this.props.getSplits()\n if (!accountsLoaded) this.props.getAccounts()\n if (!collectionsLoaded) this.props.getCollections(yearMonth)\n if (!categoriesLoaded) this.props.getCategories(yearMonth)\n if (!categoryBudgetsLoaded) this.props.getCategoryBudgets(yearMonth)\n if (!transactionsLoaded) this.props.getTransactions(yearMonth)\n if (!transactionFlagsLoaded) this.props.getTransactionFlags()\n if (!flagColorsLoaded) this.props.getFlagColors()\n if (!linkAccountsLoaded) this.props.getLinkAccounts()\n if (!linkTransactionsLoaded) this.props.getLinkTransactions()\n if (!recurringTransactionsLoaded) this.props.getRecurringTransactions()\n if (!historyTransactionsLoaded) this.props.getTransactionHistory()\n if (!holdingsLoaded) this.props.getHoldings()\n if (!securitiesLoaded) this.props.getSecurities(yearMonth)\n }\n\n render() {\n const {\n themeLoaded, accountGroupsLoaded, accountTypesLoaded, payeesLoaded, transfersLoaded, splitsLoaded,\n accountsLoaded, collectionsLoaded, categoriesLoaded,\n categoryBudgetsLoaded, transactionsLoaded, flagColorsLoaded,\n transactionFlagsLoaded, holdingsLoaded, securitiesLoaded\n } = this.props\n\n if (themeLoaded && accountGroupsLoaded && accountTypesLoaded && payeesLoaded && transfersLoaded && splitsLoaded\n && accountsLoaded && collectionsLoaded && categoriesLoaded && categoryBudgetsLoaded && transactionsLoaded\n && flagColorsLoaded && transactionFlagsLoaded && holdingsLoaded && securitiesLoaded) {\n return this.props.children\n } else {\n return <Loading />\n }\n }\n}\n\nAppLoading.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n themeLoaded: PropTypes.bool.isRequired,\n accountGroupsLoaded: PropTypes.bool.isRequired,\n accountTypesLoaded: PropTypes.bool.isRequired,\n payeesLoaded: PropTypes.bool.isRequired,\n transfersLoaded: PropTypes.bool.isRequired,\n splitsLoaded: PropTypes.bool.isRequired,\n accountsLoaded: PropTypes.bool.isRequired,\n collectionsLoaded: PropTypes.bool.isRequired,\n categoriesLoaded: PropTypes.bool.isRequired,\n categoryBudgetsLoaded: PropTypes.bool.isRequired,\n transactionsLoaded: PropTypes.bool.isRequired,\n transactionFlagsLoaded: PropTypes.bool.isRequired,\n flagColorsLoaded: PropTypes.bool.isRequired,\n holdingsLoaded: PropTypes.bool.isRequired,\n securitiesLoaded: PropTypes.bool.isRequired,\n getAccountTypes: PropTypes.func.isRequired,\n getPayees: PropTypes.func.isRequired,\n getTransfers: PropTypes.func.isRequired,\n getSplits: PropTypes.func.isRequired,\n getAccounts: PropTypes.func.isRequired,\n getCollections: PropTypes.func.isRequired,\n getCategories: PropTypes.func.isRequired,\n getCategoryBudgets: PropTypes.func.isRequired,\n getTransactions: PropTypes.func.isRequired,\n getTransactionFlags: PropTypes.func.isRequired,\n getFlagColors: PropTypes.func.isRequired,\n getLinkAccounts: PropTypes.func.isRequired,\n getLinkTransactions: PropTypes.func.isRequired,\n getRecurringTransactions: PropTypes.func.isRequired,\n getTransactionHistory: PropTypes.func.isRequired,\n getHoldings: PropTypes.func.isRequired,\n getSecurities: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n yearMonth: state.budgetMonthReducer.yearMonth,\n themeLoaded: state.themeReducer.isLoaded,\n accountGroupsLoaded: state.accountGroupReducer.isLoaded,\n accountTypesLoaded: state.accountTypeReducer.isLoaded,\n payeesLoaded: state.payeeReducer.isLoaded,\n transfersLoaded: state.transferReducer.isLoaded,\n splitsLoaded: state.splitReducer.isLoaded,\n accountsLoaded: state.accountReducer.isLoaded,\n collectionsLoaded: state.collectionReducer.isLoaded,\n categoriesLoaded: state.categoryReducer.isLoaded,\n categoryBudgetsLoaded: state.categoryBudgetReducer.isLoaded,\n transactionsLoaded: state.transactionReducer.isLoaded,\n transactionFlagsLoaded: state.transactionFlagReducer.isLoaded,\n flagColorsLoaded: state.flagColorReducer.isLoaded,\n linkAccountsLoaded: state.linkReducer.isAccountLoaded,\n linkTransactionsLoaded: state.linkReducer.isTransactionLoaded,\n recurringTransactionsLoaded: state.linkReducer.isRecurringTransactionsLoaded,\n historyTransactionsLoaded: state.historyReducer.isLoaded,\n holdingsLoaded: state.holdingReducer.isLoaded,\n securitiesLoaded: state.securityReducer.isLoaded\n})\n\nconst mapDispatchToProps = {\n getThemes,\n getAccountGroups,\n getAccountTypes,\n getPayees,\n getTransfers,\n getSplits,\n getAccounts,\n getCollections,\n getCategories,\n getCategoryBudgets,\n getTransactions,\n getTransactionFlags,\n getFlagColors,\n getLinkAccounts,\n getLinkTransactions,\n getRecurringTransactions,\n getTransactionHistory,\n getHoldings,\n getSecurities\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AppLoading)\n","import axios from 'axios'\nimport { returnErrors } from './messages'\nimport { GET_THEMES, THEME_LOADING, THEME_FAIL } from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get AccountTypes\nexport const getThemes = () => (dispatch, getState) => {\n dispatch({ type: THEME_LOADING })\n axios.get(`${proxy}/v1/themes/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_THEMES,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: THEME_FAIL })\n })\n}\n","import axios from 'axios'\nimport { returnErrors } from './messages'\nimport {\n GET_ACCOUNT_TYPES, ACCOUNT_TYPE_LOADING, ACCOUNT_TYPE_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get AccountTypes\nexport const getAccountTypes = () => (dispatch, getState) => {\n dispatch({ type: ACCOUNT_TYPE_LOADING })\n axios.get(`${proxy}/v1/account_types/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_ACCOUNT_TYPES,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: ACCOUNT_TYPE_FAIL })\n })\n}\n","import axios from 'axios'\nimport { returnErrors } from './messages'\nimport {\n GET_FLAG_COLORS, FLAG_COLOR_LOADING, FLAG_COLOR_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get transaction flags\nexport const getFlagColors = () => (dispatch, getState) => {\n dispatch({ type: FLAG_COLOR_LOADING })\n axios.get(`${proxy}/v1/flag_colors/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_FLAG_COLORS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: FLAG_COLOR_FAIL })\n })\n}\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_RECURRING_TRANSACTIONS, RECURRING_TRANSACTIONS_LOADING, RECURRING_TRANSACTIONS_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst PROXY = process.env.REACT_APP_PROXY\n\n\n// Get recurring transactions.\nexport const getRecurringTransactions = () => (dispatch, getState) => {\n dispatch({ type: RECURRING_TRANSACTIONS_LOADING })\n\n axios.get(`${PROXY}/v1/recurring_transactions/`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_RECURRING_TRANSACTIONS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: RECURRING_TRANSACTIONS_FAIL })\n })\n}\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n TextField,\n Button,\n Grid,\n Card,\n CardContent,\n CardHeader,\n Autocomplete,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography\n} from '@mui/material'\nimport { Save, Cancel, Delete, DeleteForever } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from '../layout/DraggableDialogWrapper'\nimport { editProfile, deleteUserAccount } from '../../actions/auth'\nimport { editProfileSettings, addProfileSettings } from '../../actions/profile'\nimport { fullScreen, Transition } from '../utilities/dialogs'\n\nconst styles = theme => ({\n ...sharedStyles(theme)\n})\n\nclass Settings extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n firstName: this.props.auth.user.first_name,\n lastName: this.props.auth.user.last_name,\n theme: null,\n showDeleteConfirmation: false,\n confirmPassword: '',\n isValidPassword: false,\n passwordError: false\n }\n\n this.handleChange = this.handleChange.bind(this)\n this.handleAutocompleteChange = this.handleAutocompleteChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handlePasswordChange = this.handlePasswordChange.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.confirmationDialog = this.confirmationDialog.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n }\n\n componentDidMount() {\n const { profile } = this.props\n\n if (profile && profile.theme) {\n const themeId = profile.theme_id\n const theme = profile.theme\n this.setState({ theme: { id: themeId, name: theme } })\n }\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { profile } = this.props\n\n if (profile && profile !== prevProps.profile) {\n const themeId = profile.theme_id\n const theme = profile.theme\n this.setState({ theme: { id: themeId, name: theme } })\n }\n }\n\n /**\n * Handles input change.\n * @param {Object} e - The input event object.\n */\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n /**\n * Handles the theme autocomplete field.\n * @param {Object} event - The event object.\n * @param {Object} value - The selected item from the list.\n */\n handleAutocompleteChange = (event, value) => {\n if (value) this.setState({ theme: value })\n }\n\n /**\n * Submit the form to update user settings and profile information.\n * @param {Object} e - The submit event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n\n try {\n const { firstName, lastName, theme } = this.state\n const { editProfile, editProfileSettings, addProfileSettings, profile } = this.props\n const { user } = this.props.auth\n const authProfile = { id: user.id, first_name: firstName, last_name: lastName }\n\n // Check if user updated their name.\n if (user.first_name !== firstName || user.last_name !== lastName) {\n editProfile(authProfile)\n }\n\n // Check if user changed theme. Also check if user has a theme yet.\n if (profile && profile.id > 0) {\n // Record exist. Check if user changed theme.\n if (theme.id !== profile.theme_id) {\n const settings = { id: profile.id, user_id: user.id, theme_id: theme.id }\n editProfileSettings(settings)\n }\n } else {\n // No record exist. Check if user added a theme\n if (profile && !profile.theme_id && theme && theme.id) {\n const new_setting = {\n user_id: user.id,\n theme_id: theme.id\n }\n addProfileSettings(new_setting)\n }\n }\n } catch (e) {}\n }\n\n /**\n * Update validation and password value as user types.\n * @param {Object} e - The input event\n */\n handlePasswordChange = e => {\n const value = e.target.value\n\n if (value && value.trim().length >= 8) {\n this.setState({\n confirmPassword: value,\n isValidPassword: true,\n passwordError: false\n })\n } else {\n this.setState({\n confirmPassword: value,\n isValidPassword: false\n })\n }\n }\n\n /**\n * Clears the confirm password field and closes the confirmation\n * dialog.\n */\n clearForm = () => {\n this.setState({\n showDeleteConfirmation: false,\n confirmPassword: '',\n isValidPassword: false,\n passwordError: false\n })\n }\n\n /**\n * Display the confirmation dialog for the user before permanently\n * deleting the users account and data.\n * @param {Object} e - The click event object.\n */\n confirmationDialog = e => this.setState({ showDeleteConfirmation: true })\n\n /**\n * *** DANGER ***\n * Permanently deletes the users account and data.\n * NOTE: This does not auto-cancel a users subscriptions or unlink\n * Ploutos Budget from their banking institutions.\n */\n handleDelete = () => {\n const { confirmPassword, isValidPassword } = this.state\n const { deleteUserAccount } = this.props\n\n if (!isValidPassword) {\n this.setState({ passwordError: true })\n return false\n }\n\n const password = {\n current_password: confirmPassword\n }\n\n deleteUserAccount(password)\n }\n\n render() {\n const { firstName, lastName, theme, showDeleteConfirmation, confirmPassword, passwordError } =\n this.state\n const { email } = this.props.auth.user\n const { classes, themes } = this.props\n\n return (\n <>\n <Grid container>\n <Grid item xs={12}>\n <Card raised={true}>\n <CardContent>\n <Grid container>\n <Grid item xs={6}>\n <CardHeader\n className={`${classes.pl0} ${classes.collectionLabel}`}\n title=\"Settings\"\n subheader=\"Profile\"\n />\n </Grid>\n <Grid item xs={6}>\n <Button\n onClick={this.confirmationDialog}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\"\n >\n <Delete className={classes.pr1} />\n Delete\n </Button>\n </Grid>\n </Grid>\n <form onSubmit={this.handleSubmit}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n disabled\n value={email}\n type=\"email\"\n label=\"Email\"\n fullWidth={true}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.handleChange}\n value={firstName}\n name=\"firstName\"\n type=\"text\"\n label=\"First Name\"\n fullWidth={true}\n />\n </Grid>\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.handleChange}\n value={lastName}\n name=\"lastName\"\n type=\"text\"\n label=\"Last Name\"\n fullWidth={true}\n />\n </Grid>\n <Grid item xs={12}>\n <Autocomplete\n name=\"theme\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={theme}\n options={themes}\n isOptionEqualToValue={(option, value) => option.id === value.id}\n getOptionLabel={option => (option.name ? option.name : '')}\n onChange={this.handleAutocompleteChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n renderInput={params => (\n <TextField {...params} label=\"Theme\" margin=\"normal\" />\n )}\n />\n </Grid>\n <Grid item xs={12}>\n <Button fullWidth={true} type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save className={classes.pr1} />\n Save\n </Button>\n </Grid>\n </Grid>\n </form>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n\n <Dialog\n open={showDeleteConfirmation}\n aria-labelledby=\"user-account-delete-confirmation\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\"\n fullWidth={true}\n >\n <DialogTitle className={`${classes.fontError} ${classes.moveCursor}`}>\n Warning\n </DialogTitle>\n\n <DialogContent>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Typography variant=\"body1\" gutterBottom>\n Deleting your account is permanent and means that all of your data will be\n deleted.\n <br />\n <br />\n Deleting your account data does not auto-cancel your subscription.\n <br />\n <br />\n If you experience any difficulties managing your account, please don't hesitate to\n contact us.\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <TextField\n required\n autoComplete=\"off\"\n onChange={this.handlePasswordChange}\n value={confirmPassword}\n name=\"confirmPassword\"\n label=\"Confirm Password\"\n type=\"password\"\n error={passwordError}\n helperText={passwordError ? 'Password must be at least 8 characters long.' : null}\n fullWidth={true}\n />\n </Grid>\n </Grid>\n </DialogContent>\n\n <DialogActions>\n <Button onClick={this.handleDelete} color=\"error\" variant=\"contained\">\n <DeleteForever />\n Delete Account\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel />\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </>\n )\n }\n}\n\nSettings.propTypes = {\n auth: PropTypes.object.isRequired,\n themes: PropTypes.array.isRequired,\n profile: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n themes: state.themeReducer.themes,\n profile: state.profileReducer.profile\n})\n\nconst mapDispatchToProps = {\n editProfile,\n editProfileSettings,\n addProfileSettings,\n deleteUserAccount\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(Settings))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n FormControl, FormHelperText, InputLabel, Select, MenuItem, Button,\n TextField, Dialog, DialogActions, DialogContent, Typography,\n DialogTitle, Grid\n} from '@mui/material'\nimport { PlaidLink } from 'react-plaid-link'\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'\nimport { Save, Cancel, Delete, Inventory, Refresh, LinkOff, Build } from '@mui/icons-material'\n\nimport { sharedStyles, SwitchPositive } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { addAccount, editAccount, deleteAccount } from '../../actions/accounts'\nimport { editAccountId } from '../../actions/accountId'\nimport { refreshLinkTransactions, fixLinkToken, deleteFixToken } from '../../actions/link'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { moneyInput, formatMoney } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst filter = createFilterOptions()\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass AccountForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: { error: null, helperText: '', },\n type: { error: null, helperText: '', },\n availableBalance: { error: null, helperText: '', },\n linkAccount: { error: null, helperText: '', },\n },\n categoryError: false,\n categoryHelperText: '',\n open: false,\n name: '',\n typeId: '',\n accountTypeCode: '',\n categoryOptions: [],\n category: { id: 0, name: '' },\n amountPositive: true,\n availableBalance: '',\n canDelete: true,\n linkAccount: { id: 0, name: '', status: null }\n }\n\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleLinkAccountChange = this.handleLinkAccountChange.bind(this)\n this.updateCategoryOptions = this.updateCategoryOptions.bind(this)\n this.handleAccountTypeChange = this.handleAccountTypeChange.bind(this)\n this.handleCategoryChange = this.handleCategoryChange.bind(this)\n this.handleAmountPositive = this.handleAmountPositive.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n this.handleRefresh = this.handleRefresh.bind(this)\n this.handleFix = this.handleFix.bind(this)\n }\n\n componentDidMount() {\n this.updateCategoryOptions()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { accountId, accounts, linkAccounts, categories } = this.props\n\n if (accountId !== prevProps.accountId && accountId >= 0) {\n if (accountId === 0) {\n // New account record.\n this.setState({ open: true })\n } else if (accountId > 0) {\n // Update an existing account record.\n let linkCategory = { id: 0, name: '' }\n let linkAccount = { id: 0, name: '', status: null }\n\n for (let account of accounts) {\n if (accountId === account.id) {\n\n // Get the link account if exists\n for (const link of linkAccounts) {\n if (link.id === account.link_id) {\n linkAccount = link\n break\n }\n }\n\n // Get the link category if exists\n for (const category of categories) {\n if (category.id === account.category_id) {\n linkCategory = category\n break\n }\n }\n\n let accountTypeCode = account.type_code ? account.type_code.trim().toUpperCase() : ''\n let amountPositive = account.available_balance >= 0\n let amount = Math.abs(account.available_balance)\n let canDelete = account.can_delete\n\n this.setState({\n open: true,\n name: account.name,\n amountPositive: amountPositive,\n typeId: account.type_id,\n accountTypeCode,\n availableBalance: amount,\n canDelete,\n linkAccount,\n category: linkCategory\n })\n\n // End loop\n break\n }\n }\n }\n }\n\n // Update category options\n if (categories && categories !== prevProps.categories) this.updateCategoryOptions()\n }\n\n clearForm = () => {\n this.props.editAccountId(-1)\n this.setState({\n open: false,\n name: '',\n amountPositive: true,\n typeId: '',\n accountTypeCode: '',\n category: { id: 0, name: '' },\n availableBalance: '',\n canDelete: true,\n linkAccount: { id: 0, name: '', status: null },\n categoryError: false,\n categoryHelperText: ''\n })\n }\n\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n handleInputChange = e => {\n if (moneyInput(e.target.value)) {\n this.setState({ [e.target.name]: e.target.value })\n }\n }\n\n handleAmountPositive = () => this.setState({ amountPositive: !this.state.amountPositive })\n\n /**\n * If the categories prop is updated then update the link\n * category options.\n */\n updateCategoryOptions = () => {\n const { categories } = this.props\n let categoryOptions = []\n\n categories.map(c => {\n if (c.name && c.name.trim().toLowerCase() !== 'budget' && c.name.trim().toLowerCase() !== 'split') {\n categoryOptions.push(c)\n }\n })\n\n this.setState({ categoryOptions })\n }\n\n handleAccountTypeChange = e => {\n const { accountTypes } = this.props\n const typeId = e.target.value\n\n let accountTypeCode = accountTypes.filter(t => t.id === typeId)\n accountTypeCode = accountTypeCode && accountTypeCode[0] && accountTypeCode[0].code ? accountTypeCode[0].code : ''\n accountTypeCode = accountTypeCode.trim().toUpperCase()\n\n this.setState({\n [e.target.name]: typeId,\n accountTypeCode,\n category: { id: 0, name: '' },\n categoryError: false,\n categoryHelperText: ''\n })\n }\n\n handleCategoryChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({ category: { id: 0, name: '' } })\n } else if (value) {\n\n this.setState({\n category: value,\n categoryError: false,\n categoryHelperText: ''\n })\n }\n }\n\n handleLinkAccountChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({ linkAccount: { id: 0, name: '', status: null } })\n } else if (value) {\n this.setState({ linkAccount: value })\n }\n }\n\n /**\n * Submit the new account form.\n * current_balance is set on account creation and never changed.\n * @param {Object} e - The event object\n */\n handleSubmit = e => {\n e.preventDefault()\n\n try {\n\n const { name, typeId, accountTypeCode, category, amountPositive, availableBalance, linkAccount } = this.state\n const { accountId, yearMonth } = this.props\n const { user } = this.props.auth\n\n const linkAccountId = linkAccount && linkAccount.id ? linkAccount.id : null\n const categoryId = category && category.id ? category.id : null\n let netAmount = amountPositive ? availableBalance : -Math.abs(availableBalance)\n netAmount = formatMoney(netAmount)\n\n // If the account type is an investment then balance is 0.\n if (accountTypeCode === 'F') netAmount = 0\n\n\n // If the account type is a loan then a link category is required.\n if ((accountTypeCode === 'E') && !categoryId) {\n this.setState({\n categoryError: true,\n categoryHelperText: 'Loan accounts need a link category. Select a current category or create a new one.'\n })\n\n return false\n }\n\n if (accountId > 0) {\n const account = {\n id: accountId,\n name,\n type_id: typeId,\n category_id: categoryId,\n available_balance: netAmount,\n user_id: user.id,\n link_id: linkAccountId\n }\n\n this.props.editAccount(account, yearMonth)\n } else {\n const account = {\n name,\n type_id: typeId,\n category_id: categoryId,\n current_balance: netAmount,\n available_balance: netAmount,\n user_id: user.id,\n link_id: linkAccountId\n }\n\n this.props.addAccount(account, yearMonth)\n }\n\n this.clearForm()\n } catch (e) {\n this.props.returnErrors({ updateAccount: 'Unable to add an account at this time. Please try again later.' }, 500)\n return false\n }\n }\n\n /**\n * This will delete the account permanently if there are no\n * transactions or investment holdings tied to this account.\n * Otherwise, if there are transactions tied to this account it will\n * set the archive flag to true.\n */\n handleDelete = () => {\n const { accountId, yearMonth } = this.props\n\n this.props.deleteAccount(accountId, yearMonth)\n this.clearForm()\n }\n\n /**\n * If the account is a linked then we can use the account id to\n * refresh the link transactions.\n * @param {Object} linkAccount - The selected link account.\n */\n handleRefresh = linkAccount => {\n const id = linkAccount && linkAccount.id > 0 ? linkAccount.id : 0\n if (id > 0) this.props.refreshLinkTransactions(id)\n this.clearForm()\n }\n\n /**\n * Used to fix the link account.\n * @param {Object} linkAccount - The selected link account.\n */\n handleFix = linkAccount => {\n const id = linkAccount && linkAccount.id > 0 ? linkAccount.id : 0\n if (id > 0) this.props.fixLinkToken(id)\n }\n\n /**\n * The user exited the Link flow.\n * @param err\n * @param metadata\n * @return {boolean}\n */\n onExit = (err, metadata) => {\n this.props.deleteFixToken()\n if (err != null) {\n // The user encountered a Plaid API error prior to exiting.\n return false\n }\n }\n\n /**\n * The Link was successfully updated.\n * You do not need to repeat the /item/public_token/exchange\n * process when a user uses Link in update mode.\n * The Item's access_token has not changed.\n * @param public_token\n * @param metadata\n */\n onSuccess = (public_token, metadata) => {\n const { linkAccount } = this.state\n const id = linkAccount && linkAccount.id > 0 ? linkAccount.id : 0\n\n this.props.deleteFixToken()\n this.props.refreshLinkTransactions(id)\n this.clearForm()\n }\n\n render() {\n const {\n open, error, name, typeId, accountTypeCode, category, categoryOptions,\n amountPositive, availableBalance, canDelete, linkAccount,\n categoryError, categoryHelperText\n } = this.state\n const {\n classes, theme, accountId, accountTypes, linkAccounts, fixToken\n } = this.props\n\n const deleteButton = canDelete\n ? (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n )\n : (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Inventory className={classes.pr1} />Archive\n </Button>\n )\n\n const fixButton = (\n <Button onClick={() => this.handleFix(linkAccount)}\n className={classes.ml1}\n color=\"inherit\"\n variant=\"outlined\">\n <LinkOff className={classes.pr1} fontSize=\"medium\" />Link Error\n </Button>\n )\n\n const refreshButton = (\n <DialogActions className={classes.dialogActionLeftButton}>\n <Button onClick={() => this.handleRefresh(linkAccount)}\n color=\"inherit\"\n variant=\"outlined\">\n <Refresh className={classes.pr1} fontSize=\"medium\" />Refresh\n </Button>\n </DialogActions>\n )\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"account-form\"\n disableEnforceFocus\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Account\n {accountId > 0 && linkAccount && linkAccount.status && fixButton}\n {accountId > 0 && deleteButton}\n {linkAccount && linkAccount.status && fixToken &&\n <PlaidLink token={fixToken}\n className={`${classes.ml1} ${classes.customButton} MuiButtonBase-root MuiButton-root MuiButton-outlined AccountForm-ml1-316 MuiButton-outlinedPrimary`}\n onExit={this.onExit}\n onSuccess={this.onSuccess}>\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Build className={classes.pr1} fontSize=\"medium\" />\n <Typography align=\"center\" variant=\"button\" noWrap>Fix</Typography>\n </Grid>\n </PlaidLink>\n }\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={12}>\n <TextField required\n name=\"name\"\n value={name}\n onChange={this.handleChange}\n error={error.name.error}\n helperText={error.name.helperText}\n autoFocus\n margin=\"dense\"\n id=\"accountName\"\n label=\"Account Name\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={12}>\n <FormControl variant=\"standard\" fullWidth error={error.type.error}>\n <InputLabel id=\"accountTypeLabel\">Account Type</InputLabel>\n <Select required\n variant=\"standard\"\n labelId=\"accountTypeLabel\"\n name=\"typeId\"\n value={typeId}\n onChange={this.handleAccountTypeChange}>\n {accountTypes.map(type => {\n return (\n <MenuItem key={type.id} value={type.id}>{type.name}</MenuItem>\n )\n })}\n </Select>\n {error.type.error\n ? <FormHelperText>{error.type.helperText}</FormHelperText>\n : null}\n </FormControl>\n </Grid>\n\n {accountTypeCode === 'E' &&\n <Grid item xs={12}>\n <Autocomplete\n name=\"category\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={category}\n options={categoryOptions}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={option => option.name ? option.name : ''}\n onChange={this.handleCategoryChange}\n renderOption={(props, option) => <li {...props} key={option.id}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField error={categoryError}\n helperText={categoryHelperText}\n margin=\"dense\"\n id=\"category\"\n label=\"Link Category\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n }\n\n <Grid item xs={12}>\n <Autocomplete\n name=\"linkAccount\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={linkAccount}\n options={linkAccounts}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={option => option.name && option.official_name ? `${option.name} - ${option.official_name}` : option.name ? option.name : ''}\n onChange={this.handleLinkAccountChange}\n renderOption={(props, option) => (\n <li {...props} key={option.id}>\n {option.name && option.official_name ? `${option.name} - ${option.official_name}` : option.name ? option.name : ''}\n </li>\n )}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField error={error.linkAccount.error}\n helperText={error.linkAccount.helperText}\n margin=\"dense\"\n id=\"linkAccount\"\n label=\"Link Account (optional)\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n\n {accountTypeCode !== 'F' &&\n <>\n <Grid item xs={4}>\n <Grid container alignItems=\"center\" justifyContent=\"center\" spacing={1} wrap=\"nowrap\">\n <Grid item>-</Grid>\n <Grid item>\n <SwitchPositive checked={amountPositive}\n onChange={this.handleAmountPositive}\n name=\"amountPositive\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />\n </Grid>\n <Grid item>+</Grid>\n </Grid>\n </Grid>\n <Grid item xs={8}>\n <TextField required\n name=\"availableBalance\"\n value={availableBalance}\n onChange={this.handleInputChange}\n error={error.availableBalance.error}\n helperText={error.availableBalance.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"accountAvailableBalance\"\n label=\"Account Balance\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n </>\n }\n </Grid>\n </DialogContent>\n <DialogActions>\n {accountId > 0 && linkAccount && linkAccount.id > 0 && refreshButton}\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nAccountForm.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n addAccount: PropTypes.func.isRequired,\n editAccount: PropTypes.func.isRequired,\n deleteAccount: PropTypes.func.isRequired,\n editAccountId: PropTypes.func.isRequired,\n returnErrors: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n accountTypes: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n accounts: PropTypes.array.isRequired,\n accountId: PropTypes.number.isRequired,\n linkAccounts: PropTypes.array.isRequired,\n refreshLinkTransactions: PropTypes.func.isRequired,\n fixLinkToken: PropTypes.func.isRequired,\n deleteFixToken: PropTypes.func.isRequired,\n fixToken: PropTypes.string\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n accountTypes: state.accountTypeReducer.accountTypes,\n categories: state.categoryReducer.categories,\n accounts: state.accountReducer.accounts,\n accountId: state.accountIdReducer.accountId,\n linkAccounts: state.linkReducer.linkAccounts,\n fixToken: state.linkReducer.fixToken\n})\n\nconst mapDispatchToProps = {\n addAccount,\n editAccount,\n deleteAccount,\n editAccountId,\n refreshLinkTransactions,\n fixLinkToken,\n deleteFixToken,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(AccountForm))\n","import React, { Component, Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Settings from './Settings'\nimport AccountForm from '../layout/AccountForm'\n\nclass SettingsDashboard extends Component {\n\n render() {\n return (\n <AppLoading>\n <Fragment>\n <Settings />\n <AccountForm />\n </Fragment>\n </AppLoading>\n )\n }\n}\n\nexport default SettingsDashboard\n","import React, { Fragment, useEffect } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { DateTime } from 'luxon'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button,\n Link,\n Box,\n Card,\n CardHeader,\n CardContent,\n Grid,\n Typography,\n Divider\n} from '@mui/material'\nimport { Loyalty, Today, CardGiftcard, Lock } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { createCheckoutSession, createCustomerPortal } from '../../actions/membership'\nimport { logout } from '../../actions/auth'\n\nconst styles = theme => ({\n title: {\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.primary.main\n },\n descriptionContainer: {\n marginTop: theme.spacing(4)\n },\n description: {\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(3),\n color: theme.palette.primary.main\n },\n descriptionIcon: {\n background: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n height: 48,\n width: 48,\n borderRadius: 100,\n fontSize: 32,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center'\n },\n ...sharedStyles(theme)\n})\n\nfunction Membership({\n classes,\n customer,\n createCheckoutSession,\n createCustomerPortal,\n checkoutSessionURL,\n logout\n}) {\n const monthlyMembershipPriceId = process.env.REACT_APP_MONTHLY_MEMBERSHIP_PRICE_ID\n const annualMembershipPriceId = process.env.REACT_APP_ANNUAL_MEMBERSHIP_PRICE_ID\n const currentDate = DateTime.local().toISODate()\n const checkoutSession = priceId => createCheckoutSession(priceId)\n const customerSince =\n customer && customer[0] && customer[0].created\n ? DateTime.fromISO(customer[0].created).toLocaleString()\n : null\n\n // Get membership and subscription information\n let membershipActive = true\n let subscriptions = ''\n let subscriptionKey = ''\n let subscription = ''\n let subscriptionStatus = ''\n let subscriptionPeriodEnd = ''\n let subscriptionStore = ''\n try {\n const subscriber =\n customer && customer[0] && customer[0].subscriber ? customer[0].subscriber : null\n const member =\n subscriber && subscriber.subscriber && subscriber.subscriber.entitlements.member\n ? subscriber.subscriber.entitlements.member\n : null\n if (!member || Object.keys(member).length <= 0 || member.expires_date < currentDate)\n membershipActive = false\n if (membershipActive) {\n // Active membership\n subscriptions =\n subscriber && subscriber.subscriber && subscriber.subscriber.subscriptions\n ? subscriber.subscriber.subscriptions\n : null\n subscriptionKey = member && member.product_identifier ? member.product_identifier : null\n subscription = subscriptions && subscriptionKey ? subscriptions[subscriptionKey] : null\n subscriptionStatus = subscription && subscription.period_type ? subscription.period_type : ''\n if (subscriptionStatus && subscriptionStatus === 'normal') subscriptionStatus = 'Active'\n else if (subscriptionStatus && subscriptionStatus === 'trial')\n subscriptionStatus = 'Free Trial'\n subscriptionPeriodEnd =\n subscription && subscription.expires_date\n ? DateTime.fromISO(subscription.expires_date).toLocaleString()\n : ''\n subscriptionStore = subscription && subscription.store ? subscription.store : null\n if (subscriptionStore && subscriptionStore === 'app_store') subscriptionStore = 'App Store'\n else if (subscriptionStore && subscriptionStore === 'play_store')\n subscriptionStore = 'Play Store'\n }\n } catch (error) {\n // TODO: handle error\n membershipActive = false\n }\n\n useEffect(() => {\n if (checkoutSessionURL) window.open(checkoutSessionURL, '_self')\n }, [checkoutSessionURL])\n\n /**\n * Logout the user.\n * @param {Object} event - The event object.\n */\n function handleLogout(event) {\n logout()\n }\n\n return (\n <Fragment>\n {membershipActive ? (\n <Grid container>\n <Grid item xs={12}>\n <Card raised={true}>\n <CardContent>\n <CardHeader\n title=\"Member\"\n subheader={customerSince ? `Since ${customerSince}` : ''}\n titleTypographyProps={{ className: classes.title }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} align=\"center\">\n <Typography>\n <b>Status:</b> {subscriptionStatus}\n </Typography>\n </Grid>\n <Grid item xs={12}>\n <Divider variant=\"middle\" />\n </Grid>\n <Grid item xs={12} align=\"center\">\n <Typography>\n <b>Period Ends:</b> {subscriptionPeriodEnd}\n </Typography>\n </Grid>\n <Grid item xs={12} align=\"center\">\n {subscriptionStore && subscriptionStore === 'stripe' ? (\n <Button\n fullWidth={true}\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n onClick={() => createCustomerPortal()}\n >\n <Loyalty className={classes.pr1} />\n Manage Membership\n </Button>\n ) : (\n <Typography>\n Your membership was purchased through the {subscriptionStore} and can only\n be managed there.\n </Typography>\n )}\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n ) : (\n <Grid container spacing={1}>\n <Grid item xs={12} align=\"center\" className={classes.mb1}>\n <img\n alt=\"Ploutos Budget logo\"\n height={80}\n src=\"/static/ploutos.svg\"\n style={{ marginTop: -32 }}\n />\n </Grid>\n\n <Grid item xs={12} align=\"center\">\n <CardContent>\n <Grid item xs={12} align=\"center\">\n <Typography variant=\"h5\" component=\"h1\" className={classes.title}>\n How your free trial works\n </Typography>\n </Grid>\n\n <Grid\n item\n xs={12}\n align=\"center\"\n container\n direction=\"row\"\n className={classes.descriptionContainer}\n >\n <Grid\n item\n xs={3}\n container\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Grid className={classes.descriptionIcon}>\n <Today fontSize=\"inherit\" color=\"inherit\" />\n </Grid>\n </Grid>\n\n <Grid item className={classes.description} xs={7}>\n <Typography variant=\"body1\" noWrap align=\"left\" className={classes.title}>\n Today\n </Typography>\n <Typography variant=\"body1\" align=\"left\">\n Free for one month\n </Typography>\n </Grid>\n </Grid>\n\n <Grid\n item\n xs={12}\n align=\"center\"\n container\n direction=\"row\"\n className={classes.descriptionContainer}\n >\n <Grid\n item\n xs={3}\n container\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Grid className={classes.descriptionIcon}>\n <CardGiftcard fontSize=\"inherit\" color=\"inherit\" />\n </Grid>\n </Grid>\n\n <Grid item className={classes.description} xs={7}>\n <Typography variant=\"body1\" noWrap align=\"left\" className={classes.title}>\n Enjoy Free Trial\n </Typography>\n <Typography variant=\"body1\" align=\"left\">\n Enjoy all of the features. You can cancel anytime during the one month free\n trial right inside the application.\n </Typography>\n </Grid>\n </Grid>\n\n <Grid\n item\n xs={12}\n align=\"center\"\n container\n direction=\"row\"\n className={classes.descriptionContainer}\n >\n <Grid\n item\n xs={3}\n container\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n >\n <Grid className={classes.descriptionIcon}>\n <Loyalty fontSize=\"inherit\" color=\"inherit\" />\n </Grid>\n </Grid>\n\n <Grid item className={classes.description} xs={7}>\n <Typography variant=\"body1\" noWrap align=\"left\" className={classes.title}>\n In 1 Month\n </Typography>\n <Typography variant=\"body1\" align=\"left\">\n Your subscription starts and you will be charged based on the plan you selected.\n </Typography>\n </Grid>\n </Grid>\n </CardContent>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <Card raised={true}>\n <CardContent>\n <CardHeader\n title=\"Annual Membership\"\n subheader=\"Save $35.89\"\n titleTypographyProps={{ className: classes.title }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} align=\"center\">\n <Typography>$59.99/year</Typography>\n </Grid>\n <Grid item xs={12}>\n <Divider variant=\"middle\" />\n </Grid>\n <Grid item xs={12} align=\"center\">\n <Typography>After 1 month free trial</Typography>\n </Grid>\n <Grid item xs={12}>\n <Button\n fullWidth={true}\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n onClick={() => checkoutSession(annualMembershipPriceId)}\n >\n <Loyalty className={classes.pr1} />\n Select this plan\n </Button>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </Grid>\n\n <Grid item xs={12} md={6}>\n <Card raised={true}>\n <CardContent>\n <CardHeader\n title=\"Monthly Membership\"\n subheader=\" \"\n titleTypographyProps={{ className: classes.title }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} align=\"center\">\n <Typography>$7.99/month</Typography>\n </Grid>\n <Grid item xs={12}>\n <Divider variant=\"middle\" />\n </Grid>\n <Grid item xs={12} align=\"center\">\n <Typography>After 1 month free trial</Typography>\n </Grid>\n <Grid item xs={12}>\n <Button\n fullWidth={true}\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n onClick={() => checkoutSession(monthlyMembershipPriceId)}\n >\n <Loyalty className={classes.pr1} />\n Select this plan\n </Button>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n </Grid>\n\n <Box mt={5}>\n <Grid\n container\n item\n xs={12}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n spacing={2}\n >\n <Grid item xs={9}>\n <Typography align=\"center\">\n After 1 month free trial, cancel anytime. Subscriptions will automatically renew\n unless canceled at least 24 hours before each renewal date.\n </Typography>\n </Grid>\n\n <Grid item xs={9}>\n <Typography align=\"center\">\n <Link\n title=\"Terms of Use\"\n underline=\"always\"\n target=\"_blank\"\n href=\"https://www.ploutosbudget.com/terms/\"\n >\n Terms of Use\n </Link>\n • \n <Link\n title=\"Privacy Policy\"\n underline=\"always\"\n target=\"_blank\"\n href=\"https://www.ploutosbudget.com/privacy/\"\n >\n Privacy Policy\n </Link>\n </Typography>\n </Grid>\n\n <Grid item xs={6} align=\"center\">\n <Button\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n onClick={e => handleLogout(e)}\n >\n <Lock className={classes.pr1} />\n Logout\n </Button>\n </Grid>\n </Grid>\n </Box>\n </Grid>\n )}\n </Fragment>\n )\n}\n\nMembership.propTypes = {\n createCheckoutSession: PropTypes.func.isRequired,\n createCustomerPortal: PropTypes.func.isRequired,\n checkoutSessionURL: PropTypes.string,\n customer: PropTypes.array.isRequired,\n logout: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n customer: state.membershipReducer.customer,\n checkoutSessionURL: state.membershipReducer.checkoutSessionURL\n})\n\nconst mapDispatchToProps = {\n createCheckoutSession,\n createCustomerPortal,\n logout\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(Membership))\n","import React, { Component } from 'react'\nimport { Navigate } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport { DateTime } from 'luxon'\n\nimport { Loading } from '../loading/Loading'\nimport Membership from '../membership/Membership'\n\nconst PrivateRoute = ({ component: Component, auth, membership, ...rest }) => {\n let membershipActive = true\n try {\n const customer =\n membership && membership.customer && membership.customer instanceof Array\n ? membership.customer\n : null\n const subscription =\n customer && customer[0] && customer[0].subscriber ? customer[0].subscriber : null\n const member =\n subscription && subscription.subscriber && subscription.subscriber.entitlements.member\n ? subscription.subscriber.entitlements.member\n : null\n\n const currentDate = DateTime.local().toISODate()\n\n if (!member || (Object.keys(member).length <= 0) || (member.expires_date < currentDate)) {\n membershipActive = false\n }\n\n } catch (error) {\n // TODO: handle error\n }\n\n if (auth.isLoading || membership.isLoading) {\n return <Loading />\n } else if (!auth.isAuthenticated) {\n return <Navigate to=\"/login\" />\n } else if (auth.isAuthenticated && membershipActive) {\n return <Component {...rest} />\n } else {\n return <Membership {...rest} />\n }\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n membership: state.membershipReducer\n})\n\nexport default connect(mapStateToProps)(PrivateRoute)\n","export const verticalLine = {\n id: 'spendingChartVsLastMonth', //typescript crashes without id\n afterDraw: function (chart, ease) {\n try {\n if (chart && chart.tooltip && chart.tooltip._active && chart.tooltip._active.length && chart.tooltip._active.length > 0) {\n const activePoint = chart.tooltip._active[0]\n const ctx = chart.ctx\n const x = activePoint.element.x\n const topY = chart.scales.y.top\n const bottomY = chart.scales.y.bottom\n\n // line attributes\n ctx.save()\n ctx.beginPath()\n ctx.moveTo(x, topY)\n ctx.lineTo(x, bottomY)\n ctx.lineWidth = 2\n ctx.strokeStyle = '#0f4e5b'\n ctx.stroke()\n ctx.restore()\n }\n } catch (e) {\n\n }\n }\n}\n\n// export const options = {\n// tooltips: {\n// titleFontSize: 16,\n// titleFontStyle: 'bold',\n// bodyFontSize: 16,\n// enabled: true,\n// intersect: false,\n// position: 'average',\n// mode: 'label',\n// custom: function (tooltipModel) {\n// tooltipModel.opacity = 0\n// }\n// },\n// legend: {\n// display: false\n// },\n// scales: {\n// xAxes: [{\n// ticks: {\n// autoSkip: false,\n// maxRotation: 45,\n// minRotation: 45\n// }\n// }]\n// }\n// }\n\nexport const backgroundColors = [\n 'rgba(255, 99, 132, 0.3)',\n 'rgba(54, 162, 235, 0.3)',\n 'rgba(255, 206, 86, 0.3)',\n 'rgba(75, 192, 192, 0.3)',\n 'rgba(153, 102, 255, 0.3)',\n 'rgba(255, 159, 64, 0.3)',\n 'rgba(180, 0, 0, 0.3)',\n 'rgba(0, 180, 0, 0.3)',\n 'rgba(0, 0, 180, 0.3)',\n 'rgba(0, 180, 180, 0.3)',\n 'rgba(180, 180, 0, 0.3)',\n 'rgba(180, 0, 180, 0.3)',\n 'rgba(80, 0, 0, 0.3)',\n 'rgba(0, 80, 0, 0.3)',\n 'rgba(0, 0, 80, 0.3)',\n 'rgba(80, 0, 80, 0.3)',\n 'rgba(80, 80, 0, 0.3)',\n 'rgba(0, 80, 80, 0.3)',\n 'rgba(255, 0, 0, 0.3)',\n 'rgba(0, 255, 0, 0.3)',\n 'rgba(0, 0, 255, 0.3)',\n 'rgba(255, 255, 0, 0.3)',\n 'rgba(255, 0, 255, 0.3)',\n 'rgba(0, 255, 255, 0.3)'\n]\n\nexport const borderColors = [\n 'rgba(255, 99, 132, 1)',\n 'rgba(54, 162, 235, 1)',\n 'rgba(255, 206, 86, 1)',\n 'rgba(75, 192, 192, 1)',\n 'rgba(153, 102, 255, 1)',\n 'rgba(255, 159, 64, 1)',\n 'rgba(180, 0, 0, 1)',\n 'rgba(0, 180, 0, 1)',\n 'rgba(0, 0, 180, 1)',\n 'rgba(0, 180, 180, 1)',\n 'rgba(180, 180, 0, 1)',\n 'rgba(180, 0, 180, 1)',\n 'rgba(80, 0, 0, 1.0)',\n 'rgba(0, 80, 0, 1.0)',\n 'rgba(0, 0, 80, 1.0)',\n 'rgba(80, 0, 80, 1.0)',\n 'rgba(80, 80, 0, 1.0)',\n 'rgba(0, 80, 80, 1.0)',\n 'rgba(255, 0, 0, 1.0)',\n 'rgba(0, 255, 0, 1.0)',\n 'rgba(0, 0, 255, 1.0)',\n 'rgba(255, 255, 0, 1.0)',\n 'rgba(255, 0, 255, 1.0)',\n 'rgba(0, 255, 255, 1.0)'\n]\n","import axios from 'axios'\n\nimport { createToast, returnErrors } from './messages'\nimport {\n GET_REPORTS, REPORT_LOADING, REPORT_FAIL\n} from './types'\nimport { tokenConfig } from './auth'\n\nconst proxy = process.env.REACT_APP_PROXY\n\n// Get reports\nexport const getReports = (yearMonth) => (dispatch, getState) => {\n dispatch({ type: REPORT_LOADING })\n\n let mParm = (typeof yearMonth === 'undefined' || yearMonth == null) ? '' : yearMonth\n axios.get(`${proxy}/v1/net_worth/?m=${mParm}`, tokenConfig(getState))\n .then(res => {\n dispatch({\n type: GET_REPORTS,\n payload: res.data\n })\n })\n .catch(err => {\n const error = err.response && err.response.data ? err.response.data : 'Please try again later.'\n const status = err.response && err.response.status ? err.response.status : 500\n // dispatch(returnErrors(error, status))\n dispatch({ type: REPORT_FAIL })\n })\n}\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { Typography, Grid, Paper, Box } from '@mui/material'\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler\n} from 'chart.js'\nimport { Insights, ArrowDropUp, ArrowDropDown, ArrowRight } from '@mui/icons-material'\nimport { Line } from 'react-chartjs-2'\nimport numeral from 'numeral'\nimport { DateTime } from 'luxon'\n\nimport { sharedStyles } from '../common/styles'\nimport { Loading } from '../loading/Loading'\nimport { verticalLine, backgroundColors, borderColors } from '../chart/charts'\nimport { formatMoneyLabel, formatPercentLabel } from '../utilities/numbers'\nimport { getReports } from '../../actions/reports'\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n Filler\n)\n\nconst useStyles = makeStyles(theme => ({\n ...sharedStyles(theme),\n noDataIcon: {\n color:\n theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.secondary.light\n },\n spendingText: {\n color: borderColors[1],\n fontWeight: theme.typography.fontWeightBold\n },\n lastMonthText: {\n color: borderColors[0],\n fontWeight: theme.typography.fontWeightBold\n },\n middleAlign: {\n verticalAlign: 'middle'\n },\n gridSpacing: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(3),\n padding: theme.spacing(2)\n }\n}))\n\nconst SpendingVsLastMonth = () => {\n const { yearMonth, reports, isFetching } = withPropsValidation(\n useSelector(({ budgetMonthReducer, reportReducer }) => ({\n yearMonth: budgetMonthReducer.yearMonth,\n reports: reportReducer.reports,\n isFetching: reportReducer.isFetching\n }))\n )\n\n const [data, setData] = useState({\n labels: [],\n previousMonth: [],\n currentMonth: [],\n showChart: false\n })\n const [spendingDate, setSpendingDate] = useState('')\n const [spendingDifference, setSpendingDifference] = useState(0)\n const [previousValue, setPreviousValue] = useState(0)\n const [currentValue, setCurrentValue] = useState(0)\n\n const dispatch = useDispatch()\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Fetch report data on load\n */\n useEffect(() => {\n dispatch(getReports(yearMonth))\n }, [yearMonth])\n\n /**\n * Get data to build the spending chart.\n */\n useEffect(() => {\n try {\n if (reports && Object.keys(reports).length > 0) {\n const spendingReport =\n reports && reports.spending_last_month_report ? reports.spending_last_month_report : null\n const previousMonthReport =\n spendingReport && spendingReport.previous_month ? spendingReport.previous_month : []\n const currentMonthReport =\n spendingReport && spendingReport.current_month ? spendingReport.current_month : []\n const currentBudgetYear = DateTime.local().toFormat('yyyy')\n const currentBudgetMonth = DateTime.local().toFormat('M')\n const isCurrentMonth = yearMonth === `${currentBudgetYear}${currentBudgetMonth}`\n\n // Get the previous month labels and add 1 month\n const previousMonthLabels = previousMonthReport.map(report =>\n DateTime.fromISO(report.date).plus({ months: 1 }).toLocaleString({\n month: 'long',\n day: 'numeric'\n })\n )\n // Get the current month labels\n const currentMonthLabels = currentMonthReport.map(report =>\n DateTime.fromISO(report.date).toLocaleString({\n month: 'long',\n day: 'numeric'\n })\n )\n /**\n * If on the current month. Create a label for today in case\n * none currently exist. If not current month we will grab\n * the latest date.\n */\n const currentDateLabel = isCurrentMonth\n ? [\n DateTime.local().toLocaleString({\n month: 'long',\n day: 'numeric'\n })\n ]\n : null\n // Combine the label sets\n const monthLabels = isCurrentMonth\n ? [...new Set([...previousMonthLabels, ...currentMonthLabels, ...currentDateLabel])]\n : [...new Set([...previousMonthLabels, ...currentMonthLabels])]\n // Order the array\n const labels = monthLabels.sort((a, b) => new Date(a) - new Date(b))\n const currentLabel = currentDateLabel && currentDateLabel[0] ? currentDateLabel[0] : null\n const currentSpendingDate =\n currentLabel && labels && labels.length > 0 ? currentLabel : labels[labels.length - 1]\n\n // Get previous month spending data\n let previousMonth = []\n for (const label of labels) {\n let found = false\n for (const report of previousMonthReport) {\n const date = DateTime.fromISO(report.date).plus({ months: 1 }).toLocaleString({\n month: 'long',\n day: 'numeric'\n })\n if (label === date) {\n previousMonth.push(report.total)\n found = true\n }\n }\n // If no record found for this date grab previous record\n if (!found) {\n if (previousMonth.length <= 0) {\n previousMonth.push(0)\n } else {\n const lastIndex = previousMonth.length - 1\n const previousValue = previousMonth[lastIndex]\n previousMonth.push(previousValue)\n }\n }\n }\n\n // Get current month spending data\n let currentMonth = []\n for (const label of labels) {\n let found = false\n for (const report of currentMonthReport) {\n const date = DateTime.fromISO(report.date).toLocaleString({\n month: 'long',\n day: 'numeric'\n })\n if (label === date) {\n currentMonth.push(report.total)\n found = true\n }\n }\n // If no record found for this date grab previous record\n if (!found) {\n if (currentMonth.length <= 0) {\n currentMonth.push(0)\n } else {\n const lastIndex = currentMonth.length - 1\n const previousValue = currentMonth[lastIndex]\n currentMonth.push(previousValue)\n }\n }\n }\n\n // Logic to hide chart until data is ready.\n let showChart = true\n if (\n (!previousMonth || (previousMonth && previousMonth.length <= 0)) &&\n (!currentMonth || (currentMonth && currentMonth.length <= 0))\n ) {\n showChart = false\n }\n\n // Get the default current and previous spending to display.\n previousMonth = previousMonth && previousMonth.length > 0 ? previousMonth : [0]\n currentMonth = currentMonth && currentMonth.length > 0 ? currentMonth : [0]\n\n // Get the current metrics to display on load\n let currentLabelIndex = labels.indexOf(currentSpendingDate)\n currentLabelIndex = currentLabelIndex && currentLabelIndex >= 0 ? currentLabelIndex : 0\n const currentPreviousValue =\n previousMonth && previousMonth[currentLabelIndex] ? previousMonth[currentLabelIndex] : 0\n const currentCurrentValue =\n currentMonth && currentMonth[currentLabelIndex] ? currentMonth[currentLabelIndex] : 0\n const currentSpendingDifference = getSpendingDifference(\n currentPreviousValue,\n currentCurrentValue\n )\n\n setData({\n labels,\n previousMonth,\n currentMonth,\n showChart\n })\n setSpendingDate(currentSpendingDate)\n setSpendingDifference(currentSpendingDifference)\n setPreviousValue(currentPreviousValue)\n setCurrentValue(currentCurrentValue)\n }\n } catch (e) {\n // console.log(e)\n }\n }, [reports])\n\n /**\n * Chart data to build the chart.\n * @type {{datasets: [{backgroundColor: string, borderColor: string, data: ([]|*[]|*), borderWidth: number, label: string, fill: string},{backgroundColor: string, borderColor: string, data: ([]|*[]|*), borderWidth: number, label: string, fill: string}], labels: ([]|NodeListOf<HTMLLabelElement>|NodeList|*)}}\n */\n const chartData = {\n labels: data.labels,\n datasets: [\n {\n label: 'Spending',\n data: data.currentMonth,\n backgroundColor: backgroundColors[1],\n borderColor: borderColors[1],\n borderWidth: 2,\n fill: 'start'\n },\n {\n label: 'Last Month',\n data: data.previousMonth,\n backgroundColor: backgroundColors[0],\n borderColor: borderColors[0],\n borderWidth: 2,\n fill: 'start'\n }\n ]\n }\n\n /**\n * Chart options\n * @type {{tension: number, plugins: {tooltip: {backgroundColor: string, callbacks: {label: options.plugins.tooltip.callbacks.label, title: options.plugins.tooltip.callbacks.title}, enabled: boolean}, title: {display: boolean, text: string}}, responsive: boolean, elements: {point: {radius: number}}, scales: {x: {ticks: {maxRotation: number, callback: ((function(*, *, *): (*|null))|*), minRotation: number}}, y: {ticks: {callback: (function(*, *, *): string)}}}, interaction: {mode: string, intersect: boolean}}}\n */\n const options = {\n plugins: {\n title: {\n display: false,\n text: 'Spending'\n },\n tooltip: {\n enabled: true,\n backgroundColor: 'transparent',\n callbacks: {\n title: xDatapoint => {\n const currentValue =\n xDatapoint &&\n xDatapoint[0] &&\n xDatapoint[0].raw &&\n xDatapoint[0].dataset &&\n xDatapoint[0].dataset.label === 'Spending'\n ? xDatapoint[0].raw\n : 0\n // If current spending is hidden then last month could be the index 0.\n let previousValue =\n xDatapoint &&\n xDatapoint[1] &&\n xDatapoint[1].raw &&\n xDatapoint[1].dataset &&\n xDatapoint[1].dataset.label === 'Last Month'\n ? xDatapoint[1].raw\n : null\n if (!previousValue) {\n previousValue =\n xDatapoint &&\n xDatapoint[0] &&\n xDatapoint[0].raw &&\n xDatapoint[0].dataset &&\n xDatapoint[0].dataset.label === 'Last Month'\n ? xDatapoint[0].raw\n : 0\n }\n const spendingDifference = getSpendingDifference(previousValue, currentValue)\n setCurrentValue(currentValue)\n setPreviousValue(previousValue)\n setSpendingDifference(spendingDifference)\n },\n label: yDatapoint => {\n setSpendingDate(yDatapoint.label)\n }\n }\n }\n },\n tension: 0.1,\n responsive: true,\n interaction: {\n intersect: false,\n mode: 'index'\n },\n elements: {\n point: {\n radius: 0\n }\n },\n scales: {\n x: {\n ticks: {\n maxRotation: 45,\n minRotation: 45,\n callback: function (value, index, ticks) {\n if (index % 3 === 0) return data.labels[index]\n return null\n }\n }\n },\n y: {\n ticks: {\n callback: function (value, index, ticks) {\n return formatMoneyLabel(value)\n }\n }\n }\n }\n }\n\n /**\n * Get the current spending difference.\n * @param {number} previousValue - The previous spending value.\n * @param {number} currentValue - The current spending value.\n * @returns {number} - The difference.\n */\n const getSpendingDifference = (previousValue, currentValue) =>\n numeral(previousValue).subtract(currentValue).value()\n\n /**\n * Builds the spending difference jsx elements for display.\n * @returns {JSX.Element}\n */\n const SpendingDifference = () => {\n try {\n let changeClass = null\n let arrowIcon = <ArrowRight className={classes.middleAlign} fontSize=\"medium\" />\n if (spendingDifference > 0) {\n changeClass = classes.positiveStats\n arrowIcon = <ArrowDropDown className={classes.middleAlign} fontSize=\"medium\" />\n } else if (spendingDifference < 0) {\n changeClass = classes.negativeStats\n arrowIcon = <ArrowDropUp className={classes.middleAlign} fontSize=\"medium\" />\n }\n const percentChange = (currentValue - previousValue) / Math.abs(previousValue)\n const absolutePercentChange = Math.abs(percentChange)\n const absoluteSpendingDifference = Math.abs(spendingDifference)\n\n return (\n <Grid\n container\n item\n className={changeClass}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n wrap=\"nowrap\"\n >\n {arrowIcon}\n <Typography variant=\"body1\">{formatMoneyLabel(absoluteSpendingDifference)}</Typography>\n {!isNaN(absolutePercentChange) && isFinite(absolutePercentChange) ? (\n <Typography variant=\"body1\">\n ({formatPercentLabel(absolutePercentChange)})\n </Typography>\n ) : null}\n </Grid>\n )\n } catch (e) {}\n }\n\n return isFetching ? (\n <Box mt={1} mb={2}>\n <Loading />\n </Box>\n ) : (\n <Fragment>\n <Paper elevation={3} className={classes.gridSpacing}>\n {data && data.showChart ? (\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Grid item xs={6} align=\"left\">\n <Typography variant=\"body1\" className={classes.spendingText}>\n {formatMoneyLabel(currentValue)}\n </Typography>\n <Typography variant=\"body1\">{spendingDate}</Typography>\n </Grid>\n <Grid item xs={6} align=\"right\">\n <Typography variant=\"body1\" className={classes.lastMonthText} align=\"center\">\n {formatMoneyLabel(previousValue)}\n </Typography>\n <SpendingDifference />\n </Grid>\n <Grid item xs={12}>\n <Line options={options} plugins={[verticalLine]} data={chartData} />\n </Grid>\n </Grid>\n ) : (\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Grid\n container\n item\n xs={12}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Insights fontSize=\"large\" className={classes.noDataIcon} />\n </Grid>\n <Grid\n container\n item\n xs={12}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Typography variant=\"h6\">No spending data yet. </Typography>\n </Grid>\n </Grid>\n )}\n </Paper>\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'SpendingVsLastMonth')\n return props\n}\n\nconst propTypes = {\n yearMonth: PropTypes.string.isRequired,\n reports: PropTypes.object.isRequired,\n isFetching: PropTypes.bool.isRequired\n}\n\nexport default SpendingVsLastMonth\n","import React, { useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { styled } from '@mui/material/styles'\n\nimport Box from '@mui/material/Box'\nimport LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress'\n\nimport { formatPercent } from '../utilities/numbers'\n\nconst BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({\n height: 6,\n borderRadius: 6,\n [`&.${linearProgressClasses.colorPrimary}`]: {\n backgroundColor: theme.palette.grey['400'],\n },\n [`& .${linearProgressClasses.bar}`]: {\n borderRadius: 6\n },\n}))\n\nconst HorizontalProgressBar = (props) => {\n const { step, steps } = withPropsValidation(\n useSelector(() => ({\n step: props.step,\n steps: props.steps,\n })))\n\n const [value, setValue] = useState(0)\n const [progressColor, setProgressColor] = useState('rgba(0, 0, 0, 0.12)')\n\n /**\n * Set the percentage of the progress bar. If over 100 is set to\n * 100.\n */\n useEffect(() => {\n let value = Math.floor((step / steps) * 100)\n if (step !== 0) {\n if (value >= 100 || step >= steps) value = 100\n }\n\n setValue(value)\n }, [step, steps])\n\n useEffect(() => {\n const errorColor = '#FF0000 !important'\n const warningColor = '#FFBF00 !important'\n const successColor = '#0F4E5B !important'\n\n if (value < 50) {\n setProgressColor(errorColor)\n } else if (value >= 50 && value < 100) {\n setProgressColor(warningColor)\n } else if (value >= 100) {\n setProgressColor(successColor)\n }\n }, [value])\n\n return (\n <Box sx={{ flexGrow: 1 }}>\n <BorderLinearProgress\n variant=\"determinate\"\n value={value}\n sx={{\n [`& .${linearProgressClasses.bar}`]: {\n borderRadius: 5,\n backgroundColor: progressColor,\n },\n }}\n />\n </Box>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'HorizontalProgressBar')\n return props\n}\n\nconst propTypes = {\n step: PropTypes.number.isRequired,\n steps: PropTypes.number.isRequired\n}\n\nexport default HorizontalProgressBar\n","import { GET_CATEGORY_BUDGET_ID, EDIT_CATEGORY_BUDGET_ID } from './types'\n\n// Get Categories Budget ID\nexport const getCategoryBudgetId = () => (dispatch, getState) => {\n dispatch({\n type: GET_CATEGORY_BUDGET_ID,\n payload: getState\n })\n}\n\n// Edit Categories Budget ID\nexport const editCategoryBudgetId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_CATEGORY_BUDGET_ID,\n payload: id\n })\n}\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { Typography, Toolbar, Grid, Accordion, AccordionSummary, AccordionDetails } from '@mui/material'\nimport { ExpandMore } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport HorizontalProgressBar from '../common/HorizontalProgressBar'\nimport { editCategoryBudgetId } from '../../actions/categoryBudgetId'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 600\n },\n negativeAmount: {\n color: theme.palette.error.main,\n fontWeight: 600\n },\n tableRow: {\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n paddingRight: theme.spacing(2),\n paddingLeft: theme.spacing(2),\n borderBottom: '1px solid rgba(81, 81, 81, 1)',\n '&:hover': {\n backgroundColor: theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.08)'\n }\n },\n tableLabel: {\n color: theme.palette.text.secondary\n }\n}))\n\nconst OverspentCategories = () => {\n const { categoryBudgets } = withPropsValidation(\n useSelector(({ categoryBudgetReducer }) => ({\n categoryBudgets: categoryBudgetReducer.categoryBudgets\n })))\n\n const [overspentCategories, setOverspentCategories] = useState([])\n const [isExpanded, setIsExpanded] = useState(true)\n\n const dispatch = useDispatch()\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Get the list of category budgets that are overspent.\n */\n useEffect(() => {\n const budgets = categoryBudgets.filter(cat => cat.balance < 0)\n\n setOverspentCategories(budgets)\n }, [categoryBudgets])\n\n /**\n * Handles clicking a category budget row.\n * @param {number} id - The category ID\n */\n const handleCategoryBudgetClick = id => dispatch(editCategoryBudgetId(id))\n\n return (\n <Fragment>\n {overspentCategories && overspentCategories.length > 0\n ? (\n <Accordion key={`overspent-categories-group`}\n expanded={isExpanded}\n square\n onChange={() => setIsExpanded(!isExpanded)}\n >\n\n <AccordionSummary expandIcon={<ExpandMore fontSize=\"small\" style={{ color: '#FFF' }} />}>\n <Toolbar>\n <Typography variant=\"h6\" component=\"div\">\n Overspent Categories\n </Typography>\n </Toolbar>\n </AccordionSummary>\n\n <AccordionDetails>\n {overspentCategories.map(row => {\n const balance = row && row.balance ? row.balance : 0\n const balanceClass = balance > 0 ? classes.positiveAmount : balance < 0 ? classes.negativeAmount : null\n\n return (\n <Grid key={`overspent-category-${row.id}`} container\n className={classes.tableRow}\n onClick={() => handleCategoryBudgetClick(row.category_id)}\n >\n\n <Grid container item xs={4}\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Typography variant=\"body1\">{row.category}</Typography>\n </Grid>\n\n <Grid container item xs={4} direction=\"column\">\n\n <Grid container direction=\"row\" justifyContent=\"flex-end\" alignItems=\"center\">\n <Typography variant=\"body2\"\n className={classes.tableLabel}>Budgeted: </Typography>\n <Typography variant=\"body2\">\n {formatMoneyLabel(row.budgeted)}\n </Typography>\n </Grid>\n\n <Grid container direction=\"row\" justifyContent=\"flex-end\" alignItems=\"center\">\n <Typography variant=\"body2\" className={classes.tableLabel}>Goal: </Typography>\n <Typography variant=\"body2\">\n {formatMoneyLabel(row.goal)}\n </Typography>\n </Grid>\n\n </Grid>\n\n <Grid container item xs={4} direction=\"column\" justifyContent=\"center\"\n alignItems=\"flex-end\">\n <Typography variant=\"body2\" className={classes.tableLabel}>Balance</Typography>\n <Typography variant=\"body2\" className={balanceClass}>\n {formatMoneyLabel(row.balance)}\n </Typography>\n </Grid>\n\n <Grid container item xs={12}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <HorizontalProgressBar step={row.budgeted} steps={row.goal} />\n </Grid>\n\n </Grid>\n )\n })}\n </AccordionDetails>\n </Accordion>\n ) : null\n }\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'OverspentCategories')\n return props\n}\n\nconst propTypes = {\n categoryBudgets: PropTypes.array.isRequired\n}\n\nexport default OverspentCategories\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport {\n Typography, Toolbar, Grid, Accordion, AccordionSummary, AccordionDetails\n} from '@mui/material'\nimport { ExpandMore } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport HorizontalProgressBar from '../common/HorizontalProgressBar'\nimport { editCategoryBudgetId } from '../../actions/categoryBudgetId'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 600\n },\n negativeAmount: {\n color: theme.palette.error.main,\n fontWeight: 600\n },\n tableRow: {\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n paddingRight: theme.spacing(2),\n paddingLeft: theme.spacing(2),\n borderBottom: '1px solid rgba(81, 81, 81, 1)',\n '&:hover': {\n backgroundColor: theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.08)'\n }\n },\n tableLabel: {\n color: theme.palette.text.secondary\n }\n}))\n\nconst FundShortCategories = () => {\n const { categoryBudgets } = withPropsValidation(\n useSelector(({ categoryBudgetReducer }) => ({\n categoryBudgets: categoryBudgetReducer.categoryBudgets\n })))\n\n const [fundShortCategories, setFundShortCategories] = useState([])\n const [isExpanded, setIsExpanded] = useState(true)\n\n const dispatch = useDispatch()\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Get the list of category budgets that need more money to complete\n * their goal.\n */\n useEffect(() => {\n const budgets = categoryBudgets.filter(cat => cat.budgeted < cat.goal)\n\n setFundShortCategories(budgets)\n }, [categoryBudgets])\n\n /**\n * Handles clicking a category budget row.\n * @param {number} id - The category ID\n */\n const handleCategoryBudgetClick = id => dispatch(editCategoryBudgetId(id))\n\n return (\n <Fragment>\n {fundShortCategories && fundShortCategories.length > 0\n ? (\n <Accordion key={`fund-short-categories-group`}\n expanded={isExpanded}\n square\n onChange={() => setIsExpanded(!isExpanded)}\n >\n <AccordionSummary expandIcon={<ExpandMore fontSize=\"small\" style={{ color: '#FFF' }} />}>\n <Toolbar>\n <Typography variant=\"h6\" component=\"div\">\n Categories Needing Funding\n </Typography>\n </Toolbar>\n </AccordionSummary>\n\n <AccordionDetails>\n {fundShortCategories.map(row => {\n const balance = row && row.balance ? row.balance : 0\n const balanceClass = balance > 0 ? classes.positiveAmount : balance < 0 ? classes.negativeAmount : null\n\n return (\n <Grid key={`fund-short-category-${row.id}`} container\n className={classes.tableRow}\n onClick={() => handleCategoryBudgetClick(row.category_id)}\n >\n\n <Grid container item xs={4}\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Typography variant=\"body1\">{row.category}</Typography>\n </Grid>\n\n <Grid container item xs={4} direction=\"column\">\n\n <Grid container direction=\"row\" justifyContent=\"flex-end\" alignItems=\"center\">\n <Typography variant=\"body2\"\n className={classes.tableLabel}>Budgeted: </Typography>\n <Typography variant=\"body2\">\n {formatMoneyLabel(row.budgeted)}\n </Typography>\n </Grid>\n\n <Grid container direction=\"row\" justifyContent=\"flex-end\" alignItems=\"center\">\n <Typography variant=\"body2\" className={classes.tableLabel}>Goal: </Typography>\n <Typography variant=\"body2\">\n {formatMoneyLabel(row.goal)}\n </Typography>\n </Grid>\n\n </Grid>\n\n <Grid container item xs={4} direction=\"column\" justifyContent=\"center\"\n alignItems=\"flex-end\">\n <Typography variant=\"body2\" className={classes.tableLabel}>Balance</Typography>\n <Typography variant=\"body2\" className={balanceClass}>\n {formatMoneyLabel(row.balance)}\n </Typography>\n </Grid>\n\n <Grid container item xs={12}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <HorizontalProgressBar step={row.budgeted} steps={row.goal} />\n </Grid>\n\n </Grid>\n )\n })}\n </AccordionDetails>\n </Accordion>\n ) : null\n }\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'FundShortCategories')\n return props\n}\n\nconst propTypes = {\n categoryBudgets: PropTypes.array.isRequired\n}\n\nexport default FundShortCategories\n","import { DateTime } from 'luxon'\n\n/**\n * Format the date to the logged-in users date format preference from\n * an ISO date.\n * @param input\n * @returns {string} - The input formatted to the users' date\n * preference.\n */\nexport const formatISODateTime = input => {\n return DateTime.fromISO(input).toLocaleString(DateTime.DATETIME_FULL)\n}\n\n/**\n * Format the date to the logged-in users date format preference from\n * an ISO date.\n * @param input\n * @returns {string} - The input formatted to the users' date\n * preference.\n */\nexport const formatISODate = input => {\n return DateTime.fromISO(input).toLocaleString()\n}\n\n/**\n * Format the date to the logged-in users date format preference from\n * a JS datetime.\n * @param input\n * @returns {string} - The input formatted to the users' date\n * preference.\n */\nexport const formatJSDate = input => {\n return DateTime.fromJSDate(input).toLocaleString()\n}\n\n/**\n * Used to format a javascript date to ISO format.\n * @param input\n * @returns {string} - The input formatted to ISO date format\n */\nexport const formatToISODate = input => {\n return DateTime.fromJSDate(input).toFormat('yyyy-MM-dd')\n}\n\n/**\n * Array of the months full name.\n * @type {string[]} - All of the months.\n */\nexport const months = [undefined, 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\n/**\n * Array of the months first initial.\n * @type {string[]} - All of the months.\n */\nexport const monthInitials = [undefined, 'J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle, Grid, Checkbox } from '@mui/material'\nimport { Save, Cancel, Label, LabelOutlined } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { editTransactionFlags } from '../../actions/transactionFlags'\nimport { returnErrors } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass FlagForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: { error: null, helperText: '', },\n },\n flags: []\n }\n\n this.updateFlags = this.updateFlags.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleClick = this.handleClick.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n }\n\n componentDidMount() {\n this.updateFlags()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { transactionFlagColors } = this.props\n\n if (transactionFlagColors && transactionFlagColors !== prevProps.transactionFlagColors) this.updateFlags()\n }\n\n /**\n * Update the flags state.\n */\n updateFlags = () => {\n const { transactionFlagColors } = this.props\n this.setState({ flags: transactionFlagColors })\n }\n\n /**\n * Used to clear the form and close the dialog.\n */\n clearForm = () => {\n this.setState({\n error: {\n name: { error: null, helperText: '', },\n }\n })\n\n this.props.closeForm()\n }\n\n /**\n * Used to handle the flag name update input.\n * @param {Object} e - The event object.\n * @param {number} index - The index of the array that changed..\n * @param {string} color - The color of the flag object.\n */\n handleChange = (e, index, color) => {\n const { flags } = this.state\n\n if (flags && flags[index]) {\n flags[index].name = e.target.value\n this.setState({ flags })\n }\n }\n\n /**\n * Handles the selecting and deselecting of the flag checkboxes.\n * @param {Object} e - The event object.\n * @param {number} id = The flag transaction Id.\n */\n handleClick = (e, id) => this.props.handleFlagClick(e, id)\n\n /**\n * Submit the budget form\n * @param {Object} e - The event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n const { editTransactionFlags } = this.props\n\n try {\n const { flags } = this.state\n const { user } = this.props.auth\n\n // Update flags\n const transactionFlags = {\n flags,\n user_id: user.id,\n }\n\n editTransactionFlags(transactionFlags)\n this.clearForm()\n } catch (e) {\n returnErrors({ updateTransaction: 'Cannot update flags at this time.' }, 500)\n }\n }\n\n render() {\n const { flags } = this.state\n const { classes, theme, open, flagId } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"transaction-flag-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Flag\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2}>\n {flags.map((f, index) => (\n <Grid key={f.id} item xs={12} container>\n <Grid item xs={2} container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Checkbox icon={<LabelOutlined />} checkedIcon={<Label />}\n checked={f.id === flagId}\n onClick={(e) => this.handleClick(e, f.id)}\n sx={{\n color: f.color,\n '&.Mui-checked': {\n color: f.color,\n },\n }}\n />\n </Grid>\n <Grid item xs={10} container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <TextField name={`name-${f.id}`}\n onChange={(e) => this.handleChange(e, index, f.color)}\n value={f.name ? f.name : ''}\n placeholder=\"Add Custom Flag...\"\n variant=\"outlined\" size=\"small\" fullWidth\n sx={{\n input: {\n borderRadius: '4px',\n background: f.color,\n fontWeight: 600\n },\n '& .MuiOutlinedInput-root': {\n '&.Mui-focused fieldset': {\n borderColor: f.color,\n },\n }\n }}\n />\n </Grid>\n </Grid>\n )\n )}\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={() => this.clearForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nFlagForm.propTypes = {\n open: PropTypes.bool.isRequired,\n flagId: PropTypes.number.isRequired,\n transactionFlagColors: PropTypes.array.isRequired,\n handleFlagClick: PropTypes.func.isRequired,\n closeForm: PropTypes.func.isRequired,\n editTransactionFlags: PropTypes.func.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n})\n\nconst mapDispatchToProps = {\n returnErrors,\n editTransactionFlags\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(FlagForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { DateTime } from 'luxon'\nimport numeral from 'numeral'\nimport { DatePicker } from '@mui/lab'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n FormControlLabel, FormControl, Button, IconButton, TextField, Dialog,\n DialogActions, DialogContent, DialogTitle, Grid, Box, Typography, Checkbox\n} from '@mui/material'\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'\nimport { Save, Add, Cancel, Delete, Label, LabelOutlined, Edit, LabelOffOutlined } from '@mui/icons-material'\n\nimport { sharedStyles, SwitchPositive } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport FlagForm from './FlagForm'\nimport { addTransaction } from '../../actions/transactions'\nimport { editLinkTransaction } from '../../actions/link'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { moneyInput, formatMoneyLabel, formatMoney } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst filter = createFilterOptions()\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass LinkTransactionForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: { error: null, helperText: '', },\n amount: { error: null, helperText: '', },\n category: { error: null, helperText: '', },\n account: { error: null, helperText: '', },\n date: { error: null, helperText: '', },\n notes: { error: null, helperText: '', },\n },\n open: false,\n datePickerOpen: false,\n name: { id: 0, name: '' },\n amountPositive: false,\n amount: '',\n category: { id: 0, name: '' },\n account: { id: 0, name: '' },\n date: DateTime.local(),\n splitCategories: [\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' },\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' }\n ],\n remainingSplitAmount: 0,\n accountOptions: [],\n categoryOptions: [],\n splitCategoryOptions: [],\n notes: '',\n flagId: 0,\n reconciled: true,\n transferAccountId: 0,\n payeeOptions: [],\n flagFormOpen: false,\n transactionFlagColors: [],\n splitPayeeOptions: []\n }\n\n this.updateAccountOptions = this.updateAccountOptions.bind(this)\n this.updatePayeeOptions = this.updatePayeeOptions.bind(this)\n this.updateCategoryOptions = this.updateCategoryOptions.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleNameChange = this.handleNameChange.bind(this)\n this.handleCategoryChange = this.handleCategoryChange.bind(this)\n this.handleAccountChange = this.handleAccountChange.bind(this)\n this.handleAmountPositive = this.handleAmountPositive.bind(this)\n this.handleReconciled = this.handleReconciled.bind(this)\n this.handleDateChange = this.handleDateChange.bind(this)\n this.handleSplitAmountChange = this.handleSplitAmountChange.bind(this)\n this.handleSplitNameChange = this.handleSplitNameChange.bind(this)\n this.handleSplitNotesChange = this.handleSplitNotesChange.bind(this)\n this.handleSplitCategoryChange = this.handleSplitCategoryChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n this.handleSplitCategoryAdd = this.handleSplitCategoryAdd.bind(this)\n this.handleSplitCategoryRemove = this.handleSplitCategoryRemove.bind(this)\n this.getRemainingSplitAmount = this.getRemainingSplitAmount.bind(this)\n this.usersTransactionFlags = this.usersTransactionFlags.bind(this)\n this.handleFlagClick = this.handleFlagClick.bind(this)\n this.openFlagForm = this.openFlagForm.bind(this)\n this.closeFlagForm = this.closeFlagForm.bind(this)\n }\n\n componentDidMount() {\n this.updateAccountOptions()\n this.updatePayeeOptions()\n this.updateCategoryOptions()\n this.usersTransactionFlags()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const {\n linkTransaction, accounts, categories, payees, flagColors, transactionFlags\n } = this.props\n\n if (linkTransaction && linkTransaction !== prevProps.linkTransaction) {\n let linkAmount = linkTransaction.amount ? linkTransaction.amount : null\n if (!linkAmount) return false\n let linkName = linkTransaction.merchant_name ? linkTransaction.merchant_name : linkTransaction.name\n linkName = (linkName || '')\n let linkDate = linkTransaction.date\n ? DateTime.fromISO(linkTransaction.date)\n : DateTime.local()\n // link transactions are reversed.\n let amountPositive = !(linkAmount > 0)\n let amount = Math.abs(linkAmount)\n let account = { id: 0, name: '' }\n let category = { id: 0, name: '' }\n let name = { name: linkName }\n let transferAccountId = 0\n\n // Get account\n for (const a of accounts) {\n if (a.link_id === linkTransaction.account_id) {\n account = a\n break\n }\n }\n\n this.setState({\n open: true,\n name,\n amountPositive: amountPositive,\n amount: amount,\n category,\n account,\n date: linkDate,\n transferAccountId,\n })\n }\n\n // Update account options\n if (accounts && accounts !== prevProps.accounts) {\n this.updateAccountOptions()\n }\n\n // Update payee options\n if ((payees && payees !== prevProps.payees) || (accounts && accounts !== prevProps.accounts)) {\n this.updatePayeeOptions()\n }\n\n // Update split category options\n if ((categories && categories !== prevProps.categories)) {\n this.updateCategoryOptions()\n }\n\n // Update transaction flag options\n if ((transactionFlags && transactionFlags !== prevProps.transactionFlags)\n || (flagColors && flagColors !== prevProps.flagColors)) {\n this.usersTransactionFlags()\n }\n\n }\n\n /**\n * Update the available account options to assign a transaction to.\n */\n updateAccountOptions = () => {\n const { accounts } = this.props\n\n const accountOptions = []\n for (const account of accounts) {\n if (account.archived) continue\n const accountTypeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n let group = 'Cash'\n\n if (accountTypeCode === 'C') {\n group = 'Credit Cards'\n } else if (accountTypeCode === 'E') {\n group = 'Loans'\n } else if (accountTypeCode === 'F') {\n continue\n }\n\n accountOptions.push({ group, ...account })\n }\n\n this.setState({ accountOptions })\n }\n\n /**\n * Update the transaction flag options to assign a transaction to.\n */\n usersTransactionFlags = () => {\n const { flagColors, transactionFlags } = this.props\n\n // Get the users flag colors and labels.\n const transactionFlagColors = []\n for (const flagColor of flagColors) {\n for (const transactionFlag of transactionFlags) {\n if (flagColor.id === transactionFlag.color_id) {\n transactionFlagColors.push({\n id: transactionFlag.id,\n colorId: flagColor.id,\n color: flagColor.name,\n name: transactionFlag.name\n })\n }\n }\n }\n\n // Update state.\n this.setState({ transactionFlagColors })\n }\n\n /**\n * If the payee or account prop is updated then we need to update\n * the payee and split payee options state.\n */\n updatePayeeOptions = () => {\n const { accounts, payees } = this.props\n\n let payeeOptions = []\n let splitPayeeOptions = []\n\n for (const a of accounts) {\n const code = a.type_code ? a.type_code.trim().toUpperCase() : null\n\n if (!a.archived) {\n // Investment accounts can not make transactions\n if (code === 'F') continue\n // Loan accounts\n if (code === 'E') {\n let group = 'Loan Payment'\n let debt = {}\n debt.name = a.name\n debt.id = `T-${a.id}`\n payeeOptions.push({ group, ...debt })\n } else if (code === 'C') {\n // Transfer for credit card payment\n let group = 'Credit Card Payment'\n let transfer = {}\n transfer.name = a.name\n transfer.id = `T-${a.id}`\n payeeOptions.push({ group, ...transfer })\n } else {\n // Transfer accounts\n let group = 'Transfers'\n let transfer = {}\n transfer.name = a.name\n transfer.id = `T-${a.id}`\n payeeOptions.push({ group, ...transfer })\n }\n }\n }\n\n for (const p of payees) {\n let group = 'Payees'\n const name = p.name ? p.name.trim() : null\n\n // An existing transaction cannot be turned into an adjustment.\n if (name && name !== '') {\n payeeOptions.push({ group, ...p })\n }\n\n // A split transaction cannot be an adjustment.\n if ((name && name !== '') && name.toLowerCase() !== 'adjustment') {\n splitPayeeOptions.push(p)\n }\n }\n\n this.setState({ payeeOptions, splitPayeeOptions })\n }\n\n /**\n * If the categories props is updated then update the category\n * options and the split category options.\n *\n * Remove any category that is linked to an account.\n * Remove any categories that are archived.\n */\n updateCategoryOptions = () => {\n const { accounts, categories } = this.props\n let categoryOptions = []\n let splitCategoryOptions = []\n const linkCategories = accounts.filter(a => a.category_id).map(a => a.category_id)\n\n for (const c of categories) {\n if (linkCategories.includes(c.id)) continue\n if (c.archived) continue\n const name = c.name ? c.name.trim().toLowerCase() : null\n let group = 'Categories'\n\n if (name === 'budget') {\n group = 'Income to Budget'\n } else if (name === 'split') {\n group = 'Multiple Categories'\n }\n\n categoryOptions.push({ group: group, ...c })\n }\n\n // Create split category options\n for (const c of categories) {\n if (linkCategories.includes(c.id)) continue\n if (c.archived) continue\n const name = c.name ? c.name.trim().toLowerCase() : null\n if (name === 'split') continue\n let group = 'Categories'\n\n if (name === 'budget') {\n group = 'Income to Budget'\n }\n\n splitCategoryOptions.push({ group: group, ...c })\n }\n\n this.setState({ categoryOptions, splitCategoryOptions })\n }\n\n /**\n * Used to clear the form and close the dialog\n */\n clearForm = () => {\n const { clearLinkTransaction } = this.props\n\n // Don't clear the date state in case they want the same date as the last transaction.\n this.setState({\n open: false,\n name: { id: 0, name: '' },\n amountPositive: false,\n amount: '',\n category: { id: 0, name: '' },\n account: { id: 0, name: '' },\n splitCategories: [\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' },\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' }\n ],\n remainingSplitAmount: 0,\n notes: '',\n flagId: 0,\n reconciled: true,\n transferAccountId: 0,\n flagFormOpen: false\n })\n clearLinkTransaction()\n }\n\n /**\n * Handles text input change.\n * @param {Object} e - The event object.\n */\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n /**\n * Update the amount field.\n * Update the remaining split amount available.\n * @param {Object} e - The event object.\n */\n handleInputChange = e => {\n const { splitCategories } = this.state\n\n if (moneyInput(e.target.value)) {\n let remaining = this.getRemainingSplitAmount(e.target.value, splitCategories)\n\n this.setState({\n [e.target.name]: e.target.value,\n remainingSplitAmount: remaining\n })\n }\n }\n\n /**\n * This function is used to update the name state. Cannot update the\n * name if a transfer. Name can not be adjustment. Determines if the\n * selected payee is a transfer account.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleNameChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({\n name: { id: 0, name: '' },\n transferAccountId: 0\n })\n } else if (value) {\n const { category } = this.state\n const { accounts, categories } = this.props\n\n if (value.id) {\n const id = value.id\n let updateCategory = category\n let linkCategoryId = 0\n\n // Check if account transfer\n let transferAccountId = (typeof id === 'string' && id.indexOf('T-') >= 0) ? id.substring(2) : 0\n\n if (transferAccountId > 0) {\n\n // If loan type account then get the link category.\n for (const account of accounts) {\n if (`${account.id}` === transferAccountId) {\n const typeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n if (typeCode === 'E') linkCategoryId = account.category_id\n }\n }\n\n // If a loan account get the link category.\n if (linkCategoryId > 0) {\n const linkCategory = categories.filter(c => c.id === linkCategoryId)\n updateCategory = linkCategory && linkCategory[0] ? linkCategory[0] : { id: 0, name: '' }\n } else if ((transferAccountId > 0)\n || (value.name && value.name.trim().toLowerCase() === 'adjustment')\n || (name && name.name && name.name.trim().toLowerCase() === 'adjustment')) {\n // If a transfer account or an adjustment remove the category\n updateCategory = { id: 0, name: '' }\n }\n }\n\n this.setState({\n name: value,\n category: updateCategory,\n transferAccountId\n })\n } else {\n // Adding a new payee If an adjustment remove the category\n const updateCategory = ((name && name.name && name.name.trim().toLowerCase() === 'adjustment')\n || (value.inputValue && value.inputValue.trim().toLowerCase() === 'adjustment'))\n ? { id: 0, name: '' }\n : category\n\n this.setState({\n name: { id: 0, name: value.inputValue },\n category: updateCategory\n })\n }\n }\n }\n\n /**\n * This function is used to update the category state.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleCategoryChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({ category: { id: 0, name: '' } })\n } else if (value) {\n this.setState({ category: value })\n }\n }\n\n /**\n * This function is used to update the account state. Cannot update the\n * account if a transfer.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleAccountChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({ account: { id: 0, name: '' } })\n } else if (value) {\n this.setState({ account: value })\n }\n }\n\n handleAmountPositive = () => this.setState({ amountPositive: !this.state.amountPositive })\n\n handleReconciled = () => this.setState({ reconciled: !this.state.reconciled })\n\n handleDateChange = date => this.setState({ date })\n\n /**\n * Updates the correct split amount based on index.\n * Update the remaining split amount available.\n * @param {Object} e - The event object.\n * @param {number} index - The index of the split category\n */\n handleSplitAmountChange = (e, index) => {\n const { amount, splitCategories } = this.state\n\n if (moneyInput(e.target.value)) {\n splitCategories[index].amount = e.target.value\n let remaining = this.getRemainingSplitAmount(amount, splitCategories)\n\n this.setState({\n splitCategories,\n remainingSplitAmount: remaining\n })\n }\n }\n\n /**\n * Updates the correct split name(payee) based on index.\n * @param {Object} e - The event object\n * @param {number} index - The index of the split category\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleSplitNameChange = (e, index, value, reason) => {\n const { splitCategories } = this.state\n\n if (reason === 'clear') {\n splitCategories[index].name = { id: 0, name: '' }\n this.setState({ splitCategories })\n } else if (value) {\n if (value.id) {\n // Existing payee\n splitCategories[index].name = value\n } else {\n // Adding a new payee\n splitCategories[index].name = { id: 0, name: value.inputValue }\n }\n\n this.setState({ splitCategories })\n }\n }\n\n /**\n * Updates the correct split notes based on index.\n * @param {Object} e - The event object.\n * @param {number} index - The index of the split category\n */\n handleSplitNotesChange = (e, index) => {\n const { splitCategories } = this.state\n\n splitCategories[index].notes = e.target.value\n\n this.setState({\n splitCategories\n })\n }\n\n /**\n * This function is used to update the split category state.\n * @param {Object} e - The event object\n * @param {number} index - The index of the split category\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleSplitCategoryChange = (e, index, value, reason) => {\n const { splitCategories } = this.state\n\n if (reason === 'clear') {\n splitCategories[index].category = { id: 0, name: '' }\n this.setState({ splitCategories })\n } else if (value) {\n splitCategories[index].category = value\n this.setState({ splitCategories })\n }\n }\n\n /**\n * Submit the link transaction form\n * This function is used to add the link transaction to the users'\n * transaction list.\n * @param {Object} e - The event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n\n const {\n name, amountPositive, amount, category, account, date, notes,\n flagId, reconciled, splitCategories, transferAccountId\n } = this.state\n const {\n yearMonth, addTransaction, linkTransaction, returnErrors\n } = this.props\n const { user } = this.props.auth\n const id = (linkTransaction && linkTransaction.id) ? linkTransaction.id : null\n\n // If no link transaction id return false.\n if (!id) return false\n\n // Payee name cannot be blank or adjustment\n const payee = name && name.name ? name.name.trim() : null\n if (!payee) {\n returnErrors({ updateTransaction: 'Payee/Payer cannot be blank.' }, 500)\n return false\n } else if (payee && payee.trim().toLowerCase() === 'adjustment') {\n returnErrors({ updateTransaction: 'This transaction cannot be an adjustment.' }, 500)\n }\n\n // Turn the number positive or negative based on toggle.\n let netAmount = amountPositive ? amount : -Math.abs(amount)\n netAmount = formatMoney(netAmount)\n\n // Check for a split transaction and handle accordingly.\n let splitTransactionCategory = JSON.parse(JSON.stringify(splitCategories))\n if (category && category.name && category.name.toLowerCase().trim() === 'split') {\n // Validate the amount and split amount match.\n const remaining = this.getRemainingSplitAmount(amount, splitTransactionCategory)\n if (remaining !== 0) {\n returnErrors({ updateTransaction: 'Split amounts must equal transaction amount.' }, 500)\n return false\n }\n\n // Turn split numbers positive or negative based on toggle.\n for (const sc of splitTransactionCategory) {\n const splitAmount = formatMoney(sc.amount)\n sc.amount = amountPositive ? splitAmount : -Math.abs(splitAmount)\n sc.name = sc.name && sc.name.name ? sc.name.name : ''\n sc.notes = sc.notes ? sc.notes : ''\n sc.category_id = sc.category && sc.category.id ? sc.category.id : null\n sc.user_id = user.id\n sc.transaction_id = 0\n }\n } else {\n // Not a split\n splitTransactionCategory = []\n }\n\n /**\n * If account transfer or adjustment no category. But if debt\n * payment transfer then it needs a category.\n * If the account is a loan type account then no category.\n */\n const accountTypeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n let categoryId = category.id\n if (accountTypeCode === 'E') {\n categoryId = null\n } else {\n categoryId = (transferAccountId > 0) || (payee.toLowerCase() === 'adjustment') ? null : category.id\n }\n\n const transaction = {\n name: payee,\n amount: netAmount,\n category_id: categoryId,\n account_id: account.id,\n date: date.toISODate(),\n split_categories: splitTransactionCategory,\n notes,\n flag_id: (flagId || null),\n reconciled: reconciled,\n user_id: user.id,\n link_id: id,\n transfer_account_id: transferAccountId,\n }\n addTransaction(transaction, yearMonth)\n\n this.clearForm()\n }\n\n /**\n * This function is used to update the status of the link transaction\n * to remove it from the list.\n */\n handleDelete = () => {\n const { linkTransaction, editLinkTransaction } = this.props\n\n if (linkTransaction && linkTransaction.id) {\n editLinkTransaction(linkTransaction)\n }\n\n this.clearForm()\n }\n\n /**\n * Add another category split to the transaction form.\n */\n handleSplitCategoryAdd = () => {\n this.setState(({\n splitCategories: [...this.state.splitCategories, {\n category: { id: 0, name: '' },\n name: { id: 0, name: '' },\n amount: '',\n notes: ''\n }]\n }))\n }\n\n /**\n * Remove a category split to the transaction form. Update the\n * remainingSplitAmount state.\n * @param {Object} e - The event object\n * @param {number} index - The index of the split category\n */\n handleSplitCategoryRemove = (e, index) => {\n const { amount, splitCategories } = this.state\n\n splitCategories.splice(index, 1)\n let remaining = this.getRemainingSplitAmount(amount, splitCategories)\n\n this.setState({\n splitCategories,\n remainingSplitAmount: remaining\n })\n }\n\n /**\n * Calculates the remaining amount that needs to be in split\n * categories to equal the transaction amount.\n * @param {number} amount - The current amount for the transaction\n * @param {Object[]} splitCategories - The current amount for the\n * transaction\n * @param {number} splitCategories[].amount - The amount for the\n * category split.\n * @return {number|string} remaining - The remaining amount.\n * Or 'Error'\n */\n getRemainingSplitAmount = (amount, splitCategories) => {\n try {\n let remaining = numeral(amount)\n\n for (const splitCategory of splitCategories) remaining = remaining.subtract(splitCategory.amount)\n\n return remaining.value()\n } catch (error) {\n return 'Error'\n }\n }\n\n /**\n * Handles the selecting and deselecting of the flag checkboxes.\n * @param {Object} e - The event object.\n * @param {number} id = The color id.\n */\n handleFlagClick = (e, id) => {\n const checked = e && e.target ? e.target.checked : false\n\n if (checked) {\n this.setState({ flagId: id })\n } else {\n this.setState({ flagId: 0 })\n }\n }\n\n /**\n * Opens the transaction flag form.\n */\n openFlagForm = () => {\n this.setState({ flagFormOpen: true })\n }\n\n /**\n * Closes the transaction flag form.\n */\n closeFlagForm = () => {\n this.setState({ flagFormOpen: false })\n }\n\n render() {\n const {\n error, date, open, datePickerOpen, name, amountPositive, amount,\n category, splitCategories, account, notes, flagId, reconciled,\n transferAccountId, accountOptions, categoryOptions, splitCategoryOptions, payeeOptions,\n splitPayeeOptions, remainingSplitAmount, flagFormOpen, transactionFlagColors\n } = this.state\n const { classes, theme, linkTransaction } = this.props\n const isASplit = (category && category.name && category.name.trim().toLowerCase() === 'split')\n const isATransfer = (transferAccountId > 0)\n const isAnAdjustment = (name && name.name && name.name.trim().toLowerCase() === 'adjustment')\n const isALoanAccount = (account && account.type_code && account.type_code.trim().toUpperCase() === 'E')\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"transaction-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Link Transaction\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n </DialogTitle>\n\n\n {linkTransaction && linkTransaction.id > 0\n ? (\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\"\n className={classes.mb1}\n >\n\n <Grid item xs={12}>\n <Typography variant=\"body1\" align=\"center\" style={{ color: theme.palette.text.secondary }}>\n {linkTransaction && linkTransaction.name ? `${linkTransaction.name} ` : ''}\n {linkTransaction && linkTransaction.merchant_name ? linkTransaction.merchant_name : ''}\n </Typography>\n </Grid>\n\n <Grid item xs={12}>\n <Typography variant=\"body1\" align=\"center\" style={{ color: theme.palette.text.secondary }}>\n {linkTransaction && linkTransaction.category && Array.isArray(linkTransaction.category)\n ? linkTransaction.category.join(', ')\n : null\n }\n </Typography>\n </Grid>\n\n </Grid>\n ) : null\n }\n\n {linkTransaction && linkTransaction.pending\n ?\n <>\n <DialogContent>\n <Box p={3}>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={12}>\n <Typography variant=\"body1\">\n This transaction is still pending at your institution.\n Since the amount may change the transaction cannot be added.\n Once the transaction is posted you can add it.\n </Typography>\n </Grid>\n </Grid>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => this.clearForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </>\n :\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\" item xs={12}\n style={{ padding: 0 }}\n >\n <FormControlLabel label=\"Posted\"\n labelPlacement=\"start\"\n control={<SwitchPositive checked={reconciled}\n onChange={this.handleReconciled}\n name=\"reconciled\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />}\n />\n </Grid>\n\n <Grid item xs={12}>\n <FormControl fullWidth={true}\n error={error.date.error}>\n <DatePicker\n name=\"date\"\n label=\"Date\"\n open={datePickerOpen}\n onClose={() => this.setState({ datePickerOpen: false })}\n showTodayButton\n autoOk\n animateYearScrolling\n showDaysOutsideCurrentMonth\n clearable={false}\n value={date}\n toolbarFormat=\"MMMM d yyyy\"\n inputProps={{ readOnly: true }}\n onChange={date => this.handleDateChange(date)}\n renderInput={(params) => (\n <TextField\n {...params}\n onClick={() => this.setState({ datePickerOpen: true })}\n />)}\n okText={<span style={{ color: theme.palette.text.primary }}>Ok</span>}\n cancelText={<span style={{ color: theme.palette.text.primary }}>Cancel</span>}\n todayText={<span style={{ color: theme.palette.text.primary }}>Today</span>}\n />\n </FormControl>\n </Grid>\n <Grid item xs={3}>\n <Grid container alignItems=\"center\" justifyContent=\"center\" spacing={1} wrap=\"nowrap\"\n sx={{ margin: 'auto' }}\n >\n <Grid item>-</Grid>\n <Grid item>\n <SwitchPositive checked={amountPositive}\n onChange={this.handleAmountPositive}\n name=\"amountPositive\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />\n </Grid>\n <Grid item>+</Grid>\n </Grid>\n </Grid>\n <Grid item xs={3}>\n <TextField required\n name=\"amount\"\n value={amount}\n autoFocus\n onChange={this.handleInputChange}\n error={error.amount.error}\n helperText={error.amount.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"transactionAmount\"\n label=\"Amount\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"name\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={name}\n options={payeeOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleNameChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => {\n const filtered = filter(options, params)\n const { inputValue } = params\n const isExisting = options.some((option) => inputValue === option.name)\n // Suggest the creation of a new value\n if (inputValue !== '' && !isExisting) {\n filtered.push({\n inputValue,\n name: `Add \"${inputValue}\"`,\n })\n }\n\n return filtered\n }}\n renderInput={(params) => (\n <TextField required\n error={error.name.error}\n helperText={error.name.helperText}\n margin=\"dense\"\n label={amountPositive ? 'Payer (From)' : 'Payee (To)'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"category\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n disabled={!!(isATransfer || isAnAdjustment || isALoanAccount)}\n value={category}\n options={categoryOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleCategoryChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.category.error}\n helperText={error.category.helperText}\n margin=\"dense\"\n label={(transferAccountId > 0) || isAnAdjustment || isALoanAccount\n ? 'No category needed'\n : 'Category'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"account\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={account}\n options={accountOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleAccountChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.account.error}\n helperText={error.account.helperText}\n margin=\"dense\"\n label={amountPositive ? 'Account (To)' : 'Account (From)'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n {isASplit &&\n <Grid container item align=\"center\" alignItems=\"center\"\n justifyContent=\"center\">\n <Grid item xs={12}\n className={remainingSplitAmount !== 0 ? classes.fontError : null}>\n Remaining {formatMoneyLabel(remainingSplitAmount)}\n </Grid>\n </Grid>\n }\n {isASplit && splitCategories.map((element, index) => {\n let groupStyling = classes.splitGroup\n if (index === 0) groupStyling += ` ${classes.firstSplit}`\n else if (splitCategories.length === index + 1) groupStyling += ` ${classes.lastSplit}`\n return (\n <Grid container item align=\"center\" alignItems=\"center\"\n key={`split-${index}-${element.id}`}\n justifyContent=\"center\">\n <Grid container item spacing={2}\n className={groupStyling}>\n <Grid item xs={2}>\n {splitCategories && splitCategories.length > 2\n ?\n <IconButton onClick={(e) => this.handleSplitCategoryRemove(e, index)}\n aria-label=\"remove-split\" size=\"small\">\n <Cancel color=\"error\" fontSize=\"small\" />\n </IconButton>\n : null\n }\n </Grid>\n <Grid item xs={4}>\n <TextField required\n name=\"splitAmount\"\n value={element.amount}\n onChange={(e) => this.handleSplitAmountChange(e, index)}\n error={error.amount.error}\n helperText={error.amount.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n label=\"Amount\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"splitName\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={element.name || null}\n options={splitPayeeOptions}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={(e, value, reason) => this.handleSplitNameChange(e, index, value, reason)}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => {\n const filtered = filter(options, params)\n const { inputValue } = params\n const isExisting = options.some((option) => inputValue === option.name)\n // Suggest the creation of a new value\n if (inputValue !== '' && !isExisting) {\n filtered.push({\n inputValue,\n name: `Add \"${inputValue}\"`,\n })\n }\n\n return filtered\n }}\n renderInput={(params) => (\n <TextField error={error.name.error}\n helperText={error.name.helperText}\n margin=\"dense\"\n label=\"Payee\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"splitCategory\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={element.category || null}\n options={splitCategoryOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={(e, value, reason) => this.handleSplitCategoryChange(e, index, value, reason)}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.category.error}\n helperText={error.category.helperText}\n margin=\"dense\"\n label=\"Category\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField name=\"splitNotes\"\n value={element.notes}\n onChange={(e) => this.handleSplitNotesChange(e, index)}\n error={error.notes.error}\n helperText={error.notes.helperText}\n margin=\"dense\"\n label=\"Notes\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n </Grid>\n {splitCategories && splitCategories.length === index + 1 &&\n <Grid item xs={12} className={classes.splitAddButton}>\n <IconButton onClick={this.handleSplitCategoryAdd} aria-label=\"add-split\"\n size=\"small\">\n <Add color=\"inherit\" />\n </IconButton>\n </Grid>\n }\n </Grid>\n )\n })}\n <Grid item xs={12}>\n <TextField name=\"notes\"\n value={notes ? notes : ''}\n onChange={this.handleChange}\n error={error.notes.error}\n helperText={error.notes.helperText}\n margin=\"dense\"\n label=\"Notes\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\" item xs={12}\n >\n <FormControlLabel label=\"Flag\"\n labelPlacement=\"top\"\n control={<Grid container>\n {transactionFlagColors.map(f => (\n <Checkbox\n key={f.id}\n checked={f.id === flagId}\n onClick={(e) => this.handleFlagClick(e, f.id)}\n icon={<LabelOutlined />} checkedIcon={<Label />}\n sx={{\n color: f.color,\n '&.Mui-checked': {\n color: f.color,\n },\n }}\n />\n ))\n }\n <Checkbox\n checked={false}\n onClick={(e) => this.handleFlagClick({}, 0)}\n icon={<LabelOffOutlined />}\n />\n <Checkbox\n checked={false}\n onClick={this.openFlagForm}\n icon={<Edit />}\n />\n </Grid>}\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={() => this.clearForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n }\n </Dialog>\n <FlagForm open={flagFormOpen}\n closeForm={this.closeFlagForm}\n flagId={flagId}\n handleFlagClick={this.handleFlagClick}\n transactionFlagColors={transactionFlagColors}\n />\n </Fragment>\n )\n }\n}\n\nLinkTransactionForm.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n auth: PropTypes.object.isRequired,\n accounts: PropTypes.array.isRequired,\n payees: PropTypes.array.isRequired,\n transfers: PropTypes.array.isRequired,\n splits: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n linkTransaction: PropTypes.object,\n flagColors: PropTypes.array.isRequired,\n transactionFlags: PropTypes.array.isRequired,\n addTransaction: PropTypes.func.isRequired,\n editLinkTransaction: PropTypes.func.isRequired,\n returnErrors: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n accounts: state.accountReducer.accounts,\n payees: state.payeeReducer.payees,\n transfers: state.transferReducer.transfers,\n splits: state.splitReducer.splits,\n categories: state.categoryReducer.categories,\n flagColors: state.flagColorReducer.flagColors,\n transactionFlags: state.transactionFlagReducer.transactionFlags,\n})\n\nconst mapDispatchToProps = {\n addTransaction,\n editLinkTransaction,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(LinkTransactionForm))\n","import React, { useState, useEffect, Fragment } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { Typography, Toolbar, Grid, Accordion, AccordionSummary, AccordionDetails } from '@mui/material'\nimport { ExpandMore } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { formatISODate } from '../utilities/dates'\nimport LinkTransactionForm from '../layout/LinkTransactionForm'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 600\n },\n negativeAmount: {\n color: theme.palette.error.main,\n fontWeight: 600\n },\n tableRow: {\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n paddingRight: theme.spacing(2),\n paddingLeft: theme.spacing(2),\n borderBottom: '1px solid rgba(81, 81, 81, 1)',\n '&:hover': {\n backgroundColor: theme.palette.mode === 'light' ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.08)'\n }\n },\n tableLabel: {\n color: theme.palette.text.secondary\n },\n gridSpacing: {\n marginTop: theme.spacing(3),\n marginBottom: theme.spacing(1),\n paddingBottom: theme.spacing(2)\n }\n}))\n\nconst LinkTransactions = () => {\n const { accounts, linkAccounts, linkTransactions } = withPropsValidation(\n useSelector(({ accountReducer, linkReducer }) => ({\n accounts: accountReducer.accounts,\n linkAccounts: linkReducer.linkAccounts,\n linkTransactions: linkReducer.linkTransactions\n })))\n\n const [linkTransaction, setLinkTransaction] = useState(null)\n const [pendingTransactions, setPendingTransactions] = useState([])\n const [postedTransactions, setPostedTransactions] = useState([])\n const [isExpanded, setIsExpanded] = useState(true)\n\n const dispatch = useDispatch()\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Get the list of pending and posted link transactions.\n */\n useEffect(() => {\n const pending = linkTransactions.filter(link => link.pending)\n const posted = linkTransactions.filter(link => !link.pending)\n\n setPendingTransactions(pending)\n setPostedTransactions(posted)\n }, [linkTransactions])\n\n /**\n * This function is used to update the link transaction form with\n * row that was clicked on.\n * @param {Array} rowData - The link transaction actioned.\n */\n const handleLinkTransactionClick = rowData => {\n if (rowData && rowData.id) setLinkTransaction(rowData)\n }\n\n /**\n * This function is used to clear the selected link transaction.\n */\n const clearLinkTransaction = () => setLinkTransaction(null)\n\n return (\n <Fragment>\n {linkTransactions && linkTransactions.length > 0\n ? (\n <Accordion key={`uncategorized-link-transactions-group`}\n expanded={isExpanded}\n square\n onChange={() => setIsExpanded(!isExpanded)}\n >\n\n <AccordionSummary expandIcon={<ExpandMore fontSize=\"small\" style={{ color: '#FFF' }} />}>\n <Toolbar>\n <Typography variant=\"h6\" component=\"div\">\n Uncategorized Transactions\n </Typography>\n </Toolbar>\n </AccordionSummary>\n\n <AccordionDetails>\n {pendingTransactions && pendingTransactions.length > 0\n ? (\n <Fragment>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\"\n alignItems=\"flex-end\">\n <Typography variant=\"body1\">\n Pending\n </Typography>\n </Grid>\n\n {pendingTransactions.map(row => {\n let amount = row.amount > 0 ? -Math.abs(row.amount) : Math.abs(row.amount)\n const amountClasses = amount > 0 ? classes.positiveAmount : classes.negativeAmount\n const linkAccount = linkAccounts.find(l => row && l.id === row.account_id)\n const account = accounts.find(a => linkAccount && a.link_id === linkAccount.id)\n\n return (\n <Grid key={`pending-link-transaction-${row.id}`} container\n className={classes.tableRow}\n onClick={() => handleLinkTransactionClick(row)}\n >\n\n <Grid container item xs={6}\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n >\n <Typography variant=\"body1\">\n {row.merchant_name ? row.merchant_name : row.name}\n </Typography>\n <Typography variant=\"body2\" className={classes.tableLabel}>\n {formatISODate(row.date)}\n </Typography>\n </Grid>\n\n <Grid container item xs={6}\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-end\"\n >\n <Typography variant=\"body1\" className={amountClasses}>\n {formatMoneyLabel(amount)}\n </Typography>\n <Typography variant=\"body2\" className={classes.tableLabel}>\n {account && account.name ? account.name : ''}\n </Typography>\n </Grid>\n\n </Grid>\n )\n })}\n </Fragment>\n ) : null\n }\n\n {postedTransactions && postedTransactions.length > 0\n ? (\n <Fragment>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\"\n alignItems=\"flex-end\">\n <Typography variant=\"body1\"\n sx={{ padding: `${theme.spacing(1)} 0` }}\n >\n Posted\n </Typography>\n </Grid>\n\n {postedTransactions.map(row => {\n let amount = row.amount > 0 ? -Math.abs(row.amount) : Math.abs(row.amount)\n const amountClasses = amount > 0 ? classes.positiveAmount : classes.negativeAmount\n const linkAccount = linkAccounts.find(l => row && l.id === row.account_id)\n const account = accounts.find(a => linkAccount && a.link_id === linkAccount.id)\n\n return (\n <Grid key={`pending-link-transaction-${row.id}`} container\n className={classes.tableRow}\n onClick={() => handleLinkTransactionClick(row)}\n >\n\n <Grid container item xs={6}\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n >\n <Typography variant=\"body1\">\n {row.merchant_name ? row.merchant_name : row.name}\n </Typography>\n <Typography variant=\"body2\" className={classes.tableLabel}>\n {formatISODate(row.date)}\n </Typography>\n </Grid>\n\n <Grid container item xs={6}\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-end\"\n >\n <Typography variant=\"body1\" className={amountClasses}>\n {formatMoneyLabel(amount)}\n </Typography>\n <Typography variant=\"body2\" className={classes.tableLabel}>\n {account && account.name ? account.name : ''}\n </Typography>\n </Grid>\n\n </Grid>\n )\n })}\n </Fragment>\n ) : null\n }\n </AccordionDetails>\n </Accordion>\n ) : null\n }\n <LinkTransactionForm clearLinkTransaction={clearLinkTransaction}\n linkTransaction={linkTransaction}\n />\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'LinkTransactions')\n return props\n}\n\nconst propTypes = {\n accounts: PropTypes.array.isRequired,\n linkAccounts: PropTypes.array.isRequired,\n linkTransactions: PropTypes.array.isRequired\n}\n\nexport default LinkTransactions\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle, Grid\n} from '@mui/material'\nimport { Save, Cancel } from '@mui/icons-material'\n\nimport { sharedStyles, SwitchPositive } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { editCategoryBudget } from '../../actions/categoryBudgets'\nimport { editCategoryBudgetId } from '../../actions/categoryBudgetId'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { moneyInput } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass CategoryBudgetForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n budgeted: {\n error: null,\n helperText: '',\n },\n goal: {\n error: null,\n helperText: '',\n },\n },\n open: false,\n id: 0,\n goal: 0.00,\n budgeted: 0.00,\n goalPositive: true,\n budgetedPositive: true,\n categoryName: ''\n }\n\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleGoalPositive = this.handleGoalPositive.bind(this)\n this.handleBudgetedPositive = this.handleBudgetedPositive.bind(this)\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { categories, categoryBudgetId, categoryBudgets } = this.props\n\n if (categoryBudgetId !== prevProps.categoryBudgetId && categoryBudgetId > 0) {\n for (let categoryBudget of categoryBudgets) {\n if (categoryBudgetId === categoryBudget.category_id) {\n for (let category of categories) {\n if (category.id === categoryBudgetId) {\n let goalPositive = categoryBudget.goal >= 0\n let budgetedPositive = categoryBudget.budgeted >= 0\n\n this.setState({\n open: true,\n id: categoryBudget.id,\n goal: Math.abs(categoryBudget.goal),\n budgeted: Math.abs(categoryBudget.budgeted),\n goalPositive,\n budgetedPositive,\n categoryName: category.name\n })\n\n // End loop\n break\n }\n }\n\n // End loop\n break\n }\n }\n }\n }\n\n clearForm = () => {\n this.props.editCategoryBudgetId(-1)\n this.setState({\n open: false,\n id: 0,\n goal: 0.00,\n budgeted: 0.00,\n goalPositive: true,\n budgetedPositive: true,\n })\n }\n\n handleChange = e => {\n if (moneyInput(e.target.value)) this.setState({ [e.target.name]: e.target.value })\n }\n\n handleSubmit = e => {\n e.preventDefault()\n try {\n const { id, goal, budgeted, goalPositive, budgetedPositive } = this.state\n const { yearMonth, categoryBudgetId, editCategoryBudget } = this.props\n const { user } = this.props.auth\n let budgetYear = yearMonth.substring(0, 4)\n let budgetMonth = yearMonth.substring(4, 6)\n let budgetDate = `${budgetYear}-${budgetMonth}-01`\n let netGoal = goalPositive ? goal : -Math.abs(goal)\n let netBudgeted = budgetedPositive ? budgeted : -Math.abs(budgeted)\n // Edit Budget\n const budget = {\n id,\n goal: netGoal,\n budgeted: netBudgeted,\n category_id: categoryBudgetId,\n goal_id: 1,\n user_id: user.id,\n date: budgetDate\n }\n\n editCategoryBudget(budget, yearMonth)\n this.clearForm()\n } catch (e) {\n this.props.returnErrors({ updateCategoryBudget: 'Unable to update category budget at this time. Please try again later.' }, 500)\n }\n }\n\n handleGoalPositive = () => this.setState({ goalPositive: !this.state.goalPositive })\n\n handleBudgetedPositive = () => this.setState({ budgetedPositive: !this.state.budgetedPositive })\n\n render() {\n const {\n error, open, goal, budgeted, goalPositive, budgetedPositive, categoryName\n } = this.state\n const { classes, theme } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"category-budget-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Budget for {categoryName}\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={4}>\n <Grid container alignItems=\"center\" justifyContent=\"center\" spacing={1} wrap=\"nowrap\">\n <Grid item>-</Grid>\n <Grid item>\n <SwitchPositive checked={budgetedPositive}\n onChange={this.handleBudgetedPositive}\n name=\"budgetedPositive\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />\n </Grid>\n <Grid item>+</Grid>\n </Grid>\n </Grid>\n <Grid item xs={8}>\n <TextField required\n autoFocus\n name=\"budgeted\"\n value={budgeted}\n onChange={this.handleChange}\n error={error.budgeted.error}\n helperText={error.budgeted.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"categoryBudgetBudgeted\"\n label=\"Budgeted\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={4}>\n <Grid container alignItems=\"center\" justifyContent=\"center\" spacing={1} wrap=\"nowrap\">\n <Grid item>-</Grid>\n <Grid item>\n <SwitchPositive checked={goalPositive}\n onChange={this.handleGoalPositive}\n name=\"goalPositive\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />\n </Grid>\n <Grid item>+</Grid>\n </Grid>\n </Grid>\n <Grid item xs={8}>\n <TextField required\n name=\"goal\"\n value={goal}\n onChange={this.handleChange}\n error={error.goal.error}\n helperText={error.goal.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"categoryBudgetGoal\"\n label=\"Goal\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nCategoryBudgetForm.propTypes = {\n editCategoryBudget: PropTypes.func.isRequired,\n editCategoryBudgetId: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n categoryBudgetId: PropTypes.number.isRequired,\n categories: PropTypes.array.isRequired,\n yearMonth: PropTypes.string.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n categoryBudgetId: state.categoryBudgetIdReducer.categoryBudgetId,\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n categories: state.categoryReducer.categories,\n yearMonth: state.budgetMonthReducer.yearMonth,\n})\n\nconst mapDispatchToProps = {\n editCategoryBudgetId,\n editCategoryBudget,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(CategoryBudgetForm))\n","import React, { Fragment, useCallback } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { usePlaidLink } from 'react-plaid-link'\nimport { Button } from '@mui/material'\nimport { Link as LinkIcon, LinkOff as LinkOffIcon } from '@mui/icons-material'\n\nimport { addLinkTransactions, createLinkToken } from '../../actions/link'\nimport { returnErrors } from '../../actions/messages'\n\nconst Link = props => {\n let { linkToken } = props\n\n const onSuccess = useCallback((publicToken, metadata) => {\n const { linkAccounts, addLinkTransactions, returnErrors } = props\n // verify not a duplicate\n let duplicate = false\n const accounts = metadata && metadata.accounts ? metadata.accounts : []\n const institution = metadata && metadata.institution ? metadata.institution.institution_id : null\n\n for (const account of accounts) {\n let mask = account.mask\n let name = account.name\n for (const linkAccount of linkAccounts) {\n if (linkAccount.mask === mask && linkAccount.name === name && linkAccount.institution === institution) {\n duplicate = true\n }\n }\n }\n\n if (duplicate) {\n returnErrors({ linkAPI: 'This account is already linked.' }, 500)\n } else {\n // send public_token to server\n addLinkTransactions(publicToken)\n }\n }, [])\n\n const onEvent = useCallback((eventName, metadata) => {\n }, [])\n\n /**\n * Plaid link exit event. Used to catch if token is expired.\n * TODO: Implement better error handling and token expiration check.\n * @param error\n * @param metadata\n */\n const onExit = useCallback((error, metadata) => {\n const { user, linkToken, createLinkToken } = props\n\n if (error && error.error_code === 'INVALID_LINK_TOKEN') {\n if (user.id && linkToken) {\n createLinkToken()\n }\n }\n }, [])\n\n const config = {\n token: linkToken,\n onSuccess,\n onEvent,\n onExit\n }\n\n const { open, ready, error } = usePlaidLink(config)\n\n return (\n <Fragment>\n {!ready || error || !linkToken\n ?\n <Button disabled color=\"primary\" variant=\"contained\">\n <LinkOffIcon /> Loading...\n </Button>\n :\n <Button onClick={() => open()\n } color=\"primary\" variant=\"contained\">\n <LinkIcon /> Connect\n </Button>\n }\n </Fragment>\n )\n}\n\nLink.propTypes = {\n user: PropTypes.object.isRequired,\n linkToken: PropTypes.string.isRequired,\n addLinkTransactions: PropTypes.func.isRequired,\n createLinkToken: PropTypes.func.isRequired,\n linkAccounts: PropTypes.array.isRequired\n}\n\nconst mapStateToProps = state => ({\n linkToken: state.linkReducer.linkToken,\n user: state.authReducer.user,\n linkAccounts: state.linkReducer.linkAccounts\n})\n\nconst mapDispatchToProps = {\n addLinkTransactions,\n createLinkToken,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Link)\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Button, Dialog, DialogActions, DialogContent, Typography, DialogTitle } from '@mui/material'\nimport { CheckCircle } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { createLinkToken } from '../../actions/link'\nimport Link from '../link/Link'\nimport { fullScreen, Transition } from '../utilities/dialogs'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass LinkForm extends Component {\n\n componentDidMount() {\n const { user, open, linkToken, createLinkToken } = this.props\n\n if (open && user.id && !linkToken) {\n createLinkToken()\n }\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { user, open, linkToken, createLinkToken } = this.props\n\n // Only create the link token if the user clicked \"Link\" from the\n // create button.\n if (open && open !== prevProps.open) {\n if (user.id && !linkToken) {\n createLinkToken()\n }\n }\n }\n\n handleFormClose = () => this.props.onFormClose()\n\n render() {\n const { classes, theme, open, linkToken } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"link-form\"\n disableEnforceFocus\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Link Account\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\">\n You can connect your bank to have your transactions\n automagically flow into your budget leaving you to just\n categorize them.\n </Typography>\n\n </DialogContent>\n <DialogActions>\n {linkToken && <Link linkToken={linkToken} />}\n <Button onClick={this.handleFormClose} color=\"inherit\" variant=\"outlined\">\n <CheckCircle /> Done\n </Button>\n </DialogActions>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nLinkForm.propTypes = {\n open: PropTypes.bool.isRequired,\n createLinkToken: PropTypes.func.isRequired,\n onFormClose: PropTypes.func.isRequired,\n linkToken: PropTypes.string\n}\n\nconst mapStateToProps = state => ({\n user: state.authReducer.user,\n linkToken: state.linkReducer.linkToken,\n})\n\nconst mapDispatchToProps = {\n createLinkToken,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(LinkForm))\n","import { GET_COLLECTION_ID, EDIT_COLLECTION_ID } from './types'\n\n// Get Collection ID\nexport const getCollectionId = () => (dispatch, getState) => {\n dispatch({\n type: GET_COLLECTION_ID,\n payload: getState\n })\n}\n\n// Edit Collection ID\nexport const editCollectionId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_COLLECTION_ID,\n payload: id\n })\n}\n","import { GET_CATEGORY_ID, EDIT_CATEGORY_ID } from './types'\n\n// Get category Id\nexport const getCategoryId = () => (dispatch, getState) => {\n dispatch({\n type: GET_CATEGORY_ID,\n payload: getState\n })\n}\n\n// Edit category Id\nexport const editCategoryId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_CATEGORY_ID,\n payload: id\n })\n}\n","import { GET_HOLDING_ID, EDIT_HOLDING_ID } from './types'\n\n// Get Holding ID\nexport const getHoldingId = () => (dispatch, getState) => {\n dispatch({\n type: GET_HOLDING_ID,\n payload: getState\n })\n}\n\n// Edit Holding ID\nexport const editHoldingId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_HOLDING_ID,\n payload: id\n })\n}\n","import { GET_TRANSACTION_ID, EDIT_TRANSACTION_ID } from './types'\n\n// Get Transaction Id\nexport const getTransactionId = () => (dispatch, getState) => {\n dispatch({\n type: GET_TRANSACTION_ID,\n payload: getState\n })\n}\n\n// Edit Transaction Id\nexport const editTransactionId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_TRANSACTION_ID,\n payload: id\n })\n}\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { SpeedDial, SpeedDialIcon, SpeedDialAction } from '@mui/material'\nimport { Link, AccountBalance, ViewAgenda, Category, ShowChart, ReceiptLong } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport LinkForm from './LinkForm'\nimport { editAccountId } from '../../actions/accountId'\nimport { editCollectionId } from '../../actions/collectionId'\nimport { editCategoryId } from '../../actions/categoryId'\nimport { editHoldingId } from '../../actions/holdingId'\nimport { editTransactionId } from '../../actions/transactionId'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass ActionButtons extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n open: false,\n linkConnectOpen: false\n }\n\n this.handleActionButtonToggle = this.handleActionButtonToggle.bind(this)\n this.handleLinkFormClose = this.handleLinkFormClose.bind(this)\n this.handleLinkClick = this.handleLinkClick.bind(this)\n this.handleAccountClick = this.handleAccountClick.bind(this)\n this.handleCollectionClick = this.handleCollectionClick.bind(this)\n this.handleCategoryClick = this.handleCategoryClick.bind(this)\n this.handleHoldingClick = this.handleHoldingClick.bind(this)\n this.handleTransactionClick = this.handleTransactionClick.bind(this)\n }\n\n handleActionButtonToggle = () => {\n const { open } = this.state\n\n this.setState({ open: !open })\n }\n\n handleLinkClick = () => this.setState({ linkConnectOpen: true, open: false })\n\n handleLinkFormClose = () => this.setState({ linkConnectOpen: false })\n\n handleAccountClick = () => {\n this.handleActionButtonToggle()\n this.props.editAccountId(0)\n }\n\n handleCollectionClick = () => {\n this.handleActionButtonToggle()\n this.props.editCollectionId(0)\n }\n\n handleCategoryClick = () => {\n this.handleActionButtonToggle()\n this.props.editCategoryId(0)\n }\n\n handleHoldingClick = () => {\n this.handleActionButtonToggle()\n this.props.editHoldingId(0)\n }\n\n handleTransactionClick = () => {\n this.handleActionButtonToggle()\n this.props.editTransactionId(0)\n }\n\n render() {\n const { open, linkConnectOpen } = this.state\n const { classes } = this.props\n const actions = [\n { icon: <ReceiptLong />, name: 'Transaction', handleClick: this.handleTransactionClick },\n { icon: <ShowChart />, name: 'Holding', handleClick: this.handleHoldingClick },\n { icon: <Category />, name: 'Category', handleClick: this.handleCategoryClick },\n { icon: <ViewAgenda />, name: 'Collection', handleClick: this.handleCollectionClick },\n { icon: <AccountBalance />, name: 'Account', handleClick: this.handleAccountClick },\n { icon: <Link />, name: 'Link', handleClick: this.handleLinkClick },\n ]\n\n return (\n <Fragment>\n <SpeedDial\n ariaLabel=\"Add data\"\n transitionDuration={{ enter: 500, exit: 500 }}\n className={classes.fab}\n classes={{ fab: classes.fabButton }}\n icon={<SpeedDialIcon />}\n onClick={this.handleActionButtonToggle}\n open={open}\n >\n {actions.map((action) => (\n <SpeedDialAction\n key={action.name}\n title={action.name}\n icon={action.icon}\n tooltipTitle={action.name}\n classes={{ staticTooltipLabel: classes.fabLabel, fab: classes.fabAction }}\n tooltipOpen\n onClick={action.handleClick}\n />\n ))}\n </SpeedDial>\n <LinkForm open={linkConnectOpen} onFormClose={this.handleLinkFormClose} />\n </Fragment>\n )\n }\n}\n\nActionButtons.propTypes = {\n editAccountId: PropTypes.func.isRequired,\n editCollectionId: PropTypes.func.isRequired,\n editCategoryId: PropTypes.func.isRequired,\n editHoldingId: PropTypes.func.isRequired,\n editTransactionId: PropTypes.func.isRequired,\n}\n\nconst mapStateToProps = state => ({\n user: state.authReducer.user,\n})\n\nconst mapDispatchToProps = {\n editAccountId,\n editCollectionId,\n editCategoryId,\n editHoldingId,\n editTransactionId,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(ActionButtons))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle, Grid\n} from '@mui/material'\nimport { Save, Cancel, Delete } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { addCollection, editCollection, deleteCollection } from '../../actions/collections'\nimport { editCollectionId } from '../../actions/collectionId'\nimport { fullScreen, Transition } from '../utilities/dialogs'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass CollectionForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: {\n error: null,\n helperText: '',\n }\n },\n open: false,\n name: '',\n }\n\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { collectionId, collections } = this.props\n\n if (collectionId !== prevProps.collectionId && collectionId >= 0) {\n if (collectionId === 0) {\n // New collection record.\n this.setState({ open: true })\n } else if (collectionId > 0) {\n // Update an existing collection record.\n for (let collection of collections) {\n if (collectionId === collection.id) {\n this.setState({\n open: true,\n name: collection.name,\n })\n\n // End loop\n break\n }\n }\n }\n }\n }\n\n clearForm = () => {\n this.props.editCollectionId(-1)\n this.setState({\n open: false,\n name: '',\n })\n }\n\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n handleSubmit = e => {\n e.preventDefault()\n const { name } = this.state\n const { user } = this.props.auth\n const { collectionId } = this.props\n\n if (collectionId > 0) {\n // Edit Collection\n const collection = { id: collectionId, name, user_id: user.id }\n this.props.editCollection(collection)\n } else {\n // Add Collection\n const collection = { name, user_id: user.id }\n this.props.addCollection(collection)\n }\n\n this.clearForm()\n }\n\n handleDelete = () => {\n const { collectionId } = this.props\n\n this.props.deleteCollection(collectionId)\n this.clearForm()\n }\n\n render() {\n const { open, error, name } = this.state\n const { classes, theme, collectionId } = this.props\n\n const deleteButton = (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n )\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"collection-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Collection\n {collectionId > 0 ? deleteButton : ''}\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container justifyContent=\"center\">\n <Grid item xs={12}>\n <TextField required\n name=\"name\"\n value={name}\n onChange={this.handleChange}\n error={error.name.error}\n helperText={error.name.helperText}\n autoFocus\n margin=\"dense\"\n id=\"collectionName\"\n label=\"Collection Name\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nCollectionForm.propTypes = {\n addCollection: PropTypes.func.isRequired,\n editCollection: PropTypes.func.isRequired,\n deleteCollection: PropTypes.func.isRequired,\n editCollectionId: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n collections: PropTypes.array.isRequired,\n collectionId: PropTypes.number.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n collectionId: state.collectionIdReducer.collectionId,\n collections: state.collectionReducer.collections,\n})\n\nconst mapDispatchToProps = {\n addCollection,\n editCollection,\n deleteCollection,\n editCollectionId,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(CollectionForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, TextField, Dialog, DialogActions, DialogContent,\n DialogTitle, Grid\n} from '@mui/material'\nimport { Autocomplete } from '@mui/material'\nimport { Save, Cancel, Delete, Inventory } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { addCategory, editCategory, deleteCategory } from '../../actions/categories'\nimport { editCategoryId } from '../../actions/categoryId'\nimport { fullScreen, Transition } from '../utilities/dialogs'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass CategoryForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: {\n error: null,\n helperText: '',\n },\n notes: {\n error: null,\n helperText: '',\n },\n collection: {\n error: null,\n helperText: '',\n },\n },\n open: false,\n name: '',\n notes: '',\n collection: null,\n canDelete: true\n }\n\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleCollectionChange = this.handleCollectionChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { categoryId, collections, categories } = this.props\n\n if (categoryId !== prevProps.categoryId && categoryId >= 0) {\n if (categoryId === 0) {\n // New category record.\n this.setState({ open: true })\n } else if (categoryId > 0) {\n // Update an existing category record.\n for (let category of categories) {\n if (categoryId === category.id) {\n for (let collection of collections) {\n if (collection.id === category.collection_id) {\n\n this.setState({\n open: true,\n name: category.name,\n notes: category.notes,\n collection,\n canDelete: category.can_delete\n })\n\n // End loop\n break\n }\n }\n\n // End loop\n break\n }\n }\n }\n }\n }\n\n clearForm = () => {\n this.props.editCategoryId(-1)\n this.setState({\n open: false,\n name: '',\n notes: '',\n collection: null,\n canDelete: true\n })\n }\n\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n handleCollectionChange = (event, value) => {\n if (value) this.setState({ collection: value })\n }\n\n handleSubmit = e => {\n e.preventDefault()\n const { name, notes, collection } = this.state\n const { user } = this.props.auth\n const { categoryId, yearMonth } = this.props\n const collectionId = collection && collection.id ? collection.id : null\n if (!collectionId) return false\n\n if (categoryId > 0) {\n // Edit Category\n const category = {\n id: categoryId,\n name,\n notes,\n collection_id: collectionId,\n user_id: user.id\n }\n\n this.props.editCategory(category, yearMonth)\n } else {\n // Add Category\n const category = {\n name,\n notes,\n collection_id: collectionId,\n user_id: user.id\n }\n\n this.props.addCategory(category, yearMonth)\n }\n this.clearForm()\n }\n\n /**\n * This will delete the category permanently if there are no\n * transactions or budget dollars tied to this category. If there are\n * then it will set the archive flag to true.\n */\n handleDelete = () => {\n const { yearMonth, categoryId } = this.props\n\n this.props.deleteCategory(categoryId, yearMonth)\n this.clearForm()\n }\n\n render() {\n const { open, name, notes, collection, canDelete, error } = this.state\n const { classes, theme, categoryId, collections } = this.props\n\n const deleteButton = canDelete\n ? (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n ) : (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Inventory className={classes.pr1} />Archive\n </Button>\n )\n\n return (\n <Fragment>\n <Dialog\n open={open}\n aria-labelledby=\"category-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Category\n {categoryId > 0 ? deleteButton : ''}\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n\n <Grid item xs={12}>\n <Autocomplete\n name=\"collection\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={collection}\n options={collections}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={option => option.name ? option.name : ''}\n onChange={this.handleCollectionChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n renderInput={(params) => (\n <TextField required\n error={error.collection.error}\n helperText={error.collection.helperText}\n margin=\"dense\"\n id=\"collection\"\n label=\"Collection\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n\n <Grid item xs={12}>\n <TextField required\n name=\"name\"\n value={name}\n onChange={this.handleChange}\n error={error.name.error}\n helperText={error.name.helperText}\n autoFocus\n margin=\"dense\"\n id=\"categoryName\"\n label=\"Category Name\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={12}>\n <TextField name=\"notes\"\n value={notes ? notes : ''}\n onChange={this.handleChange}\n error={error.notes.error}\n helperText={error.notes.helperText}\n margin=\"dense\"\n label=\"Notes\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nCategoryForm.propTypes = {\n addCategory: PropTypes.func.isRequired,\n editCategory: PropTypes.func.isRequired,\n deleteCategory: PropTypes.func.isRequired,\n editCategoryId: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n yearMonth: PropTypes.string.isRequired,\n collections: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n categoryId: PropTypes.number.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n collections: state.collectionReducer.collections,\n categoryId: state.categoryIdReducer.categoryId,\n categories: state.categoryReducer.categories,\n})\n\nconst mapDispatchToProps = {\n addCategory,\n editCategory,\n deleteCategory,\n editCategoryId,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(CategoryForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle, Grid, FormControl\n} from '@mui/material'\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'\nimport { Save, Cancel, Delete } from '@mui/icons-material'\nimport { DateTime } from 'luxon'\nimport { DatePicker } from '@mui/lab'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { investmentInput } from '../utilities/numbers'\nimport { addHolding, editHolding, deleteHolding } from '../../actions/holdings'\nimport { editHoldingId } from '../../actions/holdingId'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { createToast } from '../../actions/messages'\n\nconst filter = createFilterOptions()\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass HoldingForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: { error: null, helperText: '' },\n ticker: { error: null, helperText: '' },\n shares: { error: null, helperText: '' },\n costBasis: { error: null, helperText: '' },\n marketValue: { error: null, helperText: '' },\n date: { error: null, helperText: '', },\n account: { error: null, helperText: '' }\n },\n open: false,\n datePickerOpen: false,\n name: '',\n ticker: '',\n shares: 0,\n costBasis: 0,\n marketValue: 0,\n date: DateTime.local(),\n account: { id: 0, name: '' },\n accountOptions: [],\n\n }\n\n this.updateAccountOptions = this.updateAccountOptions.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleTickerChange = this.handleTickerChange.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleDateChange = this.handleDateChange.bind(this)\n this.handleAccountChange = this.handleAccountChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n }\n\n componentDidMount() {\n this.updateAccountOptions()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { holdingId, history, accounts } = this.props\n\n if (holdingId !== prevProps.holdingId && holdingId >= 0) {\n if (holdingId === 0) {\n // New holding record.\n this.setState({ open: true })\n } else if (holdingId > 0) {\n // Update an existing holding record.\n for (let holding of history) {\n if (holdingId === holding.id) {\n\n // We don't allow linked holdings to be edited.\n if (holding && holding.link_account_id) {\n this.props.editHoldingId(-1)\n this.props.createToast({\n holdingInfo: 'Linked holdings cannot be edited.'\n })\n break\n }\n\n // Get account\n let account = { id: 0, name: '' }\n for (const a of accounts) {\n if (a.id === holding.account_id) {\n account = a\n break\n }\n }\n\n this.setState({\n open: true,\n name: holding.name,\n ticker: holding.ticker_symbol,\n shares: holding.quantity,\n costBasis: holding.cost_basis,\n marketValue: holding.institution_value,\n date: DateTime.fromISO(holding.institution_price_as_of),\n account\n })\n\n // End loop\n break\n }\n }\n }\n }\n\n // Update account options\n if (accounts && accounts !== prevProps.accounts) {\n this.updateAccountOptions()\n }\n }\n\n /**\n * Update the available account options to assign a holdings to.\n * Investment (F) types only.\n */\n updateAccountOptions = () => {\n const { accounts } = this.props\n\n const accountOptions = []\n for (const account of accounts) {\n if (account.archived) continue\n const accountTypeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n let group = 'Investments'\n\n if (accountTypeCode !== 'F') continue\n\n accountOptions.push({ group, ...account })\n }\n\n this.setState({ accountOptions })\n }\n\n clearForm = () => {\n this.props.editHoldingId(-1)\n this.setState({\n error: {\n name: { error: null, helperText: '' },\n ticker: { error: null, helperText: '' },\n shares: { error: null, helperText: '' },\n costBasis: { error: null, helperText: '' },\n marketValue: { error: null, helperText: '' },\n date: { error: null, helperText: '' },\n account: { error: null, helperText: '' }\n },\n open: false,\n name: '',\n ticker: '',\n shares: 0,\n costBasis: 0,\n marketValue: 0,\n account: { id: 0, name: '' },\n })\n }\n\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n /**\n * Change event for the ticker field to autocapitalize the input\n * @param e\n */\n handleTickerChange = e => {\n let value = e.target.value\n value = value ? value.toUpperCase() : ''\n\n this.setState({ [e.target.name]: value })\n }\n\n /**\n * Update investment numbers change\n * @param {Object} e - The event object.\n */\n handleInputChange = e => {\n\n if (investmentInput(e.target.value)) {\n this.setState({\n [e.target.name]: e.target.value,\n })\n }\n }\n\n handleDateChange = date => this.setState({ date })\n\n /**\n * This function is used to update the account state.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleAccountChange = (e, value, reason) => {\n const { error } = this.state\n\n if (reason === 'clear') {\n this.setState({\n account: { id: 0, name: '' },\n error: { ...error, account: { error: null, helperText: '' } }\n })\n } else if (value) {\n this.setState({\n account: value,\n error: { ...error, account: { error: null, helperText: '' } }\n })\n }\n }\n\n /**\n * Submit form.\n * @param {Object} e - The event object\n */\n handleSubmit = e => {\n e.preventDefault()\n const { error, name, ticker, shares, costBasis, marketValue, date, account } = this.state\n const { user } = this.props.auth\n const { holdingId, yearMonth } = this.props\n const accountId = account && account.id ? account.id : 0\n if (accountId === 0) {\n this.setState({\n error: {\n ...error,\n account: {\n error: true,\n helperText: 'Account is required.'\n }\n }\n })\n\n return false\n }\n\n if (holdingId > 0) {\n // Edit Holding\n const holding = {\n id: holdingId,\n name,\n ticker_symbol: ticker,\n quantity: shares,\n cost_basis: costBasis,\n institution_value: marketValue,\n institution_price_as_of: date.toISODate(),\n account_id: account.id,\n user_id: user.id\n }\n\n this.props.editHolding(holding, yearMonth)\n } else {\n // Add Holding\n const holding = {\n name,\n ticker_symbol: ticker,\n quantity: shares,\n cost_basis: costBasis,\n institution_value: marketValue,\n institution_price_as_of: date.toISODate(),\n account_id: account.id,\n user_id: user.id\n }\n\n this.props.addHolding(holding, yearMonth)\n }\n\n this.clearForm()\n }\n\n handleDelete = () => {\n const { holdingId } = this.props\n\n this.props.deleteHolding(holdingId)\n this.clearForm()\n }\n\n render() {\n const {\n open,\n datePickerOpen,\n error,\n name,\n ticker,\n shares,\n costBasis,\n marketValue,\n date,\n account,\n accountOptions\n } = this.state\n const { classes, theme, holdingId } = this.props\n\n const deleteButton = (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n )\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"holding-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Holding\n {holdingId > 0 ? deleteButton : ''}\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container justifyContent=\"center\" spacing={2}>\n\n <Grid item xs={12}>\n <FormControl fullWidth={true} error={error.date.error}>\n <DatePicker\n name=\"date\"\n label=\"Date\"\n open={datePickerOpen}\n onClose={() => this.setState({ datePickerOpen: false })}\n showTodayButton\n autoOk\n animateYearScrolling\n showDaysOutsideCurrentMonth\n clearable={false}\n value={date}\n toolbarFormat=\"MMMM d yyyy\"\n inputProps={{ readOnly: true }}\n onChange={date => this.handleDateChange(date)}\n renderInput={(params) => (\n <TextField\n {...params}\n onClick={() => this.setState({ datePickerOpen: true })}\n />)}\n okText={<span style={{ color: theme.palette.text.primary }}>Ok</span>}\n cancelText={<span style={{ color: theme.palette.text.primary }}>Cancel</span>}\n todayText={<span style={{ color: theme.palette.text.primary }}>Today</span>}\n />\n </FormControl>\n </Grid>\n\n <Grid item xs={12}>\n <TextField required\n name=\"name\"\n value={name}\n onChange={this.handleChange}\n error={error.name.error}\n helperText={error.name.helperText}\n autoFocus\n margin=\"dense\"\n id=\"holdingName\"\n label=\"Name\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={6}>\n <TextField required\n name=\"ticker\"\n value={ticker}\n onChange={this.handleTickerChange}\n error={error.ticker.error}\n helperText={error.ticker.helperText}\n margin=\"dense\"\n id=\"holdingTicker\"\n label=\"Ticker Symbol\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={6}>\n <TextField required\n name=\"shares\"\n value={shares}\n onChange={this.handleInputChange}\n error={error.shares.error}\n helperText={error.shares.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"holdingShares\"\n label=\"Shares\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={6}>\n <TextField required\n name=\"costBasis\"\n value={costBasis}\n onChange={this.handleInputChange}\n error={error.costBasis.error}\n helperText={error.costBasis.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"holdingCostBasis\"\n label=\"Cost Basis (Total Cost for all shares.)\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={6}>\n <TextField required\n name=\"marketValue\"\n value={marketValue}\n onChange={this.handleInputChange}\n error={error.marketValue.error}\n helperText={error.marketValue.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"holdingMarketValue\"\n label=\"Market Value (Price x Shares)\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n\n <Grid item xs={12}>\n <Autocomplete\n name=\"account\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={account}\n options={accountOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleAccountChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.account.error}\n helperText={error.account.helperText}\n margin=\"dense\"\n label=\"Account\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nHoldingForm.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n addHolding: PropTypes.func.isRequired,\n editHolding: PropTypes.func.isRequired,\n deleteHolding: PropTypes.func.isRequired,\n editHoldingId: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n history: PropTypes.array.isRequired,\n holdingId: PropTypes.number.isRequired,\n accounts: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n accounts: state.accountReducer.accounts,\n holdingId: state.holdingIdReducer.holdingId,\n history: state.holdingReducer.history\n})\n\nconst mapDispatchToProps = {\n addHolding,\n editHolding,\n deleteHolding,\n editHoldingId,\n createToast\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(HoldingForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { DateTime } from 'luxon'\nimport numeral from 'numeral'\nimport { DatePicker } from '@mui/lab'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n FormControlLabel, FormControl, Button, IconButton, TextField,\n Dialog, DialogActions, DialogContent, DialogTitle, Grid, Checkbox\n} from '@mui/material'\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'\nimport { Save, Add, Cancel, Delete, Label, LabelOutlined, Edit, LabelOffOutlined } from '@mui/icons-material'\n\nimport { sharedStyles, SwitchPositive } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport FlagForm from './FlagForm'\nimport { addTransaction, editTransaction, deleteTransaction } from '../../actions/transactions'\nimport { editTransactionId } from '../../actions/transactionId'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { moneyInput, formatMoneyLabel, formatMoney } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst filter = createFilterOptions()\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass TransactionForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n name: { error: null, helperText: '', },\n amount: { error: null, helperText: '', },\n category: { error: null, helperText: '', },\n account: { error: null, helperText: '', },\n date: { error: null, helperText: '', },\n notes: { error: null, helperText: '', },\n },\n open: false,\n datePickerOpen: false,\n name: { id: 0, name: '' },\n amountPositive: false,\n amount: '',\n category: { id: 0, name: '' },\n account: { id: 0, name: '' },\n date: DateTime.local(),\n splitCategories: [\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' },\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' }\n ],\n remainingSplitAmount: 0,\n notes: '',\n flagId: 0,\n reconciled: false,\n transferAccountId: 0,\n accountOptions: [],\n categoryOptions: [],\n splitCategoryOptions: [],\n payeeOptions: [],\n flagFormOpen: false,\n transactionFlagColors: [],\n splitPayeeOptions: [],\n addAnotherTransaction: false\n }\n\n this.updateAccountOptions = this.updateAccountOptions.bind(this)\n this.updatePayeeOptions = this.updatePayeeOptions.bind(this)\n this.updateCategoryOptions = this.updateCategoryOptions.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.addAnotherTransaction = this.addAnotherTransaction.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleNameChange = this.handleNameChange.bind(this)\n this.handleCategoryChange = this.handleCategoryChange.bind(this)\n this.handleAccountChange = this.handleAccountChange.bind(this)\n this.handleAmountPositive = this.handleAmountPositive.bind(this)\n this.handleReconciled = this.handleReconciled.bind(this)\n this.handleDateChange = this.handleDateChange.bind(this)\n this.handleSplitAmountChange = this.handleSplitAmountChange.bind(this)\n this.handleSplitNameChange = this.handleSplitNameChange.bind(this)\n this.handleSplitNotesChange = this.handleSplitNotesChange.bind(this)\n this.handleSplitCategoryChange = this.handleSplitCategoryChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleDelete = this.handleDelete.bind(this)\n this.handleSplitCategoryAdd = this.handleSplitCategoryAdd.bind(this)\n this.handleSplitCategoryRemove = this.handleSplitCategoryRemove.bind(this)\n this.getRemainingSplitAmount = this.getRemainingSplitAmount.bind(this)\n this.usersTransactionFlags = this.usersTransactionFlags.bind(this)\n this.handleFlagClick = this.handleFlagClick.bind(this)\n this.openFlagForm = this.openFlagForm.bind(this)\n this.closeFlagForm = this.closeFlagForm.bind(this)\n }\n\n componentDidMount() {\n this.updateAccountOptions()\n this.updatePayeeOptions()\n this.updateCategoryOptions()\n this.usersTransactionFlags()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { category } = this.state\n const {\n accounts, categories, transactionId, transactions, payees, transfers, splits,\n flagColors, transactionFlags\n } = this.props\n\n /**\n * When an existing transaction is clicked update the form with the\n * current data\n */\n if (transactionId !== prevProps.transactionId) {\n if (transactionId === 0) {\n // New transaction\n this.setState({\n open: true,\n addAnotherTransaction: false\n })\n } else if (transactionId > 0) {\n // Edit transaction\n for (let transaction of transactions) {\n if (transactionId === transaction.id) {\n let amountPositive = transaction.amount > 0\n let reconciled = transaction.reconciled\n let amount = Math.abs(transaction.amount)\n let account = { id: 0, name: '' }\n let category = { id: 0, name: '' }\n let name = { id: 0, name: '' }\n let transferAccountId = 0\n let flagId = (transaction.flag_id || 0)\n\n // Get account\n for (const a of accounts) {\n if (a.id === transaction.account_id) {\n account = a\n break\n }\n }\n\n // Get category\n for (const c of categories) {\n if (c.id === transaction.category_id) {\n category = c\n break\n }\n }\n\n // Get payee name\n for (const payee of payees) {\n if (transaction.name === payee.name) {\n name = { id: payee.id, name: payee.name }\n break\n }\n }\n\n // Is transaction a transfer\n for (const t of transfers) {\n if (transactionId === t.to_transaction_id) {\n // Get the account the money was sent from.\n for (let trans of transactions) {\n if (t.from_transaction_id === trans.id) {\n transferAccountId = trans.account_id\n name = { id: `T-${transferAccountId}`, name: transaction.name }\n break\n }\n }\n break\n }\n if (transactionId === t.from_transaction_id) {\n // Get the account the money was sent to.\n for (let trans of transactions) {\n if (t.to_transaction_id === trans.id) {\n transferAccountId = trans.account_id\n name = { id: `T-${transferAccountId}`, name: transaction.name }\n break\n }\n }\n break\n }\n }\n\n // Get split categories.\n let splitCategories = []\n for (const split of splits) {\n if (transactionId === split.transaction_id) {\n let amount = split.amount && typeof (split.amount) === 'number' ? Math.abs(split.amount) : 0\n let splitCategory = {}\n let splitPayee = {}\n // Get split transaction category\n for (const c of categories) {\n if (c.id === split.category_id) {\n splitCategory = c\n break\n }\n }\n // Get split transaction payee\n for (const p of payees) {\n if (p.name === split.name) {\n splitPayee = p\n break\n }\n }\n\n splitCategories.push({\n id: split.id,\n category: splitCategory,\n name: splitPayee,\n amount: amount,\n notes: split.notes\n })\n }\n }\n\n // If no split categories set the default blank 2\n if (splitCategories && splitCategories.length <= 0) {\n splitCategories = [\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' },\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' }\n ]\n }\n\n this.setState({\n open: true,\n name,\n amountPositive: amountPositive,\n amount: amount,\n category,\n account,\n date: DateTime.fromISO(transaction.date),\n splitCategories,\n notes: transaction.notes,\n flagId,\n reconciled,\n transferAccountId,\n addAnotherTransaction: false\n })\n\n // End loop\n break\n }\n }\n }\n }\n\n // Update account options\n if ((accounts && accounts !== prevProps.accounts)\n || (transactionId !== -1 && transactionId !== prevProps.transactionId)) {\n this.updateAccountOptions()\n }\n\n // Update payee options\n if ((payees && payees !== prevProps.payees)\n || (accounts && accounts !== prevProps.accounts)\n || (transactionId !== -1 && transactionId !== prevProps.transactionId)) {\n this.updatePayeeOptions()\n }\n\n // Update category options\n if ((categories && categories !== prevProps.categories)\n || (category && category !== prevState.category)) {\n this.updateCategoryOptions()\n }\n\n // Update transaction flag options\n if ((transactionFlags && transactionFlags !== prevProps.transactionFlags)\n || (flagColors && flagColors !== prevProps.flagColors)\n || (transactionId !== -1 && transactionId !== prevProps.transactionId)) {\n this.usersTransactionFlags()\n }\n }\n\n /**\n * Update the transaction flag options to assign a transaction to.\n */\n usersTransactionFlags = () => {\n const { flagColors, transactionFlags } = this.props\n\n // Get the users flag colors and labels.\n const transactionFlagColors = []\n for (const flagColor of flagColors) {\n for (const transactionFlag of transactionFlags) {\n if (flagColor.id === transactionFlag.color_id) {\n transactionFlagColors.push({\n id: transactionFlag.id,\n colorId: flagColor.id,\n color: flagColor.name,\n name: transactionFlag.name\n })\n }\n }\n }\n\n // Update state.\n this.setState({ transactionFlagColors })\n }\n\n /**\n * Update the available account options to assign a transaction to.\n */\n updateAccountOptions = () => {\n const { accounts } = this.props\n\n const accountOptions = []\n for (const account of accounts) {\n if (account.archived) continue\n const accountTypeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n let group = 'Cash'\n\n if (accountTypeCode === 'C') {\n group = 'Credit Cards'\n } else if (accountTypeCode === 'E') {\n group = 'Loans'\n } else if (accountTypeCode === 'F') {\n continue\n }\n\n accountOptions.push({ group, ...account })\n }\n\n this.setState({ accountOptions })\n }\n\n /**\n * If the payee or account prop is updated then we need to update\n * the payeeOptions state. If editing an account, and it is not a\n * transfer then don't allow them to turn it into one.\n */\n updatePayeeOptions = () => {\n const { transferAccountId, name } = this.state\n const { accounts, payees, transactionId } = this.props\n\n let payeeOptions = []\n let splitPayeeOptions = []\n /**\n * If editing a transaction and not a transfer don't show transfers\n * and adjustment as options.\n */\n if ((transactionId > 0 && transferAccountId > 0) || (transactionId === 0)) {\n for (const a of accounts) {\n const code = a.type_code ? a.type_code.trim().toUpperCase() : null\n\n if (!a.archived) {\n // Investment accounts can not make transactions\n if (code === 'F') continue\n // Loan accounts\n if (code === 'E') {\n let group = 'Loan Payment'\n let debt = {}\n debt.name = a.name\n debt.id = `T-${a.id}`\n payeeOptions.push({ group, ...debt })\n } else if (code === 'C') {\n // Transfer for credit card payment\n let group = 'Credit Card Payment'\n let transfer = {}\n transfer.name = a.name\n transfer.id = `T-${a.id}`\n payeeOptions.push({ group, ...transfer })\n } else {\n // Transfer accounts\n let group = 'Transfers'\n let transfer = {}\n transfer.name = a.name\n transfer.id = `T-${a.id}`\n payeeOptions.push({ group, ...transfer })\n }\n }\n }\n }\n\n for (const p of payees) {\n let group = 'Payees'\n // An existing transaction cannot be turned into an adjustment.\n if (name !== 'Adjustment' && transactionId > 0) {\n if ((p.name || p.name === '') && p.name.trim().toLowerCase() !== 'adjustment') {\n payeeOptions.push({ group, ...p })\n }\n } else {\n // A split transaction cannot be an adjustment.\n payeeOptions.push({ group, ...p })\n }\n\n if ((p.name || p.name === '') && p.name.trim().toLowerCase() !== 'adjustment') {\n splitPayeeOptions.push(p)\n }\n }\n\n this.setState({ payeeOptions, splitPayeeOptions })\n }\n\n /**\n * If the categories prop is updated then update the category\n * and split category options.\n *\n * Remove any category that is linked to an account.\n * Remove any categories that are archived.\n */\n updateCategoryOptions = () => {\n const { accounts, categories } = this.props\n let categoryOptions = []\n let splitCategoryOptions = []\n const linkCategories = accounts.filter(a => a.category_id).map(a => a.category_id)\n\n // Create category options\n for (const c of categories) {\n if (linkCategories.includes(c.id)) continue\n if (c.archived) continue\n const name = c.name ? c.name.trim().toLowerCase() : null\n let group = 'Categories'\n\n if (name === 'budget') {\n group = 'Income to Budget'\n } else if (name === 'split') {\n group = 'Multiple Categories'\n }\n\n categoryOptions.push({ group: group, ...c })\n }\n\n // Create split category options\n for (const c of categories) {\n if (linkCategories.includes(c.id)) continue\n if (c.archived) continue\n const name = c.name ? c.name.trim().toLowerCase() : null\n if (name === 'split') continue\n let group = 'Categories'\n\n if (name === 'budget') {\n group = 'Income to Budget'\n }\n\n splitCategoryOptions.push({ group: group, ...c })\n }\n\n this.setState({ categoryOptions, splitCategoryOptions })\n }\n\n /**\n * Whether another transaction is being added after this one. Used\n * to either clear the form and close the dialog or just clear the\n * form.\n * @param {boolean} addAnother\n */\n clearForm = addAnother => {\n if (addAnother) {\n this.props.editTransactionId(0)\n this.setState({\n open: true,\n name: { id: 0, name: '' },\n amountPositive: false,\n amount: '',\n category: { id: 0, name: '' },\n account: { id: 0, name: '' },\n splitCategories: [\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' },\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' }\n ],\n remainingSplitAmount: 0,\n notes: '',\n flagId: 0,\n reconciled: false,\n transferAccountId: 0,\n addAnotherTransaction: false,\n flagFormOpen: false\n })\n } else {\n this.props.editTransactionId(-1)\n // Don't clear the date state in case they want the same date as the last transaction.\n this.setState({\n open: false,\n name: { id: 0, name: '' },\n amountPositive: false,\n amount: '',\n category: { id: 0, name: '' },\n account: { id: 0, name: '' },\n splitCategories: [\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' },\n { id: 0, category: { id: 0, name: '' }, name: { id: 0, name: '' }, amount: '', notes: '' }\n ],\n remainingSplitAmount: 0,\n notes: '',\n flagId: 0,\n reconciled: false,\n transferAccountId: 0,\n addAnotherTransaction: false,\n flagFormOpen: false\n })\n }\n }\n\n addAnotherTransaction = () => this.setState({ addAnotherTransaction: true })\n\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n /**\n * Update the amount field.\n * Update the remaining split amount available.\n * @param {Object} e - The event object.\n */\n handleInputChange = e => {\n const { splitCategories } = this.state\n\n if (moneyInput(e.target.value)) {\n let remaining = this.getRemainingSplitAmount(e.target.value, splitCategories)\n\n this.setState({\n [e.target.name]: e.target.value,\n remainingSplitAmount: remaining\n })\n }\n }\n\n /**\n * This function is used to update the name state. Cannot update the\n * name if a transfer or an adjustment. Determines if the selected\n * payee is a transfer account.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleNameChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({\n name: { id: 0, name: '' },\n transferAccountId: 0\n })\n } else if (value) {\n const { amountPositive, name, category } = this.state\n const { accounts, categories } = this.props\n\n if (value.id) {\n const id = value.id\n let updateCategory = category\n let linkCategoryId = 0\n\n // Check if account transfer\n let transferAccountId = (typeof id === 'string' && id.indexOf('T-') >= 0) ? id.substring(2) : 0\n\n if (transferAccountId > 0) {\n\n // If loan type account then get the link category.\n for (const account of accounts) {\n if (`${account.id}` === transferAccountId) {\n const typeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n if (typeCode === 'E') linkCategoryId = account.category_id\n }\n }\n\n // If a loan account get the link category.\n if (linkCategoryId > 0) {\n const linkCategory = categories.find(c => c.id === linkCategoryId)\n updateCategory = !amountPositive && linkCategory ? linkCategory : { id: 0, name: '' }\n } else if ((transferAccountId > 0)\n || (value.name && value.name.trim().toLowerCase() === 'adjustment')\n || (name && name.name && name.name.trim().toLowerCase() === 'adjustment')) {\n // If a transfer account or an adjustment remove the category\n updateCategory = { id: 0, name: '' }\n }\n }\n\n this.setState({\n name: value,\n category: updateCategory,\n transferAccountId\n })\n } else {\n // Adding a new payee If an adjustment remove the category\n const updateCategory = ((name && name.name && name.name.trim().toLowerCase() === 'adjustment')\n || (value.inputValue && value.inputValue.trim().toLowerCase() === 'adjustment'))\n ? { id: 0, name: '' }\n : category\n\n this.setState({\n name: { id: 0, name: value.inputValue },\n category: updateCategory\n })\n }\n }\n }\n\n /**\n * This function is used to update the category state.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleCategoryChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({ category: { id: 0, name: '' } })\n } else if (value) {\n this.setState({ category: value })\n }\n }\n\n /**\n * This function is used to update the account state. Cannot update\n * the account if a transfer.\n * If the transaction is positive the account is the \"To\".\n * If a positive transaction and the account is a Loan update the\n * category.\n * @param {Object} e - The event object\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleAccountChange = (e, value, reason) => {\n if (reason === 'clear') {\n this.setState({ account: { id: 0, name: '' } })\n } else if (value) {\n const { amountPositive } = this.state\n const { categories } = this.props\n\n // If loan type account then get the link category.\n let linkCategoryId = 0\n let linkCategory\n const typeCode = value.type_code ? value.type_code.trim().toUpperCase() : null\n if (typeCode === 'E') linkCategoryId = value.category_id\n // If a loan account get the link category.\n if (linkCategoryId > 0) linkCategory = categories.find(c => c.id === linkCategoryId)\n\n if (linkCategory) {\n if (amountPositive) {\n this.setState({ account: value, category: linkCategory })\n } else {\n this.setState({ account: value, category: { id: 0, name: '' } })\n }\n } else {\n this.setState({ account: value })\n }\n }\n }\n\n /**\n * Toggles the positive switch for the transaction form.\n * Update category value if payee or account is a loan.\n *\n * Money coming \"From\" a loan is not categorized.\n * Money going \"To\" a loan is categorized.\n */\n handleAmountPositive = () => {\n const { amountPositive, account, category, name } = this.state\n const { accounts, categories } = this.props\n const newAmountPositive = !amountPositive\n let updateCategory = category\n\n if (account && account.id > 0) {\n // If amount is positive and account (To) is a loan auto-select category\n let linkCategoryId = 0\n let linkCategory = null\n const typeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n if (typeCode === 'E') {\n if (newAmountPositive) {\n linkCategoryId = account.category_id\n if (linkCategoryId > 0) linkCategory = categories.find(c => c.id === linkCategoryId)\n updateCategory = (linkCategory || { id: 0, name: '' })\n } else {\n // If amount is negative and account (From) is a loan clear category\n updateCategory = { id: 0, name: '' }\n }\n }\n } else if (name && name.id) {\n // If amount is positive and payee (From) is a loan clear category\n const id = name.id\n let transferAccountId = (typeof id === 'string' && id.indexOf('T-') >= 0) ? id.substring(2) : 0\n // Check if account transfer.\n if (transferAccountId > 0) {\n let linkCategoryId = 0\n let typeCode = null\n // If loan type account then get the link category.\n for (const a of accounts) {\n if (`${a.id}` === transferAccountId) {\n typeCode = a.type_code ? a.type_code.trim().toUpperCase() : null\n linkCategoryId = a.category_id\n }\n }\n\n if (typeCode === 'E' && linkCategoryId > 0) {\n if (newAmountPositive) {\n // If amount is positive and payee (To) is a loan clear category\n updateCategory = { id: 0, name: '' }\n } else {\n // If amount is negative and payee (To) is a loan auto-select category\n const linkCategory = categories.find(c => c.id === linkCategoryId)\n updateCategory = linkCategory ? linkCategory : { id: 0, name: '' }\n }\n }\n }\n }\n\n this.setState({\n amountPositive: newAmountPositive,\n category: updateCategory\n })\n }\n\n handleReconciled = () => this.setState({ reconciled: !this.state.reconciled })\n\n handleDateChange = date => this.setState({ date })\n\n /**\n * Updates the correct split amount based on index.\n * Update the remaining split amount available.\n * @param {Object} e - The event object.\n * @param {number} index - The index of the split category\n */\n handleSplitAmountChange = (e, index) => {\n const { amount, splitCategories } = this.state\n\n if (moneyInput(e.target.value)) {\n splitCategories[index].amount = e.target.value\n let remaining = this.getRemainingSplitAmount(amount, splitCategories)\n\n this.setState({\n splitCategories,\n remainingSplitAmount: remaining\n })\n }\n }\n\n /**\n * Updates the correct split name(payee) based on index.\n * @param {Object} e - The event object\n * @param {number} index - The index of the split category\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleSplitNameChange = (e, index, value, reason) => {\n const { splitCategories } = this.state\n\n if (reason === 'clear') {\n splitCategories[index].name = { id: 0, name: '' }\n this.setState({ splitCategories })\n } else if (value) {\n if (value.id) {\n // Existing payee\n splitCategories[index].name = value\n } else {\n // Adding a new payee\n splitCategories[index].name = { id: 0, name: value.inputValue }\n }\n\n this.setState({ splitCategories })\n }\n }\n\n /**\n * Updates the correct split notes based on index.\n * @param {Object} e - The event object.\n * @param {number} index - The index of the split category\n */\n handleSplitNotesChange = (e, index) => {\n const { splitCategories } = this.state\n\n splitCategories[index].notes = e.target.value\n\n this.setState({\n splitCategories\n })\n }\n\n /**\n * This function is used to update the split category state.\n * @param {Object} e - The event object\n * @param {number} index - The index of the split category\n * @param {Object} value - The selected value object. ie {id, name}\n * @param {string} reason - The reason the event was triggered.\n */\n handleSplitCategoryChange = (e, index, value, reason) => {\n const { splitCategories } = this.state\n\n if (reason === 'clear') {\n splitCategories[index].category = { id: 0, name: '' }\n this.setState({ splitCategories })\n } else if (value) {\n splitCategories[index].category = value\n this.setState({ splitCategories })\n }\n }\n\n /**\n * Submit the transaction form\n * @param {Object} e - The event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n\n const {\n name, amountPositive, amount, category, account, date, splitCategories,\n notes, flagId, reconciled, transferAccountId, addAnotherTransaction\n } = this.state\n const {\n transactionId, yearMonth, accounts, categories, editTransaction, addTransaction,\n returnErrors\n } = this.props\n const { user } = this.props.auth\n\n // Check that transferAccountId and account.id are not the same\n if (transferAccountId === `${account.id}`) {\n returnErrors({ updateTransaction: 'The \"To\" and \"From\" accounts cannot be the same.' }, 500)\n return false\n }\n\n // Payee name cannot be blank\n const payee = name && name.name ? name.name.trim() : null\n if (!payee) {\n returnErrors({ updateTransaction: 'Payee/Payer cannot be blank.' }, 500)\n return false\n }\n\n // Turn the number positive or negative based on toggle.\n let netAmount = amountPositive ? amount : -Math.abs(amount)\n netAmount = formatMoney(netAmount)\n\n // Check for a split transaction and handle accordingly.\n let splitTransactionCategory = JSON.parse(JSON.stringify(splitCategories))\n if (category && category.name && category.name.toLowerCase().trim() === 'split') {\n // Validate the amount and split amount match.\n const remaining = this.getRemainingSplitAmount(amount, splitTransactionCategory)\n if (remaining !== 0) {\n returnErrors({ updateTransaction: 'Split amounts must equal transaction amount.' }, 500)\n return false\n }\n\n // Turn split numbers positive or negative based on toggle.\n for (const sc of splitTransactionCategory) {\n const splitAmount = formatMoney(sc.amount)\n sc.amount = amountPositive ? splitAmount : -Math.abs(splitAmount)\n sc.name = sc.name && sc.name.name ? sc.name.name : ''\n sc.notes = sc.notes ? sc.notes : ''\n sc.category_id = sc.category && sc.category.id ? sc.category.id : null\n sc.user_id = user.id\n sc.transaction_id = transactionId\n }\n } else {\n // Not a split\n splitTransactionCategory = []\n }\n\n /**\n * If a transfer or adjustment then no category. But if the \"To\"\n * is a loan account a category is required and defaulted to.\n */\n let categoryId = (transferAccountId) || (payee.toLowerCase() === 'adjustment') ? null : category.id\n if (amountPositive) {\n const accountTypeCode = account.type_code ? account.type_code.trim().toUpperCase() : null\n if (accountTypeCode === 'E') categoryId = (account.category_id || categoryId)\n } else {\n let linkCategoryId = 0\n for (const a of accounts) {\n if (`${a.id}` === transferAccountId) {\n const typeCode = a.type_code ? a.type_code.trim().toUpperCase() : null\n if (typeCode === 'E') linkCategoryId = a.category_id\n }\n }\n if (linkCategoryId > 0) {\n const linkCategory = categories.find(c => c.id === linkCategoryId)\n categoryId = linkCategory && linkCategory.id ? linkCategory.id : categoryId\n }\n }\n categoryId = (categoryId || null)\n\n if (transactionId > 0) {\n const transaction = {\n id: transactionId,\n name: payee,\n amount: netAmount,\n category_id: categoryId,\n account_id: account.id,\n date: date.toISODate(),\n split_categories: splitTransactionCategory,\n notes,\n flag_id: (flagId || null),\n reconciled: (reconciled || false),\n user_id: user.id,\n transfer_account_id: transferAccountId,\n }\n\n editTransaction(transaction, yearMonth)\n } else {\n const transaction = {\n name: payee,\n amount: netAmount,\n category_id: categoryId,\n account_id: account.id,\n date: date.toISODate(),\n split_categories: splitTransactionCategory,\n notes,\n flag_id: (flagId || null),\n reconciled: (reconciled || false),\n user_id: user.id,\n transfer_account_id: transferAccountId,\n }\n\n addTransaction(transaction, yearMonth)\n }\n\n this.clearForm(addAnotherTransaction)\n }\n\n handleDelete = () => {\n const { transactionId, yearMonth } = this.props\n\n this.props.deleteTransaction(transactionId, yearMonth)\n this.clearForm(false)\n }\n\n /**\n * Add another category split to the transaction form.\n */\n handleSplitCategoryAdd = () => {\n this.setState(({\n splitCategories: [...this.state.splitCategories, {\n category: { id: 0, name: '' },\n name: { id: 0, name: '' },\n amount: '',\n notes: ''\n }]\n }))\n }\n\n /**\n * Remove a category split to the transaction form. Update the\n * remainingSplitAmount state.\n * @param {Object} e - The event object\n * @param {number} index - The index of the split category\n */\n handleSplitCategoryRemove = (e, index) => {\n const { amount, splitCategories } = this.state\n\n splitCategories.splice(index, 1)\n let remaining = this.getRemainingSplitAmount(amount, splitCategories)\n\n this.setState({\n splitCategories,\n remainingSplitAmount: remaining\n })\n }\n\n /**\n * Calculates the remaining amount that needs to be in split\n * categories to equal the transaction amount.\n * @param {number} amount - The current amount for the transaction\n * @param {Object[]} splitCategories - The current amount for the\n * transaction\n * @param {number} splitCategories[].amount - The amount for the\n * category split.\n * @return {number|string} remaining - The remaining amount.\n * Or 'Error'\n */\n getRemainingSplitAmount = (amount, splitCategories) => {\n try {\n let remaining = numeral(amount)\n\n for (const splitCategory of splitCategories) remaining = remaining.subtract(splitCategory.amount)\n\n return remaining.value()\n } catch (error) {\n return 'Error'\n }\n }\n\n /**\n * Handles the selecting and deselecting of the flag checkboxes.\n * @param {Object} e - The event object.\n * @param {number} id = The color id.\n */\n handleFlagClick = (e, id) => {\n const checked = e && e.target ? e.target.checked : false\n\n if (checked) {\n this.setState({ flagId: id })\n } else {\n this.setState({ flagId: 0 })\n }\n }\n\n /**\n * Opens the transaction flag form.\n */\n openFlagForm = () => {\n this.setState({ flagFormOpen: true })\n }\n\n /**\n * Closes the transaction flag form.\n */\n closeFlagForm = () => {\n this.setState({ flagFormOpen: false })\n }\n\n render() {\n const {\n error, open, date, datePickerOpen, name, amountPositive, amount,\n category, account, notes, flagId, reconciled, transferAccountId, accountOptions,\n payeeOptions, splitPayeeOptions, splitCategories, categoryOptions,\n splitCategoryOptions, remainingSplitAmount, flagFormOpen, transactionFlagColors\n } = this.state\n const { classes, theme, transactionId } = this.props\n\n const isASplit = (category && category.name && category.name.trim().toLowerCase() === 'split')\n const isAnEdit = (transactionId > 0)\n const isAnAdjustment = (name && name.name && name.name.trim().toLowerCase() === 'adjustment')\n const isATransfer = (transferAccountId > 0)\n const isALoanAccount = (account && account.type_code && account.type_code.trim().toUpperCase() === 'E')\n const deleteButton = (\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n )\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"transaction-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Transaction\n {transactionId > 0 && deleteButton}\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\" item xs={12}\n style={{ padding: 0 }}\n >\n <FormControlLabel label=\"Posted\"\n labelPlacement=\"start\"\n control={<SwitchPositive checked={reconciled}\n onChange={this.handleReconciled}\n name=\"reconciled\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />}\n />\n </Grid>\n <Grid item xs={12}>\n <FormControl fullWidth={true}\n error={error.date.error}>\n <DatePicker\n name=\"date\"\n label=\"Date\"\n open={datePickerOpen}\n onClose={() => this.setState({ datePickerOpen: false })}\n showTodayButton\n autoOk\n animateYearScrolling\n showDaysOutsideCurrentMonth\n disabled={!!(isAnEdit && isAnAdjustment)}\n clearable={false}\n value={date}\n toolbarFormat=\"MMMM d yyyy\"\n inputProps={{ readOnly: true }}\n onChange={date => this.handleDateChange(date)}\n renderInput={(params) => (\n <TextField\n {...params}\n onClick={isAnEdit && isAnAdjustment ? null : () => this.setState({ datePickerOpen: true })}\n />)}\n okText={<span style={{ color: theme.palette.text.primary }}>Ok</span>}\n cancelText={<span style={{ color: theme.palette.text.primary }}>Cancel</span>}\n todayText={<span style={{ color: theme.palette.text.primary }}>Today</span>}\n />\n </FormControl>\n </Grid>\n <Grid item xs={3}>\n <Grid container alignItems=\"center\" justifyContent=\"center\" spacing={1} wrap=\"nowrap\"\n sx={{ margin: 'auto' }}\n >\n <Grid item>-</Grid>\n <Grid item>\n <SwitchPositive checked={amountPositive}\n disabled={!!(isAnEdit && isAnAdjustment)}\n onChange={this.handleAmountPositive}\n name=\"amountPositive\"\n inputProps={{ 'aria-label': 'amount-positive' }}\n />\n </Grid>\n <Grid item>+</Grid>\n </Grid>\n </Grid>\n <Grid item xs={3}>\n <TextField required\n name=\"amount\"\n value={amount}\n disabled={!!(isAnEdit && isAnAdjustment)}\n autoFocus\n onChange={this.handleInputChange}\n error={error.amount.error}\n helperText={error.amount.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"transactionAmount\"\n label=\"Amount\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"name\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n disabled={!!(isAnEdit && (isATransfer || isAnAdjustment))}\n value={(name || null)}\n options={payeeOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleNameChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => {\n const filtered = filter(options, params)\n const { inputValue } = params\n const isExisting = options.some((option) => inputValue === option.name)\n // Suggest the creation of a new value\n if (inputValue !== '' && !isExisting) {\n filtered.push({\n inputValue,\n name: `Add \"${inputValue}\"`,\n })\n }\n\n return filtered\n }}\n renderInput={(params) => (\n <TextField required\n error={error.name.error}\n helperText={error.name.helperText}\n margin=\"dense\"\n label={amountPositive ? 'Payer (From)' : 'Payee (To)'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"category\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n disabled={!!(isATransfer || isAnAdjustment || isALoanAccount)}\n value={category}\n options={categoryOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleCategoryChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.category.error}\n helperText={error.category.helperText}\n margin=\"dense\"\n label={(transferAccountId > 0) || isAnAdjustment || isALoanAccount\n ? 'No category needed'\n : 'Category'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"account\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n disabled={!!(isAnEdit && (isATransfer || isAnAdjustment))}\n value={account}\n options={accountOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={this.handleAccountChange}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.account.error}\n helperText={error.account.helperText}\n margin=\"dense\"\n label={amountPositive ? 'Account (To)' : 'Account (From)'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n {isASplit &&\n <Grid container item align=\"center\" alignItems=\"center\"\n justifyContent=\"center\">\n <Grid item xs={12}\n className={remainingSplitAmount !== 0 ? classes.fontError : null}>\n Remaining {formatMoneyLabel(remainingSplitAmount)}\n </Grid>\n </Grid>\n }\n {isASplit && splitCategories.map((element, index) => {\n let groupStyling = classes.splitGroup\n if (index === 0) groupStyling += ` ${classes.firstSplit}`\n else if (splitCategories.length === index + 1) groupStyling += ` ${classes.lastSplit}`\n return (\n <Grid container item align=\"center\" alignItems=\"center\"\n key={`transaction-${index}-${element.id}`}\n justifyContent=\"center\">\n <Grid container item spacing={2}\n className={groupStyling}>\n <Grid item xs={2}>\n {splitCategories && splitCategories.length > 2\n ?\n <IconButton onClick={(e) => this.handleSplitCategoryRemove(e, index)}\n aria-label=\"remove-split\" size=\"small\">\n <Cancel color=\"error\" fontSize=\"small\" />\n </IconButton>\n : null\n }\n </Grid>\n <Grid item xs={4}>\n <TextField required\n name=\"splitAmount\"\n value={element.amount}\n onChange={(e) => this.handleSplitAmountChange(e, index)}\n error={error.amount.error}\n helperText={error.amount.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n label=\"Amount\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"splitName\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={element.name && element.name.name ? element.name : null}\n options={splitPayeeOptions}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={(e, value, reason) => this.handleSplitNameChange(e, index, value, reason)}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => {\n const filtered = filter(options, params)\n const { inputValue } = params\n const isExisting = options.some((option) => inputValue === option.name)\n // Suggest the creation of a new value\n if (inputValue !== '' && !isExisting) {\n filtered.push({\n inputValue,\n name: `Add \"${inputValue}\"`,\n })\n }\n\n return filtered\n }}\n renderInput={(params) => (\n <TextField error={error.name.error}\n helperText={error.name.helperText}\n margin=\"dense\"\n label={amountPositive ? 'Payer (From)' : 'Payee (To)'}\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <Autocomplete\n name=\"splitCategory\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={element.category || null}\n options={splitCategoryOptions}\n groupBy={(option) => option.group}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => option.inputValue ? option.inputValue : option.name}\n onChange={(e, value, reason) => this.handleSplitCategoryChange(e, index, value, reason)}\n renderOption={(props, option) => <li {...props}>{option.name}</li>}\n filterOptions={(options, params) => filter(options, params)}\n renderInput={(params) => (\n <TextField required\n error={error.category.error}\n helperText={error.category.helperText}\n margin=\"dense\"\n label=\"Category\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n <Grid item xs={6}>\n <TextField name=\"splitNotes\"\n value={element.notes}\n onChange={(e) => this.handleSplitNotesChange(e, index)}\n error={error.notes.error}\n helperText={error.notes.helperText}\n margin=\"dense\"\n label=\"Notes\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n </Grid>\n {splitCategories && splitCategories.length === index + 1 &&\n <Grid item xs={12} className={classes.splitAddButton}>\n <IconButton onClick={this.handleSplitCategoryAdd} aria-label=\"add-split\" size=\"small\">\n <Add color=\"inherit\" />\n </IconButton>\n </Grid>\n }\n </Grid>\n )\n })}\n <Grid item xs={12}>\n <TextField name=\"notes\"\n value={notes ? notes : ''}\n onChange={this.handleChange}\n error={error.notes.error}\n helperText={error.notes.helperText}\n margin=\"dense\"\n label=\"Notes\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\" item xs={12}\n >\n <FormControlLabel label=\"Flag\"\n labelPlacement=\"top\"\n control={<Grid container>\n {transactionFlagColors.map(f => (\n <Checkbox\n key={f.id}\n checked={f.id === flagId}\n onClick={(e) => this.handleFlagClick(e, f.id)}\n icon={<LabelOutlined />} checkedIcon={<Label />}\n sx={{\n color: f.color,\n '&.Mui-checked': {\n color: f.color,\n },\n }}\n />\n ))\n }\n <Checkbox\n checked={false}\n onClick={(e) => this.handleFlagClick({}, 0)}\n icon={<LabelOffOutlined />}\n />\n <Checkbox\n checked={false}\n onClick={this.openFlagForm}\n icon={<Edit />}\n />\n </Grid>}\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button name=\"addAnotherTransaction\" type=\"submit\" onClick={this.addAnotherTransaction} color=\"primary\"\n variant=\"contained\">\n <Save /> Save & <Add /> Add\n </Button>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={() => this.clearForm(false)} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n <FlagForm open={flagFormOpen}\n closeForm={this.closeFlagForm}\n flagId={flagId}\n handleFlagClick={this.handleFlagClick}\n transactionFlagColors={transactionFlagColors}\n />\n </Fragment>\n )\n }\n}\n\nTransactionForm.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n addTransaction: PropTypes.func.isRequired,\n deleteTransaction: PropTypes.func.isRequired,\n editTransaction: PropTypes.func.isRequired,\n editTransactionId: PropTypes.func.isRequired,\n returnErrors: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n accounts: PropTypes.array.isRequired,\n payees: PropTypes.array.isRequired,\n transfers: PropTypes.array.isRequired,\n splits: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n transactionId: PropTypes.number.isRequired,\n transactions: PropTypes.array.isRequired,\n flagColors: PropTypes.array.isRequired,\n transactionFlags: PropTypes.array.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n accounts: state.accountReducer.accounts,\n payees: state.payeeReducer.payees,\n transfers: state.transferReducer.transfers,\n splits: state.splitReducer.splits,\n categories: state.categoryReducer.categories,\n transactionId: state.transactionIdReducer.transactionId,\n transactions: state.transactionReducer.transactions,\n flagColors: state.flagColorReducer.flagColors,\n transactionFlags: state.transactionFlagReducer.transactionFlags,\n})\n\nconst mapDispatchToProps = {\n editTransactionId,\n addTransaction,\n editTransaction,\n deleteTransaction,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(TransactionForm))\n","import { GET_CATEGORY_BALANCE_ID, EDIT_CATEGORY_BALANCE_ID } from './types'\n\n// Get category balance Id\nexport const getCategoryBalanceId = () => (dispatch, getState) => {\n dispatch({\n type: GET_CATEGORY_BALANCE_ID,\n payload: getState\n })\n}\n\n// Edit category balance Id\nexport const editCategoryBalanceId = (id) => (dispatch, getState) => {\n dispatch({\n type: EDIT_CATEGORY_BALANCE_ID,\n payload: id\n })\n}\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle,\n Grid, ListItem, ListItemText\n} from '@mui/material'\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete'\nimport { Save, Cancel } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { bulkCategoryBudgetUpdate } from '../../actions/categoryBudgets'\nimport { editCategoryBalanceId } from '../../actions/categoryBalanceId'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { formatMoneyLabel, moneyInput } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst filter = createFilterOptions()\nconst styles = theme => ({\n ...sharedStyles(theme)\n})\n\nclass MoveBalanceForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n amount: { error: null, helperText: '', },\n fromCategory: { error: null, helperText: '', },\n },\n filteredCategories: [],\n open: false,\n amount: '',\n toCategoryId: 0,\n toCategoryName: '',\n fromCategory: { id: 0, name: '' },\n }\n\n this.handleCategoryOptions = this.handleCategoryOptions.bind(this)\n this.clearForm = this.clearForm.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleCategoryChange = this.handleCategoryChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { categoryBalanceId } = this.props\n\n /**\n * If category balance Id is updated open up the dialog. Filter\n * out the category they clicked on from the options.\n */\n if (categoryBalanceId !== prevProps.categoryBalanceId && categoryBalanceId > 0) {\n this.handleCategoryOptions()\n }\n }\n\n /**\n * Populates the category options for the dropdown.\n */\n handleCategoryOptions = () => {\n try {\n const { classes, categories, categoryBalanceId, categoryBudgets } = this.props\n\n const toCategory = categories.find(f => f.id === categoryBalanceId)\n const toBudget = categoryBudgets.find(f => f.category_id === categoryBalanceId)\n const toCategoryAmount = toBudget && toBudget.balance ? toBudget.balance : 0\n const amountNeeded = toCategoryAmount && toCategoryAmount < 0 ? Math.abs(toCategoryAmount) : 0\n const toCategoryName = toCategory ? toCategory.name : ''\n let filteredCategories = []\n\n for (const c of categories) {\n if (categoryBalanceId === c.id) continue\n for (const cb of categoryBudgets) {\n if (c.id === cb.category_id) {\n if (!c.archived) {\n const balance = cb.balance ? formatMoneyLabel(cb.balance) : '$0.00'\n const styles = cb.balance >= 0 ? classes.dropdownListItem : classes.dropdownListItemError\n const name = c.name ? c.name.toLowerCase().trim() : null\n\n if (name !== 'budget' && name !== 'split') {\n const label = `${c.name}: ${balance}`\n\n filteredCategories.push({\n id: c.id,\n name: c.name,\n balance: balance,\n label: label,\n styles: styles\n })\n }\n // End inner loop\n break\n }\n }\n }\n }\n\n this.setState({\n open: true,\n toCategoryId: categoryBalanceId,\n toCategoryName,\n amount: amountNeeded,\n filteredCategories\n })\n } catch (e) {\n this.props.returnErrors({ updateCategoryBudget: 'Unable to move money at this time. Please try again later.' }, 500)\n }\n }\n\n /**\n * Used to clear the form and close the dialog.\n */\n clearForm = () => {\n this.props.editCategoryBalanceId(-1)\n this.setState({\n open: false,\n amount: '',\n toCategoryId: 0,\n toCategoryName: '',\n fromCategory: { id: 0, name: '' },\n })\n }\n\n handleInputChange = e => {\n if (moneyInput(e.target.value)) {\n this.setState({ [e.target.name]: e.target.value })\n }\n }\n\n handleCategoryChange = (e, values, reason) => {\n if (reason === 'clear') {\n this.setState({ fromCategory: { id: 0, name: '' } })\n } else if (values) {\n this.setState({ fromCategory: values })\n }\n }\n\n /**\n * Submit the balance form\n * @param {Object} e - The event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n try {\n const { amount, toCategoryId, fromCategory } = this.state\n const { yearMonth, bulkCategoryBudgetUpdate } = this.props\n const { user } = this.props.auth\n const moveFromCategory = (fromCategory && fromCategory.id || null)\n const moveToCategory = (toCategoryId || null)\n if (!moveToCategory || !moveFromCategory) throw new Error('CategoryMissing')\n const categories = [moveFromCategory, moveToCategory]\n let budgetYear = yearMonth.substring(0, 4)\n let budgetMonth = yearMonth.substring(4, 6)\n let budgetDate = `${budgetYear}-${budgetMonth}-01`\n const moveAmount = Math.abs(amount)\n\n // Bulk edit category budgets\n const budget = {\n action: 'move_budget',\n goal_id: 1,\n user_id: user.id,\n date: budgetDate,\n categories: categories,\n budgeted: moveAmount,\n category_id: moveFromCategory\n }\n\n bulkCategoryBudgetUpdate(budget, yearMonth)\n this.clearForm()\n } catch (e) {\n this.props.returnErrors({ updateCategoryBudget: 'Unable to move money at this time. Please try again later.' }, 500)\n }\n }\n\n render() {\n const { error, filteredCategories, open, amount, toCategoryName, fromCategory } = this.state\n const { classes, theme } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"move-budget-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Add Money to {toCategoryName}\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={12}>\n <TextField required\n name=\"amount\"\n value={amount}\n autoFocus\n onChange={this.handleInputChange}\n error={error.amount.error}\n helperText={error.amount.helperText}\n inputProps={{ inputMode: 'decimal' }}\n margin=\"dense\"\n id=\"transactionAmount\"\n label=\"Amount\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n <Grid item xs={12}>\n <Autocomplete\n name=\"fromCategory\"\n clearOnEscape\n openOnFocus\n autoComplete\n autoHighlight\n includeInputInList\n value={fromCategory}\n options={filteredCategories}\n isOptionEqualToValue={(option, value,) => value.value === option.value}\n getOptionLabel={(option) => {\n if (option.inputValue) return option.inputValue\n else if (option.label) return option.label\n else return option.name\n }}\n onChange={this.handleCategoryChange}\n filterOptions={(options, params) => filter(options, params)}\n renderOption={(props, option) => (\n <ListItem key={option.id} {...props}>\n <ListItemText align=\"left\" primary={option.name} />\n <ListItemText align=\"right\" className={option.styles} primary={option.balance} />\n </ListItem>\n )}\n renderInput={(params) => (\n <TextField required\n error={error.fromCategory.error}\n helperText={error.fromCategory.helperText}\n margin=\"dense\"\n label=\"From Category\"\n type=\"text\"\n fullWidth {...params}\n />\n )}\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={() => this.clearForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nMoveBalanceForm.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n auth: PropTypes.object.isRequired,\n categories: PropTypes.array.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n categoryBalanceId: PropTypes.number.isRequired,\n bulkCategoryBudgetUpdate: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n categories: state.categoryReducer.categories,\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n categoryBalanceId: state.categoryBalanceIdReducer.categoryBalanceId\n})\n\nconst mapDispatchToProps = {\n editCategoryBalanceId,\n bulkCategoryBudgetUpdate,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(MoveBalanceForm))\n","import React, { Fragment } from 'react'\n\nimport SpendingVsLastMonth from './SpendingVsLastMonth'\nimport OverspentCategories from './OverspentCategories'\nimport FundShortCategories from './FundShortCategories'\nimport LinkTransactions from './LinkTransactions'\nimport CategoryBudgetForm from '../layout/CategoryBudgetForm'\nimport ActionButtons from '../layout/ActionButtons'\nimport AccountForm from '../layout/AccountForm'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\nimport MoveBalanceForm from '../layout/MoveBalanceForm'\n\n/**\n *\n * @returns {JSX.Element}\n * @constructor\n */\nconst Overview = () => {\n\n return (\n <Fragment>\n <SpendingVsLastMonth />\n <OverspentCategories />\n <FundShortCategories />\n <LinkTransactions />\n\n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n <MoveBalanceForm />\n\n <CategoryBudgetForm />\n </Fragment>\n )\n}\n\nexport default Overview\n","import React, { Fragment, useCallback, useEffect, useRef } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { usePlaidLink } from 'react-plaid-link'\n\nimport { addLinkTransactions } from '../../actions/link'\n\nconst OAuthResponse = props => {\n const { linkToken, stateId } = props\n const oAuthConfirmation = useRef(null)\n\n useEffect(() => {\n setTimeout(() => {\n oAuthConfirmation.current.click()\n }, 3000)\n }, [])\n\n const onSuccess = useCallback((publicToken, metadata) => {\n const { addLinkTransactions } = props\n // send public_token to server\n addLinkTransactions(publicToken)\n }, [])\n\n const onEvent = useCallback((eventName, metadata) => {\n if (eventName === 'HANDOFF' || eventName === 'EXIT') location.href = process.env.REACT_APP_O_AUTH_REDIRECT\n }, [])\n\n const onExit = useCallback((err, metadata) => {\n }, [])\n\n const config = {\n token: linkToken,\n receivedRedirectUri: stateId,\n onSuccess,\n onEvent,\n onExit\n }\n\n const { open, ready, error } = usePlaidLink(config)\n\n return (\n <Fragment>\n {!ready || error || !linkToken || !stateId\n ?\n <div />\n :\n <div onClick={() => open()} ref={oAuthConfirmation} />\n }\n </Fragment>\n )\n}\n\nOAuthResponse.propTypes = {\n linkToken: PropTypes.string.isRequired,\n stateId: PropTypes.string.isRequired,\n addLinkTransactions: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n linkToken: state.linkReducer.linkToken,\n user: state.authReducer.user\n})\n\nconst mapDispatchToProps = {\n addLinkTransactions,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(OAuthResponse)\n","import React, { useState, useEffect } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Overview from './Overview'\nimport OAuthResponse from '../link/OAuthResponse'\n\n/**\n * oauth_state_id is used by plaid for oauth authentication.\n * This logic needs to be at the root route.\n * @returns {JSX.Element}\n */\nconst Dashboard = () => {\n const [stateId, setStateId] = useState(null)\n\n useEffect(() => {\n const urlParams = new URLSearchParams(window.location.search)\n const stateId = urlParams.has('oauth_state_id') ? urlParams.get('oauth_state_id') : null\n if (stateId) setStateId(stateId)\n }, [])\n\n\n return (\n <AppLoading>\n {!stateId\n ? <Overview />\n : <OAuthResponse stateId={stateId} />\n }\n </AppLoading>\n )\n}\n\nexport default Dashboard\n","import React from 'react'\nimport { SortableElement } from 'react-sortable-hoc'\nimport {\n Grid, Hidden, ListItem, IconButton, ListItemText, Typography, Tooltip, Checkbox, Button,\n ListItemButton\n} from '@mui/material'\nimport { Link as LinkIcon } from '@mui/icons-material'\n\nimport { DragHandle } from '../common/DragHandle'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nexport const SortableCategories = SortableElement(\n ({\n checkboxChange, checked, categoryClick,\n categoryBudgetClick, categoryBalanceClick,\n category, categoryBudgets, accountCategoryId, classes, theme\n }) => {\n\n let categoryActivity = category.activity\n let categoryBudgetGoal = 0.00\n let categoryBudgetBudgeted = 0.00\n let categoryBalance = 0.00\n // Get the goal, budgeted, and balance for category.\n for (let categoryBudget of categoryBudgets) {\n if (category.id === categoryBudget.category_id) {\n categoryBudgetGoal = categoryBudget.goal\n categoryBudgetBudgeted = categoryBudget.budgeted\n categoryBalance = categoryBudget.balance\n break\n }\n }\n let goalProgressColor = 'rgba(0, 0, 0, 0.12)'\n let goalProgress = 0\n let categoryBalanceColor = classes.categoryLabel\n let categoryBalanceTitle = 'Your budget is on track!'\n let categoryBudgetedColor = classes.categoryLabel\n let categoryBudgetedTitle = 'You have reached your goal!'\n\n if (categoryBalance < 0) {\n categoryBalanceColor = classes.fontError\n categoryBalanceTitle = 'You need to budget more money for this category.'\n }\n\n if (categoryBudgetGoal > categoryBudgetBudgeted) {\n categoryBudgetedColor = classes.fontWarning\n categoryBudgetedTitle = 'Budget more money to reach your goal.'\n goalProgress = Math.floor((categoryBudgetBudgeted / categoryBudgetGoal) * 100)\n }\n\n if (categoryBudgetBudgeted !== 0) {\n if (goalProgress >= 100 || categoryBudgetBudgeted >= categoryBudgetGoal) goalProgress = 100\n }\n\n if (goalProgress < 50) {\n goalProgressColor = 'linear-gradient(to right, #F45C43, #FF0000)'\n } else if (goalProgress >= 50 && goalProgress < 100) {\n goalProgressColor = 'linear-gradient(to right, #FFC837, #FFBF00)'\n } else if (goalProgress >= 100) {\n goalProgressColor = 'linear-gradient(to right, #206470, #0f4e5b)'\n }\n\n goalProgress = `${goalProgress}%`\n const selectedRow = checked ? classes.selectedRow : null\n\n return (\n <Grid container key={category.id}\n className={`${selectedRow} ${classes.budgetRow} ${classes.dragHandleParent}`}\n direction=\"row\"\n alignItems=\"center\"\n >\n\n <Grid item xs={4} lg={3} zeroMinWidth>\n <ListItem disableGutters dense className={`${classes.m0} ${classes.p0}`}>\n <IconButton aria-label=\"drag\" size=\"small\" className={classes.dragHandleButton}>\n <DragHandle classes={classes} />\n {accountCategoryId &&\n <LinkIcon fontSize=\"small\" color=\"primary\" className={classes.accountCategoryIcon} />\n }\n </IconButton>\n <Checkbox\n checked={checked}\n name={`${category.id}`}\n onChange={checkboxChange}\n size=\"small\"\n inputProps={{ 'aria-label': 'category checkbox' }}\n />\n <ListItemButton dense disableGutters onClick={categoryClick.bind(this, category.id)}\n sx={{\n padding: '11px 0'\n }}\n >\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap className={classes.categoryLabel}\n variant=\"subtitle2\" align=\"left\">\n {category.name}\n </Typography>\n }\n />\n </ListItemButton>\n </ListItem>\n </Grid>\n\n <Grid item xs={4} lg={3} zeroMinWidth>\n <Tooltip title={categoryBudgetedTitle}>\n <ListItemButton disableGutters dense onClick={categoryBudgetClick.bind(this, category.id)}\n className={`${classes.m0} ${classes.p0}`}\n >\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap className={`${categoryBudgetedColor}`}\n variant=\"subtitle2\" align=\"right\">\n {formatMoneyLabel(categoryBudgetBudgeted)}\n </Typography>\n }\n secondary={\n <Typography noWrap className={`${classes.categoryLabel}`}\n variant=\"subtitle2\" align=\"right\">\n {formatMoneyLabel(categoryBudgetGoal)}\n </Typography>\n }\n />\n </ListItemButton>\n </Tooltip>\n </Grid>\n\n <Hidden lgUp>\n <Grid item xs={4} zeroMinWidth>\n <Tooltip title={categoryBudgetedTitle}>\n <ListItem\n sx={{\n margin: 0,\n padding: theme.spacing(1),\n textAlign: 'right'\n }}\n >\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap\n className={`${classes.categoryLabel} ${classes.pr1}`}\n variant=\"subtitle2\" align=\"right\">\n {formatMoneyLabel(categoryActivity)}\n </Typography>\n }\n secondary={\n <Button size=\"small\"\n color={categoryBalance >= 0\n ? categoryBalance > 0\n ? 'success'\n : 'inherit'\n : 'error'\n }\n variant=\"contained\"\n onClick={categoryBalanceClick.bind(this, category.id)}\n className={classes.p0}\n >\n {formatMoneyLabel(categoryBalance)}\n </Button>\n }\n />\n </ListItem>\n </Tooltip>\n </Grid>\n </Hidden>\n\n <Hidden lgDown>\n <Grid item lg={3} zeroMinWidth>\n <ListItem sx={{\n margin: 0,\n padding: 0,\n textAlign: 'right'\n }}\n >\n <ListItemText primary={\n <Typography noWrap className={`${classes.categoryLabel}`}\n variant=\"subtitle2\" align=\"right\">\n {formatMoneyLabel(categoryActivity)}\n </Typography>\n } />\n </ListItem>\n </Grid>\n <Grid item lg={3}>\n <Tooltip title={categoryBalanceTitle}>\n <ListItem sx={{\n margin: 0,\n padding: 0,\n paddingRight: theme.spacing(1),\n textAlign: 'right'\n }}\n >\n <ListItemText primary={\n <Button size=\"small\"\n color={categoryBalance >= 0\n ? categoryBalance > 0\n ? 'success'\n : 'inherit'\n : 'error'\n }\n variant=\"contained\"\n onClick={categoryBalanceClick.bind(this, category.id)}\n className={classes.p0}\n >\n {formatMoneyLabel(categoryBalance)}\n </Button>\n } />\n </ListItem>\n </Tooltip>\n </Grid>\n </Hidden>\n\n <div className={`${classes.progressBar} `} style={{\n width: goalProgress,\n background: goalProgressColor\n }} />\n </Grid>\n )\n }\n)\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport arrayMove from 'array-move'\n\nimport { sharedStyles } from '../common/styles'\nimport { SortContainer } from '../common/SortContainer'\nimport { SortableCategories } from './SortCategories'\nimport { editCategoryId } from '../../actions/categoryId'\nimport { editCategoryBudgetId } from '../../actions/categoryBudgetId'\nimport { editCategoryBalanceId } from '../../actions/categoryBalanceId'\nimport { reorderCategories } from '../../actions/categories'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass Categories extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n deriveProps: true,\n balanceDialogOpen: false,\n categories: this.props.categories\n }\n\n this.categoryClick = this.categoryClick.bind(this)\n this.categoryBudgetClick = this.categoryBudgetClick.bind(this)\n this.categoryBalanceClick = this.categoryBalanceClick.bind(this)\n }\n\n categoryClick = id => this.props.editCategoryId(id)\n\n categoryBudgetClick = id => {\n this.props.editCategoryBudgetId(id)\n }\n\n categoryBalanceClick = id => {\n this.props.editCategoryBalanceId(id)\n }\n\n onSortEnd = ({ oldIndex, newIndex }) => {\n try {\n const { yearMonth, categories, reorderCategories } = this.props\n const oldPositionElement = categories[oldIndex]\n const newPositionElement = categories[newIndex]\n if (oldPositionElement !== newPositionElement) {\n this.setState({\n deriveProps: false, // Temporarily stop props affecting state\n categories: arrayMove(categories, oldIndex, newIndex),\n })\n oldPositionElement.new_index = newIndex\n reorderCategories(oldPositionElement, yearMonth)\n\n\n // After a very short wait, allow props to affect state again\n setTimeout(() => {\n this.setState(() => ({\n deriveProps: true,\n }))\n }, 3000)\n }\n } catch (e) {\n // TODO: dispatch error\n }\n }\n\n // Update state with prop changes, except for a brief period after the order has changed,\n // to stop flickering from happening\n static getDerivedStateFromProps(props, state) {\n if (state.deriveProps) {\n return {\n categories: props.categories,\n }\n }\n return null\n }\n\n render() {\n const {\n accounts, collection, categoriesChecked, handleCategoryCheckbox,\n categoryBudgets, classes, theme\n } = this.props\n const { categories } = this.state\n\n return (\n <SortContainer onSortEnd={this.onSortEnd} useDragHandle className={classes.p0}>\n {categories.map((category, index) => {\n if (collection.id === category.collection_id) {\n const accountCategory = accounts.filter(a => a.category_id === category.id)\n const accountCategoryId = accountCategory && accountCategory[0] && accountCategory[0].category_id ? accountCategory[0].category_id : null\n const checked = (categoriesChecked && categoriesChecked.indexOf(`${category.id}`) >= 0)\n const archived = category.archived\n\n return !archived\n ? (\n <SortableCategories key={category.id}\n index={index}\n categoryClick={this.categoryClick}\n categoryBudgetClick={this.categoryBudgetClick}\n categoryBalanceClick={this.categoryBalanceClick}\n category={category}\n checked={checked}\n checkboxChange={handleCategoryCheckbox}\n categoryBudgets={categoryBudgets}\n classes={classes}\n theme={theme}\n accountCategoryId={accountCategoryId}\n />\n ) : null\n }\n })}\n </SortContainer>\n )\n }\n}\n\nCategories.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n editCategoryId: PropTypes.func.isRequired,\n editCategoryBudgetId: PropTypes.func.isRequired,\n editCategoryBalanceId: PropTypes.func.isRequired,\n reorderCategories: PropTypes.func.isRequired,\n accounts: PropTypes.array.isRequired,\n collection: PropTypes.object.isRequired,\n categories: PropTypes.array.isRequired,\n categoriesChecked: PropTypes.array.isRequired,\n handleCategoryCheckbox: PropTypes.func.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n}\n\nconst mapDispatchToProps = {\n editCategoryId,\n editCategoryBudgetId,\n editCategoryBalanceId,\n reorderCategories,\n}\n\nexport default connect(null, mapDispatchToProps)(withStyles(styles, { withTheme: true })(Categories))\n","import React from 'react'\nimport { SortableElement } from 'react-sortable-hoc'\nimport {\n Accordion, AccordionSummary, AccordionDetails, Checkbox, Grid, Hidden,\n List, ListItem, ListItemButton, IconButton, ListItemText, Typography\n} from '@mui/material'\nimport { ExpandMore } from '@mui/icons-material'\n\nimport { DragHandle } from '../common/DragHandle'\nimport Categories from '../category/Categories'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nexport const SortableCollections = SortableElement(\n ({\n handleCollectionCheckbox, handleCategoryCheckbox,\n collectionClick, collectionsChecked, indeterminate, categoriesChecked,\n collectionItem, categories, categoryBudgets, accounts, yearMonth, expandCollections, handleExpandClick,\n classes, theme\n }) => {\n let collection = collectionItem\n const displayCategories = categories.filter(c => c.name !== 'Budget' && c.name !== 'Split')\n let collectionTotalBudgeted = (collection.total_budgeted) ? collection.total_budgeted : 0\n let collectionTotalGoal = (collection.total_goal) ? collection.total_goal : 0\n let collectionTotalActivity = (collection.total_activity) ? collection.total_activity : 0\n let collectionTotalBalance = (collection.total_balance) ? collection.total_balance : 0\n return (\n <Accordion key={`collection-${collection.id}`} defaultExpanded\n expanded={expandCollections.includes(collection.id)}\n >\n <AccordionSummary expandIcon={<ExpandMore fontSize=\"small\" style={{ color: '#FFF' }} />}\n onClick={() => handleExpandClick(collection.id)}\n >\n <List sx={{ width: '100%', }}>\n\n <Grid container className={`${classes.dragHandleParent}`}>\n <Grid item xs={4} lg={3} zeroMinWidth>\n <ListItem disableGutters dense\n onClick={(event) => event.stopPropagation()}\n className={`${classes.m0} ${classes.p0}`}>\n <IconButton aria-label=\"drag\" size=\"small\" className={classes.dragHandleButton} color=\"inherit\">\n <DragHandle classes={classes} />\n </IconButton>\n <Checkbox checked={collectionsChecked}\n name={`${collection.id}`}\n indeterminate={indeterminate}\n onChange={handleCollectionCheckbox}\n size=\"small\"\n inputProps={{ 'aria-label': 'collection checkbox' }}\n sx={{ color: '#fff' }}\n />\n <ListItemButton dense disableGutters onClick={collectionClick.bind(this, collection.id)}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap className={classes.collectionLabel}\n variant=\"subtitle1\" align=\"left\">\n {collection.name}\n </Typography>\n } />\n </ListItemButton>\n </ListItem>\n </Grid>\n\n <Grid item xs={4} lg={3} zeroMinWidth>\n <ListItem disableGutters={true} dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap\n className={`${classes.collectionLabel} ${classes.line19}`}\n variant=\"subtitle1\" align=\"right\">\n {formatMoneyLabel(collectionTotalBudgeted)}\n </Typography>\n }\n secondary={\n <Typography noWrap\n className={`${classes.collectionLabel} ${classes.line19}`}\n variant=\"subtitle1\" align=\"right\">\n {formatMoneyLabel(collectionTotalGoal)}\n </Typography>\n } />\n </ListItem>\n </Grid>\n\n <Hidden lgUp>\n <Grid item xs={4} md={4} zeroMinWidth>\n <ListItem disableGutters dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap\n className={`${classes.collectionLabel} ${classes.line19}`}\n variant=\"subtitle1\" align=\"right\">\n {formatMoneyLabel(collectionTotalActivity)}\n </Typography>\n }\n secondary={\n <Typography noWrap\n className={`${classes.collectionLabel} ${classes.line19}`}\n variant=\"subtitle1\" align=\"right\">\n {formatMoneyLabel(collectionTotalBalance)}\n </Typography>\n } />\n </ListItem>\n </Grid>\n </Hidden>\n\n <Hidden lgDown>\n <Grid item lg={3} zeroMinWidth>\n <ListItem disableGutters dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText primary={\n <Typography noWrap className={`${classes.collectionLabel} ${classes.line30}`}\n variant=\"subtitle1\" align=\"right\">\n {formatMoneyLabel(collectionTotalActivity)}\n </Typography>\n } />\n </ListItem>\n </Grid>\n <Grid item lg={3} zeroMinWidth>\n <ListItem disableGutters dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText primary={\n <Typography noWrap className={`${classes.collectionLabel} ${classes.line30}`}\n variant=\"subtitle1\" align=\"right\">\n {formatMoneyLabel(collectionTotalBalance)}\n </Typography>\n } />\n </ListItem>\n </Grid>\n </Hidden>\n </Grid>\n </List>\n </AccordionSummary>\n\n <AccordionDetails>\n <Categories collection={collection}\n categories={displayCategories}\n categoriesChecked={categoriesChecked}\n handleCategoryCheckbox={handleCategoryCheckbox}\n categoryBudgets={categoryBudgets}\n yearMonth={yearMonth}\n accounts={accounts}\n />\n </AccordionDetails>\n\n\n </Accordion>\n )\n }\n)\n","import * as React from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@mui/styles'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Typography from '@mui/material/Typography'\nimport Box from '@mui/material/Box'\n\nimport { sharedStyles } from './styles'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n label: {\n color: theme.palette.secondary.contrastText,\n fontWeight: theme.typography.fontWeightBold\n }\n}))\n\n/**\n * Builds a progress circle\n * @param props\n * @param {string} props.color - The color of the chart.\n * @param {number} props.value - The value of the progress 0-100.\n * @param {number} props.size - The size of the circle.\n * @param {number} props.thickness - The thickness of the circle.\n * @param {boolean} props.showLabel - Show the percent label in the\n * center of the circle.\n * @returns {JSX.Element}\n * @constructor\n */\nfunction ProgressCircle(props) {\n const chartProps = { ...props }\n delete chartProps.showLabel\n const classes = useStyles()\n\n return (\n <Box sx={{\n verticalAlign: 'middle',\n position: 'relative',\n display: 'inline-flex'\n }}\n >\n <CircularProgress\n color={props.color}\n size={props.size}\n thickness={props.thickness}\n variant=\"determinate\"\n {...chartProps}\n />\n <Box sx={{\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {props.showLabel &&\n <Typography variant=\"subtitle2\" noWrap className={classes.label}>\n {`${Math.round(props.value)}%`}\n </Typography>\n }\n\n </Box>\n </Box>\n )\n}\n\nProgressCircle.propTypes = {\n /**\n * The value of the progress indicator for the determinate variant.\n * Value between 0 and 100.\n * @default 0\n */\n color: PropTypes.string.isRequired,\n value: PropTypes.number.isRequired,\n size: PropTypes.number.isRequired,\n thickness: PropTypes.number.isRequired,\n showLabel: PropTypes.bool.isRequired\n}\n\nexport default ProgressCircle\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Chart as ChartJS, CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend, } from 'chart.js'\nimport { Bar } from 'react-chartjs-2'\n\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { backgroundColors, borderColors } from '../chart/charts'\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend\n)\n\nconst options = {\n plugins: {\n legend: {\n display: true,\n labels: {\n color: '#fff'\n }\n },\n title: {\n display: false,\n },\n },\n responsive: true,\n interaction: {\n intersect: false,\n mode: 'index'\n },\n scales: {\n x: {\n ticks: {\n maxRotation: 0,\n minRotation: 0,\n color: '#fff'\n },\n },\n y: {\n ticks: {\n color: '#fff',\n callback: function (value, index, ticks) {\n return formatMoneyLabel(value)\n },\n },\n },\n },\n}\n\n/**\n * Builds a bar chart with two bars for comparison.\n * @param props\n * @param {number} props.previous - The previous number to compare.\n * @param {number} props.current - The current number to compare.\n * @returns {JSX.Element}\n * @constructor\n */\nconst CompareActivityBar = props => {\n\n const data = {\n labels: ['Last Month', 'Current'],\n datasets: [\n {\n label: 'Activity',\n data: [Math.abs(props.previous), Math.abs(props.current)],\n backgroundColor: backgroundColors[1],\n borderColor: borderColors[1],\n borderWidth: 2,\n }\n ],\n }\n\n return (\n <Bar options={options} data={data} />\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'CompareActivityBar')\n return props\n}\n\nconst propTypes = {}\n\nCompareActivityBar.propTypes = {\n previous: PropTypes.number.isRequired,\n current: PropTypes.number.isRequired\n}\n\nexport default CompareActivityBar\n","import React, { useState, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport {\n Box, Typography, List, ListItemText, ListItemButton, Collapse\n} from '@mui/material'\n\nimport { sharedStyles } from '../common/styles'\nimport { editTransactionId } from '../../actions/transactionId'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { formatISODate, months } from '../utilities/dates'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n container: {\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n width: '100%',\n padding: theme.spacing(2)\n },\n cardText: {\n color: theme.palette.secondary.contrastText,\n }\n}))\n\n/**\n * Displays the most recent transactions. Can be filtered down to\n * selected categories.\n * @param {String[]} categoryIds - An array of category IDs strings.\n * @param {number} numberSelected - Number of selected categories\n * @returns {JSX.Element}\n * @constructor\n */\nconst RecentTransactions = ({ categoryIds, numberSelected }) => {\n const { transactions, splits, yearMonth } = withPropsValidation(\n useSelector(({ transactionReducer, splitReducer, budgetMonthReducer }\n ) => ({\n transactions: transactionReducer.transactions,\n splits: splitReducer.splits,\n yearMonth: budgetMonthReducer.yearMonth\n })))\n\n const [list, setList] = useState([])\n const [month, setMonth] = useState(null)\n\n const dispatch = useDispatch()\n const classes = useStyles()\n const theme = useTheme()\n\n /**\n * Refreshes table when selected categories or transactions change.\n */\n useEffect(() => {\n try {\n let list = []\n\n if (!Array.isArray(categoryIds) || !categoryIds.length) {\n // array does not exist, is not an array, or is empty\n list = transactions\n\n setList(list)\n } else {\n // Filter to selected categories.\n for (const categoryId of categoryIds) {\n // Check transactions for matching Ids.\n for (const transaction of transactions) {\n const transactionCategory = `${transaction.category_id}`\n\n if (categoryId === transactionCategory) list.push(transaction)\n }\n\n // Check splits for matching Ids.\n for (const split of splits) {\n const splitCategory = `${split.category_id}`\n\n if (categoryId === splitCategory) {\n // Get matching transaction for split\n const transaction = transactions.find(t => t.id === split.transaction_id)\n if (transaction) {\n let splitTransaction = { ...transaction }\n splitTransaction.amount = split && split.amount ? split.amount : transaction.amount\n list.push(splitTransaction)\n }\n }\n }\n }\n }\n\n // Grab first 10 records.\n list = list.slice(0, 10)\n setList(list)\n } catch (e) {\n\n }\n }, [categoryIds, transactions, splits])\n\n /**\n * Update the display month whenever the month changes. Refreshes\n * table.\n */\n useEffect(() => {\n try {\n let budgetMonth = yearMonth.substring(4, 6)\n const monthIndex = budgetMonth && !isNaN(Number(budgetMonth)) ? Number(budgetMonth) : null\n if (monthIndex) {\n const month = months[monthIndex]\n\n setMonth(month)\n }\n\n } catch (e) {\n\n }\n }, [yearMonth])\n\n /**\n * This function is used to update the transaction form with\n * row that was clicked on.\n * @param {number} id - The selected transaction Id.\n */\n const transactionClick = (id) => dispatch(editTransactionId(id))\n\n return (\n <Box marginY={1}>\n\n {list && list.length > 0\n ? <Typography variant=\"body1\" align=\"center\">{`Recent ${month} Transactions`}</Typography>\n : <Typography variant=\"body1\" align=\"center\">No Recent Transactions</Typography>\n }\n\n\n <Collapse in={(list && list.length > 0)}>\n <List sx={{ width: '100%' }}>\n {list.map((row, index) => {\n const id = row && row.id ? row.id : null\n if (!id) return\n\n const date = row && row.date ? formatISODate(row.date) : ''\n const name = row && row.name ? row.name : ''\n const account = row && row.account ? row.account : ''\n const category = row && row.category ? row.category : ''\n const amount = row && row.amount ? formatMoneyLabel(row.amount) : ''\n return (\n <ListItemButton key={`recent-transaction-${row.id}-${index}`} dense\n onClick={() => transactionClick(row.id)}\n sx={{ borderBottom: `1px solid ${theme.palette.divider}` }}\n >\n <ListItemText\n primary={account}\n secondary={category}\n secondaryTypographyProps={{ className: `text-darken-2` }}\n sx={{\n textAlign: 'left'\n }}\n />\n <ListItemText\n primary={name}\n secondary={amount}\n secondaryTypographyProps={{ className: `text-darken-2` }}\n sx={{\n textAlign: 'right'\n }}\n />\n </ListItemButton>\n )\n })}\n </List>\n </Collapse>\n </Box>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'RecentTransactions')\n return props\n}\n\nconst propTypes = {\n transactions: PropTypes.array.isRequired,\n splits: PropTypes.array.isRequired,\n yearMonth: PropTypes.string.isRequired,\n}\n\nRecentTransactions.propTypes = {\n categoryIds: PropTypes.array.isRequired,\n numberSelected: PropTypes.number.isRequired\n}\n\nexport default RecentTransactions\n","import React, { useState, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport {\n Drawer, Button, Divider, Box, Grid, Card, Toolbar, Typography,\n List, ListItemButton, ListItemText, Collapse\n} from '@mui/material'\nimport numeral from 'numeral'\n\nimport { sharedStyles } from '../common/styles'\nimport { editCategoryId } from '../../actions/categoryId'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport ProgressCircle from '../common/ProgressCircle'\nimport CompareActivityBar from '../common/CompareActivityBar'\nimport RecentTransactions from './RecentTransactions'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n container: {\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n width: '100%',\n padding: theme.spacing(2)\n },\n cardText: {\n color: theme.palette.secondary.contrastText,\n }\n}))\n\n/**\n * Populates the detail card with category details based on the\n * selection of the user.\n * @param {String[]} categoryIds - An array of category IDs strings.\n * @param {number} budgetedSummed\n * @param {number} goalSummed\n * @param {number} totalGoalProgress\n * @param {number} activitySummed\n * @param {number} previousActivity\n * @param {number} balanceSummed\n * @param {number} fundShort\n * @param {number} overspent\n * @param {number} numberSelected\n * @param {number} overbudget\n * @param {function} actionClick\n * @returns {JSX.Element}\n * @constructor\n */\nconst CategoryDetail = ({\n categoryIds, budgetedSummed, goalSummed, totalGoalProgress, activitySummed,\n previousActivity, balanceSummed, fundShort, overspent, numberSelected,\n overbudget, actionClick\n }) => {\n const {\n categories\n } = withPropsValidation(useSelector(({ categoryReducer, categoryBudgetReducer }) => ({\n categories: categoryReducer.categories\n })))\n\n const [halfBudget, setHalfBudget] = useState(0)\n const [selectedCategory, setSelectedCategory] = useState(null)\n\n const dispatch = useDispatch()\n const classes = useStyles()\n const theme = useTheme()\n\n\n /**\n * Calculate the half budget amount everytime the goal or budgeted\n * changes.\n */\n useEffect(() => {\n try {\n let halfFund = numeral(0)\n let goal = goalSummed\n let halfBudget = goal ? numeral(goal).divide(2) : numeral(0)\n halfBudget = halfBudget.value()\n\n if (halfBudget !== budgetedSummed) {\n halfFund = numeral(halfBudget).subtract(budgetedSummed)\n }\n\n halfFund = halfFund.value()\n setHalfBudget(halfFund)\n } catch (e) {\n }\n }, [goalSummed, budgetedSummed])\n\n /**\n * If the categories or the selected categories changes update the\n * selected category. We are only setting if a single category is\n * selected.\n */\n useEffect(() => {\n try {\n // Array does not exist, is not an array, or is empty\n if (!Array.isArray(categoryIds) || !categoryIds.length) return false\n // Array has more than 1 record\n if (categoryIds && categoryIds.length > 1) return false\n\n const categoryId = categoryIds[0]\n const selectedCategory = categories.find(c => `${c.id}` === categoryId)\n if (selectedCategory) setSelectedCategory(selectedCategory)\n } catch (e) {\n }\n }, [categories, categoryIds])\n\n /**\n * This function is used to open the category edit form.\n * @param {number} id - The selected category Id.\n */\n const categoryClick = (id) => dispatch(editCategoryId(id))\n\n return (\n <Drawer\n variant=\"permanent\"\n anchor=\"right\"\n sx={{\n width: '264px',\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: '264px',\n boxSizing: 'border-box'\n },\n }}\n >\n\n <Toolbar />\n <Box marginY={1}>\n <Divider />\n </Box>\n\n <Box\n sx={{\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1)\n }}\n >\n <Box\n sx={{\n overflow: 'scroll',\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n height: 'calc(100vh - 160px)'\n }}\n >\n <Grid container spacing={1}>\n\n <Collapse in={(numberSelected === 1 && selectedCategory ? true : false)}\n sx={{ width: '100%', marginLeft: theme.spacing(1), paddingBottom: 0 }}\n >\n <List>\n <ListItemButton dense onClick={() => categoryClick(selectedCategory.id)}>\n <ListItemText\n primary={selectedCategory ? selectedCategory.name : ''}\n secondary={selectedCategory ? selectedCategory.notes : ''}\n secondaryTypographyProps={{ className: `text-darken-2` }}\n />\n </ListItemButton>\n </List>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n </Collapse>\n\n <Collapse in={(numberSelected > 1 ? true : false)}\n sx={{ width: '100%', marginLeft: theme.spacing(1), paddingBottom: 0 }}\n >\n <List>\n <ListItemText primary={`Categories Selected (${numberSelected})`} />\n </List>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n </Collapse>\n\n <Grid container item direction=\"row\">\n <Grid item xs={6}>\n <Typography variant=\"body2\" align=\"left\" noWrap>Fund Short</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body2\" align=\"right\" noWrap>{formatMoneyLabel(fundShort)}</Typography>\n </Grid>\n\n <Grid item xs={6}>\n <Typography variant=\"body2\" align=\"left\" noWrap>Overspent</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body2\" align=\"right\" noWrap>{formatMoneyLabel(overspent)}</Typography>\n </Grid>\n\n <Grid item xs={6}>\n <Typography variant=\"body2\" align=\"left\" noWrap>Overbudget</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body2\" align=\"right\" noWrap>{formatMoneyLabel(overbudget)}</Typography>\n </Grid>\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n <Collapse in={(numberSelected >= 1 ? true : false)}\n sx={{\n width: '100%',\n marginLeft: theme.spacing(1),\n marginTop: theme.spacing(1)\n }}\n >\n\n <Typography variant=\"body1\" align=\"center\">Quick Actions</Typography>\n\n <Grid container spacing={1}>\n\n <Grid container direction=\"row\" item xs={12}>\n <Button fullWidth color=\"primary\" variant=\"contained\"\n aria-label=\"Set the budgeted to zero dollars\"\n onClick={(e) => actionClick(e, 'empty_fund')}\n >\n <Grid container item xs={12}>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"left\"\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400',\n textTransform: 'capitalize'\n }}\n >Zero Budget</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"right\" noWrap\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400'\n }}\n >{formatMoneyLabel(budgetedSummed)}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\" align=\"left\"\n sx={{\n fontSize: '0.5',\n fontWeight: '300',\n textTransform: 'capitalize'\n }}\n >Clear budgeted dollars.</Typography>\n </Grid>\n </Grid>\n </Button>\n </Grid>\n\n <Grid container direction=\"row\" item xs={12}>\n <Button fullWidth color=\"primary\" variant=\"contained\"\n aria-label=\"Fund half of the goal\"\n onClick={(e) => actionClick(e, 'half_fund')}\n >\n <Grid container item xs={12}>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"left\"\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400',\n textTransform: 'capitalize'\n }}\n >Budget Half</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"right\" noWrap\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400',\n }}\n >{formatMoneyLabel(-Math.abs(halfBudget))}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\" align=\"left\"\n sx={{\n fontSize: '0.5',\n fontWeight: '300',\n textTransform: 'capitalize'\n }}\n >Fund half of the goal.</Typography>\n </Grid>\n </Grid>\n </Button>\n </Grid>\n\n <Grid container direction=\"row\" item xs={12}>\n <Button fullWidth color=\"primary\" variant=\"contained\"\n aria-label=\"Fund the total goal\"\n onClick={(e) => actionClick(e, 'full_fund')}\n >\n <Grid container item xs={12}>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"left\"\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400',\n textTransform: 'capitalize'\n }}\n >Budget Full</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"right\" noWrap\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400'\n }}\n >{formatMoneyLabel(-Math.abs(fundShort))}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\" align=\"left\"\n sx={{\n fontSize: '0.5',\n fontWeight: '300',\n textTransform: 'capitalize'\n }}\n >Fund the total goal.</Typography>\n </Grid>\n </Grid>\n </Button>\n </Grid>\n\n <Grid container direction=\"row\" item xs={12}>\n <Button fullWidth color=\"primary\" variant=\"contained\"\n aria-label=\"Clear the balance\"\n onClick={(e) => actionClick(e, 'zero_balance')}\n >\n <Grid container item xs={12}>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"left\"\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400',\n textTransform: 'capitalize'\n }}\n >Zero Balance</Typography>\n </Grid>\n <Grid item xs={6}>\n <Typography variant=\"body1\" align=\"right\" noWrap\n sx={{\n fontSize: '0.875rem',\n fontWeight: '400'\n }}\n >{formatMoneyLabel(balanceSummed)}</Typography>\n </Grid>\n <Grid item xs={12}>\n <Typography variant=\"body2\" align=\"left\"\n sx={{\n fontSize: '0.5',\n fontWeight: '300',\n textTransform: 'capitalize'\n }}\n >Clear the balance.</Typography>\n </Grid>\n </Grid>\n </Button>\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n </Grid>\n </Collapse>\n\n <Grid item xs={12}>\n <Card className={classes.container}>\n <Grid container>\n\n <Grid item xs={6}\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>Budgeted</Typography>\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>Goal</Typography>\n </Grid>\n\n <Grid item xs={6}\n container\n direction=\"column\"\n justifyContent=\"flex-end\"\n alignItems=\"flex-end\"\n >\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>\n {formatMoneyLabel(budgetedSummed)}\n </Typography>\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>\n {formatMoneyLabel(goalSummed)}\n </Typography>\n </Grid>\n </Grid>\n\n\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <ProgressCircle value={totalGoalProgress}\n size={80}\n thickness={6}\n showLabel\n color=\"info\"\n />\n </Grid>\n </Card>\n </Grid>\n\n <Grid item xs={12}>\n <Card className={classes.container}>\n <Grid container>\n\n <Grid item xs={6}\n container\n direction=\"column\"\n justifyContent=\"flex-start\"\n alignItems=\"flex-start\"\n >\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>Last Month</Typography>\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>Current</Typography>\n </Grid>\n\n <Grid item xs={6}\n container\n direction=\"column\"\n justifyContent=\"flex-end\"\n alignItems=\"flex-end\"\n >\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>\n {formatMoneyLabel(previousActivity)}\n </Typography>\n <Typography variant=\"subtitle2\" noWrap className={classes.cardText}>\n {formatMoneyLabel(activitySummed)}\n </Typography>\n </Grid>\n </Grid>\n\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <CompareActivityBar previous={previousActivity} current={activitySummed} />\n </Grid>\n\n </Card>\n </Grid>\n\n <Grid item xs={12}>\n <RecentTransactions categoryIds={categoryIds} numberSelected={numberSelected} />\n </Grid>\n\n </Grid>\n </Box>\n </Box>\n <Divider />\n </Drawer>\n\n\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'CategoryDetail')\n return props\n}\n\nconst propTypes = {\n categories: PropTypes.array.isRequired\n}\n\nCategoryDetail.propTypes = {\n categoryIds: PropTypes.array.isRequired,\n budgetedSummed: PropTypes.number.isRequired,\n goalSummed: PropTypes.number.isRequired,\n totalGoalProgress: PropTypes.number.isRequired,\n activitySummed: PropTypes.number.isRequired,\n previousActivity: PropTypes.number.isRequired,\n balanceSummed: PropTypes.number.isRequired,\n fundShort: PropTypes.number.isRequired,\n overspent: PropTypes.number.isRequired,\n overbudget: PropTypes.number.isRequired,\n actionClick: PropTypes.func.isRequired\n}\n\nexport default CategoryDetail\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport arrayMove from 'array-move'\nimport { Grid, Box, Typography } from '@mui/material'\nimport { CategoryOutlined } from '@mui/icons-material'\nimport numeral from 'numeral'\n\nimport { sharedStyles } from '../common/styles'\nimport { SortContainer } from '../common/SortContainer'\nimport { SortableCollections } from './SortCollections'\nimport { bulkCategoryBudgetUpdate } from '../../actions/categoryBudgets'\nimport { editCollectionId } from '../../actions/collectionId'\nimport { reorderCollections } from '../../actions/collections'\nimport CategoryDetail from '../category/CategoryDetail'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n noDataIcon: {\n color: theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.secondary.light,\n fontSize: '56px'\n },\n})\n\nclass Collections extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n deriveProps: true,\n collections: this.props.collections,\n budgetedSummed: 0,\n goalSummed: 0,\n totalGoalProgress: 0,\n activitySummed: 0,\n previousActivity: 0,\n balanceSummed: 0,\n fundShort: 0,\n overspent: 0,\n overbudget: 0,\n }\n\n this.updateBudgetData = this.updateBudgetData.bind(this)\n this.collectionClick = this.collectionClick.bind(this)\n this.handleMultiActionClick = this.handleMultiActionClick.bind(this)\n }\n\n componentDidMount() {\n this.updateBudgetData()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const {\n categories, categoryBudgets, transactions, categoriesChecked\n } = this.props\n\n /**\n * If a user clicks a checkbox or the user updates a category\n * budget while a checkbox is clicked then we need to update the\n * toolbar numbers.\n */\n if ((categoriesChecked && categoriesChecked !== prevProps.categoriesChecked) ||\n (categoryBudgets && categoryBudgets !== prevProps.categoryBudgets) ||\n (categories && categories !== prevProps.categories) ||\n (transactions && transactions !== prevProps.transactions)) {\n this.updateBudgetData()\n }\n\n }\n\n /**\n * On component load and when data changes calculate the budget\n * data\n */\n updateBudgetData = () => {\n const { categories, categoryBudgets, transactions, categoriesChecked } = this.props\n\n try {\n let budgetedSummed = numeral(0)\n let goalSummed = numeral(0)\n let totalGoalProgress = numeral(0)\n let activitySummed = numeral(0)\n let previousActivity = numeral(0)\n let balanceSummed = numeral(0)\n let fundShort = numeral(0)\n let overspent = numeral(0)\n let progressBudgeted = numeral(0)\n let overbudget = numeral(0)\n\n if (categoriesChecked.length > 0) {\n for (const id of categoriesChecked) {\n // Sum budgeted, goal, and balance\n for (const budget of categoryBudgets) {\n if (`${budget.category_id}` === id) {\n budgetedSummed.add(budget.budgeted)\n goalSummed.add(budget.goal)\n balanceSummed.add(budget.balance)\n\n // Get fund short\n if (budget.goal > budget.budgeted) {\n const fund = numeral(budget.goal).subtract(budget.budgeted)\n fundShort.add(fund.value())\n }\n\n // Get overspent\n if (budget.balance < 0) {\n overspent.add(budget.balance)\n }\n\n // Get overbudget\n if (budget.budgeted > budget.goal) {\n const over = numeral(budget.budgeted).subtract(budget.goal)\n overbudget.add(over.value())\n }\n\n // Calculate budgeted for progress goal metric\n if (budget.budgeted > budget.goal) progressBudgeted.add(budget.goal)\n else progressBudgeted.add(budget.budgeted)\n\n break\n }\n }\n\n // Sum activity\n for (const category of categories) {\n if (`${category.id}` === id) {\n const categoryActivity = category && category.activity ? category.activity : 0\n const categoryPreviousActivity = category && category.previous_activity ? category.previous_activity : 0\n activitySummed.add(categoryActivity)\n previousActivity.add(categoryPreviousActivity)\n break\n }\n }\n }\n } else {\n // Don't filter the totals\n if (transactions && transactions[0] && transactions[0].total_activity) activitySummed.set(transactions[0].total_activity)\n if (categoryBudgets && categoryBudgets[0] && categoryBudgets[0].total_budgeted) budgetedSummed.set(categoryBudgets[0].total_budgeted)\n if (categoryBudgets && categoryBudgets[0] && categoryBudgets[0].total_goal) goalSummed.set(categoryBudgets[0].total_goal)\n\n // Get the total previous month activity\n for (const category of categories) {\n const lastMonthActivity = category && category.previous_activity ? category.previous_activity : 0\n previousActivity.add(lastMonthActivity)\n }\n\n // Get the total balance and overspent if no categories selected\n for (const budget of categoryBudgets) {\n balanceSummed.add(budget.balance)\n\n // Calculate overspent\n if (budget.balance < 0) overspent.add(budget.balance)\n\n // Calculate fund short\n if (budget.goal > budget.budgeted) {\n const fund = numeral(budget.goal).subtract(budget.budgeted)\n fundShort.add(fund.value())\n }\n\n // Get overbudget\n if (budget.budgeted > budget.goal) {\n const over = numeral(budget.budgeted).subtract(budget.goal)\n overbudget.add(over.value())\n }\n\n // Calculate budgeted for progress goal metric\n if (budget.budgeted > budget.goal) progressBudgeted.add(budget.goal)\n else progressBudgeted.add(budget.budgeted)\n }\n }\n\n\n budgetedSummed = budgetedSummed.value()\n goalSummed = goalSummed.value()\n activitySummed = activitySummed.value()\n previousActivity = previousActivity.value()\n balanceSummed = balanceSummed.value()\n fundShort = fundShort.value()\n overspent = overspent.value()\n progressBudgeted = progressBudgeted.value()\n overbudget = overbudget.value()\n\n // Get the total goal.\n if (progressBudgeted && progressBudgeted > 0) totalGoalProgress = goalSummed && goalSummed > 0 ? numeral(progressBudgeted).divide(goalSummed).multiply(100) : numeral(100)\n totalGoalProgress = totalGoalProgress.value()\n\n this.setState({\n budgetedSummed,\n goalSummed,\n totalGoalProgress,\n activitySummed,\n previousActivity,\n balanceSummed,\n fundShort,\n overspent,\n overbudget\n })\n } catch (e) {\n\n }\n }\n\n collectionClick = id => this.props.editCollectionId(id)\n\n /**\n * This function is used to set the goal for each selected row to\n * what the goal was the previous month.\n * @param {Object} e - The on click event.\n * @param {string} action - The action code to perform on the\n * selected categories.\n */\n handleMultiActionClick = (e, action) => {\n const { yearMonth, bulkCategoryBudgetUpdate, categoriesChecked } = this.props\n const { user } = this.props.auth\n const budgetYear = yearMonth.substring(0, 4)\n const budgetMonth = yearMonth.substring(4, 6)\n const budgetDate = `${budgetYear}-${budgetMonth}-01`\n const budget = {\n action: action,\n goal_id: 1,\n user_id: user.id,\n date: budgetDate,\n categories: categoriesChecked\n }\n\n bulkCategoryBudgetUpdate(budget, yearMonth)\n }\n\n onSortEnd = ({ oldIndex, newIndex }) => {\n try {\n const { collections, yearMonth, reorderCollections } = this.props\n\n let oldPositionElement = collections[oldIndex]\n let newPositionElement = collections[newIndex]\n if (oldPositionElement !== newPositionElement) {\n this.setState({\n deriveProps: false, // Temporarily stop props affecting state\n collections: arrayMove(collections, oldIndex, newIndex),\n })\n oldPositionElement.new_index = newIndex\n reorderCollections(oldPositionElement, yearMonth)\n\n // After a very short wait, allow props to affect state again\n setTimeout(() => {\n this.setState(() => ({\n deriveProps: true,\n }))\n }, 3000)\n }\n } catch (e) {\n // TODO: dispatch error\n }\n }\n\n // onSortStart = ({ node, index, collection, isKeySorting }, event) => {}\n\n // Update state with prop changes, except for a brief period after the order has changed,\n // to stop flickering from happening\n static getDerivedStateFromProps(props, state) {\n if (state.deriveProps) {\n return {\n collections: props.collections,\n }\n }\n return null\n }\n\n render() {\n const {\n classes, theme, accounts, categoryFilter, categories, categoryBudgets,\n yearMonth, collectionsChecked, categoriesChecked, expandCollections,\n handleExpandClick, handleCollectionCheckbox, handleCategoryCheckbox\n } = this.props\n const {\n collections, budgetedSummed, goalSummed, totalGoalProgress,\n activitySummed, previousActivity, balanceSummed, fundShort, overspent, overbudget\n } = this.state\n const selectedCount = (categoriesChecked && categoriesChecked.length > 0) ? categoriesChecked.length : 0\n\n return (\n <Fragment>\n <Box mt={1}>\n <Grid container spacing={2}\n sx={{\n width: 'calc(100% - 248px)'\n }}\n >\n <Grid item xs={12}>\n <SortContainer onSortEnd={this.onSortEnd} useDragHandle className={classes.p0}>\n {collections && collections.length > 0\n\n ? collections.map((collection, index) => {\n const checked = (collectionsChecked && collectionsChecked.indexOf(`${collection.id}`) >= 0)\n const collectionCategories = categories.filter(c => c.collection_id === collection.id).map(c => `${c.id}`)\n let indeterminate = false\n for (const cc of collectionCategories) if (categoriesChecked.indexOf(cc) >= 0) {\n indeterminate = true\n break\n }\n indeterminate = (!checked && indeterminate)\n return (\n <SortableCollections key={`sortable-collection-${collection.id}`}\n index={index}\n collectionItem={collection}\n collectionClick={this.collectionClick}\n handleCollectionCheckbox={handleCollectionCheckbox}\n handleCategoryCheckbox={handleCategoryCheckbox}\n collectionsChecked={checked}\n indeterminate={indeterminate}\n categoriesChecked={categoriesChecked}\n categories={categories}\n categoryBudgets={categoryBudgets}\n yearMonth={yearMonth}\n classes={classes}\n theme={theme}\n accounts={accounts}\n expandCollections={expandCollections}\n handleExpandClick={handleExpandClick}\n />\n )\n })\n : (\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\" spacing={2\n }>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <CategoryOutlined className={classes.noDataIcon} />\n </Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"h5\" align=\"center\">\n {categoryFilter === 1 || categoryFilter === 2\n ? categoryFilter === 1\n ? 'You betcha, that\\'s some good work! No overspending this month.'\n : 'Keep\\'er movin\\', you\\'re doing fantastic! All your categories are funded.'\n : 'Ope, no categories found'\n }\n </Typography>\n </Grid>\n </Grid>\n )\n }\n </SortContainer>\n </Grid>\n </Grid>\n </Box>\n\n <CategoryDetail\n categoryIds={categoriesChecked}\n budgetedSummed={budgetedSummed}\n goalSummed={goalSummed}\n totalGoalProgress={totalGoalProgress}\n activitySummed={activitySummed}\n previousActivity={previousActivity}\n balanceSummed={balanceSummed}\n fundShort={fundShort}\n overspent={overspent}\n overbudget={overbudget}\n numberSelected={selectedCount}\n actionClick={this.handleMultiActionClick}\n />\n\n </Fragment>\n )\n }\n}\n\nCollections.propTypes = {\n auth: PropTypes.object.isRequired,\n yearMonth: PropTypes.string.isRequired,\n bulkCategoryBudgetUpdate: PropTypes.func.isRequired,\n editCollectionId: PropTypes.func.isRequired,\n reorderCollections: PropTypes.func.isRequired,\n accounts: PropTypes.array.isRequired,\n categoryFilter: PropTypes.number.isRequired,\n collections: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n transactions: PropTypes.array.isRequired,\n expandCollections: PropTypes.array.isRequired,\n handleExpandClick: PropTypes.func.isRequired,\n handleCollectionCheckbox: PropTypes.func.isRequired,\n handleCategoryCheckbox: PropTypes.func.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n accounts: state.accountReducer.accounts,\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n transactions: state.transactionReducer.transactions,\n})\n\nconst mapDispatchToProps = {\n bulkCategoryBudgetUpdate,\n editCollectionId,\n reorderCollections,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(Collections))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Grid, Box, Card, CardContent, Typography, Hidden, ListItem, ListItemText, Checkbox, ListItemButton, Button\n} from '@mui/material'\nimport {\n Flag, PieChart, ShoppingBasket, MonetizationOn, UnfoldLess, UnfoldMore, AllInclusive, ErrorOutline, WarningAmber\n} from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport Collections from '../collection/Collections'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\n/**\n * Displays the budget screen.\n */\nclass Budget extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n expandCollections: [],\n checkAll: false,\n checkAllIndeterminate: false,\n collectionOptions: [],\n categoryOptions: [],\n categoryFilter: 0,\n collectionsChecked: [],\n categoriesChecked: []\n }\n\n this.setCollectionCategoryOptions = this.setCollectionCategoryOptions.bind(this)\n this.collectionClick = this.collectionClick.bind(this)\n this.handleCheckAllCheckbox = this.handleCheckAllCheckbox.bind(this)\n this.handleCollectionCheckbox = this.handleCollectionCheckbox.bind(this)\n this.handleCategoryCheckbox = this.handleCategoryCheckbox.bind(this)\n this.handleUpdateFilter = this.handleUpdateFilter.bind(this)\n }\n\n componentDidMount() {\n const { collections, categories } = this.props\n\n if (collections) {\n const expandCollections = collections.map(c => c.id)\n this.setState({ expandCollections })\n }\n\n if (categories) {\n this.setCollectionCategoryOptions()\n }\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { collections, categories } = this.props\n const { categoryOptions, categoryFilter, categoriesChecked } = this.state\n\n if ((categoriesChecked && categoriesChecked !== prevState.categoriesChecked) ||\n (categoryOptions && categoryOptions !== prevState.categoryOptions)) {\n // Determine if the check all is checked or indeterminate.\n try {\n // Get the list of all the categoryOptions.\n const checkedCategoryCount = categoriesChecked && categoriesChecked.length ? categoriesChecked.length : 0\n const allCategoryCount = categoryOptions.filter(c => {\n if (!c.archived) {\n const name = c.name ? c.name.toLowerCase().trim() : null\n if (name && name !== 'budget' && name !== 'split') return c\n }\n }).length\n let checkAll = false\n let checkAllIndeterminate = false\n\n if ((checkedCategoryCount > 0) && checkedCategoryCount < allCategoryCount) {\n checkAll = false\n checkAllIndeterminate = true\n } else if (checkedCategoryCount >= allCategoryCount) {\n checkAll = true\n checkAllIndeterminate = false\n } else {\n checkAll = false\n checkAllIndeterminate = false\n }\n\n this.setState({ checkAll, checkAllIndeterminate })\n } catch (e) {\n\n }\n }\n\n if ((collections && collections !== prevProps.collections) ||\n (categories && categories !== prevProps.categories)) {\n // Set the category options\n this.setCollectionCategoryOptions()\n }\n\n if (categoryFilter !== prevState.categoryFilter) {\n // Filter changed\n this.setCollectionCategoryOptions()\n }\n }\n\n /**\n * This function is used to set and update the collection and\n * category options.\n */\n setCollectionCategoryOptions = () => {\n try {\n const { collections, categories, categoryBudgets } = this.props\n const { categoryFilter } = this.state\n\n // Get all collections.\n let collectionOptions = collections.map(c => c)\n\n // Get all categories that are not archived or reserved.\n let categoryOptions = categories.filter(c => {\n if (!c.archived) {\n const name = c.name ? c.name.toLowerCase().trim() : null\n if (name && name !== 'budget' && name !== 'split') return c\n }\n })\n\n // Apply any filters that are applicable.\n if (categoryFilter === 1) {\n // Overspent\n const overspentCategories = categoryBudgets.filter(cb => cb.balance < 0).map(cb => cb.category_id)\n categoryOptions = categoryOptions.filter(o => overspentCategories.includes(o.id))\n } else if (categoryFilter === 2) {\n // Underfunded\n const underfundedCategories = categoryBudgets.filter(cb => cb.goal > cb.budgeted).map(cb => cb.category_id)\n categoryOptions = categoryOptions.filter(o => underfundedCategories.includes(o.id))\n }\n\n // Filter out collections without a category in them.\n collectionOptions = collectionOptions.filter(collection => {\n const id = collection && collection.id ? collection.id : null\n for (const category of categoryOptions) {\n const collectionId = category && category.collection_id ? category.collection_id : null\n if ((id && collectionId) && (collectionId === id)) return collection\n }\n })\n\n this.setState({\n collectionOptions,\n categoryOptions\n })\n } catch (e) {\n\n }\n }\n\n /**\n * Used to toggle which filter is active.\n * Resets all checked values.\n * Category filter codes:\n * 0 - All\n * 1 - Overspent\n * 2 - Underfunded\n * @param {number} filter - The filter code to apply.\n */\n handleUpdateFilter = filter => {\n const { categoryFilter } = this.state\n\n if (filter !== categoryFilter) {\n this.setState({\n collectionsChecked: [],\n categoriesChecked: [],\n checkAll: false,\n checkAllIndeterminate: false,\n categoryFilter: filter\n })\n }\n }\n\n /**\n * Handles checking and unchecking all categories and collections.\n * Ignoring any archived categories.\n */\n handleCheckAllCheckbox = () => {\n try {\n const { checkAll, collectionOptions, categoryOptions } = this.state\n const newCheckAll = !checkAll\n let collectionsChecked = []\n let categoriesChecked = []\n\n if (newCheckAll) {\n collectionsChecked = collectionOptions.map(c => `${c.id}`)\n categoriesChecked = categoryOptions.filter(c => {\n if (!c.archived) {\n const name = c.name ? c.name.toLowerCase().trim() : null\n\n if (name && name !== 'budget' && name !== 'split') return c\n }\n }).map(c => `${c.id}`)\n }\n\n this.setState(\n {\n collectionsChecked,\n categoriesChecked\n })\n } catch (e) {\n }\n }\n\n /**\n * Handle adding and removing collections and categories from the\n * checked list.\n * @param {Object} e The on change event.\n */\n handleCollectionCheckbox = e => {\n try {\n const { categoryOptions, collectionsChecked, categoriesChecked } = this.state\n const collectionId = e.target.name\n const collectionCategories = categoryOptions\n .filter(c => !c.archived && `${c.collection_id}` === collectionId)\n .map(c => `${c.id}`)\n\n if (e.target.checked) {\n // Remove duplicates.\n const uniqueCategories = collectionCategories.filter(c => categoriesChecked.indexOf(c) === -1)\n // Checked true add item to list\n this.setState({\n collectionsChecked: [...collectionsChecked, collectionId],\n categoriesChecked: [...categoriesChecked, ...uniqueCategories]\n })\n } else {\n this.setState({\n collectionsChecked: collectionsChecked.filter(id => id !== collectionId),\n categoriesChecked: categoriesChecked.filter(id => collectionCategories.indexOf(id) < 0)\n })\n }\n } catch (e) {\n\n }\n }\n\n /**\n * Handle adding and removing categories from the checked list.\n * @param {Object} e The on change event.\n */\n handleCategoryCheckbox = e => {\n try {\n const { categoryOptions, collectionsChecked, categoriesChecked } = this.state\n const categoryId = e.target.name\n\n // Get collection Id.\n let collectionId = ''\n for (let c of categoryOptions) if (`${c.id}` === `${categoryId}`) {\n collectionId = `${c.collection_id}`\n break\n }\n\n let allChecked = true\n if (collectionId && e.target.checked) {\n // Get all the categories in this collection except for the one clicked on.\n const collectionCategories = categoryOptions\n .filter(c => !c.archived && `${c.collection_id}` === collectionId && `${c.id}` !== categoryId)\n .map(c => `${c.id}`)\n // check if all the categories in this collection are checked.\n for (const cc of collectionCategories) if (categoriesChecked.indexOf(`${cc}`) < 0) allChecked = false\n } else allChecked = false\n\n if (e.target.checked) {\n // Checked true add item to list\n if (allChecked) {\n // Add the checked category and the collection\n this.setState({\n categoriesChecked: [...categoriesChecked, categoryId],\n collectionsChecked: [...collectionsChecked, collectionId]\n })\n } else {\n // Just add the checked category\n this.setState({ categoriesChecked: [...categoriesChecked, categoryId], })\n }\n } else {\n // Checked false remove item from list\n this.setState({\n categoriesChecked: categoriesChecked.filter(id => id !== categoryId),\n collectionsChecked: collectionsChecked.filter(id => id !== collectionId),\n })\n }\n } catch (e) {\n\n }\n }\n\n /**\n * Controls toggling the collection accordion open and close.\n * @param {number} id - The collection Id\n */\n collectionClick = id => {\n const { expandCollections } = this.state\n\n try {\n const newExpandCollections = [...expandCollections]\n\n if (!newExpandCollections.includes(id)) {\n newExpandCollections.push(id)\n } else {\n newExpandCollections.splice(newExpandCollections.indexOf(id), 1)\n }\n this.setState({ expandCollections: newExpandCollections })\n } catch (e) {\n }\n }\n\n /**\n * This function collapses all the collections.\n */\n collapseAllCollections = () => this.setState({ expandCollections: [] })\n\n /**\n * This function expands all the collections.\n */\n expandAllCollections = () => {\n const { collections } = this.props\n\n if (collections) {\n const expandCollections = collections.map(c => c.id)\n this.setState({ expandCollections })\n }\n }\n\n render() {\n const {\n expandCollections, checkAll, checkAllIndeterminate, collectionOptions, collectionsChecked, categoryFilter,\n categoryOptions, categoriesChecked\n } = this.state\n const { categoryBudgets, transactions, classes, theme } = this.props\n let totalGoal = (categoryBudgets && categoryBudgets[0]) ? categoryBudgets[0].total_goal : 0\n let totalBudgeted = (categoryBudgets && categoryBudgets[0]) ? categoryBudgets[0].total_budgeted : 0\n let totalActivity = (transactions && transactions[0]) ? transactions[0].total_activity : 0\n let totalBalance = (categoryBudgets && categoryBudgets[0]) ? categoryBudgets[0].total_balance : 0\n\n return (\n <Fragment>\n <Box mt={1}>\n <Grid container spacing={2}\n sx={{\n width: 'calc(100% - 248px)'\n }}\n >\n <Grid item xs={6} md={3}>\n <Card className={classes.cardBudget}>\n <CardContent className={classes.budgetCardsContent}>\n <Typography noWrap variant=\"subtitle1\" className={classes.cardText}>\n {formatMoneyLabel(totalGoal)}\n </Typography>\n <Typography noWrap variant=\"body2\" className={classes.cardText}>\n Goal\n </Typography>\n <Flag className={`${classes.cardIcon} ${classes.cardBudgetIcon}`} />\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={6} md={3}>\n <Card className={classes.cardAvailable}>\n <CardContent className={classes.budgetCardsContent}>\n <Typography noWrap variant=\"subtitle1\" className={classes.cardText}>\n {formatMoneyLabel(totalBudgeted)}\n </Typography>\n <Typography noWrap variant=\"body2\" className={classes.cardText}>\n Budgeted\n </Typography>\n <PieChart className={`${classes.cardIcon} ${classes.cardAvailableIcon}`} />\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={6} md={3}>\n <Card className={classes.cardActivity}>\n <CardContent className={classes.budgetCardsContent}>\n <Typography noWrap variant=\"subtitle1\" className={classes.cardText}>\n {formatMoneyLabel(totalActivity)}\n </Typography>\n <Typography noWrap variant=\"body2\" className={classes.cardText}>\n Activity\n </Typography>\n <ShoppingBasket className={`${classes.cardIcon} ${classes.cardActivityIcon}`} />\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={6} md={3}>\n <Card className={classes.cardInflow}>\n <CardContent className={classes.budgetCardsContent}>\n <Typography noWrap variant=\"subtitle1\" className={classes.cardText}>\n {formatMoneyLabel(totalBalance)}\n </Typography>\n <Typography noWrap variant=\"body2\" className={classes.cardText}>\n Balance\n </Typography>\n <MonetizationOn className={`${classes.cardIcon} ${classes.cardInflowIcon}`} />\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </Box>\n\n <Grid container\n direction=\"row\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n sx={{\n width: 'calc(100% - 264px)',\n marginTop: theme.spacing(1)\n }}\n >\n <Button color=\"inherit\" variant=\"text\" size=\"small\"\n onClick={this.expandAllCollections}\n sx={{ textTransform: 'capitalize', padding: theme.spacing(0.5), marginRight: theme.spacing(1) }}\n >\n <UnfoldMore fontSize=\"small\" /> Expand\n </Button>\n\n <Button color=\"inherit\" variant=\"text\" size=\"small\"\n onClick={this.collapseAllCollections}\n sx={{ textTransform: 'capitalize', padding: theme.spacing(0.5), marginRight: theme.spacing(1) }}\n >\n <UnfoldLess fontSize=\"small\" /> Collapse\n </Button>\n\n <Button color=\"inherit\" variant={categoryFilter === 0 ? 'contained' : 'text'} size=\"small\"\n sx={{ textTransform: 'capitalize', padding: theme.spacing(0.5), marginRight: theme.spacing(1) }}\n onClick={() => this.handleUpdateFilter(0)}\n >\n <AllInclusive fontSize=\"small\" /> All\n </Button>\n\n <Button color=\"inherit\" variant={categoryFilter === 1 ? 'contained' : 'text'} size=\"small\"\n sx={{ textTransform: 'capitalize', padding: theme.spacing(0.5), marginRight: theme.spacing(1) }}\n onClick={() => this.handleUpdateFilter(1)}\n >\n <ErrorOutline fontSize=\"small\" /> Overspent\n </Button>\n\n <Button color=\"inherit\" variant={categoryFilter === 2 ? 'contained' : 'text'} size=\"small\"\n sx={{ textTransform: 'capitalize', padding: theme.spacing(0.5) }}\n onClick={() => this.handleUpdateFilter(2)}\n >\n <WarningAmber fontSize=\"small\" /> Underfunded\n </Button>\n </Grid>\n\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n sx={{\n width: 'calc(100% - 264px)',\n paddingRight: theme.spacing(1)\n }}\n >\n <Grid item xs={4} lg={3} zeroMinWidth>\n <ListItemButton dense sx={{ padding: 0 }}\n onClick={this.handleCheckAllCheckbox}\n >\n <Checkbox\n checked={checkAll}\n indeterminate={checkAllIndeterminate}\n size=\"small\"\n inputProps={{ 'aria-label': 'collection checkbox' }}\n />\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography variant=\"body2\" align=\"left\">Category</Typography>\n } />\n </ListItemButton>\n </Grid>\n\n <Grid item xs={4} lg={3} zeroMinWidth>\n <ListItem disableGutters={true} dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography className={classes.tableHeader} variant=\"body2\" align=\"right\">\n Budgeted / Goal\n </Typography>\n } />\n </ListItem>\n </Grid>\n\n <Hidden lgUp>\n <Grid item xs={4} md={4} zeroMinWidth>\n <ListItem disableGutters={true} dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography className={classes.tableHeader} variant=\"body2\" align=\"right\">\n Activity / Balance\n </Typography>\n } />\n </ListItem>\n </Grid>\n </Hidden>\n\n <Hidden lgDown>\n <Grid item lg={3} zeroMinWidth>\n <ListItem disableGutters={true} dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap className={classes.tableHeader} variant=\"body2\" align=\"right\">\n Activity\n </Typography>\n } />\n </ListItem>\n </Grid>\n <Grid item lg={3} zeroMinWidth>\n <ListItem disableGutters={true} dense className={`${classes.m0} ${classes.p0}`}>\n <ListItemText className={`${classes.m0} ${classes.p0}`}\n primary={\n <Typography noWrap className={classes.tableHeader} variant=\"body2\" align=\"right\">\n Balance\n </Typography>\n } />\n </ListItem>\n </Grid>\n </Hidden>\n </Grid>\n\n <Collections categoryFilter={categoryFilter}\n collections={collectionOptions}\n collectionsChecked={collectionsChecked}\n categories={categoryOptions}\n categoriesChecked={categoriesChecked}\n expandCollections={expandCollections}\n handleExpandClick={this.collectionClick}\n handleCollectionCheckbox={this.handleCollectionCheckbox}\n handleCategoryCheckbox={this.handleCategoryCheckbox}\n />\n </Fragment>\n )\n }\n}\n\nBudget.propTypes = {\n collections: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n categoryBudgets: PropTypes.array.isRequired,\n transactions: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n collections: state.collectionReducer.collections,\n categories: state.categoryReducer.categories,\n categoryBudgets: state.categoryBudgetReducer.categoryBudgets,\n transactions: state.transactionReducer.transactions,\n})\n\nexport default connect(mapStateToProps)(withStyles(styles, { withTheme: true })(Budget))\n","import React, { Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Budget from './Budget'\nimport AccountForm from '../layout/AccountForm'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\nimport CategoryBudgetForm from '../layout/CategoryBudgetForm'\nimport MoveBalanceForm from '../layout/MoveBalanceForm'\nimport ActionButtons from '../layout/ActionButtons'\n\nconst BudgetDashboard = () => {\n\n return (\n <AppLoading>\n <Fragment>\n <Budget />\n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n <CategoryBudgetForm />\n <MoveBalanceForm />\n </Fragment>\n </AppLoading>\n )\n}\n\nexport default BudgetDashboard\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { Calendar, luxonLocalizer, Views } from 'react-big-calendar'\nimport { useTheme } from '@mui/styles'\nimport { DateTime } from 'luxon'\n\nimport '../../styles/calendar.css'\n\nconst localizer = luxonLocalizer(DateTime)\nconst NOW = new Date()\nconst CURRENT_YEAR_MONTH = `${NOW.getFullYear()}${NOW.getMonth() + 1}`\n\n/**\n * The calendar runs off only javascript dates.\n * Note: A javascript month is 0 based. Meaning 0 is January.\n * @param {Array} events - The list of events.\n * @param {function} onShowMore - Call when a user selects the show\n * more button on the calendar.\n * @param {function} onSelectEvent - Call when a user selects an event.\n * @returns {JSX.Element}\n * @constructor\n */\nconst RecurringCalendar = ({ events, onShowMore, onSelectEvent }) => {\n const { yearMonth } = withPropsValidation(\n useSelector(({ budgetMonthReducer }) => ({\n yearMonth: budgetMonthReducer.yearMonth,\n })))\n\n const [calendarDate, setCalendarDate] = useState(NOW)\n\n const theme = useTheme()\n\n /**\n * If viewing current month set the initial date to current date.\n * If not current month set calendar date to the first of the month.\n */\n useEffect(() => {\n let dayOfMonth = 1\n let budgetYear = yearMonth.substring(0, 4)\n let budgetMonth = yearMonth.substring(4, 6)\n if (CURRENT_YEAR_MONTH === yearMonth) dayOfMonth = DateTime.local().toFormat('dd')\n const calendarDate = new Date(budgetYear, budgetMonth - 1, dayOfMonth, 0, 0, 0)\n\n setCalendarDate(calendarDate)\n }, [yearMonth])\n\n /**\n * Events prop getting to add custom styling to each event.\n */\n const eventPropGetter = useCallback(\n (event, start, end, isSelected) => ({\n style: {\n background: '#FF7100',\n fontSize: 14,\n padding: '2px 4px'\n },\n ...(event.lastAmountPositive\n ? {\n style: {\n backgroundColor: theme.palette.success.main,\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: theme.typography.fontWeightBold,\n padding: '2px 4px',\n color: '#ffffff'\n },\n } : {\n style: {\n backgroundColor: theme.palette.error.main,\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: theme.typography.fontWeightBold,\n padding: '2px 4px',\n color: '#ffffff'\n },\n }),\n }), [])\n\n const handleShowMore = (events, date) => onShowMore(events, date)\n\n const handleSelectEvent = (calEvent) => onSelectEvent(calEvent)\n\n return (\n <Calendar localizer={localizer}\n // defaultDate={calendarDate}\n getNow={() => calendarDate}\n events={events}\n defaultView={Views.MONTH}\n style={{ height: 625 }}\n eventPropGetter={eventPropGetter}\n toolbar={false}\n drilldownView={null}\n selectable={false}\n showAllEvents={false}\n onKeyPressEvent={() => false}\n onShowMore={handleShowMore}\n onSelectEvent={handleSelectEvent}\n onDoubleClickEvent={() => false}\n onSelectSlot={() => false}\n onSelecting={() => false}\n onDrillDown={() => false}\n />\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'RecurringCalendar')\n return props\n}\n\nconst propTypes = {\n yearMonth: PropTypes.string.isRequired,\n}\n\nRecurringCalendar.propTypes = {\n events: PropTypes.array.isRequired,\n onShowMore: PropTypes.func.isRequired,\n onSelectEvent: PropTypes.func.isRequired\n}\n\nexport default RecurringCalendar\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n Box, Grid, Table, TableBody, TableContainer, TableCell, TableHead, TableRow, Tooltip, Typography\n} from '@mui/material'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { EventRepeat } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n}))\n\n/**\n *\n * @param {Array} events - The list of events.\n * @param {function} onSelectEvent - Call when a user selects an event.\n * @returns {JSX.Element}\n * @constructor\n */\nconst RecurringTransactionList = ({ events, onSelectEvent }) => {\n\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Handles the user selecting an event from the list of recurring.\n * @param {Object} event - The event the user selected.\n */\n const handleSelectEvent = (event) => onSelectEvent(event)\n\n return (\n <Fragment>\n {events && events.length > 0\n ? (\n <TableContainer>\n <Table aria-label=\"recurring transaction table\">\n <TableHead>\n <TableRow>\n <TableCell>Upcoming</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Last Event</TableCell>\n <TableCell>Est. Next Event</TableCell>\n <TableCell align=\"center\">Status</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {events.map((row, index) => (\n <TableRow key={`upcoming-event-${index}`} hover\n onClick={() => handleSelectEvent(row)}\n >\n\n <TableCell>\n <Grid container>\n <Grid item xs={12} style={{ whiteSpace: 'nowrap' }}>\n {row.account}\n </Grid>\n <Grid item xs={12}\n style={{\n whiteSpace: 'nowrap',\n color: theme.palette.text.secondary\n }}\n >\n {row.prettyFrequency}\n </Grid>\n </Grid>\n </TableCell>\n\n <TableCell>\n {row.description}{row.merchantName ? `: ${row.merchantName}` : ''}\n </TableCell>\n\n <TableCell>\n <Grid container>\n <Grid item xs={12} style={{ whiteSpace: 'nowrap' }}>\n {row.prettyLastDate}\n </Grid>\n <Grid item xs={12}\n style={{\n textTransform: 'capitalize',\n whiteSpace: 'nowrap',\n color: row.lastAmountPositive ? theme.palette.success.main : theme.palette.text.secondary\n }}\n >\n {formatMoneyLabel(row.lastAmount)}\n </Grid>\n </Grid>\n </TableCell>\n\n <TableCell>\n {row.isActive\n ? (\n <Grid container>\n <Grid item xs={12} style={{ whiteSpace: 'nowrap' }}>\n {row.prettyNextDate}\n </Grid>\n <Grid item xs={12}\n style={{\n textTransform: 'capitalize',\n whiteSpace: 'nowrap',\n color: row.lastAmountPositive ? theme.palette.success.main : theme.palette.text.secondary\n }}\n >\n {formatMoneyLabel(row.lastAmount)}\n </Grid>\n </Grid>\n )\n : 'None'\n }\n </TableCell>\n\n <TableCell align=\"center\">\n <Tooltip title={row.status === 'MATURE'\n ? 'A long term recurring transaction.'\n : row.status === 'EARLY_DETECTION'\n ? 'A new recurring transaction.'\n : 'No future transactions detected.'\n }>\n {row.statusIcon}\n </Tooltip>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n ) : (\n <Box p={3}>\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <EventRepeat fontSize=\"large\" className={classes.noDataIcon} />\n </Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"h6\">No recurring events detected yet.</Typography>\n </Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"subtitle2\">\n If your accounts are linked any detected recurring events like subscriptions or bills will show\n up here.\n </Typography>\n </Grid>\n </Grid>\n </Box>\n )}\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'RecurringTransactionList')\n return props\n}\n\nconst propTypes = {}\n\nRecurringTransactionList.propTypes = {\n events: PropTypes.array.isRequired,\n onSelectEvent: PropTypes.func.isRequired\n}\n\nexport default RecurringTransactionList\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { DateTime } from 'luxon'\nimport { Cancel } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport RecurringTransactionList from '../recurring/RecurringTransactionList'\nimport { fullScreen, Transition } from '../utilities/dialogs'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n}))\n\n/**\n *\n * @param {boolean} open - Is the modal open or closed.\n * @param {function} handleClose - Function to close the modal.\n * @param {Array} events - The recurring events to\n * display.\n * @param {DateTime} recurringDate - The date of events. JS Date\n * display.\n * @param {function} onSelectEvent - Call when a user selects an event.\n * @returns {JSX.Element}\n * @constructor\n */\nconst RecurringDateDetail = ({ open, handleClose, events, recurringDate, onSelectEvent }) => {\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * Handles the user selecting an event from the list of recurring.\n * @param {Object} event - The event the user selected.\n */\n const handleSelectEvent = (event) => onSelectEvent(event)\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"date-events-list\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n {DateTime.fromJSDate(recurringDate).toLocaleString({\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })}\n </DialogTitle>\n <DialogContent>\n\n <RecurringTransactionList events={events} onSelectEvent={handleSelectEvent} />\n\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'RecurringDateDetail')\n return props\n}\n\nconst propTypes = {}\n\nRecurringDateDetail.propTypes = {\n open: PropTypes.bool.isRequired,\n handleClose: PropTypes.func.isRequired,\n events: PropTypes.array.isRequired,\n recurringDate: PropTypes.instanceOf(Date),\n onSelectEvent: PropTypes.func.isRequired\n}\n\nexport default RecurringDateDetail\n","import React, { Fragment, useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Grid, Typography,\n Table, TableBody, TableCell, TableHead, TableRow\n} from '@mui/material'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport { Cancel, ReceiptLong } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { formatISODate } from '../utilities/dates'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n}))\n\n/**\n *\n * @param {boolean} open - Is the modal open or closed.\n * @param {function} handleClose - Function to close the modal.\n * @param {Object} event - The recurring event.\n * @returns {JSX.Element}\n * @constructor\n */\nconst RecurringTransactionDetail = ({ open, handleClose, event }) => {\n const [title, setTitle] = useState('')\n const [linkTransactions, setLinkTransactions] = useState([])\n\n const theme = useTheme()\n const classes = useStyles()\n\n /**\n * When the user selects an event update the link transaction list\n * to display all the transactions for that event.\n */\n useEffect(() => {\n const linkTransactions = event && event.linkTransactions ? event.linkTransactions : []\n const firstLinkTransaction = linkTransactions && linkTransactions[0] ? linkTransactions[0] : null\n let title = ''\n if (firstLinkTransaction) {\n title = firstLinkTransaction.name && firstLinkTransaction.merchant_name\n ? `${firstLinkTransaction.name} - ${firstLinkTransaction.merchant_name}`\n : firstLinkTransaction.name\n ? firstLinkTransaction.name\n : ''\n }\n\n setTitle(title)\n setLinkTransactions(linkTransactions)\n }, [event])\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"recurring-transactions-list\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n <div>\n <Typography variant=\"h6\">{(event && event.account || '')}</Typography>\n <Typography variant=\"subtitle2\">{(event && event.linkAccount || '')}</Typography>\n <Typography variant=\"subtitle2\">{(event && event.linkAccountOfficial || '')}</Typography>\n <Grid container item xs={12}\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Box mt={2}>\n <Typography variant=\"h6\" align=\"center\">{title}</Typography>\n <Typography variant=\"subtitle2\" align=\"center\">{(event && event.prettyFrequency || '')}</Typography>\n </Box>\n </Grid>\n </div>\n </DialogTitle>\n <DialogContent>\n\n {linkTransactions && linkTransactions.length > 0\n ? (\n <Table sx={{ minWidth: 400 }} aria-label=\"recurring transaction table\">\n <TableHead>\n <TableRow>\n <TableCell>Posted</TableCell>\n <TableCell>Amount</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {linkTransactions.map((row, index) => {\n let amount = row.amount > 0 ? -Math.abs(row.amount) : Math.abs(row.amount)\n return (\n <TableRow key={`recurring-event-transaction-${index}`}>\n <TableCell>{formatISODate(row.date)}</TableCell>\n <TableCell>{formatMoneyLabel(amount)}</TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n ) : (\n <Grid container direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <ReceiptLong fontSize=\"large\" className={classes.noDataIcon} />\n </Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"h6\">No transaction history yet.</Typography>\n </Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"subtitle2\">\n All the charges related to this recurring transaction\n will show up here.\n </Typography>\n </Grid>\n </Grid>\n )}\n\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'RecurringTransactionDetail')\n return props\n}\n\nconst propTypes = {}\n\nRecurringTransactionDetail.propTypes = {\n open: PropTypes.bool.isRequired,\n handleClose: PropTypes.func.isRequired,\n event: PropTypes.object.isRequired\n}\n\nexport default RecurringTransactionDetail\n","import React, { Fragment, useEffect, useState, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { useSelector } from 'react-redux'\nimport { Grid, Paper } from '@mui/material'\nimport { DateTime } from 'luxon'\nimport { CheckCircle, Warning, Report } from '@mui/icons-material'\n\nimport RecurringCalendar from './RecurringCalendar'\nimport RecurringTransactionList from './RecurringTransactionList'\nimport RecurringDateDetail from '../layout/RecurringDateDetail'\nimport RecurringTransactionDetail from '../layout/RecurringTransactionDetail'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\nconst NOW = new Date()\n\n/**\n * Dashboard for the recurring page.\n *\n * Note: calendarEvents is the same as the events state object with the\n * exception that calendarEvents contains the last event and the\n * upcoming event. The event state object only contains the upcoming\n * event if known otherwise the last event.\n * @returns {JSX.Element}\n * @constructor\n */\nconst Dashboard = () => {\n const { recurringTransactions, accounts } = withPropsValidation(\n useSelector(({ recurringReducer, accountReducer }) => ({\n recurringTransactions: recurringReducer.recurringTransactions,\n accounts: accountReducer.accounts\n })))\n\n const [calendarEvents, setCalendarEvents] = useState([])\n const [events, setEvents] = useState([])\n const [dateDetailOpen, setDateDetailOpen] = useState(false)\n const [transactionDetailOpen, setTransactionDetailOpen] = useState(false)\n const [dateEvents, setDateEvents] = useState([])\n const [transactionDetails, setTransactionDetails] = useState({})\n const [recurringDate, setRecurringDate] = useState(NOW)\n\n\n /**\n * Link transactions are reversed in this case.\n * A positive is an outflow and a negative is an inflow.\n * Let's flip them.\n */\n useEffect(() => {\n const calendarEvents = []\n const events = []\n\n for (const rt of recurringTransactions) {\n // Get the account associated with this event.\n const account = accounts.find(a => a.link_id === rt.account_id)\n\n // Handle the last and average transaction amount for this event.\n let lastAmount = rt.last_amount > 0 ? -Math.abs(rt.last_amount) : Math.abs(rt.last_amount)\n const lastAmountPositive = (lastAmount > 0)\n lastAmount = formatMoneyLabel(lastAmount)\n let averageAmount = rt.average_amount > 0 ? -Math.abs(rt.average_amount) : Math.abs(rt.average_amount)\n const averageAmountPositive = (averageAmount > 0)\n averageAmount = formatMoneyLabel(averageAmount)\n\n // Format a title string.\n const title = rt.description && rt.merchant_name\n ? `${lastAmount}: ${rt.description} ${rt.merchant_name}`\n : rt.description\n ? `${lastAmount}: ${rt.description} `\n : lastAmount\n\n /**\n * Get the last event date and next event date.\n * Both events as a JS Date and in pretty format.\n */\n const lastDate = DateTime.fromISO(rt.last_date).toJSDate()\n const prettyLastDate = DateTime.fromISO(rt.last_date).toLocaleString({\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })\n const frequency = rt.frequency ? rt.frequency : ''\n const isActive = (rt.active || false)\n const { prettyFrequency, nextEvent } = handleFrequency(rt.last_date, frequency)\n const prettyNextEvent = nextEvent ? DateTime.fromJSDate(nextEvent).toLocaleString({\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }) : 'Unknown'\n const statusIcon = handleStatus(rt.status)\n\n const event = {\n id: rt.id,\n title,\n // start: DateTime.local().toJSDate(),\n // end: DateTime.local().toJSDate(),\n start: nextEvent ? nextEvent : lastDate,\n end: nextEvent ? nextEvent : lastDate,\n allDay: true,\n resourceId: rt.id,\n account: account ? account.name : '',\n description: (rt.description || ''),\n merchantName: (rt.merchant_name || ''),\n lastAmount,\n lastAmountPositive,\n lastDate,\n prettyLastDate,\n averageAmount,\n nextDate: nextEvent,\n prettyNextDate: prettyNextEvent,\n frequency: frequency,\n prettyFrequency: (prettyFrequency || 'Unknown'),\n isActive: isActive,\n status: rt.status,\n statusIcon,\n linkAccount: (rt.account || ''),\n linkAccountOfficial: (rt.account_official || ''),\n linkTransactions: rt.link_transactions\n }\n\n /**\n * If the next event is known then add the last event to the\n * calendar state object\n */\n if (nextEvent) {\n calendarEvents.push({\n ...event,\n start: lastDate,\n end: lastDate\n })\n }\n\n calendarEvents.push(event)\n events.push(event)\n }\n\n setCalendarEvents(calendarEvents)\n setEvents(events)\n }, [recurringTransactions])\n\n /**\n * This function calculates the next estimated date and returns the\n * frequency in a prettier format.\n *\n * Frequency options:\n * UNKNOWN, WEEKLY, BIWEEKLY, SEMI_MONTHLY, MONTHLY, ANNUALLY\n * @param {string} frequency\n * @param {string} lastDate - The last time the recurring transaction\n * occurred.\n * @returns {{nextEvent: date, prettyFrequency: string}|{nextEvent: null, prettyFrequency: null}}\n */\n const handleFrequency = (lastDate, frequency) => {\n let prettyFrequency = null\n let nextEvent = null\n\n try {\n\n switch (frequency) {\n case 'WEEKLY':\n prettyFrequency = 'Weekly'\n nextEvent = DateTime.fromISO(lastDate).plus({ weeks: 1 }).toJSDate()\n break\n case 'BIWEEKLY':\n prettyFrequency = 'Every 2 weeks'\n nextEvent = DateTime.fromISO(lastDate).plus({ weeks: 2 }).toJSDate()\n break\n case 'SEMI_MONTHLY':\n prettyFrequency = 'Twice a month'\n nextEvent = DateTime.fromISO(lastDate).plus({ months: 0.5 }).toJSDate()\n break\n case 'MONTHLY':\n prettyFrequency = 'Monthly'\n nextEvent = DateTime.fromISO(lastDate).plus({ months: 1 }).toJSDate()\n break\n case 'ANNUALLY':\n prettyFrequency = 'Annually'\n nextEvent = DateTime.fromISO(lastDate).plus({ years: 1 }).toJSDate()\n break\n default:\n prettyFrequency = null\n nextEvent = null\n }\n\n return { prettyFrequency, nextEvent }\n } catch (e) {\n return { prettyFrequency, nextEvent }\n }\n }\n\n /**\n * Status options:\n * UNKNOWN, MATURE, EARLY_DETECTION, TOMBSTONED\n * @param {string} status\n */\n const handleStatus = (status) => {\n try {\n let statusColor\n\n switch (status) {\n case 'MATURE':\n statusColor = <CheckCircle fontSize=\"small\" color=\"success\" />\n break\n case 'EARLY_DETECTION':\n statusColor = <Warning fontSize=\"small\" color=\"warning\" />\n break\n case 'TOMBSTONED':\n statusColor = <Report fontSize=\"small\" color=\"error\" />\n break\n default:\n statusColor = <Report fontSize=\"small\" color=\"error\" />\n }\n\n return statusColor\n } catch (e) {\n return <Report fontSize=\"small\" color=\"error\" />\n }\n }\n\n\n /**\n * Handles when a user clicks or uses the keyboard to action the\n * show more button.\n */\n const handleShowMore = useCallback(\n (events, date) => {\n setDateEvents(events)\n setRecurringDate(date)\n setDateDetailOpen(true)\n }, [])\n\n /**\n * Handles when a user clicks or uses the keyboard to action an\n * event.\n * @param {Object} calendarEvent - The selected event object.\n */\n const handleSelectEvent = useCallback((calendarEvent) => {\n if (calendarEvent) {\n setTransactionDetails(calendarEvent)\n setTransactionDetailOpen(true)\n }\n }, [])\n\n /**\n * Close the recurring date detail modal.\n */\n const handleDateDetailClose = () => setDateDetailOpen(false)\n\n /**\n * Close the recurring transaction details modal.\n */\n const handleTransactionClose = () => setTransactionDetailOpen(false)\n\n return (\n <Fragment>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Paper elevation={3}>\n <RecurringCalendar events={calendarEvents} onShowMore={handleShowMore}\n onSelectEvent={handleSelectEvent}\n />\n </Paper>\n </Grid>\n\n <Grid item xs={12}>\n <Paper elevation={3}>\n <RecurringTransactionList events={events} onSelectEvent={handleSelectEvent} />\n </Paper>\n </Grid>\n </Grid>\n\n <RecurringDateDetail open={dateDetailOpen}\n handleClose={handleDateDetailClose}\n events={dateEvents}\n recurringDate={recurringDate}\n onSelectEvent={handleSelectEvent}\n />\n <RecurringTransactionDetail open={transactionDetailOpen}\n handleClose={handleTransactionClose}\n event={transactionDetails}\n />\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'Dashboard')\n return props\n}\n\nconst propTypes = {\n recurringTransactions: PropTypes.array.isRequired,\n accounts: PropTypes.array.isRequired\n}\n\nexport default Dashboard\n","import React, { Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Dashboard from './Dashboard'\nimport ActionButtons from '../layout/ActionButtons'\nimport AccountForm from '../layout/AccountForm'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\nimport MoveBalanceForm from '../layout/MoveBalanceForm'\n\n/**\n * @returns {JSX.Element}\n * @constructor\n */\nconst Recurring = () => {\n\n return (\n <AppLoading>\n <Fragment>\n <Dashboard />\n \n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n <MoveBalanceForm />\n </Fragment>\n </AppLoading>\n )\n}\n\nexport default Recurring\n","import React, { useEffect, useState, useRef } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport {\n Box, Paper, Typography, Grid, ListItemText, Button,\n FormControl, MenuItem, Checkbox, InputLabel, Select, Tooltip, TextField,\n FormLabel, FormGroup\n} from '@mui/material'\nimport { DatePicker } from '@mui/lab'\nimport MUIDataTable, { debounceSearchRender } from 'mui-datatables'\nimport { Verified, NewReleases, Inventory } from '@mui/icons-material'\nimport { DateTime } from 'luxon'\nimport clsx from 'clsx'\n\nimport { sharedStyles } from '../common/styles'\nimport { ROWS_PER_PAGE_OPTIONS } from '../utilities/tables'\nimport { editTransactionId } from '../../actions/transactionId'\nimport { downloadTransactionHistory, getTransactionHistory } from '../../actions/history'\nimport { Loading } from '../loading/Loading'\nimport { formatISODate } from '../utilities/dates'\nimport { formatMoneyLabel } from '../utilities/numbers'\n\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n tableChips: {\n marginBottom: theme.spacing(1),\n marginRight: theme.spacing(1)\n },\n tableAttributeContainer: {\n background: 'linear-gradient(to right, #0f4e5b, #206470)',\n color: theme.palette.secondary.contrastText,\n borderRadius: theme.spacing(0.5),\n marginLeft: theme.spacing(0.5),\n marginRight: theme.spacing(0.5),\n padding: theme.spacing(0.5)\n },\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 500,\n whiteSpace: 'nowrap',\n textAlign: 'right',\n },\n negativeAmount: {\n fontWeight: 500,\n whiteSpace: 'nowrap',\n textAlign: 'right',\n },\n}))\n\nconst HistoryTransactionList = () => {\n const {\n transactions,\n flagColors,\n transactionFlags,\n isFetching,\n accounts,\n categories\n } = withPropsValidation(\n useSelector(({\n historyReducer,\n flagColorReducer,\n transactionFlagReducer,\n accountReducer,\n categoryReducer\n }) => ({\n transactions: historyReducer.transactions,\n isFetching: historyReducer.isFetching,\n flagColors: flagColorReducer.flagColors,\n transactionFlags: transactionFlagReducer.transactionFlags,\n accounts: accountReducer.accounts,\n categories: categoryReducer.categories\n })))\n\n const [searchText, setSearchText] = useState('')\n const [filterList, setFilterList] = useState([])\n const [startDateOpen, setStartDateOpen] = useState(false)\n const [endDateOpen, setEndDateOpen] = useState(false)\n const [accountOptions, setAccountOptions] = useState([])\n const [categoryOptions, setCategoryOptions] = useState([])\n const [flagOptions, setFlagOptions] = useState([])\n const [tableData, setTableData] = useState([])\n const [tableOptions, setTableOptions] = useState({})\n\n const optionsRef = useRef()\n const dispatch = useDispatch()\n const theme = useTheme()\n const classes = useStyles()\n optionsRef.current = tableOptions\n\n /**\n * Page load and if transactions change.\n */\n useEffect(() => {\n updateTable()\n }, [transactions])\n\n /**\n * Update the account options for filtering.\n */\n useEffect(() => {\n const accountOptions = []\n\n for (const account of accounts) {\n accountOptions.push({\n id: account.id,\n name: account.name\n })\n }\n\n setAccountOptions(accountOptions)\n }, [accounts])\n\n /**\n * Update the category options for filtering.\n */\n useEffect(() => {\n const categoryOptions = []\n\n for (const category of categories) {\n let categoryName = category && category.name ? category.name : ''\n categoryName = categoryName.trim().toLowerCase()\n\n if (categoryName === 'split' || categoryName === '') continue\n\n categoryOptions.push({\n id: category.id,\n name: category.name\n })\n }\n\n setCategoryOptions(categoryOptions)\n }, [categories])\n\n\n /**\n * Update the table with the new transaction data.\n */\n const updateTable = () => {\n try {\n const count = transactions && transactions[0] && transactions[0].count ? transactions[0].count : 0\n const page = transactions && transactions[0] && transactions[0].page ? transactions[0].page : 0\n const rowsPerPage = transactions && transactions[0] && transactions[0].page_size ? transactions[0].page_size : ROWS_PER_PAGE_OPTIONS[0]\n const flagOptions = []\n\n // Get the users flag colors and labels.\n for (const flagColor of flagColors) {\n for (const transactionFlag of transactionFlags) {\n if (flagColor.id === transactionFlag.color_id) {\n flagOptions.push({\n id: transactionFlag.id,\n colorId: flagColor.id,\n color: flagColor.name,\n name: transactionFlag.name\n })\n }\n }\n }\n\n setFlagOptions(flagOptions)\n setTableData(transactions)\n setTableOptions({\n count,\n page,\n rowsPerPage,\n responsive: 'vertical',\n selectableRows: 'none',\n elevation: 0,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n serverSide: true,\n rowHover: false,\n print: false,\n sort: false,\n download: true,\n viewColumns: true,\n confirmFilters: true,\n search: true,\n searchText: searchText,\n searchPlaceholder: 'Search Transaction History',\n customSearchRender: debounceSearchRender(500),\n downloadOptions: {\n filterOptions: {\n useDisplayedColumnsOnly: true,\n useDisplayedRowsOnly: true\n }\n },\n // Calling the applyNewFilters parameter applies the selected filters to the table\n customFilterDialogFooter: (currentFilterList, applyNewFilters) => (\n <div style={{ marginTop: theme.spacing(4) }}>\n <Button variant=\"contained\" fullWidth\n onClick={() => handleFilterSubmit(applyNewFilters)}>\n Apply Filters\n </Button>\n </div>\n ),\n // onRowClick: rowData => transactionClick(rowData)\n onDownload: (buildHead, buildBody, columns, data) => {\n const displayColumns = columns.map(c => c.name)\n downloadHistoryTransactions(displayColumns, searchText, filterList)\n return false\n },\n onSearchChange: searchText => searchTransactions(searchText),\n onSearchClose: () => resetSearchTransactions(),\n onChangePage: page => updatePage(page),\n onChangeRowsPerPage: numberOfRows => updateRowsPerPage(numberOfRows),\n onFilterChipClose: (index, removedFilter, filterList) => {\n let newFilters = () => (filterList)\n handleFilterSubmit(newFilters)\n },\n setFilterChipProps: (colIndex, colName, data) => {\n return {\n color: 'primary',\n variant: 'contained',\n className: classes.tableChips,\n }\n }\n })\n\n } catch (e) {\n // console.log({ error: e })\n }\n }\n\n\n /**\n * Gets attributes about the current record set to display in\n * the toolbar.\n * @param {Object} data - The display data for the table.\n * @returns {JSX.Element}\n */\n const TableToolbar = ({ data }) => {\n let sum = 0\n let min = 0\n let max = 0\n let average = 0\n const displayRow = data && data[0] ? data[0] : null\n if (displayRow) {\n sum = displayRow.sum ? displayRow.sum : 0\n min = displayRow.min ? displayRow.min : 0\n max = displayRow.max ? displayRow.max : 0\n average = displayRow.average ? displayRow.average : 0\n }\n\n return (\n <Grid container>\n\n <Grid item xs={6} md={3}>\n <ListItemText disableTypography\n className={classes.tableAttributeContainer}\n primary={\n <Typography align=\"center\" variant=\"body2\" noWrap>\n {formatMoneyLabel(sum)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Sum\n </Typography>\n }\n />\n </Grid>\n\n <Grid item xs={6} md={3}>\n <ListItemText disableTypography\n className={classes.tableAttributeContainer}\n primary={\n <Typography align=\"center\" variant=\"body2\" noWrap>\n {formatMoneyLabel(average)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Average\n </Typography>\n }\n />\n </Grid>\n\n <Grid item xs={6} md={3}>\n <ListItemText disableTypography\n className={classes.tableAttributeContainer}\n primary={\n <Typography align=\"center\" variant=\"body2\" noWrap>\n {formatMoneyLabel(min)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Min\n </Typography>\n }\n />\n </Grid>\n\n <Grid item xs={6} md={3}>\n <ListItemText disableTypography\n className={classes.tableAttributeContainer}\n primary={\n <Typography align=\"center\" variant=\"body2\" noWrap>\n {formatMoneyLabel(max)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Max\n </Typography>\n }\n />\n </Grid>\n\n </Grid>\n )\n }\n\n\n /**\n * This function is used to update the transaction form with\n * row that was clicked on.\n * @param {Array} rowData - The link transaction actioned.\n */\n const transactionClick = rowData => dispatch(editTransactionId(rowData[0]))\n\n /**\n * Sends request for transaction history based on\n * number of rows changing. Reset the current page back to 0.\n * @param {number} rowsPerPage- The rows per page to display.\n */\n const updateRowsPerPage = (rowsPerPage) => {\n const query = searchText && searchText.length > 2 ? searchText : ''\n\n updateTableData(0, rowsPerPage, query, filterList)\n }\n\n /**\n * Sends request for transaction history based on\n * page changing.\n * @param {number} page - The page to display. 0 indexed.\n */\n const updatePage = (page) => {\n const rowsPerPage = optionsRef && optionsRef.current && optionsRef.current.rowsPerPage\n ? optionsRef.current.rowsPerPage\n : ROWS_PER_PAGE_OPTIONS[0]\n const query = searchText && searchText.length > 2 ? searchText : ''\n\n updateTableData(page, rowsPerPage, query, filterList)\n }\n\n /**\n * Search the transaction history based on the passed query string.\n * We reset the page number and rows per page for the search.\n * Don't search until 3 or more characters.\n * @param {string} query - The query to search against.\n */\n const searchTransactions = query => {\n setSearchText(query)\n\n if (query && query.length > 2) {\n updateTableData(0, 0, query, filterList)\n }\n }\n\n /**\n * Handles the user closing the search.\n */\n const resetSearchTransactions = () => updateTableData(0, 0, '', filterList)\n\n /**\n * Applies the filters to the table and saves to state. Makes\n * a call to update table data. Reset page back to 0\n * @param {Function} newFilters - Function to create new filters\n */\n const handleFilterSubmit = (newFilters) => {\n let filterList = newFilters()\n setFilterList(filterList)\n const rowsPerPage = optionsRef && optionsRef.current && optionsRef.current.rowsPerPage\n ? optionsRef.current.rowsPerPage\n : ROWS_PER_PAGE_OPTIONS[0]\n const query = searchText && searchText.length > 2 ? searchText : ''\n updateTableData(0, rowsPerPage, query, filterList)\n }\n\n\n /**\n * Calls the action to make a request to the server for table data\n * based on the passed query params.\n * *** *** WARNING *** ***\n * All of the table columns and filters are index based.\n * @param {number} page - The page of data. 0 indexed.\n * @param {number} rowsPerPage - The size of the page.\n * @param {string} query - A search query to filter on.\n * @param {Array} filterList - The table filters.\n */\n const updateTableData = (page, rowsPerPage, query, filterList) => {\n try {\n const startDate = filterList && filterList[2] && filterList[2][0]\n ? DateTime.fromISO(filterList[2][0]).toFormat('yyyyMMdd')\n : null\n const endDate = filterList && filterList[3] && filterList[3][0]\n ? DateTime.fromISO(filterList[3][0]).toFormat('yyyyMMdd')\n : null\n const flags = filterList && filterList[5] && filterList[5].length > 0\n ? filterList[5].toString()\n : null\n const payee = filterList && filterList[6] && filterList[6][0]\n ? filterList[6][0]\n : null\n const filterAccounts = filterList && filterList[7] && filterList[7].length > 0\n ? filterList[7].toString()\n : null\n const filterCategories = filterList && filterList[8] && filterList[8].length > 0\n ? filterList[8].toString()\n : null\n const posted = filterList && filterList[11]\n ? filterList[11][0]\n : null\n const archived = filterList && filterList[12]\n ? filterList[12][0]\n : null\n\n dispatch(getTransactionHistory(page, rowsPerPage, query, startDate, endDate, flags, payee, filterAccounts, filterCategories, posted, archived))\n } catch (e) {\n\n }\n }\n\n\n /**\n * Downloads history transaction data to CSV file.\n * *** *** WARNING *** ***\n * All of the table columns and filters are index based.\n * @param {Array} columns - A list of columns to download\n * @param {string} query - A search query to filter on.\n * @param {Array} filterList - The table filters.\n */\n const downloadHistoryTransactions = (columns, query, filterList) => {\n try {\n const startDate = filterList && filterList[2] && filterList[2][0]\n ? DateTime.fromISO(filterList[2][0]).toFormat('yyyyMMdd')\n : null\n const endDate = filterList && filterList[3] && filterList[3][0]\n ? DateTime.fromISO(filterList[3][0]).toFormat('yyyyMMdd')\n : null\n const flags = filterList && filterList[5] && filterList[5].length > 0\n ? filterList[5].toString()\n : null\n const payee = filterList && filterList[6] && filterList[6][0]\n ? filterList[6][0]\n : null\n const filterAccounts = filterList && filterList[7] && filterList[7].length > 0\n ? filterList[7].toString()\n : null\n const filterCategories = filterList && filterList[8] && filterList[8].length > 0\n ? filterList[8].toString()\n : null\n const posted = filterList && filterList[11]\n ? filterList[11][0]\n : null\n const archived = filterList && filterList[12]\n ? filterList[12][0]\n : null\n\n dispatch(downloadTransactionHistory(columns, query, startDate, endDate, flags, payee, filterAccounts, filterCategories, posted, archived))\n } catch (e) {\n\n }\n }\n\n /**\n * *** WARNING ***\n * Some columns are indexed based, so if the position of a column\n * is changed it could break the logic.\n */\n const tableColumns = [{\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false,\n download: false\n }\n }, {\n label: 'Flag Color', name: 'flag_color',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false,\n download: false\n }\n }, {\n label: 'Start Date', name: 'start_date',\n options: {\n searchable: false,\n display: 'excluded',\n viewColumns: false,\n download: false,\n filter: true,\n filterType: 'custom',\n // filterList: [formatISODate(DateTime.local().plus({ months: -1 }))],\n customFilterListOptions: {\n render: v => {\n if (v[0]) {\n return `Start Date: ${formatISODate(v[0])}`\n }\n return false\n },\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <div>\n <FormLabel>Start Date</FormLabel>\n <FormGroup row>\n <DatePicker open={startDateOpen}\n onChange={value => {\n filterList[index] = [value]\n onChange(filterList[index], index, column)\n }}\n value={filterList && filterList[index] && filterList[index][0] ? formatISODate(filterList[index][0]) : null}\n onClose={() => setStartDateOpen(false)}\n clearable={false}\n inputProps={{ readOnly: true }}\n renderInput={(params) => (\n <TextField fullWidth\n {...params}\n onClick={() => setStartDateOpen(true)}\n />)}\n />\n </FormGroup>\n </div>\n ),\n },\n },\n }, {\n label: 'End Date', name: 'end_date',\n options: {\n searchable: false,\n display: 'excluded',\n viewColumns: false,\n download: false,\n filter: true,\n filterType: 'custom',\n // filterList: [formatISODate(DateTime.local())],\n customFilterListOptions: {\n render: v => {\n if (v[0]) {\n return `End Date: ${formatISODate(v[0])}`\n }\n return false\n },\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <div>\n <FormLabel>End Date</FormLabel>\n <FormGroup row>\n <DatePicker open={endDateOpen}\n onChange={value => {\n filterList[index] = [value]\n onChange(filterList[index], index, column)\n }}\n value={filterList && filterList[index] && filterList[index][0] ? formatISODate(filterList[index][0]) : null}\n onClose={() => setEndDateOpen(false)}\n clearable={false}\n inputProps={{ readOnly: true }}\n renderInput={(params) => (\n <TextField fullWidth\n {...params}\n onClick={() => setEndDateOpen(true)}\n />)}\n />\n </FormGroup>\n </div>\n ),\n },\n },\n }, {\n label: 'Date', name: 'date',\n options: {\n filter: false,\n download: true,\n searchable: false,\n customBodyRender: value => formatISODate(value),\n }\n }, {\n label: 'Flag', name: 'flag_name', searchable: true,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => {\n const flagColor = tableMeta && tableMeta.rowData && tableMeta.rowData[1]\n ? tableMeta.rowData[1]\n : theme.palette.divider\n return (\n <Box className={classes.tableLabel}\n style={{\n border: `1px solid ${flagColor}`,\n color: flagColor\n }}\n >\n <Typography variant=\"caption\" align=\"center\" noWrap>\n {value}\n </Typography>\n </Box>\n )\n },\n filter: true,\n filterType: 'custom',\n customFilterListOptions: {\n render: v => {\n const selectedColors = []\n\n for (const flag of flagOptions) {\n if (v.includes(flag.color)) {\n const name = flag && flag.name ? flag.name.trim() : ''\n if (name) {\n selectedColors.push(name)\n } else {\n selectedColors.push(flag.color)\n }\n }\n }\n\n return selectedColors\n },\n update: (filterList, filterPos, index) => {\n filterList[index].splice(filterPos, 1)\n return filterList\n }\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <FormControl variant=\"standard\">\n <InputLabel>\n Flag\n </InputLabel>\n <Select multiple\n value={filterList[index]}\n renderValue={selected => {\n const selectedColors = []\n\n for (const flag of flagOptions) {\n if (selected.includes(flag.color)) {\n const name = flag && flag.name ? flag.name.trim() : ''\n if (name) {\n selectedColors.push(name)\n } else {\n selectedColors.push(flag.color)\n }\n }\n }\n\n return selectedColors.join(', ')\n }}\n onChange={event => {\n filterList[index] = event.target.value\n onChange(filterList[index], index, column)\n }}\n >\n {flagOptions.map(item => (\n <MenuItem key={item.id} value={item.color}>\n <Checkbox\n checked={filterList[index].indexOf(item.color) > -1}\n sx={{\n color: item.color,\n '&.Mui-checked': {\n color: item.color,\n },\n }}\n />\n <ListItemText primary={item.name} />\n </MenuItem>\n )\n )}\n </Select>\n </FormControl>\n )\n }\n }\n }, {\n label: 'Payee', name: 'name', searchable: true,\n options: {\n filter: true,\n filterType: 'textField'\n }\n }, {\n label: 'Account', name: 'account', searchable: true,\n options: {\n filter: true,\n filterType: 'custom',\n customFilterListOptions: {\n render: v => {\n const selectedAccounts = []\n\n for (const account of accountOptions) {\n if (v.includes(account.id)) {\n const name = account && account.name ? account.name.trim() : ''\n selectedAccounts.push(name)\n }\n }\n\n return selectedAccounts.join(', ')\n },\n update: (filterList, filterPos, index) => {\n filterList[index].splice(filterPos, 1)\n return filterList\n }\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <FormControl variant=\"standard\">\n <InputLabel>\n Account\n </InputLabel>\n <Select multiple\n value={filterList[index]}\n renderValue={selected => {\n const selectedAccounts = []\n\n for (const account of accountOptions) {\n if (selected.includes(account.id)) {\n const name = account && account.name ? account.name.trim() : ''\n selectedAccounts.push(name)\n }\n }\n\n return selectedAccounts.join(', ')\n }}\n onChange={event => {\n filterList[index] = event.target.value\n onChange(filterList[index], index, column)\n }}\n >\n {accountOptions.map(item => (\n <MenuItem key={item.id} value={item.id}>\n <Checkbox checked={filterList[index].indexOf(item.id) > -1} />\n <ListItemText primary={item.name} />\n </MenuItem>\n )\n )}\n </Select>\n </FormControl>\n )\n }\n }\n }, {\n label: 'Category', name: 'category', searchable: true,\n options: {\n filter: true,\n filterType: 'custom',\n customFilterListOptions: {\n render: v => {\n const selectedCategories = []\n\n for (const category of categoryOptions) {\n if (v.includes(category.id)) {\n const name = category && category.name ? category.name.trim() : ''\n selectedCategories.push(name)\n }\n }\n\n return selectedCategories.join(', ')\n },\n update: (filterList, filterPos, index) => {\n filterList[index].splice(filterPos, 1)\n return filterList\n }\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <FormControl variant=\"standard\">\n <InputLabel>\n Category\n </InputLabel>\n <Select multiple\n value={filterList[index]}\n renderValue={selected => {\n const selectedCategories = []\n\n for (const category of categoryOptions) {\n if (selected.includes(category.id)) {\n const name = category && category.name ? category.name.trim() : ''\n selectedCategories.push(name)\n }\n }\n\n return selectedCategories.join(', ')\n }}\n onChange={event => {\n filterList[index] = event.target.value\n onChange(filterList[index], index, column)\n }}\n >\n {categoryOptions.map(item => (\n <MenuItem key={item.id} value={item.id}>\n <Checkbox checked={filterList[index].indexOf(item.id) > -1} />\n <ListItemText primary={item.name} />\n </MenuItem>\n )\n )}\n </Select>\n </FormControl>\n )\n }\n }\n }, {\n label: 'Notes', name: 'notes', searchable: true,\n options: {\n filter: false,\n }\n }, {\n label: 'Amount', name: 'amount', searchable: true,\n options: {\n setCellHeaderProps: () => {\n return {\n className: clsx({\n [classes.rightTableHead]: true,\n })\n }\n },\n setCellProps: value => {\n return {\n style: {\n textAlign: 'right'\n },\n }\n },\n customBodyRender: value => {\n const transactionAmount = value ? formatMoneyLabel(value) : '???'\n return (\n <Grid container\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"flex-end\"\n wrap=\"nowrap\"\n className={transactionAmount && transactionAmount.includes('-') ? classes.negativeAmount : classes.positiveAmount}\n >\n {transactionAmount}\n </Grid>\n )\n },\n filter: false,\n }\n }, {\n label: 'Posted', name: 'reconciled', searchable: false,\n options: {\n setCellHeaderProps: () => {\n return {\n style: {\n padding: '4px',\n maxWidth: '60px',\n minWidth: '60px'\n },\n className: clsx({\n [classes.centerTableHead]: true,\n })\n }\n },\n setCellProps: value => {\n return {\n style: {\n textAlign: 'center',\n padding: '4px'\n },\n className: clsx({\n [classes.positiveAmount]: value === true,\n [classes.negativeAmount]: value === false,\n })\n }\n },\n customBodyRender: (value, tableMeta) => {\n const archived = tableMeta && tableMeta.rowData && tableMeta.rowData[12]\n ? tableMeta.rowData[12]\n : false\n return value\n ? archived ? (\n <Grid>\n <Tooltip title=\"Transaction Posted\">\n <Verified fontSize=\"16\" color=\"success\" />\n </Tooltip>\n <Tooltip title=\"Transaction Archived\">\n <Inventory fontSize=\"16\" color=\"error\" />\n </Tooltip>\n </Grid>\n ) : (<Tooltip title=\"Transaction Posted\">\n <Verified fontSize=\"16\" color=\"success\" />\n </Tooltip>\n )\n : archived ? (\n <Grid>\n <Tooltip title=\"Transaction Pending\">\n <NewReleases fontSize=\"16\" color=\"disabled\" />\n </Tooltip>\n <Tooltip title=\"Transaction Archived\">\n <Inventory fontSize=\"16\" color=\"error\" />\n </Tooltip>\n </Grid>\n ) : (\n <Tooltip title=\"Transaction Pending\">\n <NewReleases fontSize=\"16\" color=\"disabled\" />\n </Tooltip>\n )\n },\n filter: true,\n filterType: 'checkbox',\n filterOptions: {\n names: [true, false],\n renderValue: v => v\n ? (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Posted\n </Typography>\n )\n : (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Not Posted\n </Typography>\n ),\n },\n customFilterListOptions: {\n render: v => {\n if (v === false) return 'Not Posted'\n else if (v === true) return 'Posted'\n }\n },\n },\n }, {\n label: 'Archived', name: 'archived',\n options: {\n display: 'excluded',\n viewColumns: false,\n searchable: false,\n filter: true,\n filterType: 'checkbox',\n filterOptions: {\n names: [true, false],\n renderValue: v => v\n ? (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Archived\n </Typography>\n )\n : (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Not Archived\n </Typography>\n ),\n }, customFilterListOptions: {\n render: v => {\n if (v === false) return 'Not Archived'\n else if (v === true) return 'Archived'\n }\n },\n }\n }]\n\n return (\n <Paper elevation={4}>\n {isFetching &&\n <Loading />\n }\n\n <TableToolbar data={tableData} />\n\n <MUIDataTable\n title={<Typography variant=\"h6\">Transaction History</Typography>}\n data={tableData}\n columns={tableColumns}\n options={tableOptions}\n />\n </Paper>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'HistoryTransactionList')\n return props\n}\n\nconst propTypes = {\n isFetching: PropTypes.bool.isRequired,\n transactions: PropTypes.array.isRequired,\n flagColors: PropTypes.array.isRequired,\n transactionFlags: PropTypes.array.isRequired,\n accounts: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired\n}\n\nHistoryTransactionList.propTypes = {\n editTransactionId: PropTypes.func,\n downloadTransactionHistory: PropTypes.func\n}\n\nexport default HistoryTransactionList\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\n\nimport HistoryTransactionList from './HistoryTransactionList'\n\n\n/**\n * Dashboard for the transaction history page.\n *\n * @returns {JSX.Element}\n * @constructor\n */\nconst Dashboard = () => {\n\n return (\n <Fragment>\n <HistoryTransactionList />\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'Dashboard')\n return props\n}\n\nconst propTypes = {}\n\nexport default Dashboard\n","import React, { Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Dashboard from './Dashboard'\nimport ActionButtons from '../layout/ActionButtons'\nimport AccountForm from '../layout/AccountForm'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\nimport MoveBalanceForm from '../layout/MoveBalanceForm'\n\n/**\n * @returns {JSX.Element}\n * @constructor\n */\nconst History = () => {\n\n return (\n <AppLoading>\n <Fragment>\n <Dashboard />\n\n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n <MoveBalanceForm />\n </Fragment>\n </AppLoading>\n )\n}\n\nexport default History\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport MUIDataTable from 'mui-datatables'\nimport {\n Box, Paper, TableContainer, Table, TableBody, TableHead, TableRow,\n TableCell, Typography, Grid, ListItem, ListItemText,\n FormControl, MenuItem, Checkbox, InputLabel, Select, Tooltip\n} from '@mui/material'\nimport { Verified, NewReleases, Inventory } from '@mui/icons-material'\nimport { DateTime } from 'luxon'\nimport clsx from 'clsx'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { ROWS_PER_PAGE_OPTIONS } from '../utilities/tables'\nimport LinkTransactionForm from '../layout/LinkTransactionForm'\nimport { editTransactionId } from '../../actions/transactionId'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 500,\n whiteSpace: 'nowrap',\n textAlign: 'right',\n },\n negativeAmount: {\n fontWeight: 500,\n whiteSpace: 'nowrap',\n textAlign: 'right',\n },\n tableChips: {\n marginBottom: theme.spacing(1),\n marginRight: theme.spacing(1)\n }\n})\n\nconst TableHeader = ({ name, posted, pending, available }) => (\n <Grid container>\n <Grid item xs={12}>\n <ListItem dense disableGutters>\n <ListItemText disableTypography\n sx={{\n position: 'relative',\n background: 'linear-gradient(to right, #3A7985, #0f4e5b, #0f4e5b, #3A7985)',\n borderRadius: '4px',\n border: '4px solid #3A7985',\n color: '#fff',\n boxShadow: '0px 2px 1px -1px rgb(0 0 0 / 20%), 0px 1px 1px 0px rgb(0 0 0 / 14%), 0px 1px 3px 0px rgb(0 0 0 / 12%)',\n '&:after, &:before': {\n left: '100%',\n top: '50%',\n border: 'solid transparent',\n content: '\"\"',\n height: 0,\n width: 0,\n position: 'absolute'\n },\n '&:after': {\n borderLeftColor: '#3A7985',\n borderWidth: '14px',\n marginTop: '-14px'\n },\n '&:before': {\n borderLeftColor: '#3A7985',\n borderWidth: '20px',\n marginTop: '-20px'\n }\n }}\n primary={\n <Typography align=\"center\" variant=\"body1\" noWrap>\n {formatMoneyLabel(available)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle1\" noWrap>\n {name}\n </Typography>\n }\n />\n <ListItemText disableTypography\n primary={\n <Typography align=\"center\" variant=\"body2\" noWrap>\n {formatMoneyLabel(posted)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Posted\n </Typography>\n }\n />\n <ListItemText disableTypography\n sx={{ maxWidth: '15px' }}\n primary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n +\n </Typography>\n }\n />\n <ListItemText disableTypography\n primary={\n <Typography align=\"center\" variant=\"body2\" noWrap>\n {formatMoneyLabel(pending)}\n </Typography>\n }\n secondary={\n <Typography align=\"center\" variant=\"subtitle2\" noWrap>\n Pending\n </Typography>\n }\n />\n </ListItem>\n </Grid>\n </Grid>\n)\n\nclass TransactionList extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n pageSize: 50,\n linkTransaction: null\n }\n\n this.transactionClick = this.transactionClick.bind(this)\n this.linkTransactionClick = this.linkTransactionClick.bind(this)\n this.clearLinkTransaction = this.clearLinkTransaction.bind(this)\n this.handleColumnsBuild = this.handleColumnsBuild.bind(this)\n }\n\n /**\n * This function is used to update the transaction form with\n * row that was clicked on.\n * @param {Array} rowData - The link transaction actioned.\n */\n transactionClick = rowData => this.props.editTransactionId(rowData[0])\n\n /**\n * This function is used to update the link transaction form with\n * row that was clicked on.\n * @param {Array} rowData - The link transaction actioned.\n */\n linkTransactionClick = rowData => {\n if (rowData && rowData.id) this.setState({ linkTransaction: rowData })\n }\n\n /**\n * This function is used to clear the selected link transaction.\n */\n clearLinkTransaction = () => {\n this.setState({ linkTransaction: null })\n }\n\n /**\n * Builds the column data for the transaction table.\n * @return {Array} columns - The column data.\n */\n handleColumnsBuild = () => {\n const { theme, classes, accountKey, flagColors, transactionFlags } = this.props\n const flagOptions = []\n\n // Get the users flag colors and labels.\n for (const flagColor of flagColors) {\n for (const transactionFlag of transactionFlags) {\n if (flagColor.id === transactionFlag.color_id) {\n flagOptions.push({\n id: transactionFlag.id,\n colorId: flagColor.id,\n color: flagColor.name,\n name: transactionFlag.name\n })\n }\n }\n }\n\n /**\n * Adjust columns based on viewing all accounts or specific account\n * *** WARNING ***\n * Some columns are indexed based, so if the position of a column\n * is changed it could break the logic.\n */\n return accountKey === 0\n ? [{\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false,\n download: false\n }\n }, {\n label: 'Flag Name', name: 'flag_name',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false,\n download: false\n }\n }, {\n label: 'Flag', name: 'flag_color', searchable: true,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => {\n const flagColor = value\n ? value\n : theme.palette.divider\n const flagName = tableMeta && tableMeta.rowData && tableMeta.rowData[1]\n ? tableMeta.rowData[1]\n : ''\n return (\n <Box className={classes.tableLabel}\n style={{\n border: `1px solid ${flagColor}`,\n color: flagColor\n }}\n >\n <Typography variant=\"caption\" align=\"center\" noWrap>\n {flagName}\n </Typography>\n </Box>\n )\n },\n filter: true,\n filterType: 'custom',\n customFilterListOptions: {\n render: v => {\n const selectedColors = []\n\n for (const flag of flagOptions) {\n if (v.includes(flag.color)) {\n const name = flag && flag.name ? flag.name.trim() : ''\n if (name) {\n selectedColors.push(name)\n } else {\n selectedColors.push(flag.color)\n }\n }\n }\n\n return selectedColors\n },\n update: (filterList, filterPos, index) => {\n filterList[index].splice(filterPos, 1)\n return filterList\n }\n },\n filterOptions: {\n logic: (color, filters, row) => {\n if (filters.length) return !filters.includes(color)\n return false\n },\n display: (filterList, onChange, index, column) => (\n <FormControl variant=\"standard\">\n <InputLabel>\n Flag\n </InputLabel>\n <Select multiple\n value={filterList[index]}\n renderValue={selected => {\n const selectedColors = []\n\n for (const flag of flagOptions) {\n if (selected.includes(flag.color)) {\n const name = flag && flag.name ? flag.name.trim() : ''\n if (name) {\n selectedColors.push(name)\n } else {\n selectedColors.push(flag.color)\n }\n }\n }\n\n return selectedColors.join(', ')\n }}\n onChange={event => {\n filterList[index] = event.target.value\n onChange(filterList[index], index, column)\n }}\n >\n {flagOptions.map(item => (\n <MenuItem key={item.id} value={item.color}>\n <Checkbox checked={filterList[index].indexOf(item.color) > -1}\n sx={{\n color: item.color,\n '&.Mui-checked': {\n color: item.color,\n },\n }}\n />\n <ListItemText primary={item.name} />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n }\n }\n }, {\n label: 'Date', name: 'date', searchable: true,\n options: {\n filter: true,\n filterType: 'multiselect',\n customBodyRender: value => DateTime.fromISO(value).toLocaleString()\n }\n }, {\n label: 'Payee', name: 'name', searchable: true,\n options: {\n filter: true,\n filterType: 'textField'\n }\n },\n {\n label: 'Account', name: 'account', searchable: true,\n options: {\n filter: true,\n filterType: 'multiselect'\n }\n }, {\n label: 'Category', name: 'category', searchable: true,\n options: {\n filter: true,\n filterType: 'multiselect'\n }\n },\n {\n label: 'Notes', name: 'notes', searchable: true,\n options: {\n filter: false,\n }\n }, {\n label: 'Amount', name: 'amount', searchable: true,\n options: {\n setCellHeaderProps: () => {\n return {\n className: clsx({\n [classes.rightTableHead]: true,\n })\n }\n },\n setCellProps: value => {\n return {\n style: {\n textAlign: 'right'\n },\n }\n },\n customBodyRender: value => {\n const transactionAmount = value ? formatMoneyLabel(value) : '???'\n return (\n <Grid container\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"flex-end\"\n wrap=\"nowrap\"\n className={transactionAmount && transactionAmount.includes('-') ? classes.negativeAmount : classes.positiveAmount}\n >\n {transactionAmount}\n </Grid>\n )\n },\n filter: false,\n }\n }, {\n label: 'Posted', name: 'reconciled', searchable: true,\n options: {\n setCellHeaderProps: () => {\n return {\n style: {\n padding: '4px',\n maxWidth: '60px',\n minWidth: '60px'\n },\n className: clsx({\n [classes.centerTableHead]: true,\n })\n }\n },\n setCellProps: value => {\n return {\n style: {\n textAlign: 'center',\n padding: '4px'\n },\n className: clsx({\n [classes.positiveAmount]: value === true,\n [classes.negativeAmount]: value === false,\n })\n }\n },\n customBodyRender: (value, tableMeta) => {\n const archived = tableMeta && tableMeta.rowData && tableMeta.rowData[10]\n ? tableMeta.rowData[10]\n : false\n return value\n ? archived ? (\n <Grid>\n <Tooltip title=\"Transaction Posted\">\n <Verified fontSize=\"16\" color=\"success\" />\n </Tooltip>\n <Tooltip title=\"Transaction Archived\">\n <Inventory fontSize=\"16\" color=\"error\" />\n </Tooltip>\n </Grid>\n ) : (<Tooltip title=\"Transaction Posted\">\n <Verified fontSize=\"16\" color=\"success\" />\n </Tooltip>\n )\n : archived ? (\n <Grid>\n <Tooltip title=\"Transaction Pending\">\n <NewReleases fontSize=\"16\" color=\"disabled\" />\n </Tooltip>\n <Tooltip title=\"Transaction Archived\">\n <Inventory fontSize=\"16\" color=\"error\" />\n </Tooltip>\n </Grid>\n ) : (\n <Tooltip title=\"Transaction Pending\">\n <NewReleases fontSize=\"16\" color=\"disabled\" />\n </Tooltip>\n )\n },\n filter: true,\n filterType: 'checkbox',\n filterOptions: {\n names: [true, false],\n renderValue: v => v\n ? (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Posted\n </Typography>\n )\n : (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Not Posted\n </Typography>\n ),\n },\n customFilterListOptions: {\n render: v => {\n if (v === false) return 'Not Posted'\n else if (v === true) return 'Posted'\n }\n },\n },\n }, {\n label: 'Archived', name: 'archived',\n options: {\n display: 'excluded',\n viewColumns: false,\n searchable: false,\n filter: true,\n filterType: 'checkbox',\n filterOptions: {\n names: [true, false],\n renderValue: v => v\n ? (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Archived\n </Typography>\n )\n : (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Not Archived\n </Typography>\n ),\n }, customFilterListOptions: {\n render: v => {\n if (v === false) return 'Not Archived'\n else if (v === true) return 'Archived'\n }\n },\n }\n }]\n : [{\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false\n }\n }, {\n label: 'Flag Name', name: 'flag_name',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false\n }\n }, {\n label: 'Balance', name: 'running_balance',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false\n }\n }, {\n label: 'Flag', name: 'flag_color', searchable: true,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => {\n const flagColor = value\n ? value\n : theme.palette.divider\n const flagName = tableMeta && tableMeta.rowData && tableMeta.rowData[1]\n ? tableMeta.rowData[1]\n : ''\n return (\n <Box className={classes.tableLabel}\n style={{\n border: `1px solid ${flagColor}`,\n color: flagColor\n }}\n >\n <Typography variant=\"caption\" align=\"center\" noWrap>\n {flagName}\n </Typography>\n </Box>\n )\n },\n filter: true,\n filterType: 'custom',\n customFilterListOptions: {\n render: v => {\n const selectedColors = []\n\n for (const flag of flagOptions) {\n if (v.includes(flag.color)) {\n const name = flag && flag.name ? flag.name.trim() : ''\n if (name) {\n selectedColors.push(name)\n } else {\n selectedColors.push(flag.color)\n }\n }\n }\n\n return selectedColors\n },\n update: (filterList, filterPos, index) => {\n filterList[index].splice(filterPos, 1)\n return filterList\n }\n },\n filterOptions: {\n logic: (color, filters, row) => {\n if (filters.length) return !filters.includes(color)\n return false\n },\n display: (filterList, onChange, index, column) => (\n <FormControl variant=\"standard\">\n <InputLabel>\n Flag\n </InputLabel>\n <Select multiple\n value={filterList[index]}\n renderValue={selected => {\n const selectedColors = []\n\n for (const flag of flagOptions) {\n if (selected.includes(flag.color)) {\n const name = flag && flag.name ? flag.name.trim() : ''\n if (name) {\n selectedColors.push(name)\n } else {\n selectedColors.push(flag.color)\n }\n }\n }\n\n return selectedColors.join(', ')\n }}\n onChange={event => {\n filterList[index] = event.target.value\n onChange(filterList[index], index, column)\n }}\n >\n {flagOptions.map(item => (\n <MenuItem key={item.id} value={item.color}>\n <Checkbox checked={filterList[index].indexOf(item.color) > -1}\n sx={{\n color: item.color,\n '&.Mui-checked': {\n color: item.color,\n },\n }}\n />\n <ListItemText primary={item.name} />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n }\n }\n }, {\n label: 'Date', name: 'date', searchable: true,\n options: {\n filter: true,\n filterType: 'multiselect',\n customBodyRender: value => DateTime.fromISO(value).toLocaleString()\n }\n }, {\n label: 'Payee', name: 'name', searchable: true,\n options: {\n filter: true,\n filterType: 'textField'\n }\n }, {\n label: 'Category', name: 'category', searchable: true,\n options: {\n filter: true,\n filterType: 'multiselect'\n }\n },\n {\n label: 'Notes', name: 'notes', searchable: true,\n options: {\n filter: false,\n }\n }, {\n label: 'Amount', name: 'amount', searchable: true,\n options: {\n setCellHeaderProps: () => {\n return {\n className: clsx({\n [classes.rightTableHead]: true,\n })\n }\n },\n customBodyRender: (value, tableMeta, updateValue) => {\n const transactionAmount = value ? formatMoneyLabel(value) : '???'\n const runningBalance = tableMeta && tableMeta.rowData && tableMeta.rowData[2]\n ? formatMoneyLabel(tableMeta.rowData[2])\n : '---'\n return (\n <Grid container>\n <Grid item xs={12} style={{ textAlign: 'right', whiteSpace: 'nowrap' }}\n className={transactionAmount && transactionAmount.includes('-') ? classes.negativeAmount : classes.positiveAmount}\n >\n {transactionAmount}\n </Grid>\n <Grid item xs={12}\n style={{ textAlign: 'right', whiteSpace: 'nowrap', color: theme.palette.text.secondary }}\n >\n {runningBalance}\n </Grid>\n </Grid>\n )\n },\n filter: false,\n }\n }, {\n label: 'Posted', name: 'reconciled', searchable: true,\n options: {\n setCellHeaderProps: () => {\n return {\n style: {\n padding: '4px',\n maxWidth: '60px',\n minWidth: '60px'\n },\n className: clsx({\n [classes.centerTableHead]: true,\n })\n }\n },\n setCellProps: value => {\n return {\n style: {\n textAlign: 'center',\n padding: '4px'\n },\n className: clsx({\n [classes.positiveAmount]: value === true,\n [classes.negativeAmount]: value === false,\n })\n }\n },\n customBodyRender: (value, tableMeta) => {\n const archived = tableMeta && tableMeta.rowData && tableMeta.rowData[10]\n ? tableMeta.rowData[10]\n : false\n return value\n ? archived ? (\n <Grid>\n <Tooltip title=\"Transaction Posted\">\n <Verified fontSize=\"16\" color=\"success\" />\n </Tooltip>\n <Tooltip title=\"Transaction Archived\">\n <Inventory fontSize=\"16\" color=\"error\" />\n </Tooltip>\n </Grid>\n ) : (<Tooltip title=\"Transaction Posted\">\n <Verified fontSize=\"16\" color=\"success\" />\n </Tooltip>\n )\n : archived ? (\n <Grid>\n <Tooltip title=\"Transaction Pending\">\n <NewReleases fontSize=\"16\" color=\"disabled\" />\n </Tooltip>\n <Tooltip title=\"Transaction Archived\">\n <Inventory fontSize=\"16\" color=\"error\" />\n </Tooltip>\n </Grid>\n ) : (\n <Tooltip title=\"Transaction Pending\">\n <NewReleases fontSize=\"16\" color=\"disabled\" />\n </Tooltip>\n )\n },\n filter: true,\n filterType: 'checkbox',\n filterOptions: {\n names: [true, false],\n renderValue: v => v\n ? (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Posted\n </Typography>\n )\n : (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Not Posted\n </Typography>\n ),\n },\n customFilterListOptions: {\n render: v => {\n if (v === false) return 'Not Posted'\n else if (v === true) return 'Posted'\n }\n },\n }\n }, {\n label: 'Archived', name: 'archived',\n options: {\n display: 'excluded',\n viewColumns: false,\n searchable: false,\n filter: true,\n filterType: 'checkbox',\n filterOptions: {\n names: [true, false],\n renderValue: v => v\n ? (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Archived\n </Typography>\n )\n : (\n <Typography align=\"left\" variant=\"subtitle2\" noWrap sx={{ marginRight: '8px' }}>\n Not Archived\n </Typography>\n ),\n }, customFilterListOptions: {\n render: v => {\n if (v === false) return 'Not Archived'\n else if (v === true) return 'Archived'\n }\n },\n }\n }\n ]\n }\n\n render() {\n const { pageSize, linkTransaction } = this.state\n const {\n classes, accountName, availableBalance, postedBalance, pendingBalance,\n currentTransactions, currentLinkTransactions\n } = this.props\n const pendingLinkTransactions = currentLinkTransactions.filter(t => t.pending)\n const postedLinkTransactions = currentLinkTransactions.filter(t => !t.pending)\n const columns = this.handleColumnsBuild()\n const options = {\n responsive: 'vertical',\n selectableRows: 'none',\n rowHover: true,\n rowsPerPage: pageSize,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n print: false,\n sort: false,\n download: true,\n downloadOptions: {\n filterOptions: {\n useDisplayedColumnsOnly: true,\n useDisplayedRowsOnly: true\n }\n },\n onRowClick: rowData => this.transactionClick(rowData),\n setFilterChipProps: (colIndex, colName, data) => {\n return {\n color: 'primary',\n variant: 'contained',\n className: classes.tableChips,\n }\n }\n }\n\n return (\n <Fragment>\n {currentLinkTransactions && currentLinkTransactions.length > 0 &&\n <Box mt={2}>\n <TableContainer component={Paper} elevation={3}>\n <Table size=\"small\" aria-label=\"link transactions\">\n <TableHead>\n <TableRow>\n <TableCell colSpan={6}>Link Transactions</TableCell>\n </TableRow>\n </TableHead>\n {pendingLinkTransactions && pendingLinkTransactions.length > 0 &&\n <TableBody>\n <TableRow>\n <TableCell colSpan={6} align=\"center\">Pending</TableCell>\n </TableRow>\n {pendingLinkTransactions.map((row, index) => {\n let amount = row.amount > 0 ? -Math.abs(row.amount) : Math.abs(row.amount)\n const amountClasses = amount > 0 ? classes.positiveAmount : classes.negativeAmount\n return (\n <TableRow key={`pending-${row.transaction_id}-${index}`}\n onClick={() => this.linkTransactionClick(row)}>\n <TableCell>{DateTime.fromISO(row.date).toLocaleString()}</TableCell>\n <TableCell>{row.merchant_name ? row.merchant_name : row.name}</TableCell>\n <TableCell className={amountClasses} align=\"right\">\n {formatMoneyLabel(amount)}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n }\n {postedLinkTransactions && postedLinkTransactions.length > 0 &&\n <TableBody>\n <TableRow>\n <TableCell colSpan={6} align=\"center\">Posted</TableCell>\n </TableRow>\n {postedLinkTransactions.map((row, index) => {\n let amount = row.amount > 0 ? -Math.abs(row.amount) : Math.abs(row.amount)\n const amountClasses = amount > 0 ? classes.positiveAmount : classes.negativeAmount\n return (\n <TableRow key={`posted-${row.transaction_id}-${index}`}\n onClick={() => this.linkTransactionClick(row)}>\n <TableCell>{DateTime.fromISO(row.date).toLocaleString()}</TableCell>\n <TableCell>{row.merchant_name ? row.merchant_name : row.name}</TableCell>\n <TableCell className={amountClasses} align=\"right\">\n {formatMoneyLabel(amount)}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n }\n </Table>\n </TableContainer>\n </Box>\n }\n <Box mt={1}>\n <MUIDataTable\n title={<TableHeader name={accountName}\n posted={postedBalance}\n pending={pendingBalance}\n available={availableBalance}\n />}\n data={currentTransactions}\n columns={columns}\n options={options}\n />\n </Box>\n <LinkTransactionForm clearLinkTransaction={this.clearLinkTransaction}\n linkTransaction={linkTransaction} />\n </Fragment>\n )\n }\n}\n\nTransactionList.propTypes = {\n editTransactionId: PropTypes.func.isRequired,\n auth: PropTypes.object.isRequired,\n currentTransactions: PropTypes.array.isRequired,\n currentLinkTransactions: PropTypes.array.isRequired,\n flagColors: PropTypes.array.isRequired,\n transactionFlags: PropTypes.array.isRequired,\n accountKey: PropTypes.number.isRequired,\n availableBalance: PropTypes.number.isRequired,\n postedBalance: PropTypes.number.isRequired,\n pendingBalance: PropTypes.number.isRequired,\n yearMonth: PropTypes.string.isRequired,\n accountName: PropTypes.string.isRequired\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n flagColors: state.flagColorReducer.flagColors,\n transactionFlags: state.transactionFlagReducer.transactionFlags,\n})\n\nconst mapDispatchToProps = {\n editTransactionId,\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(TransactionList))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Grid, Card, CardContent, Typography } from '@mui/material'\nimport { ShoppingBasket, LocalAtm } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport TransactionList from './TransactionList'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass Transactions extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n currentAccount: '',\n currentTransactions: [],\n currentLinkTransactions: []\n }\n }\n\n componentDidMount() {\n const { accounts, transactions, linkTransactions, accountKey } = this.props\n\n let currentAccount = accountKey === 0 ? 'All' : accounts.filter(a => a.id === accountKey).map(a => (a))\n currentAccount = currentAccount && currentAccount !== 'All' && currentAccount.length > 0 ? currentAccount[0] : 'All'\n\n const currentTransactions = accountKey === 0\n ? transactions.map(t => (t))\n : transactions.filter(t => t.account_id === accountKey).map(t => (t))\n\n const currentLinkTransactions = (currentAccount === 'All' && linkTransactions)\n ? []\n : linkTransactions.filter(l => l.account_id === currentAccount.link_id).map(l => (l))\n\n this.setState({\n currentAccount,\n currentTransactions,\n currentLinkTransactions\n })\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { accounts, transactions, linkTransactions, accountKey } = this.props\n\n // On transaction change update the table\n if (transactions !== prevProps.transactions) {\n const currentTransactions = accountKey === 0\n ? transactions.map(t => (t))\n : transactions.filter(t => t.account_id === accountKey).map(t => (t))\n\n this.setState({\n currentTransactions\n })\n }\n\n // On link transaction change update table.\n if (linkTransactions && linkTransactions !== prevProps.linkTransactions) {\n let currentAccount = accountKey === 0 ? 'All' : accounts.filter(a => a.id === accountKey).map(a => (a))\n currentAccount = currentAccount && currentAccount !== 'All' && currentAccount.length > 0 ? currentAccount[0] : 'All'\n\n const currentLinkTransactions = (currentAccount === 'All' && linkTransactions)\n ? []\n : linkTransactions.filter(l => l.account_id === currentAccount.link_id).map(l => (l))\n\n this.setState({\n currentAccount,\n currentLinkTransactions\n })\n }\n\n // On accountKey change update table.\n if (accountKey !== prevProps.accountKey) {\n let currentAccount = accountKey === 0 ? 'All' : accounts.filter(a => a.id === accountKey).map(a => (a))\n currentAccount = currentAccount && currentAccount !== 'All' && currentAccount.length > 0 ? currentAccount[0] : 'All'\n\n const currentTransactions = accountKey === 0\n ? transactions.map(t => (t))\n : transactions.filter(t => t.account_id === accountKey).map(t => (t))\n\n const currentLinkTransactions = (currentAccount === 'All' && linkTransactions)\n ? []\n : linkTransactions.filter(l => l.account_id === currentAccount.link_id).map(l => (l))\n\n this.setState({\n currentAccount,\n currentTransactions,\n currentLinkTransactions\n })\n }\n\n\n }\n\n render() {\n const { currentTransactions, currentLinkTransactions } = this.state\n const { classes, accountKey, accounts } = this.props\n\n let accountName = accounts.filter(a => a.id === accountKey).map(a => (a.name))\n accountName = (typeof accountName !== 'undefined' && accountName != null && accountName.length > 0) ? accountName[0] : 'All'\n\n // Get available balance\n let availableBalance = accounts.filter(a => a.id === accountKey).map(a => (a.available_balance))\n availableBalance = (availableBalance && typeof availableBalance[0] !== 'undefined') ? availableBalance[0] : null\n availableBalance = (!availableBalance && availableBalance !== 0 && accounts && accounts[0]) ? accounts[0].total_available : availableBalance\n if (!availableBalance) availableBalance = 0\n\n // Get posted balance\n let postedBalance = accounts.filter(a => a.id === accountKey).map(a => (a.posted_balance))\n postedBalance = (postedBalance && typeof postedBalance[0] !== 'undefined') ? postedBalance[0] : null\n postedBalance = (!postedBalance && postedBalance !== 0 && accounts && accounts[0]) ? accounts[0].total_posted : postedBalance\n if (!postedBalance) postedBalance = 0\n\n // Get pending balance\n let pendingBalance = accounts.filter(a => a.id === accountKey).map(a => (a.pending_balance))\n pendingBalance = (pendingBalance && typeof pendingBalance[0] !== 'undefined') ? pendingBalance[0] : null\n pendingBalance = (!pendingBalance && pendingBalance !== 0 && accounts && accounts[0]) ? accounts[0].total_pending : pendingBalance\n if (!pendingBalance) pendingBalance = 0\n\n let totalActivity = 0\n let totalInflow = 0\n for (let c of currentTransactions) {\n totalActivity += c.amount < 0 ? c.amount : 0\n totalInflow += c.amount > 0 ? c.amount : 0\n }\n\n return (\n <Fragment>\n <Grid container spacing={3}>\n <Grid item xs={6}>\n <Card className={classes.cardActivity}>\n <CardContent className={classes.budgetCardsContent}>\n <Typography variant=\"subtitle1\" className={classes.cardText}>\n {formatMoneyLabel(totalActivity)}\n </Typography>\n <Typography variant=\"body2\" className={classes.cardText}>\n Activity\n </Typography>\n <ShoppingBasket className={`${classes.cardIcon} ${classes.cardActivityIcon}`} />\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={6}>\n <Card className={classes.cardInflow}>\n <CardContent className={classes.budgetCardsContent}>\n <Typography variant=\"subtitle1\" className={classes.cardText}>\n {formatMoneyLabel(totalInflow)}\n </Typography>\n <Typography variant=\"body2\" className={classes.cardText}>\n Inflow\n </Typography>\n <LocalAtm className={`${classes.cardIcon} ${classes.cardInflowIcon}`} />\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n <TransactionList\n currentTransactions={currentTransactions}\n currentLinkTransactions={currentLinkTransactions}\n accountName={accountName}\n accountKey={accountKey}\n availableBalance={availableBalance}\n postedBalance={postedBalance}\n pendingBalance={pendingBalance}\n />\n </Fragment>\n )\n }\n}\n\nTransactions.propTypes = {\n accounts: PropTypes.array.isRequired,\n transactions: PropTypes.array.isRequired,\n linkTransactions: PropTypes.array.isRequired,\n transfers: PropTypes.array.isRequired,\n accountKey: PropTypes.number.isRequired\n}\n\nconst mapStateToProps = state => ({\n accounts: state.accountReducer.accounts,\n transactions: state.transactionReducer.transactions,\n linkTransactions: state.linkReducer.linkTransactions,\n transfers: state.transferReducer.transfers\n})\n\nexport default connect(mapStateToProps)(withStyles(styles)(Transactions))\n","import React, { useState, useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { useNavigate } from 'react-router-dom'\nimport PropTypes from 'prop-types'\nimport makeStyles from '@mui/styles/makeStyles'\nimport MUIDataTable from 'mui-datatables'\nimport { Box, Grid, Tooltip } from '@mui/material'\nimport { ArrowDropUp, ArrowDropDown, Link, LinkOff } from '@mui/icons-material'\nimport { DateTime } from 'luxon'\nimport clsx from 'clsx'\n\nimport { sharedStyles } from '../common/styles'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { ROWS_PER_PAGE_OPTIONS, TableHeader } from '../utilities/tables'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n positiveAmount: {\n background: 'rgba(0, 255, 0, 0.2)',\n color: theme.palette.success.main,\n fontWeight: 500,\n borderRadius: theme.spacing(1),\n textAlign: 'center',\n padding: `0 ${theme.spacing(1)}`,\n whiteSpace: 'nowrap'\n },\n negativeAmount: {\n background: 'rgba(255, 0, 0, 0.2)',\n color: theme.palette.error.main,\n fontWeight: 500,\n borderRadius: theme.spacing(1),\n textAlign: 'center',\n padding: `0 ${theme.spacing(1)}`,\n whiteSpace: 'nowrap'\n }\n}))\n\nconst HoldingList = ({ account, holdings }) => {\n\n const [pageSize, setPageSize] = useState(50)\n const [columns, setColumns] = useState([])\n\n const dispatch = useDispatch()\n const navigate = useNavigate()\n const classes = useStyles()\n\n useEffect(() => {\n const columns = handleColumnsBuild()\n }, [])\n\n /**\n * This function handles when a user clicks on a holding row.\n * It will navigate the user to the detail page for the selected\n * holding.\n * @param {Array} rowData - The holding row actioned.\n */\n const holdingClick = rowData => navigate(`/holdings/${rowData[0]}`)\n\n /**\n * Builds the column data for the transaction table.\n * @return {Array} columns - The column data.\n */\n const handleColumnsBuild = () => {\n /**\n * *** WARNING ***\n * Some columns are indexed based, so if the position of a column\n * is changed it could break the logic.\n */\n const tableColumns = [{\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false,\n download: false\n }\n }, {\n label: 'Name', name: 'name', searchable: true,\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n download: false\n }\n }, {\n label: 'Ticker', name: 'ticker_symbol', searchable: true,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => {\n const companyName = tableMeta && tableMeta.rowData && tableMeta.rowData[1] ? tableMeta.rowData[1] : ''\n return (\n <Grid container>\n <Grid item xs={12}>\n {companyName}\n </Grid>\n <Grid item xs={12} style={{ fontSize: '12px' }}>\n {value}\n </Grid>\n </Grid>\n )\n },\n filter: false,\n }\n }, {\n label: 'Price', name: 'institution_price', searchable: false,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => (\n value && value > 0\n ? formatMoneyLabel(value)\n : '-'\n ),\n filter: false,\n }\n }, {\n label: 'Shares', name: 'quantity', searchable: false,\n options: {\n filter: false,\n }\n }, {\n label: 'Cost Basis', name: 'cost_basis', searchable: false,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => (\n formatMoneyLabel(value)\n ),\n filter: false,\n }\n }, {\n label: 'Value', name: 'institution_value', searchable: false,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => (\n formatMoneyLabel(value)\n ),\n filter: false,\n }\n }, {\n label: 'Average Price', name: 'average_price', searchable: false,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => (\n formatMoneyLabel(value)\n ),\n filter: false,\n }\n }, {\n label: 'P/L', name: 'profit_loss', searchable: false,\n options: {\n customBodyRender: (value, tableMeta, updateValue) => {\n const profitLoss = formatMoneyLabel(value)\n let plStyles = null\n let plArrow = null\n\n if (value !== 0) {\n plStyles = profitLoss.includes('-') ? classes.negativeAmount : classes.positiveAmount\n plArrow = profitLoss.includes('-')\n ? <ArrowDropDown className={classes.middleAlign} fontSize=\"small\" color=\"error\" />\n : <ArrowDropUp className={classes.middleAlign} fontSize=\"small\" color=\"success\" />\n }\n\n return (\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n wrap=\"nowrap\"\n className={plStyles}\n >\n {plArrow}\n {profitLoss}\n </Grid>\n )\n },\n filter: false,\n }\n }, {\n label: 'Last Updated', name: 'institution_price_as_of', searchable: true,\n options: {\n customBodyRender: value => (\n <Grid container>\n <Grid item xs={12}>\n {DateTime.fromISO(value).toLocaleString()}\n </Grid>\n </Grid>\n ),\n filter: false,\n }\n }, {\n label: 'Linked', name: 'link_account_id', searchable: false,\n options: {\n download: false,\n setCellHeaderProps: () => {\n return {\n style: {\n padding: '4px',\n maxWidth: '60px',\n minWidth: '60px'\n },\n className: clsx({\n [classes.centerTableHead]: true,\n })\n }\n },\n customBodyRender: (value, tableMeta) => {\n return !!value\n ? (\n <Grid>\n <Tooltip title=\"Holding Linked\">\n <Link fontSize=\"16\" />\n </Tooltip>\n </Grid>\n ) : (<Tooltip title=\"Manual Holding\">\n <LinkOff fontSize=\"16\" />\n </Tooltip>\n )\n },\n },\n }]\n\n setColumns(tableColumns)\n }\n\n const options = {\n responsive: 'vertical',\n selectableRows: 'none',\n rowHover: true,\n rowsPerPage: pageSize,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n print: false,\n sort: false,\n filter: false,\n searchPlaceholder: 'Search Ticker',\n download: true,\n downloadOptions: {\n filterOptions: {\n useDisplayedColumnsOnly: true,\n useDisplayedRowsOnly: true\n }\n },\n onRowClick: rowData => holdingClick(rowData)\n\n }\n\n return (\n <Box mt={2}>\n <MUIDataTable\n title={<TableHeader\n title={account && account.available_balance ? formatMoneyLabel(account.available_balance) : '$0'}\n subtitle={(account && account.name || '')}\n />}\n data={holdings}\n columns={columns}\n options={options}\n />\n </Box>\n )\n}\n\n\nHoldingList.propTypes = {\n account: PropTypes.object.isRequired,\n holdings: PropTypes.array.isRequired\n}\n\nexport default HoldingList\n","import React, { useEffect, useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport makeStyles from '@mui/styles/makeStyles'\nimport numeral from 'numeral'\n\nimport HoldingList from './HoldingList'\nimport { sharedStyles } from '../common/styles'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n}))\n\nconst Holdings = ({ accountKey }) => {\n\n const { accounts } = useSelector(({ accountReducer }) => accountReducer)\n const { holdings } = useSelector(({ holdingReducer }) => holdingReducer)\n\n const [holdingList, setHoldingList] = useState([])\n const [account, setAccount] = useState({})\n\n const classes = useStyles()\n\n useEffect(() => {\n updateHoldingList(accountKey)\n }, [accountKey, accounts, holdings])\n\n /**\n * Update the holding list state array with the current holdings\n * for this account. Add some calculated values and reorder the list.\n * @param {number} key - The unique account key.\n */\n const updateHoldingList = (key) => {\n\n const account = accounts.find(a => a.id === key)\n const accountHoldings = holdings.filter(h => (h.link_account_id && h.link_account_id === account.link_id) || (h.account_id && h.account_id === account.id))\n const activeHoldings = []\n const soldHoldings = []\n for (const accountHolding of accountHoldings) {\n // TODO: This logic should probably move to the backend.\n let institutionValue = accountHolding && accountHolding.institution_value ? accountHolding.institution_value : 0\n institutionValue = numeral(institutionValue)\n let costBasis = accountHolding && accountHolding.cost_basis ? accountHolding.cost_basis : 0\n const profitLoss = institutionValue.subtract(costBasis)\n const shares = accountHolding && accountHolding.quantity ? accountHolding.quantity : 0\n costBasis = numeral(costBasis)\n const averagePrice = shares > 0 ? costBasis.divide(shares) : costBasis\n // If holding is added manually calculate the price (institution_price).\n let institutionPrice = accountHolding && accountHolding.institution_price ? accountHolding.institution_price : 0\n if (!institutionPrice) {\n let marketValue = accountHolding && accountHolding.institution_value ? accountHolding.institution_value : 0\n marketValue = numeral(marketValue)\n institutionPrice = marketValue.divide(shares)\n institutionPrice = institutionPrice.value()\n }\n\n if (shares > 0) {\n activeHoldings.push({\n ...accountHolding,\n average_price: averagePrice.value(),\n profit_loss: profitLoss.value(),\n institution_price: institutionPrice\n })\n } else {\n soldHoldings.push({\n ...accountHolding,\n average_price: averagePrice.value(),\n profit_loss: profitLoss.value(),\n institution_price: institutionPrice\n })\n }\n }\n\n\n const combinedList = activeHoldings.concat(soldHoldings)\n setAccount(account)\n setHoldingList(combinedList)\n }\n\n return (\n <HoldingList account={account} holdings={holdingList} />\n )\n}\n\nHoldings.propTypes = {\n accountKey: PropTypes.number.isRequired\n}\n\nexport default Holdings\n","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\n\nimport { withRouter } from '../utilities/withRouter'\nimport Transactions from '../transaction/Transactions'\nimport Holdings from '../holdings/Holdings'\n\nclass AccountDetail extends Component {\n\n render() {\n const { accounts, accountKey } = this.props\n const account = accounts.find(a => a.id === accountKey)\n const accountType = account && account.type_code ? account.type_code : null\n\n return accountType !== 'F'\n ? <Transactions accountKey={accountKey} />\n : <Holdings accountKey={accountKey} />\n }\n}\n\nAccountDetail.propTypes = {\n accounts: PropTypes.array.isRequired,\n accountKey: PropTypes.number.isRequired\n}\n\nconst mapStateToProps = state => ({\n accounts: state.accountReducer.accounts,\n accountKey: state.accountKeyReducer.accountKey\n})\n\nconst mapDispatchToProps = {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(AccountDetail))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\n\nimport AppLoading from '../loading/AppLoading'\nimport { withRouter } from '../utilities/withRouter'\nimport AccountDetail from '../account/AccountDetail'\nimport ActionButtons from '../layout/ActionButtons'\nimport AccountForm from '../layout/AccountForm'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\nimport { editAccountKey } from '../../actions/accountKey'\n\n\nclass TransactionDashboard extends Component {\n constructor(props) {\n super(props)\n\n this.handleAccountKeyUpdate = this.handleAccountKeyUpdate.bind(this)\n }\n\n componentDidMount() {\n const { accountKey, match: { params } } = this.props\n\n if (params && params.accountKey) {\n if (params.accountKey !== accountKey) this.handleAccountKeyUpdate(params.accountKey)\n } else {\n this.handleAccountKeyUpdate(0)\n }\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n const { match: { params } } = this.props\n\n if (params && params.accountKey) {\n if (params.accountKey !== prevProps.match.params.accountKey) this.handleAccountKeyUpdate(params.accountKey)\n } else {\n this.handleAccountKeyUpdate(0)\n }\n }\n\n /**\n * If the account key in the url changes update the account key.\n * @param {(number|string)} accountKey - The account key to set.\n */\n handleAccountKeyUpdate = (accountKey) => {\n const newKey = accountKey ? parseInt(accountKey) : 0\n this.props.editAccountKey(newKey)\n }\n\n render() {\n const { accountKey } = this.props\n\n return (\n <AppLoading>\n <Fragment>\n <AccountDetail accountKey={accountKey} />\n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n </Fragment>\n </AppLoading>\n )\n }\n}\n\nTransactionDashboard.propTypes = {\n editAccountKey: PropTypes.func.isRequired,\n accountKey: PropTypes.number.isRequired\n}\n\nconst mapStateToProps = state => ({\n accountKey: state.accountKeyReducer.accountKey\n})\n\nconst mapDispatchToProps = {\n editAccountKey\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withRouter(TransactionDashboard))\n","import React, { useEffect, useState, useRef, Fragment } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { useParams } from 'react-router-dom'\nimport PropTypes from 'prop-types'\nimport { makeStyles, useTheme } from '@mui/styles'\nimport {\n Paper, Grid, Button, Tooltip, TextField, FormLabel, FormGroup\n} from '@mui/material'\nimport { ArrowDropUp, ArrowDropDown, Link, LinkOff } from '@mui/icons-material'\nimport { DatePicker } from '@mui/lab'\nimport MUIDataTable from 'mui-datatables'\nimport { DateTime } from 'luxon'\nimport numeral from 'numeral'\nimport clsx from 'clsx'\n\nimport AppLoading from '../loading/AppLoading'\nimport { sharedStyles } from '../common/styles'\nimport { getHoldingHistory } from '../../actions/holdings'\nimport { formatISODate } from '../utilities/dates'\nimport { formatMoneyLabel, isInt } from '../utilities/numbers'\nimport { Loading } from '../loading/Loading'\nimport { ROWS_PER_PAGE_OPTIONS, TableHeader } from '../utilities/tables'\nimport { editHoldingId } from '../../actions/holdingId'\nimport { returnErrors } from '../../actions/messages'\nimport ActionButtons from '../layout/ActionButtons'\nimport AccountForm from '../layout/AccountForm'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\n\nconst useStyles = makeStyles((theme) => ({\n ...sharedStyles(theme),\n tableChips: {\n marginBottom: theme.spacing(1),\n marginRight: theme.spacing(1)\n },\n positiveAmount: {\n background: 'rgba(0, 255, 0, 0.2)',\n color: theme.palette.success.main,\n fontWeight: 500,\n borderRadius: theme.spacing(1),\n textAlign: 'center',\n padding: `0 ${theme.spacing(1)}`,\n whiteSpace: 'nowrap'\n },\n negativeAmount: {\n background: 'rgba(255, 0, 0, 0.2)',\n color: theme.palette.error.main,\n fontWeight: 500,\n borderRadius: theme.spacing(1),\n textAlign: 'center',\n padding: `0 ${theme.spacing(1)}`,\n whiteSpace: 'nowrap'\n }\n}))\n\n/**\n * Displays the history and details about a specific Holding.\n * @returns {JSX.Element}\n * @constructor\n */\nconst HoldingDetail = () => {\n const { historyIsFetching, history, holdings, accounts } = withPropsValidation(\n useSelector(({ holdingReducer, accountReducer }) => ({\n historyIsFetching: holdingReducer.historyIsFetching,\n holdings: holdingReducer.holdings,\n history: holdingReducer.history,\n accounts: accountReducer.accounts\n })))\n\n\n const [holdingId, setHoldingId] = useState(null)\n const [account, setAccount] = useState(null)\n const [currentHolding, setCurrentHolding] = useState(null)\n const [tableData, setTableData] = useState([])\n const [tableOptions, setTableOptions] = useState({})\n const [filterList, setFilterList] = useState([])\n const [startDateOpen, setStartDateOpen] = useState(false)\n const [endDateOpen, setEndDateOpen] = useState(false)\n\n const params = useParams()\n const optionsRef = useRef()\n const dispatch = useDispatch()\n const theme = useTheme()\n const classes = useStyles()\n optionsRef.current = tableOptions\n\n useEffect(() => {\n try {\n const holdingKey = params && params.holdingKey ? params.holdingKey : null\n const holdingId = holdingKey && isInt(holdingKey) ? parseInt(holdingKey) : null\n const currentHolding = holdings.find(h => h.id === holdingId)\n const account = currentHolding ? accounts.find(a => a.id === currentHolding.account_id) : null\n\n setAccount(account)\n setCurrentHolding(currentHolding)\n setHoldingId(holdingId)\n updateTableData(holdingId, 0, 0, [])\n } catch (e) {\n dispatch(returnErrors({ holding: 'Unable to find holding history. Please try again later.' }, 500))\n }\n }, [params, holdings, accounts])\n\n useEffect(() => {\n try {\n const count = history && history[0] && history[0].count ? history[0].count : 0\n const page = history && history[0] && history[0].page ? history[0].page : 0\n const rowsPerPage = history && history[0] && history[0].page_size ? history[0].page_size : ROWS_PER_PAGE_OPTIONS[0]\n\n\n const displayList = []\n for (const h of history) {\n let institutionValue = h && h.institution_value ? h.institution_value : 0\n institutionValue = numeral(institutionValue)\n let costBasis = h && h.cost_basis ? h.cost_basis : 0\n const profitLoss = institutionValue.subtract(costBasis)\n const shares = h && h.quantity ? h.quantity : 0\n costBasis = numeral(costBasis)\n const averagePrice = shares > 0 ? costBasis.divide(shares) : costBasis\n // If holding is added manually calculate the price (institution_price).\n let institutionPrice = h && h.institution_price ? h.institution_price : 0\n if (!institutionPrice) {\n let marketValue = h && h.institution_value ? h.institution_value : 0\n marketValue = numeral(marketValue)\n institutionPrice = marketValue.divide(shares)\n institutionPrice = institutionPrice.value()\n }\n\n displayList.push({\n ...h,\n average_price: averagePrice.value(),\n profit_loss: profitLoss.value(),\n institution_price: institutionPrice\n }\n )\n }\n\n\n setTableData(displayList)\n setTableOptions({\n count,\n page,\n rowsPerPage,\n responsive: 'vertical',\n selectableRows: 'none',\n elevation: 0,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n serverSide: true,\n rowHover: true,\n print: false,\n sort: false,\n download: false,\n viewColumns: true,\n confirmFilters: true,\n filter: true,\n search: false,\n searchPlaceholder: 'Search Holding',\n onRowClick: rowData => dispatch(editHoldingId(rowData[0])),\n // Calling the applyNewFilters parameter applies the selected filters to the table\n customFilterDialogFooter: (currentFilterList, applyNewFilters) => (\n <div style={{ marginTop: theme.spacing(4) }}>\n <Button variant=\"contained\" fullWidth\n onClick={() => handleFilterSubmit(applyNewFilters)}>\n Apply Filters\n </Button>\n </div>\n ),\n onChangePage: page => updatePage(page),\n onChangeRowsPerPage: numberOfRows => updateRowsPerPage(numberOfRows),\n onFilterChipClose: (index, removedFilter, filterList) => {\n let newFilters = () => (filterList)\n handleFilterSubmit(newFilters)\n },\n setFilterChipProps: (colIndex, colName, data) => {\n return {\n color: 'primary',\n variant: 'contained',\n className: classes.tableChips,\n }\n }\n })\n } catch (e) {\n\n }\n }, [history])\n\n /**\n * Sends request for transaction history based on\n * page changing.\n * @param {number} page - The page to display. 0 indexed.\n */\n const updatePage = (page) => {\n const rowsPerPage = optionsRef && optionsRef.current && optionsRef.current.rowsPerPage\n ? optionsRef.current.rowsPerPage\n : ROWS_PER_PAGE_OPTIONS[0]\n\n updateTableData(holdingId, page, rowsPerPage, filterList)\n }\n\n /**\n * Sends request for transaction history based on\n * number of rows changing. Reset the current page back to 0.\n * @param {number} rowsPerPage- The rows per page to display.\n */\n const updateRowsPerPage = (rowsPerPage) => {\n updateTableData(holdingId, 0, rowsPerPage, filterList)\n }\n\n /**\n * Applies the filters to the table and saves to state. Makes\n * a call to update table data. Reset page back to 0\n * @param {Function} newFilters - Function to create new filters\n */\n const handleFilterSubmit = (newFilters) => {\n let filterList = newFilters()\n setFilterList(filterList)\n const rowsPerPage = optionsRef && optionsRef.current && optionsRef.current.rowsPerPage\n ? optionsRef.current.rowsPerPage\n : ROWS_PER_PAGE_OPTIONS[0]\n\n updateTableData(holdingId, 0, rowsPerPage, filterList)\n }\n\n /**\n * Calls the action to make a request to the server for table data\n * based on the passed query params.\n * @param {number} holdingId - The id of the holding we want the\n * history for.\n * @param {number} page - The page of data. 0 indexed.\n * @param {number} rowsPerPage - The size of the page.\n * @param {Array} filterList - The table filters.\n */\n const updateTableData = (holdingId, page, rowsPerPage, filterList) => {\n const startDate = filterList && filterList[1] && filterList[1][0]\n ? DateTime.fromISO(filterList[1][0]).toFormat('yyyyMMdd')\n : null\n const endDate = filterList && filterList[2] && filterList[2][0]\n ? DateTime.fromISO(filterList[2][0]).toFormat('yyyyMMdd')\n : null\n\n dispatch(getHoldingHistory(holdingId, page, rowsPerPage, startDate, endDate))\n }\n\n /**\n * *** WARNING ***\n * Some columns are indexed based, so if the position of a column\n * is changed it could break the logic.\n */\n const tableColumns = [{\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n searchable: false,\n download: false\n }\n }, {\n label: 'Start Date', name: 'start_date',\n options: {\n searchable: false,\n display: 'excluded',\n viewColumns: false,\n download: false,\n filter: true,\n filterType: 'custom',\n // filterList: [formatISODate(DateTime.local().plus({ months: -1 }))],\n customFilterListOptions: {\n render: v => {\n if (v[0]) {\n return `Start Date: ${formatISODate(v[0])}`\n }\n return false\n },\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <div>\n <FormLabel>Start Date</FormLabel>\n <FormGroup row>\n <DatePicker open={startDateOpen}\n onChange={value => {\n filterList[index] = [value]\n onChange(filterList[index], index, column)\n }}\n value={filterList && filterList[index] && filterList[index][0] ? formatISODate(filterList[index][0]) : null}\n onClose={() => setStartDateOpen(false)}\n clearable={false}\n inputProps={{ readOnly: true }}\n renderInput={(params) => (\n <TextField fullWidth\n {...params}\n onClick={() => setStartDateOpen(true)}\n />)}\n />\n </FormGroup>\n </div>\n ),\n },\n },\n }, {\n label: 'End Date', name: 'end_date',\n options: {\n searchable: false,\n display: 'excluded',\n viewColumns: false,\n download: false,\n filter: true,\n filterType: 'custom',\n // filterList: [formatISODate(DateTime.local())],\n customFilterListOptions: {\n render: v => {\n if (v[0]) {\n return `End Date: ${formatISODate(v[0])}`\n }\n return false\n },\n },\n filterOptions: {\n display: (filterList, onChange, index, column) => (\n <div>\n <FormLabel>End Date</FormLabel>\n <FormGroup row>\n <DatePicker open={endDateOpen}\n onChange={value => {\n filterList[index] = [value]\n onChange(filterList[index], index, column)\n }}\n value={filterList && filterList[index] && filterList[index][0] ? formatISODate(filterList[index][0]) : null}\n onClose={() => setEndDateOpen(false)}\n clearable={false}\n inputProps={{ readOnly: true }}\n renderInput={(params) => (\n <TextField fullWidth\n {...params}\n onClick={() => setEndDateOpen(true)}\n />)}\n />\n </FormGroup>\n </div>\n ),\n },\n },\n }, {\n label: 'Name', name: 'name',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n download: false,\n searchable: false,\n }\n }, {\n label: 'Ticker', name: 'ticker_symbol',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: (value, tableMeta, updateValue) => {\n const companyName = tableMeta && tableMeta.rowData && tableMeta.rowData[3] ? tableMeta.rowData[3] : ''\n return (\n <Grid container>\n <Grid item xs={12}>\n {companyName}\n </Grid>\n <Grid item xs={12} style={{ fontSize: '12px' }}>\n {value}\n </Grid>\n </Grid>\n )\n },\n }\n }, {\n label: 'Price', name: 'institution_price',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: (value, tableMeta, updateValue) => (\n value && value > 0\n ? formatMoneyLabel(value)\n : '-'\n ),\n }\n }, {\n label: 'Shares', name: 'quantity',\n options: {\n filter: false,\n download: false,\n searchable: false,\n }\n }, {\n label: 'Cost Basis', name: 'cost_basis',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: (value, tableMeta, updateValue) => (\n formatMoneyLabel(value)\n ),\n }\n }, {\n label: 'Value', name: 'institution_value',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: (value, tableMeta, updateValue) => (\n formatMoneyLabel(value)\n ),\n }\n }, {\n label: 'Average Price', name: 'average_price',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: (value, tableMeta, updateValue) => (\n formatMoneyLabel(value)\n ),\n }\n }, {\n label: 'P/L', name: 'profit_loss',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: (value, tableMeta, updateValue) => {\n const profitLoss = formatMoneyLabel(value)\n const plStyles = profitLoss.includes('-') ? classes.negativeAmount : classes.positiveAmount\n const plArrow = profitLoss.includes('-')\n ? <ArrowDropDown className={classes.middleAlign} fontSize=\"small\" color=\"error\" />\n : <ArrowDropUp className={classes.middleAlign} fontSize=\"small\" color=\"success\" />\n return (\n <Grid container\n direction=\"row\"\n justifyContent=\"center\"\n alignItems=\"center\"\n wrap=\"nowrap\"\n className={plStyles}\n >\n {plArrow}\n {profitLoss}\n </Grid>\n )\n },\n }\n }, {\n label: 'Date', name: 'institution_price_as_of',\n options: {\n filter: false,\n download: false,\n searchable: false,\n customBodyRender: value => (\n <Grid container>\n <Grid item xs={12}>\n {DateTime.fromISO(value).toLocaleString()}\n </Grid>\n </Grid>\n ),\n }\n }, {\n label: 'Linked', name: 'link_account_id',\n options: {\n filter: false,\n download: false,\n searchable: false,\n setCellHeaderProps: () => {\n return {\n style: {\n padding: '4px',\n maxWidth: '60px',\n minWidth: '60px'\n },\n className: clsx({\n [classes.centerTableHead]: true,\n })\n }\n },\n customBodyRender: (value, tableMeta) => {\n return !!value\n ? (\n <Grid>\n <Tooltip title=\"Holding Linked\">\n <Link fontSize=\"16\" />\n </Tooltip>\n </Grid>\n ) : (<Tooltip title=\"Manual Holding\">\n <LinkOff fontSize=\"16\" />\n </Tooltip>\n )\n },\n },\n }]\n\n\n return (\n <AppLoading>\n <Fragment>\n <Paper elevation={4}>\n {historyIsFetching &&\n <Loading />\n }\n\n <MUIDataTable\n title={\n <TableHeader\n title={`${currentHolding && currentHolding.name || ''} - ${(currentHolding && currentHolding.ticker_symbol || '')}`}\n subtitle={(account && account.name || '')}\n />\n }\n data={tableData}\n columns={tableColumns}\n options={tableOptions}\n />\n </Paper>\n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n </Fragment>\n </AppLoading>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', 'HoldingDetail')\n return props\n}\n\nconst propTypes = {\n historyIsFetching: PropTypes.bool.isRequired,\n holdings: PropTypes.array.isRequired,\n history: PropTypes.array.isRequired,\n accounts: PropTypes.array.isRequired\n}\n\nHoldingDetail.propTypes = {}\n\nexport default HoldingDetail\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Box } from '@mui/material'\n\nfunction TabPanel(props) {\n const { children, value, index, ...other } = props\n\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`full-width-tabpanel-${index}`}\n aria-labelledby={`full-width-tab-${index}`}\n {...other}\n >\n {value === index && (\n <Box sx={{ p: 3 }}>\n {children}\n </Box>\n )}\n </div>\n )\n}\n\nTabPanel.propTypes = {\n children: PropTypes.node,\n index: PropTypes.number.isRequired,\n value: PropTypes.number.isRequired,\n}\n\nexport default TabPanel\n","import React, { Fragment } from 'react'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Grid, Table, TableBody, TableContainer, TableCell, TableHead,\n TableRow, Paper\n} from '@mui/material'\nimport { DateTime } from 'luxon'\nimport {\n Chart as ChartJS, CategoryScale, LinearScale, BarElement, Title,\n Tooltip, Legend,\n} from 'chart.js'\nimport { Bar } from 'react-chartjs-2'\n\nimport { backgroundColors, borderColors } from '../chart/charts'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { sharedStyles } from '../common/styles'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend\n)\n\nconst options = {\n plugins: {\n title: {\n display: false,\n text: 'Income Vs Expense',\n },\n },\n responsive: true,\n interaction: {\n intersect: false,\n mode: 'index'\n },\n scales: {\n x: {\n stacked: true,\n ticks: {\n maxRotation: 45,\n minRotation: 45\n },\n },\n y: {\n stacked: true,\n ticks: {\n callback: function (value, index, ticks) {\n return formatMoneyLabel(value)\n },\n },\n },\n },\n}\n\nfunction IncomeVsExpense() {\n\n const { reports } = withPropsValidation(\n useSelector(({ reportReducer }) => ({\n reports: reportReducer.reports,\n })))\n\n let incomeExpenseReport = reports && reports.income_expense_report ? reports.income_expense_report : []\n const incomeExpenseTable = [...incomeExpenseReport].reverse()\n incomeExpenseReport = incomeExpenseReport.slice(-12)\n const labels = incomeExpenseReport.map((report) => DateTime.fromISO(report.date).toLocaleString({\n month: 'short',\n year: 'numeric'\n }))\n const inflow = incomeExpenseReport.map((report) => report.inflow)\n const outflow = incomeExpenseReport.map((report) => report.outflow)\n const surplus = incomeExpenseReport.map((report) => report.inflow - report.outflow)\n\n const data = {\n labels,\n datasets: [\n {\n label: 'Inflow',\n data: inflow,\n backgroundColor: backgroundColors[3],\n borderColor: borderColors[3],\n borderWidth: 2,\n stack: 'Stack 0',\n },\n {\n label: 'Outflow',\n data: outflow,\n backgroundColor: backgroundColors[0],\n borderColor: borderColors[0],\n borderWidth: 2,\n stack: 'Stack 1',\n },\n {\n label: 'Surplus',\n data: surplus,\n backgroundColor: backgroundColors[1],\n borderColor: borderColors[1],\n borderWidth: 2,\n stack: 'Stack 2',\n },\n ],\n }\n\n return (\n <Fragment>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Bar options={options} data={data} />\n </Grid>\n <Grid item xs={12}>\n <TableContainer component={Paper}>\n <Table sx={{ minWidth: 400 }} aria-label=\"income vs expense table\">\n <TableHead>\n <TableRow>\n <TableCell>Month</TableCell>\n <TableCell align=\"center\">Inflow</TableCell>\n <TableCell align=\"center\">Outflow</TableCell>\n <TableCell align=\"center\">Surplus</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {incomeExpenseTable.map((row, index) => {\n let surplus = row.inflow - row.outflow\n surplus = formatMoneyLabel(surplus)\n const inflow = formatMoneyLabel(row.inflow)\n const outflow = formatMoneyLabel(row.outflow)\n return (\n <TableRow key={`income-vs-expense-${index}`} hover>\n <TableCell>{DateTime.fromISO(row.date).toLocaleString({\n month: 'short',\n year: 'numeric'\n })}</TableCell>\n <TableCell align=\"center\">{inflow}</TableCell>\n <TableCell align=\"center\">{outflow}</TableCell>\n <TableCell align=\"center\">{surplus}</TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </TableContainer>\n </Grid>\n </Grid>\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', '')\n return props\n}\n\nconst propTypes = {\n reports: PropTypes.object.isRequired\n}\n\n\nexport default withStyles(styles)(IncomeVsExpense)\n","import React, { Fragment } from 'react'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Grid, Table, TableBody, TableContainer, TableCell, TableHead, TableRow, Typography, Paper\n} from '@mui/material'\nimport { ArrowDropUp, ArrowDropDown, ArrowRight } from '@mui/icons-material'\nimport { DateTime } from 'luxon'\nimport { Chart as ChartJS, CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend, } from 'chart.js'\nimport { Bar } from 'react-chartjs-2'\n\nimport { sharedStyles } from '../common/styles'\nimport { backgroundColors, borderColors } from '../chart/charts'\nimport { formatMoneyLabel, formatMoney, formatPercentLabel } from '../utilities/numbers'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 500\n },\n negativeAmount: {\n color: theme.palette.error.main,\n fontWeight: 500\n },\n middleAlign: {\n verticalAlign: 'middle'\n }\n})\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend\n)\n\nconst options = {\n plugins: {\n title: {\n display: false,\n text: 'Net Worth',\n },\n },\n responsive: true,\n interaction: {\n intersect: false,\n mode: 'index'\n },\n scales: {\n x: {\n ticks: {\n maxRotation: 45,\n minRotation: 45\n },\n },\n y: {\n ticks: {\n callback: function (value, index, ticks) {\n return formatMoneyLabel(value)\n },\n },\n },\n },\n}\n\nfunction NetWorth(props) {\n\n const { classes, reports } = withPropsValidation(\n useSelector(({ reportReducer }) => ({\n classes: props.classes,\n reports: reportReducer.reports,\n })))\n\n let netWorthReport = reports && reports.net_worth_report ? reports.net_worth_report : []\n const netWorthTable = [...netWorthReport].reverse()\n netWorthReport = netWorthReport.slice(-12)\n const labels = netWorthReport.map((report) => DateTime.fromISO(report.date).toLocaleString({\n month: 'short',\n year: 'numeric'\n }))\n const netWorth = netWorthReport.map((report) => formatMoney(report.net_worth))\n\n const data = {\n labels,\n datasets: [\n {\n label: 'Net Worth',\n data: netWorth,\n backgroundColor: backgroundColors[1],\n borderColor: borderColors[1],\n borderWidth: 2,\n }\n ],\n }\n\n return (\n <Fragment>\n <Typography variant=\"h6\">{formatMoneyLabel(reports.net_worth)}</Typography>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <Bar options={options} data={data} />\n </Grid>\n <Grid item xs={12}>\n <TableContainer component={Paper}>\n <Table sx={{ minWidth: 400 }} aria-label=\"net worth table\">\n <TableHead>\n <TableRow>\n <TableCell>Month</TableCell>\n <TableCell align=\"center\">Net Worth</TableCell>\n <TableCell align=\"center\">Change</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {netWorthTable.map((row, index) => {\n let changeClass = null\n let arrowIcon = <ArrowRight className={classes.middleAlign} fontSize=\"small\" />\n if (row.percent_change > 0) {\n changeClass = classes.positiveStats\n arrowIcon = <ArrowDropUp className={classes.middleAlign} fontSize=\"small\" />\n } else if (row.percent_change < 0) {\n changeClass = classes.negativeStats\n arrowIcon = <ArrowDropDown className={classes.middleAlign} fontSize=\"small\" />\n }\n return (\n <TableRow key={`net-worth-${index}`} hover>\n <TableCell>{DateTime.fromISO(row.date).toLocaleString({\n month: 'short',\n year: 'numeric'\n })}</TableCell>\n <TableCell align=\"center\">{formatMoneyLabel(row.net_worth)}</TableCell>\n <TableCell align=\"center\">\n <div className={changeClass}>\n {arrowIcon}\n {formatPercentLabel(row.percent_change)}\n </div>\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </TableContainer>\n </Grid>\n </Grid>\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', '')\n return props\n}\n\nconst propTypes = {\n classes: PropTypes.object.isRequired,\n reports: PropTypes.object.isRequired\n}\n\n\nexport default withStyles(styles)(NetWorth)\n","import React, { Fragment, useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n FormControl, Grid, InputLabel, MenuItem, Select, Table, TableBody,\n TableContainer, TableCell, TableHead, TableRow, Paper, Hidden\n} from '@mui/material'\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\nimport { Pie } from 'react-chartjs-2'\nimport numeral from 'numeral'\n\nimport { sharedStyles } from '../common/styles'\nimport { backgroundColors, borderColors } from '../chart/charts'\nimport { formatMoneyLabel, formatPercentLabel } from '../utilities/numbers'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n positiveAmount: {\n color: theme.palette.success.main,\n fontWeight: 500\n },\n negativeAmount: {\n color: theme.palette.error.main,\n fontWeight: 500\n },\n middleAlign: {\n verticalAlign: 'middle'\n }\n})\n\nconst months = [undefined, 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\nChartJS.register(ArcElement, Tooltip, Legend)\n\nconst options = {\n plugins: {\n title: {\n display: false,\n text: 'Total Expenses by Category',\n },\n legend: {\n position: 'right'\n },\n },\n responsive: true,\n interaction: {\n intersect: false,\n mode: 'point'\n }\n}\n\n/**\n * This component uses a budget date to sift through the data to\n * display the correct data the user wants. The budget date is a string\n * of the month and year squished together. e.g. 12022 is January 2022.\n * @param {Object} props - All the props for this component.\n * @param {Object} props.reports - Contains reporting information.\n * @return {JSX.Element}\n * @constructor\n */\nfunction CategorizedExpenses(props) {\n const [budgetDate, setBudgetDate] = useState(null)\n const [chartData, setChartData] = useState(null)\n const [dateList, setDateList] = useState(null)\n const [tableData, setTableData] = useState(null)\n\n const { classes, reports } = withPropsValidation(\n useSelector(({ reportReducer }) => ({\n classes: props.classes,\n reports: reportReducer.reports,\n })))\n\n useEffect(() => {\n // If page load get current budget date\n let currentBudgetDate = null\n if (!budgetDate) {\n if (reports && reports.end_month && reports.end_year) {\n const month = reports.end_month\n const year = reports.end_year\n currentBudgetDate = `${month}${year}`\n setBudgetDate(currentBudgetDate)\n return false\n }\n }\n\n const categorizedExpenses = reports && reports.monthly_category_expense_report\n ? reports.monthly_category_expense_report : []\n // Filtering based on month and year and less than 0 *** No leading 0 ***\n let monthlyExpenses = categorizedExpenses.filter((report) => `${report.month}${report.year}` === budgetDate && report.total < 0)\n const labels = monthlyExpenses.map((report) => report.category_name)\n const total = monthlyExpenses.map((report) => report.total)\n\n // Get monthly total expenses and percentage\n let totalMonthlyExpenses = numeral(0)\n for (const monthlyExpense of monthlyExpenses) totalMonthlyExpenses.add(monthlyExpense.total)\n totalMonthlyExpenses = totalMonthlyExpenses.value()\n monthlyExpenses = monthlyExpenses.map(e => {\n let percent = numeral(e.total).divide(totalMonthlyExpenses)\n percent = percent && percent.value() ? percent.value() : 0\n return {\n ...e,\n percent\n }\n })\n\n\n // Get list of valid budget dates\n let dateList = []\n categorizedExpenses.forEach((report) => {\n const month = report.month\n const year = report.year\n const newDate = { value: `${month}${year}`, label: `${months[month]} ${year}` }\n if (dateList.length > 0) {\n if (!dateList.some(item => item.value === newDate.value)) dateList.push(newDate)\n } else dateList.push(newDate)\n })\n\n // chart data\n const data = {\n labels,\n datasets: [\n {\n label: 'Category',\n data: total,\n backgroundColor: backgroundColors,\n borderColor: borderColors,\n borderWidth: 2,\n }\n ],\n }\n\n setTableData(monthlyExpenses)\n setChartData(data)\n setDateList(dateList)\n }, [reports, budgetDate])\n\n /**\n * Used to update the budget date being displayed for this report.\n * @param {Object} event - The change event.\n * @param {Object} newValue - The selected value object.\n */\n const handleBudgetDateChange = (event, newValue) => {\n setBudgetDate(event.target.value)\n }\n\n return (\n <Fragment>\n <Grid container spacing={3}>\n {budgetDate && dateList &&\n <Grid item xs={12}>\n <FormControl variant=\"standard\" sx={{ width: 200 }}>\n <InputLabel>Budget Month</InputLabel>\n <Select\n value={budgetDate}\n onChange={handleBudgetDateChange}\n label=\"Budget Date\">\n {dateList.map((item) => (\n <MenuItem key={`budget-date-${item.value}`}\n value={item.value}>{item.label}</MenuItem>\n ))}\n </Select>\n </FormControl>\n </Grid>\n }\n </Grid>\n <Grid container spacing={3}>\n <Hidden smDown>\n <Grid item md={1} lg={2} />\n </Hidden>\n {chartData &&\n <Grid item xs={12} md={10} lg={8}>\n <Pie options={options} data={chartData} />\n </Grid>\n }\n <Hidden smDown>\n <Grid item md={1} lg={2} />\n </Hidden>\n {tableData &&\n <Grid item xs={12}>\n <TableContainer component={Paper}>\n <Table sx={{ minWidth: 400 }} aria-label=\"categorized expense table\">\n <TableHead>\n <TableRow>\n <TableCell align=\"left\">Category</TableCell>\n <TableCell align=\"center\">Total</TableCell>\n <TableCell align=\"center\">Percent</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {tableData.map((row, index) => (\n <TableRow key={`category-expense-${index}`} hover>\n <TableCell align=\"left\">{row.category_name}</TableCell>\n <TableCell align=\"center\">{formatMoneyLabel(row.total)}</TableCell>\n <TableCell align=\"center\">{formatPercentLabel(row.percent)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </Grid>\n }\n </Grid>\n </Fragment>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', '')\n return props\n}\n\nconst propTypes = {\n classes: PropTypes.object.isRequired,\n reports: PropTypes.object.isRequired\n}\n\n\nexport default withStyles(styles)(CategorizedExpenses)\n","import React, { useState, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { Box } from '@mui/material'\n\nimport { TabBar, TabList, TabButton } from '../common/styles'\nimport AppLoading from '../loading/AppLoading'\nimport { Loading } from '../loading/Loading'\nimport TabPanel from '../layout/TabPanel'\nimport IncomeVsExpense from './IncomeVsExpense'\nimport NetWorth from './NetWorth'\nimport CategorizedExpenses from './CategorizedExpenses'\nimport AccountForm from '../layout/AccountForm'\nimport { getReports } from '../../actions/reports'\nimport ActionButtons from '../layout/ActionButtons'\nimport CollectionForm from '../layout/CollectionForm'\nimport CategoryForm from '../layout/CategoryForm'\nimport HoldingForm from '../layout/HoldingForm'\nimport TransactionForm from '../layout/TransactionForm'\nimport MoveBalanceForm from '../layout/MoveBalanceForm'\n\nfunction ReportDashboard() {\n const [tabIndex, setTabIndex] = useState(0)\n\n const { isFetching, reports } = withPropsValidation(\n useSelector(({ reportReducer }) => ({\n isFetching: reportReducer.isFetching,\n reports: reportReducer.reports\n })))\n\n const dispatch = useDispatch()\n\n useEffect(() => {\n dispatch(getReports())\n }, [dispatch])\n\n const handleTabChange = (event, newValue) => {\n setTabIndex(newValue)\n }\n\n return (\n <AppLoading>\n\n {isFetching &&\n <Box mb={1}>\n <Loading />\n </Box>\n }\n\n <TabBar>\n <TabList value={tabIndex} onChange={handleTabChange} centered variant=\"fullWidth\"\n aria-label=\"report tabs\">\n <TabButton label=\"Income vs Expense\" index={0} />\n <TabButton label=\"Net Worth\" index={1} />\n <TabButton label=\"Categorized Expenses\" index={2} />\n </TabList>\n </TabBar>\n\n <TabPanel value={tabIndex} index={0}><IncomeVsExpense reports={reports} /></TabPanel>\n <TabPanel value={tabIndex} index={1}><NetWorth reports={reports} /></TabPanel>\n <TabPanel value={tabIndex} index={2}><CategorizedExpenses reports={reports} /></TabPanel>\n\n <ActionButtons />\n <AccountForm />\n <CollectionForm />\n <CategoryForm />\n <HoldingForm />\n <TransactionForm />\n <MoveBalanceForm />\n </AppLoading>\n )\n}\n\nconst withPropsValidation = props => {\n PropTypes.checkPropTypes(propTypes, props, 'prop', '')\n return props\n}\n\nconst propTypes = {\n isFetching: PropTypes.bool.isRequired,\n reports: PropTypes.object.isRequired\n}\n\nexport default ReportDashboard\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Button, Box, Typography, Dialog, DialogActions, DialogContent, DialogTitle,\n Grid, Link as Anchor\n} from '@mui/material'\nimport { Delete, Cancel } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { formatISODateTime } from '../utilities/dates'\nimport { deleteLinkAccount } from '../../actions/link'\nimport { returnErrors } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass LinkAccountForm extends Component {\n constructor(props) {\n super(props)\n\n this.handleDelete = this.handleDelete.bind(this)\n }\n\n /**\n * Delete the link account.\n * @param {Object} e - The event object.\n */\n handleDelete = e => {\n e.preventDefault()\n try {\n const { closeForm, linkAccount, deleteLinkAccount } = this.props\n\n deleteLinkAccount(linkAccount)\n closeForm()\n } catch (e) {\n this.props.returnErrors({ deleteAccount: 'Unable to delete. Please try again later.' }, 500)\n }\n }\n\n render() {\n const { theme, classes, open, closeForm, linkAccount } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"link-account-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Delete {linkAccount.name}\n <Button onClick={this.handleDelete}\n className={`${classes.dangerButton} ${classes.floatRight}`}\n variant=\"outlined\">\n <Delete className={classes.pr1} />Delete\n </Button>\n </DialogTitle>\n <DialogContent>\n <Box p={3}>\n <Grid container spacing={2} justifyContent=\"center\">\n\n <Grid item xs={12}>\n\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"h6\"\n style={{\n fontWeight: theme.typography.fontWeightBold,\n color: linkAccount.institution_primary_color\n }}\n >\n {linkAccount.institution_name}\n </Typography>\n </Grid>\n\n {linkAccount && linkAccount.institution_url &&\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Anchor color=\"inherit\" underline=\"hover\" target=\"_blank\" href={linkAccount.institution_url}>\n {linkAccount.institution_url.replace(/(^\\w+:|^)\\/\\//, '').replace(/\\/$/, '')}\n </Anchor>\n </Grid>\n }\n\n <Grid container item xs={12} direction=\"row\" justifyContent=\"center\" alignItems=\"center\">\n <Typography variant=\"body1\" style={{ color: theme.palette.text.secondary }}>\n Last Updated: {formatISODateTime(linkAccount.updated)}\n </Typography>\n </Grid>\n </Grid>\n\n <Grid item xs={12}>\n <Typography variant=\"body1\">\n Are you sure? This will delete the linked account\n from Ploutos Budget. We will no longer be able\n to pull in transactions for this account.\n </Typography>\n </Grid>\n </Grid>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => closeForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nLinkAccountForm.propTypes = {\n open: PropTypes.bool.isRequired,\n closeForm: PropTypes.func.isRequired,\n linkAccount: PropTypes.object.isRequired,\n deleteLinkAccount: PropTypes.func.isRequired\n}\n\nconst mapDispatchToProps = {\n deleteLinkAccount,\n returnErrors\n}\n\nexport default connect(null, mapDispatchToProps)(withStyles(styles, { withTheme: true })(LinkAccountForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport {\n Paper, Typography, Toolbar, TableContainer, Table, TableBody,\n TableHead, TableRow, TableCell, Grid\n} from '@mui/material'\nimport { Link as LinkIcon, LinkOff as LinkOffIcon } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport LinkAccountForm from '../layout/LinkAccountForm'\nimport { formatISODateTime } from '../utilities/dates'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n fontSecondary: {\n color: theme.palette.text.secondary\n }\n})\n\nclass LinkAccount extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n open: false,\n linkAccount: {}\n }\n\n this.closeDialog = this.closeDialog.bind(this)\n this.linkAccountClick = this.linkAccountClick.bind(this)\n }\n\n /**\n * Close the dialog and reset the link account.\n */\n closeDialog = () => this.setState({ open: false, linkAccount: {} })\n\n /**\n * Open the dialog and set the selected link account.\n * @param {Object} row - The selected link account.\n */\n linkAccountClick = row => this.setState({ open: true, linkAccount: row })\n\n render() {\n const { open, linkAccount } = this.state\n const { theme, classes, linkAccounts } = this.props\n\n return (\n <Fragment>\n <Paper elevation={3}>\n <Toolbar>\n <Typography variant=\"h6\" component=\"div\">\n Link Accounts\n </Typography>\n </Toolbar>\n <TableContainer>\n <Table aria-label=\"link accounts\">\n <TableHead>\n <TableRow>\n <TableCell>Institution</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Type</TableCell>\n <TableCell>Status</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {linkAccounts && linkAccounts.length > 0\n ? linkAccounts.map((row) => (\n <TableRow key={row.id} hover onClick={() => this.linkAccountClick(row)}>\n\n <TableCell style={{\n fontWeight: theme.typography.fontWeightBold,\n color: row.institution_primary_color\n }}>\n {row.institution_name}\n </TableCell>\n\n <TableCell>\n <Grid container>\n <Grid item xs={12}>{row.name}</Grid>\n <Grid item xs={12} className={classes.fontSecondary}>{row.official_name}</Grid>\n </Grid>\n </TableCell>\n\n <TableCell style={{ textTransform: 'capitalize' }}>\n\n <Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"flex-start\"\n alignItems=\"center\">\n {(row.sub_type || '')}\n </Grid>\n <Grid item xs={12} className={classes.fontSecondary}>\n <Typography variant=\"body2\" noWrap>\n {(row.type || '')}\n </Typography>\n </Grid>\n </Grid>\n\n </TableCell>\n\n {row && (!row.status || row.status === '')\n ? (\n <TableCell>\n <Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"flex-start\"\n alignItems=\"center\">\n <LinkIcon fontSize=\"medium\" color=\"success\" />\n Connected\n </Grid>\n <Grid item xs={12} className={classes.fontSecondary}>\n <Typography variant=\"body2\" noWrap>\n {formatISODateTime(row.updated)}\n </Typography>\n </Grid>\n </Grid>\n </TableCell>\n ) : (\n <TableCell>\n <Grid>\n <Grid container item xs={12} direction=\"row\" justifyContent=\"flex-start\"\n alignItems=\"center\">\n <LinkOffIcon fontSize=\"medium\" color=\"error\" />\n Broken\n </Grid>\n <Grid item xs={12} className={classes.fontSecondary}>\n <Typography variant=\"body2\" noWrap>\n {formatISODateTime(row.updated)}\n </Typography>\n </Grid>\n </Grid>\n </TableCell>\n )\n }\n </TableRow>\n )\n )\n :\n (\n <TableRow>\n <TableCell align=\"center\" colSpan={10}>No accounts linked.</TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n </Paper>\n <LinkAccountForm open={open}\n closeForm={this.closeDialog}\n linkAccount={linkAccount} />\n </Fragment>\n )\n }\n}\n\nLinkAccount.propTypes = {\n linkAccounts: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n linkAccounts: state.linkReducer.linkAccounts,\n})\n\nconst mapDispatchToProps = {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(LinkAccount))\n","import React, { Component, Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport LinkAccount from './LinkAccount'\nimport AccountForm from '../layout/AccountForm'\n\nclass LinkAccountDashboard extends Component {\n\n render() {\n return (\n <AppLoading>\n <Fragment>\n <LinkAccount />\n <AccountForm />\n </Fragment>\n </AppLoading>\n )\n }\n}\n\nexport default LinkAccountDashboard\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Button, TextField, Dialog, DialogActions, DialogContent, DialogTitle, Grid } from '@mui/material'\nimport { Save, Cancel } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { bulkPayeeUpdate } from '../../actions/payees'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { returnErrors } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass PayeeForm extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: {\n payee: { error: null, helperText: '', },\n },\n payee: '',\n }\n\n this.clearForm = this.clearForm.bind(this)\n this.handleChange = this.handleChange.bind(this)\n this.handleSubmit = this.handleSubmit.bind(this)\n }\n\n /**\n * Used to clear the form and close the dialog.\n */\n clearForm = () => {\n this.setState({ payee: '' })\n this.props.closeDialog()\n }\n\n handleChange = e => this.setState({ [e.target.name]: e.target.value })\n\n /**\n * Submit the edit payee form\n * @param {Object} e - The event object.\n */\n handleSubmit = e => {\n e.preventDefault()\n try {\n const { payee } = this.state\n const { yearMonth, payees, bulkPayeeUpdate, returnErrors } = this.props\n const { user } = this.props.auth\n const name = payee ? payee.trim() : null\n\n // Payee cannot be blank\n if (!name) {\n returnErrors({ payee: 'Payee cannot be blank.' }, 500)\n return false\n }\n\n // Payee cannot equal adjustment\n if (name && name.toLowerCase() === 'adjustment') {\n returnErrors({ payee: 'Cannot update payee to \"Adjustment\".' }, 500)\n return false\n }\n\n // Edit payees\n const payeeForm = {\n name,\n payees,\n user_id: user.id\n }\n\n bulkPayeeUpdate(payeeForm, yearMonth)\n this.clearForm()\n } catch (e) {\n this.props.returnErrors({ payee: 'Unable to update payees. Please try again later.' }, 500)\n }\n }\n\n render() {\n const { error, payee } = this.state\n const { classes, theme, open } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"edit-payee-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n maxWidth=\"sm\"\n PaperComponent={DraggableDialogWrapper}\n fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Edit Payee\n </DialogTitle>\n <form onSubmit={this.handleSubmit}>\n <DialogContent>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={12}>\n <TextField required\n name=\"payee\"\n value={payee}\n autoFocus\n onChange={this.handleChange}\n error={error.payee.error}\n helperText={error.payee.helperText}\n margin=\"dense\"\n label=\"Payee\"\n type=\"text\"\n fullWidth\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button type=\"submit\" color=\"primary\" variant=\"contained\">\n <Save /> Save\n </Button>\n <Button onClick={this.clearForm} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nPayeeForm.propTypes = {\n auth: PropTypes.object.isRequired,\n open: PropTypes.bool.isRequired,\n yearMonth: PropTypes.string.isRequired,\n closeDialog: PropTypes.func.isRequired,\n payees: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n yearMonth: state.budgetMonthReducer.yearMonth,\n})\n\nconst mapDispatchToProps = {\n bulkPayeeUpdate,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(PayeeForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles';\nimport MUIDataTable from 'mui-datatables'\nimport {\n Paper, Tooltip, IconButton, Toolbar\n} from '@mui/material'\nimport { Edit } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport PayeeForm from '../layout/PayeeForm'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nconst ROWS_PER_PAGE_OPTIONS = [50, 100, 200]\n\nconst columns = [{ label: 'Payee', name: 'name' }]\n\nclass Payee extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n open: false,\n selectedPayees: [],\n selectedPayeesDataIndexes: [],\n pageSize: 50\n }\n\n this.closeDialog = this.closeDialog.bind(this)\n this.payeeClick = this.payeeClick.bind(this)\n this.selectPayees = this.selectPayees.bind(this)\n }\n\n /**\n * Close the dialog and reset the selected payees.\n */\n closeDialog = () => this.setState({ open: false, selectedPayees: [], selectedPayeesDataIndexes: [] })\n\n /**\n * Open the dialog and set the selected payee.\n * @param {Object} row - The selected payee.\n */\n payeeClick = row => this.setState({ open: true, selectedPayees: row })\n\n /**\n * Select the payees, open the form, and update the payees state.\n * @param {Array.<Object>} selectedRows - The selected rows from the\n * table.\n * @param {Array.<Object>} displayData - All of the rows currently\n * displayed in the table.\n */\n selectPayees = (selectedRows, displayData) => {\n try {\n let selectedPayees = []\n const data = selectedRows && selectedRows.data ? selectedRows.data : []\n if (data.length > 0) {\n for (const row of data) {\n const rowIndex = row && (row.index || row.index === 0) ? row.index : null\n if (rowIndex != null && displayData[rowIndex].dataIndex === row.dataIndex) {\n const payee = displayData[rowIndex].data[0]\n selectedPayees.push(payee)\n }\n }\n\n this.setState({ open: true, selectedPayees })\n }\n } catch (e) {\n return false\n }\n }\n\n render() {\n const { open, selectedPayees, selectedPayeesDataIndexes, pageSize } = this.state\n const { payees } = this.props\n const payeeOptions = payees.filter(p => p.name\n && p.name.trim().toLowerCase() !== 'adjustment')\n\n const options = {\n responsive: 'standard',\n rowsPerPage: pageSize,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n print: false,\n viewColumns: false,\n download: false,\n filter: false,\n selectableRows: 'multiple',\n selectableRowsOnClick: true,\n rowsSelected: selectedPayeesDataIndexes,\n customToolbarSelect: (selectedRows, displayData) => (\n <Toolbar variant=\"dense\">\n <Tooltip title=\"Edit\">\n <IconButton\n aria-label=\"edit\"\n color=\"primary\"\n onClick={() => this.selectPayees(selectedRows, displayData)}\n size=\"large\">\n <Edit />\n </IconButton>\n </Tooltip>\n </Toolbar>\n ),\n }\n\n return (\n <Fragment>\n <Paper elevation={3}>\n <MUIDataTable title=\"Payees\"\n data={payeeOptions}\n columns={columns}\n options={options}\n />\n </Paper>\n <PayeeForm open={open}\n closeDialog={this.closeDialog}\n payees={selectedPayees} />\n </Fragment>\n )\n }\n}\n\nPayee.propTypes = {\n payees: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n payees: state.payeeReducer.payees,\n})\n\nconst mapDispatchToProps = {}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(Payee))\n","import React, { Component, Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Payee from './Payee'\nimport AccountForm from '../layout/AccountForm'\n\nclass PayeeDashboard extends Component {\n\n render() {\n return (\n <AppLoading>\n <Fragment>\n <Payee />\n <AccountForm />\n </Fragment>\n </AppLoading>\n )\n }\n}\n\nexport default PayeeDashboard\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport { Button, Box, Typography, Dialog, DialogActions, DialogContent, DialogTitle, Grid } from '@mui/material'\nimport { Cancel, Unarchive } from '@mui/icons-material'\n\nimport { sharedStyles } from '../common/styles'\nimport DraggableDialogWrapper from './DraggableDialogWrapper'\nimport { fullScreen, Transition } from '../utilities/dialogs'\nimport { unarchiveAccount } from '../../actions/accounts'\nimport { unarchiveCategory } from '../../actions/categories'\nimport { returnErrors } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nclass ArchiveForm extends Component {\n constructor(props) {\n super(props)\n\n this.handleUnarchive = this.handleUnarchive.bind(this)\n }\n\n /**\n * Unarchive the item based on table key.\n * item.table 'account' | 'category'\n * @param {Object} e - The event object.\n */\n handleUnarchive = e => {\n e.preventDefault()\n\n try {\n const { yearMonth, closeForm, item, unarchiveAccount, unarchiveCategory } = this.props\n const table = item && item.table ? item.table : null\n\n if (!item || !item.archived) throw Error('Not Archived')\n if (!table) throw Error('Not found')\n\n item.archived = false\n\n if (table === 'account') {\n unarchiveAccount(item, yearMonth)\n } else if (table === 'category') {\n unarchiveCategory(item, yearMonth)\n } else {\n throw Error('Not found')\n }\n\n closeForm()\n } catch (e) {\n this.props.returnErrors({ updateAccount: 'Unable to unarchive account. Please try again later.' }, 500)\n }\n }\n\n render() {\n const { theme, classes, open, closeForm, item } = this.props\n\n return (\n <Fragment>\n <Dialog open={open}\n aria-labelledby=\"unarchive-form\"\n TransitionComponent={Transition}\n fullScreen={fullScreen(theme)}\n PaperComponent={DraggableDialogWrapper}\n maxWidth=\"sm\" fullWidth={true}\n >\n <DialogTitle className={classes.moveCursor}>\n Unarchive {item.name}\n </DialogTitle>\n <DialogContent>\n <Box p={3}>\n <Grid container spacing={2} justifyContent=\"center\">\n <Grid item xs={12}>\n <Typography variant=\"body1\">\n Would you like to unarchive and add this back into your budget?\n </Typography>\n <br />\n <Typography variant=\"body1\">\n Note that archived item's data are still reflected in your budget. They are just hidden and\n unable to be used while archived.\n </Typography>\n </Grid>\n </Grid>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={this.handleUnarchive} color=\"primary\" variant=\"contained\">\n <Unarchive className={classes.pr1} />Unarchive\n </Button>\n <Button onClick={() => closeForm()} color=\"inherit\" variant=\"outlined\">\n <Cancel /> Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </Fragment>\n )\n }\n}\n\nArchiveForm.propTypes = {\n yearMonth: PropTypes.string.isRequired,\n open: PropTypes.bool.isRequired,\n closeForm: PropTypes.func.isRequired,\n item: PropTypes.object.isRequired,\n unarchiveAccount: PropTypes.func.isRequired,\n unarchiveCategory: PropTypes.func.isRequired\n}\n\nconst mapStateToProps = state => ({\n yearMonth: state.budgetMonthReducer.yearMonth\n})\n\nconst mapDispatchToProps = {\n unarchiveAccount,\n unarchiveCategory,\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(ArchiveForm))\n","import React, { Component, Fragment } from 'react'\nimport { connect } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport withStyles from '@mui/styles/withStyles'\nimport MUIDataTable from 'mui-datatables'\nimport { Card, Grid } from '@mui/material'\nimport { DateTime } from 'luxon'\n\nimport { sharedStyles } from '../common/styles'\nimport ArchiveForm from '../layout/ArchiveForm'\nimport { formatMoneyLabel } from '../utilities/numbers'\nimport { returnErrors } from '../../actions/messages'\n\nconst styles = theme => ({\n ...sharedStyles(theme),\n})\n\nconst ROWS_PER_PAGE_OPTIONS = [5, 10, 25]\n\nconst accountColumns = [\n {\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n }\n },\n { label: 'Account', name: 'name' },\n {\n label: 'Account Balance',\n name: 'available_balance',\n options: {\n customBodyRender: value => formatMoneyLabel(value),\n }\n }, {\n label: 'Archived', name: 'archived',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n }\n },\n {\n label: 'Last Updated', name: 'updated',\n options: {\n customBodyRender: value => DateTime.fromISO(value).toLocaleString()\n }\n }\n]\nconst CategoryColumns = [\n {\n label: 'ID', name: 'id',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n }\n },\n { label: 'Categories', name: 'name' },\n {\n label: 'Archived', name: 'archived',\n options: {\n display: 'excluded',\n viewColumns: false,\n filter: false,\n }\n },\n {\n label: 'Last Updated', name: 'updated',\n options: {\n customBodyRender: value => DateTime.fromISO(value).toLocaleString()\n }\n }\n]\n\nclass Archive extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n open: false,\n item: {},\n pageSize: 5\n }\n\n this.closeDialog = this.closeDialog.bind(this)\n this.handleAccountArchiveClick = this.handleAccountArchiveClick.bind(this)\n this.handleCategoryArchiveClick = this.handleCategoryArchiveClick.bind(this)\n }\n\n /**\n * Close the dialog and reset the selected payees.\n */\n closeDialog = () => this.setState({ open: false, item: {} })\n\n /**\n * Open the dialog and set the selected account item.\n * @param {Array} row - The selected item.\n */\n handleAccountArchiveClick = row => {\n try {\n const { accounts } = this.props\n const rowId = row && row[0] ? row[0] : null\n let account = accounts.filter(a => a.id === rowId)\n account = account && account[0] ? account[0] : null\n\n if (!account) throw Error('Not found')\n\n account['table'] = 'account'\n\n this.setState({ open: true, item: account })\n } catch (e) {\n this.props.returnErrors({ updateAccount: 'Unable to unarchive account. Please try again later.' }, 500)\n }\n }\n\n /**\n * Open the dialog and set the selected category item.\n * @param {Array} row - The selected item.\n */\n handleCategoryArchiveClick = row => {\n try {\n const { categories } = this.props\n const rowId = row && row[0] ? row[0] : null\n let category = categories.filter(c => c.id === rowId)\n category = category && category[0] ? category[0] : null\n\n if (!category) throw Error('Not found')\n\n category['table'] = 'category'\n\n this.setState({ open: true, item: category })\n } catch (e) {\n this.props.returnErrors({ updateCategory: 'Unable to unarchive category. Please try again later.' }, 500)\n }\n }\n\n render() {\n const { open, item, pageSize } = this.state\n const { accounts, categories } = this.props\n const accountOptions = accounts.filter(a => a.archived)\n const categoryOptions = categories.filter(c => c.archived)\n\n const accountTableOptions = {\n responsive: 'standard',\n rowsPerPage: pageSize,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n print: false,\n viewColumns: false,\n download: false,\n filter: false,\n selectableRows: 'none',\n onRowClick: rowData => this.handleAccountArchiveClick(rowData)\n }\n\n const categoryTableOptions = {\n responsive: 'standard',\n rowsPerPage: pageSize,\n rowsPerPageOptions: ROWS_PER_PAGE_OPTIONS,\n print: false,\n viewColumns: false,\n download: false,\n filter: false,\n selectableRows: 'none',\n onRowClick: rowData => this.handleCategoryArchiveClick(rowData)\n }\n\n return (\n <Fragment>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Card raised={false}>\n <MUIDataTable title=\"Accounts\"\n data={accountOptions}\n columns={accountColumns}\n options={accountTableOptions}\n />\n </Card>\n </Grid>\n <Grid item xs={12}>\n <Card raised={false}>\n <MUIDataTable title=\"Categories\"\n data={categoryOptions}\n columns={CategoryColumns}\n options={categoryTableOptions}\n />\n </Card>\n </Grid>\n </Grid>\n\n <ArchiveForm open={open}\n closeForm={this.closeDialog}\n item={item}\n />\n\n </Fragment>\n )\n }\n}\n\nArchive.propTypes = {\n auth: PropTypes.object.isRequired,\n accounts: PropTypes.array.isRequired,\n categories: PropTypes.array.isRequired,\n}\n\nconst mapStateToProps = state => ({\n auth: state.authReducer,\n accounts: state.accountReducer.accounts,\n categories: state.categoryReducer.categories,\n})\n\nconst mapDispatchToProps = {\n returnErrors\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles, { withTheme: true })(Archive))\n","import React, { Component, Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Archive from './Archive'\nimport AccountForm from '../layout/AccountForm'\n\nclass ArchiveDashboard extends Component {\n\n render() {\n return (\n <AppLoading>\n <Fragment>\n <Archive />\n <AccountForm />\n </Fragment>\n </AppLoading>\n )\n }\n}\n\nexport default ArchiveDashboard\n","import React, { Fragment } from 'react'\n\nimport AppLoading from '../loading/AppLoading'\nimport Membership from './Membership'\nimport AccountForm from '../layout/AccountForm'\n\nexport default function MembershipDashboard() {\n return (\n <AppLoading>\n <Fragment>\n <Membership />\n <AccountForm />\n </Fragment>\n </AppLoading>\n )\n}\n","import { GET_BUDGET_MONTH, EDIT_BUDGET_MONTH } from '../actions/types'\n\nconst NOW = new Date()\n\nconst initialState = {\n yearMonth: `${NOW.getFullYear()}${NOW.getMonth() + 1}`\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_BUDGET_MONTH:\n return {\n ...state\n }\n case EDIT_BUDGET_MONTH:\n return {\n ...state,\n yearMonth: action.payload\n }\n default:\n return state\n }\n}","import {\n GET_TRANSACTIONS, EDIT_TRANSACTION, DELETE_TRANSACTION, ADD_TRANSACTION,\n TRANSACTION_LOADING, TRANSACTION_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n transactions: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_TRANSACTIONS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n transactions: action.payload\n }\n case EDIT_TRANSACTION:\n return {\n ...state,\n error: false,\n isFetching: false,\n transactions: state.transactions.map(transaction => {\n return transaction.id === action.payload.id ? action.payload : transaction\n }) // Replace matched transaction and returns the state.\n }\n case DELETE_TRANSACTION:\n return {\n ...state,\n error: false,\n isFetching: false,\n transactions: state.transactions.filter(transaction => transaction.id !== action.payload)\n } // Return the state minus the passed transaction id.\n case ADD_TRANSACTION:\n return {\n ...state,\n error: false,\n isFetching: false,\n transactions: [...state.transactions, action.payload]\n }\n case TRANSACTION_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case TRANSACTION_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import {\n GET_TRANSACTION_FLAGS, EDIT_TRANSACTION_FLAGS, TRANSACTION_FLAG_LOADING, TRANSACTION_FLAG_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n transactionFlags: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_TRANSACTION_FLAGS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n transactionFlags: action.payload\n }\n case EDIT_TRANSACTION_FLAGS:\n return {\n ...state,\n error: false,\n isFetching: false\n }\n case TRANSACTION_FLAG_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case TRANSACTION_FLAG_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import {\n GET_FLAG_COLORS, FLAG_COLOR_LOADING, FLAG_COLOR_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n flagColors: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_FLAG_COLORS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n flagColors: action.payload\n }\n case FLAG_COLOR_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case FLAG_COLOR_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import { GET_TRANSACTION_ID, EDIT_TRANSACTION_ID } from '../actions/types'\n\nconst initialState = {\n transactionId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_TRANSACTION_ID:\n return {\n ...state\n }\n case EDIT_TRANSACTION_ID:\n return {\n ...state,\n transactionId: action.payload\n }\n default:\n return state\n }\n}","import { GET_ACCOUNT_KEY, EDIT_ACCOUNT_KEY } from '../actions/types'\n\nconst initialState = {\n accountKey: 0\n}\n\n/**\n * Account key is used to select and account for showing transactions.\n * @param state\n * @param action\n * @returns {{accountKey: *}|{accountKey: number}}\n */\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ACCOUNT_KEY:\n return {\n ...state\n }\n case EDIT_ACCOUNT_KEY:\n return {\n ...state,\n accountKey: action.payload\n }\n default:\n return state\n }\n}","import {\n GET_ACCOUNTS, EDIT_ACCOUNT, DELETE_ACCOUNT, ADD_ACCOUNT, REORDER_ACCOUNTS,\n ACCOUNT_LOADING, ACCOUNT_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n accounts: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ACCOUNTS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n accounts: action.payload\n }\n case EDIT_ACCOUNT:\n case REORDER_ACCOUNTS:\n return {\n ...state,\n error: false,\n isFetching: false,\n accounts: state.accounts.map(account => {\n return account.id === action.payload.id ? action.payload : account\n }) // Replace matched account and returns the state.\n }\n case DELETE_ACCOUNT:\n return {\n ...state,\n error: false,\n isFetching: false,\n accounts: state.accounts.filter(account => account.id !== action.payload)\n }\n case ADD_ACCOUNT:\n return {\n ...state,\n error: false,\n isFetching: false,\n accounts: [...state.accounts, action.payload]\n }\n case ACCOUNT_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true,\n }\n case ACCOUNT_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import { GET_ACCOUNT_ID, EDIT_ACCOUNT_ID } from '../actions/types'\n\nconst initialState = {\n accountId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ACCOUNT_ID:\n return {\n ...state\n }\n case EDIT_ACCOUNT_ID:\n return {\n ...state,\n accountId: action.payload\n }\n default:\n return state\n }\n}","import {\n GET_ACCOUNT_GROUPS, EDIT_ACCOUNT_GROUPS, REORDER_ACCOUNT_GROUPS,\n ACCOUNT_GROUPS_LOADING, ACCOUNT_GROUPS_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n accountGroups: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ACCOUNT_GROUPS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n accountGroups: action.payload\n }\n case EDIT_ACCOUNT_GROUPS:\n case REORDER_ACCOUNT_GROUPS:\n return {\n ...state,\n error: false,\n isFetching: false,\n accountGroups: state.accountGroups.map(group => {\n return group.id === action.payload.id ? action.payload : group\n }) // Replace matched group and returns the state.\n }\n case ACCOUNT_GROUPS_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true,\n }\n case ACCOUNT_GROUPS_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import {\n GET_ACCOUNT_TYPES, ACCOUNT_TYPE_LOADING, ACCOUNT_TYPE_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n accountTypes: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ACCOUNT_TYPES:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n accountTypes: action.payload\n }\n case ACCOUNT_TYPE_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case ACCOUNT_TYPE_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import {\n GET_PAYEES, EDIT_PAYEES, PAYEE_LOADING, PAYEE_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n payees: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_PAYEES:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n payees: action.payload\n }\n case EDIT_PAYEES:\n return {\n ...state,\n error: false,\n isFetching: false\n }\n case PAYEE_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case PAYEE_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import {\n GET_TRANSFERS, TRANSFER_LOADING, TRANSFER_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n transfers: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_TRANSFERS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n transfers: action.payload\n }\n case TRANSFER_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case TRANSFER_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import {\n GET_SPLITS, SPLIT_LOADING, SPLIT_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n splits: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_SPLITS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n splits: action.payload\n }\n case SPLIT_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case SPLIT_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import {\n GET_REPORTS, REPORT_LOADING, REPORT_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n reports: {}\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_REPORTS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n reports: action.payload\n }\n case REPORT_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true,\n isLoaded: false\n }\n case REPORT_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import {\n GET_CATEGORIES, EDIT_CATEGORY, REORDER_CATEGORIES, DELETE_CATEGORY,\n ADD_CATEGORY, CATEGORY_LOADING, CATEGORY_FAIL,\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n categories: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_CATEGORIES:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n categories: action.payload\n }\n case EDIT_CATEGORY:\n case REORDER_CATEGORIES:\n return {\n ...state,\n error: false,\n isFetching: false,\n categories: state.categories.map(category => {\n return category.id === action.payload.id ? action.payload : category\n }) // Replace matched category and returns the state.\n }\n case DELETE_CATEGORY:\n return {\n ...state,\n error: false,\n isFetching: false,\n categories: state.categories.filter(category => category.id !== action.payload)\n }\n case ADD_CATEGORY:\n return {\n ...state,\n error: false,\n isFetching: false,\n categories: [...state.categories, action.payload]\n }\n case CATEGORY_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case CATEGORY_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import { GET_CATEGORY_ID, EDIT_CATEGORY_ID } from '../actions/types'\n\nconst initialState = {\n categoryId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_CATEGORY_ID:\n return {\n ...state\n }\n case EDIT_CATEGORY_ID:\n return {\n ...state,\n categoryId: action.payload\n }\n default:\n return state\n }\n}","import {\n GET_CATEGORY_BUDGETS, EDIT_CATEGORY_BUDGET, CATEGORY_BUDGET_LOADING,\n CATEGORY_BUDGET_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n categoryBudgets: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_CATEGORY_BUDGETS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n categoryBudgets: action.payload\n }\n case EDIT_CATEGORY_BUDGET:\n return {\n ...state,\n error: false,\n isFetching: false,\n // categoryBudgets: state.categoryBudgets.map(budget => {\n // return budget.id === action.payload.id ? action.payload : budget\n // }) // Replace matched budget and returns the state.\n }\n case CATEGORY_BUDGET_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case CATEGORY_BUDGET_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import { GET_CATEGORY_BUDGET_ID, EDIT_CATEGORY_BUDGET_ID } from '../actions/types'\n\nconst initialState = {\n categoryBudgetId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_CATEGORY_BUDGET_ID:\n return {\n ...state\n }\n case EDIT_CATEGORY_BUDGET_ID:\n return {\n ...state,\n categoryBudgetId: action.payload\n }\n default:\n return state\n }\n}","import { GET_CATEGORY_BALANCE_ID, EDIT_CATEGORY_BALANCE_ID } from '../actions/types'\n\nconst initialState = {\n categoryBalanceId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_CATEGORY_BALANCE_ID:\n return {\n ...state\n }\n case EDIT_CATEGORY_BALANCE_ID:\n return {\n ...state,\n categoryBalanceId: action.payload\n }\n default:\n return state\n }\n}","import {\n GET_COLLECTIONS, EDIT_COLLECTION, REORDER_COLLECTIONS, DELETE_COLLECTION,\n ADD_COLLECTION, COLLECTION_LOADING, COLLECTION_FAIL,\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n collections: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_COLLECTIONS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n collections: action.payload\n }\n case EDIT_COLLECTION:\n case REORDER_COLLECTIONS:\n return {\n ...state,\n error: false,\n isFetching: false,\n collections: state.collections.map(collection => {\n return collection.id === action.payload.id ? action.payload : collection\n }) // Replace matched collection and returns the state.\n }\n case DELETE_COLLECTION:\n return {\n ...state,\n error: false,\n isFetching: false,\n collections: state.collections.filter(collection => collection.id !== action.payload)\n }\n case ADD_COLLECTION:\n return {\n ...state,\n error: false,\n isFetching: false,\n collections: [...state.collections, action.payload]\n }\n case COLLECTION_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case COLLECTION_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import { GET_COLLECTION_ID, EDIT_COLLECTION_ID } from '../actions/types'\n\nconst initialState = {\n collectionId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_COLLECTION_ID:\n return {\n ...state\n }\n case EDIT_COLLECTION_ID:\n return {\n ...state,\n collectionId: action.payload\n }\n default:\n return state\n }\n}","import {\n GET_HOLDINGS, GET_HOLDING_HISTORY, EDIT_HOLDING, DELETE_HOLDING, ADD_HOLDING, HOLDING_LOADING,\n HOLDING_FAIL, HOLDING_HISTORY_LOADING, HOLDING_HISTORY_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n holdings: [],\n historyIsFetching: true,\n historyIsLoaded: false,\n history: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_HOLDINGS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n holdings: action.payload\n }\n case GET_HOLDING_HISTORY:\n return {\n ...state,\n error: false,\n historyIsFetching: false,\n historyIsLoaded: true,\n history: action.payload\n }\n case EDIT_HOLDING:\n return {\n ...state,\n error: false,\n isFetching: false,\n historyIsFetching: false,\n holdings: state.holdings.map(holding => {\n return holding.id === action.payload.id ? action.payload : holding\n }), // Replace matched holding and returns the state.\n history: state.history.map(h => {\n return h.id === action.payload.id ? action.payload : h\n }) // Replace matched history and returns the state.\n }\n case DELETE_HOLDING:\n return {\n ...state,\n error: false,\n isFetching: false,\n holdings: state.holdings.filter(holding => holding.id !== action.payload),\n history: state.history.filter(holding => holding.id !== action.payload)\n }\n case ADD_HOLDING:\n return {\n ...state,\n error: false,\n isFetching: false,\n holdings: [...state.holdings, action.payload],\n history: [...state.history, action.payload]\n }\n case HOLDING_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case HOLDING_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n case HOLDING_HISTORY_LOADING:\n return {\n ...state,\n error: false,\n historyIsFetching: true,\n historyIsLoaded: false,\n }\n case HOLDING_HISTORY_FAIL:\n return {\n ...state,\n error: true,\n historyIsFetching: false,\n historyIsLoaded: true,\n }\n default:\n return state\n }\n}\n","import { GET_HOLDING_ID, EDIT_HOLDING_ID } from '../actions/types'\n\nconst initialState = {\n holdingId: -1\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_HOLDING_ID:\n return {\n ...state\n }\n case EDIT_HOLDING_ID:\n return {\n ...state,\n holdingId: action.payload\n }\n default:\n return state\n }\n}\n","import {\n GET_SECURITIES, EDIT_SECURITY, DELETE_SECURITY, ADD_SECURITY, SECURITY_LOADING, SECURITY_FAIL,\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n securities: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_SECURITIES:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n securities: action.payload\n }\n case EDIT_SECURITY:\n return {\n ...state,\n error: false,\n isFetching: false,\n securities: state.securities.map(security => {\n return security.id === action.payload.id ? action.payload : security\n }) // Replace matched security and returns the state.\n }\n case DELETE_SECURITY:\n return {\n ...state,\n error: false,\n isFetching: false,\n securities: state.securities.filter(security => security.id !== action.payload)\n }\n case ADD_SECURITY:\n return {\n ...state,\n error: false,\n isFetching: false,\n securities: [...state.securities, action.payload]\n }\n case SECURITY_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case SECURITY_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import {\n CREATE_LINK_TOKEN, CREATE_LINK_TOKEN_FAIL, DELETE_LINK_TOKEN_SUCCESS,\n CREATE_FIX_TOKEN, CREATE_FIX_TOKEN_FAIL, DELETE_FIX_TOKEN_SUCCESS,\n GET_LINK_ACCOUNTS, LINK_ACCOUNTS_LOADING, LINK_ACCOUNTS_FAIL,\n CREATE_LINK_TRANSACTIONS, GET_LINK_TRANSACTIONS, EDIT_LINK_TRANSACTION,\n LINK_TRANSACTIONS_LOADING, LINK_TRANSACTIONS_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isAccountFetching: true,\n isTransactionFetching: true,\n isAccountLoaded: false,\n isTransactionLoaded: false,\n linkToken: null,\n fixToken: null,\n linkAccounts: [],\n linkTransactions: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case CREATE_LINK_TOKEN:\n return {\n ...state,\n linkToken: action.payload,\n }\n case CREATE_FIX_TOKEN:\n return {\n ...state,\n fixToken: action.payload,\n }\n case GET_LINK_ACCOUNTS:\n return {\n ...state,\n error: false,\n isAccountFetching: false,\n isAccountLoaded: true,\n linkAccounts: action.payload\n }\n case CREATE_LINK_TRANSACTIONS:\n return {\n ...state,\n isTransactionFetching: false,\n isTransactionLoaded: true,\n }\n case GET_LINK_TRANSACTIONS:\n return {\n ...state,\n error: false,\n isTransactionFetching: false,\n isTransactionLoaded: true,\n linkTransactions: action.payload\n }\n case EDIT_LINK_TRANSACTION:\n return {\n ...state,\n error: false,\n isTransactionFetching: false,\n isTransactionLoaded: true,\n linkTransactions: state.linkTransactions.filter(transaction => transaction.id !== action.payload.id)\n } // Return the state minus the passed transaction id.\n case LINK_ACCOUNTS_LOADING:\n return {\n ...state,\n error: false,\n isAccountFetching: true,\n }\n case LINK_TRANSACTIONS_LOADING:\n return {\n ...state,\n error: false,\n isTransactionFetching: true,\n fixToken: null\n }\n case CREATE_FIX_TOKEN_FAIL:\n case DELETE_FIX_TOKEN_SUCCESS:\n return {\n ...state,\n fixToken: null\n }\n case DELETE_LINK_TOKEN_SUCCESS:\n case CREATE_LINK_TOKEN_FAIL:\n case LINK_ACCOUNTS_FAIL:\n case LINK_TRANSACTIONS_FAIL:\n localStorage.removeItem('ploutos-link-token')\n return {\n ...state,\n error: true,\n isAccountFetching: false,\n isTransactionFetching: false,\n linkToken: null,\n fixToken: null,\n }\n default:\n return state\n }\n}\n","import {\n GET_RECURRING_TRANSACTIONS, RECURRING_TRANSACTIONS_LOADING, RECURRING_TRANSACTIONS_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isRecurringTransactionsFetching: true,\n isRecurringTransactionsLoaded: false,\n recurringTransactions: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_RECURRING_TRANSACTIONS:\n return {\n ...state,\n error: false,\n isRecurringTransactionsFetching: false,\n isRecurringTransactionsLoaded: true,\n recurringTransactions: action.payload\n }\n case RECURRING_TRANSACTIONS_LOADING:\n return {\n ...state,\n error: false,\n isRecurringTransactionsFetching: true,\n }\n case RECURRING_TRANSACTIONS_FAIL:\n return {\n ...state,\n error: true,\n isRecurringTransactionsFetching: false\n }\n default:\n return state\n }\n}\n","import {\n GET_HISTORY_TRANSACTIONS, HISTORY_TRANSACTION_LOADING, HISTORY_TRANSACTION_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n transactions: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_HISTORY_TRANSACTIONS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n transactions: action.payload\n }\n case HISTORY_TRANSACTION_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case HISTORY_TRANSACTION_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}\n","import {\n GET_CUSTOMER, CREATE_CHECKOUT_SESSION, DELETE_CHECKOUT_SESSION,\n CUSTOMER_LOADING, CREATE_CHECKOUT_SESSION_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isLoading: false,\n isLoaded: false,\n checkoutSessionURL: null,\n customer: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_CUSTOMER:\n return {\n ...state,\n error: false,\n isLoading: false,\n isLoaded: true,\n checkoutSessionURL: null,\n customer: action.payload\n }\n case CREATE_CHECKOUT_SESSION:\n return {\n ...state,\n error: false,\n isLoaded: true,\n checkoutSessionURL: action.payload\n }\n case DELETE_CHECKOUT_SESSION:\n return {\n ...state,\n error: false,\n isLoaded: true,\n checkoutSessionURL: null\n }\n case CUSTOMER_LOADING:\n return {\n ...state,\n error: false,\n isLoading: true,\n isLoaded: false,\n }\n case CREATE_CHECKOUT_SESSION_FAIL:\n return {\n ...state,\n error: true,\n isLoading: false,\n isLoaded: true,\n checkoutSessionURL: null\n }\n default:\n return state\n }\n}\n","import { GET_ERRORS } from '../actions/types'\n\nconst initialState = {\n msg: {},\n status: null\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_ERRORS:\n return {\n msg: action.payload.msg,\n status: action.payload.status\n }\n default:\n return state\n }\n}","import { CREATE_TOAST, CREATE_MESSAGE, CLEAR_MESSAGES } from '../actions/types'\n\nconst initialState = {\n message: null,\n toast: null\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case CREATE_TOAST:\n return {\n ...state,\n message: null,\n toast: action.payload\n }\n case CREATE_MESSAGE:\n return {\n ...state,\n message: action.payload,\n toast: null\n }\n case CLEAR_MESSAGES:\n return {\n ...state,\n message: initialState.message,\n toast: initialState.toast\n }\n default:\n return state\n }\n}\n","import {\n USER_LOADED,\n USER_LOADING,\n AUTH_ERROR,\n AUTHENTICATED_SUCCESS,\n AUTHENTICATED_FAIL,\n LOGIN_SUCCESS,\n LOGIN_FAIL,\n LOGOUT_SUCCESS,\n REGISTER_SUCCESS,\n REGISTER_FAIL,\n ACTIVATION_SUCCESS,\n ACTIVATION_FAIL,\n PASSWORD_RESET_SUCCESS,\n PASSWORD_RESET_FAIL,\n PASSWORD_RESET_CONFIRM_SUCCESS,\n PASSWORD_RESET_CONFIRM_FAIL,\n EDIT_PROFILE,\n DELETE_USER_ACCOUNT,\n DELETE_USER_ACCOUNT_FAIL\n} from '../actions/types'\n\nconst initialState = {\n isAuthenticated: false,\n accountCreated: false,\n accountActivated: false,\n resetPasswordRequested: false,\n resetPasswordSuccess: false,\n isLoading: true,\n user: null\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case AUTHENTICATED_SUCCESS:\n return {\n ...state,\n isAuthenticated: true\n }\n case USER_LOADING:\n return {\n ...state,\n isLoading: true,\n isAuthenticated: false\n }\n case USER_LOADED:\n return {\n ...state,\n isAuthenticated: true,\n isLoading: false,\n user: action.payload\n }\n case LOGIN_SUCCESS:\n return {\n ...state,\n isAuthenticated: true,\n isLoading: false\n }\n case EDIT_PROFILE:\n return {\n ...state,\n user: action.payload\n }\n case ACTIVATION_SUCCESS:\n return {\n ...state,\n accountActivated: true,\n isLoading: false\n }\n case REGISTER_SUCCESS:\n return {\n ...state,\n isAuthenticated: false,\n accountCreated: action.payload,\n isLoading: false\n }\n case PASSWORD_RESET_SUCCESS:\n return {\n ...state,\n resetPasswordRequested: true,\n isLoading: false\n }\n case PASSWORD_RESET_CONFIRM_SUCCESS:\n return {\n ...state,\n resetPasswordSuccess: true,\n isLoading: false\n }\n case AUTHENTICATED_FAIL:\n return {\n ...state,\n isAuthenticated: false,\n isLoading: false\n }\n case AUTH_ERROR:\n case LOGIN_FAIL:\n case DELETE_USER_ACCOUNT:\n case LOGOUT_SUCCESS:\n case REGISTER_FAIL:\n case ACTIVATION_FAIL:\n localStorage.removeItem('ploutos-link-token')\n return {\n state: null,\n user: null,\n isAuthenticated: false,\n accountActivated: false,\n resetPasswordRequested: false,\n resetPasswordSuccess: false,\n isLoading: false,\n accountCreated: false\n }\n case DELETE_USER_ACCOUNT_FAIL:\n case PASSWORD_RESET_FAIL:\n case PASSWORD_RESET_CONFIRM_FAIL:\n return {\n ...state,\n isLoading: false\n }\n default:\n return state\n }\n}\n","import {\n GET_PROFILE_SETTINGS, ADD_PROFILE_SETTINGS, EDIT_PROFILE_SETTINGS,\n PROFILE_SETTINGS_LOADING, PROFILE_SETTINGS_FAIL\n} from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n profile: {},\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_PROFILE_SETTINGS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n profile: action.payload && action.payload.length > 0 ? action.payload[0] : {}\n }\n case ADD_PROFILE_SETTINGS:\n case EDIT_PROFILE_SETTINGS:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n profile: action.payload\n }\n case PROFILE_SETTINGS_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case PROFILE_SETTINGS_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import { GET_THEMES, THEME_LOADING, THEME_FAIL } from '../actions/types'\n\nconst initialState = {\n error: false,\n isFetching: true,\n isLoaded: false,\n themes: []\n}\n\nexport default function (state = initialState, action) {\n switch (action.type) {\n case GET_THEMES:\n return {\n ...state,\n error: false,\n isFetching: false,\n isLoaded: true,\n themes: action.payload\n }\n case THEME_LOADING:\n return {\n ...state,\n error: false,\n isFetching: true\n }\n case THEME_FAIL:\n return {\n ...state,\n error: true,\n isFetching: false,\n isLoaded: true,\n }\n default:\n return state\n }\n}","import { combineReducers } from 'redux'\nimport yearMonth from './budgetMonth'\nimport transactions from './transactions'\nimport transactionFlags from './transactionFlags'\nimport flagColors from './flagColors'\nimport transactionId from './transactionId'\nimport accountKey from './accountKey'\nimport accounts from './accounts'\nimport accountId from './accountId'\nimport accountGroups from './accountGroups'\nimport accountTypes from './accountTypes'\nimport payees from './payees'\nimport transfers from './transfers'\nimport splits from './splits'\nimport reports from './reports'\nimport categories from './categories'\nimport categoryId from './categoryId'\nimport categoryBudgets from './categoryBudgets'\nimport categoryBudgetId from './categoryBudgetId'\nimport categoryBalanceId from './categoryBalanceId'\nimport collections from './collections'\nimport collectionId from './collectionId'\nimport holdings from './holdings'\nimport holdingId from './holdingId'\nimport securities from './securities'\nimport links from './link'\nimport recurring from './recurring'\nimport history from './history'\nimport membership from './membership'\nimport errors from './errors'\nimport messages from './messages'\nimport auth from './auth'\nimport profile from './profile'\nimport theme from './theme'\n\nconst appReducer = combineReducers({\n budgetMonthReducer: yearMonth,\n transactionReducer: transactions,\n transactionFlagReducer: transactionFlags,\n flagColorReducer: flagColors,\n transactionIdReducer: transactionId,\n accountKeyReducer: accountKey,\n accountReducer: accounts,\n accountIdReducer: accountId,\n accountGroupReducer: accountGroups,\n accountTypeReducer: accountTypes,\n payeeReducer: payees,\n transferReducer: transfers,\n splitReducer: splits,\n reportReducer: reports,\n categoryReducer: categories,\n categoryIdReducer: categoryId,\n categoryBudgetReducer: categoryBudgets,\n categoryBudgetIdReducer: categoryBudgetId,\n categoryBalanceIdReducer: categoryBalanceId,\n collectionReducer: collections,\n collectionIdReducer: collectionId,\n holdingReducer: holdings,\n holdingIdReducer: holdingId,\n securityReducer: securities,\n linkReducer: links,\n recurringReducer: recurring,\n historyReducer: history,\n membershipReducer: membership,\n errorReducer: errors,\n messageReducer: messages,\n authReducer: auth,\n profileReducer: profile,\n themeReducer: theme\n})\n\nconst rootReducer = (state, action) => {\n // when a logout action is dispatched it will reset redux state\n if (action.type === 'LOGOUT_SUCCESS') state = undefined\n return appReducer(state, action)\n}\n\nexport default rootReducer\n","import { createStore, applyMiddleware } from 'redux'\nimport { composeWithDevTools } from 'redux-devtools-extension'\nimport thunk from 'redux-thunk'\nimport rootReducer from './reducers'\n\nconst initialState = {}\nconst middleware = [thunk]\n\nconst devTools =\n process.env.NODE_ENV === 'production'\n ? applyMiddleware(...middleware)\n : composeWithDevTools(applyMiddleware(...middleware))\n\nconst store = createStore(rootReducer, initialState, devTools)\n\nexport default store","import React, { Component, Fragment } from 'react'\nimport ReactDOM from 'react-dom'\nimport { BrowserRouter as Router, Routes, Route } from 'react-router-dom'\nimport { Provider } from 'react-redux'\nimport AdapterLuxon from '@mui/lab/AdapterLuxon'\nimport LocalizationProvider from '@mui/lab/LocalizationProvider'\nimport { Grid, CssBaseline } from '@mui/material'\n\nimport ThemeWrapper from './layout/ThemeWrapper'\nimport ErrorBoundary from './error/ErrorBoundary'\nimport Error404 from './error/Error404'\nimport AuthLoading from './loading/AuthLoading'\nimport Idle from './common/Idle'\nimport Header from './layout/Header'\nimport Alerts from './layout/Alerts'\nimport Message from './layout/Message'\nimport ToastWrapper from './layout/ToastWrapper'\nimport Login from './users/Login'\nimport AuthGoogle from './users/AuthGoogle'\nimport AuthApple from './users/AuthApple'\nimport Register from './users/Register'\nimport RegisterAcknowledge from './users/RegisterAcknowledge'\nimport Activate from './users/Activate'\nimport ResetPassword from './users/ResetPassword'\nimport ResetPasswordAcknowledge from './users/ResetPasswordAcknowledge'\nimport ResetPasswordConfirm from './users/ResetPasswordConfirm'\nimport SettingsDashboard from './users/SettingsDashboard'\nimport PrivateRoute from './common/PrivateRoute'\nimport Dashboard from './dashboard/Dashboard'\nimport BudgetDashboard from './budget/BudgetDashboard'\nimport Recurring from './recurring'\nimport History from './history'\nimport TransactionDashboard from './transaction/TransactionDashboard'\nimport HoldingDetail from './holdings/HoldingDetail'\nimport ReportDashboard from './report/ReportDashboard'\nimport LinkAccountDashboard from './link/LinkAccountDashboard'\nimport PayeeDashboard from './payee/PayeeDashboard'\nimport ArchiveDashboard from './archive/ArchiveDashboard'\nimport MembershipDashboard from './membership/MembershipDashboard'\nimport * as amplitude from '@amplitude/analytics-browser'\nimport store from '../store'\nimport { loadUser, logout } from '../actions/auth'\n\nclass App extends Component {\n componentDidMount() {\n try {\n store.dispatch(loadUser())\n\n if (process.env.NODE_ENV === 'production') {\n const AMPLITUDE_KEY = process.env.REACT_APP_AMPLITUDE_API_KEY\n if (AMPLITUDE_KEY) {\n amplitude.init(AMPLITUDE_KEY, { autocapture: true })\n }\n }\n } catch (err) {\n store.dispatch(logout())\n }\n }\n\n render() {\n return (\n <Provider store={store}>\n <ThemeWrapper>\n <CssBaseline />\n <Router>\n <Fragment>\n <ErrorBoundary>\n <AuthLoading>\n <Idle />\n <LocalizationProvider dateAdapter={AdapterLuxon}>\n <Header>\n <Alerts />\n <Message />\n <ToastWrapper />\n <Grid container>\n <Grid item xs={12}>\n <Routes>\n <Route\n exact\n path=\"/\"\n element={<PrivateRoute exact path=\"/\" component={Dashboard} />}\n />\n <Route\n exact\n path=\"/dashboard\"\n element={\n <PrivateRoute exact path=\"/dashboard\" component={Dashboard} />\n }\n />\n <Route\n exact\n path=\"/budget\"\n element={\n <PrivateRoute exact path=\"/budget\" component={BudgetDashboard} />\n }\n />\n <Route\n exact\n path=\"/recurring\"\n element={\n <PrivateRoute exact path=\"/recurring\" component={Recurring} />\n }\n />\n <Route\n exact\n path=\"/history\"\n element={<PrivateRoute exact path=\"/history\" component={History} />}\n />\n <Route\n exact\n path=\"/accounts\"\n element={\n <PrivateRoute\n exact\n path=\"/accounts\"\n component={TransactionDashboard}\n />\n }\n />\n <Route\n exact\n path=\"/accounts/:accountKey\"\n element={\n <PrivateRoute\n exact\n path=\"/accounts/:accountKey\"\n component={TransactionDashboard}\n />\n }\n />\n <Route\n exact\n path=\"/holdings/:holdingKey\"\n element={\n <PrivateRoute\n exact\n path=\"/holdings/:holdingKey\"\n component={HoldingDetail}\n />\n }\n />\n <Route\n exact\n path=\"/reports\"\n element={\n <PrivateRoute exact path=\"/reports\" component={ReportDashboard} />\n }\n />\n <Route\n exact\n path=\"/settings\"\n element={\n <PrivateRoute\n exact\n path=\"/settings\"\n component={SettingsDashboard}\n />\n }\n />\n <Route\n exact\n path=\"/link-accounts\"\n element={\n <PrivateRoute\n exact\n path=\"/link-accounts\"\n component={LinkAccountDashboard}\n />\n }\n />\n <Route\n exact\n path=\"/payees\"\n element={\n <PrivateRoute exact path=\"/payees\" component={PayeeDashboard} />\n }\n />\n <Route\n exact\n path=\"/archives\"\n element={\n <PrivateRoute exact path=\"/archives\" component={ArchiveDashboard} />\n }\n />\n <Route\n exact\n path=\"/membership\"\n element={\n <PrivateRoute\n exact\n path=\"/membership\"\n component={MembershipDashboard}\n />\n }\n />\n <Route exact path=\"/login\" element={<Login />} />\n <Route exact path=\"/auth/google\" element={<AuthGoogle />} />\n <Route exact path=\"/auth/apple\" element={<AuthApple />} />\n <Route exact path=\"/register\" element={<Register />} />\n <Route\n exact\n path=\"/register-acknowledge\"\n element={<RegisterAcknowledge />}\n />\n <Route exact path=\"/reset-password\" element={<ResetPassword />} />\n <Route\n exact\n path=\"/reset-password-acknowledge\"\n element={<ResetPasswordAcknowledge />}\n />\n <Route\n exact\n path=\"/password/reset/confirm/:uid/:token\"\n element={<ResetPasswordConfirm />}\n />\n <Route exact path=\"/activate/:uid/:token\" element={<Activate />} />\n <Route path=\"*\" element={<Error404 />} />\n </Routes>\n </Grid>\n </Grid>\n </Header>\n </LocalizationProvider>\n </AuthLoading>\n </ErrorBoundary>\n </Fragment>\n </Router>\n </ThemeWrapper>\n </Provider>\n )\n }\n}\n\nReactDOM.render(<App />, document.getElementById('app'))\n","import './index.css'\nimport 'regenerator-runtime/runtime.js'\nimport './components/App'\n\n\nwindow.addEventListener('load', () => {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.register('/sw.js')\n .then(function (registration) {\n // Successful registration\n registration.update() // Immediately update\n }).catch(function (error) {\n // Failed registration, service worker won’t be installed\n // console.log({ error })\n })\n }\n})\n"],"sourceRoot":""}