actual/packages/browser/build/static/js/main.a27b6a9d.chunk.js.map
2022-04-28 22:44:38 -04:00

1 line
1.6 MiB

{"version":3,"sources":["../../loot-design/src/components/common.js","../../loot-design/src/components/tooltips.js","../../loot-core/src/client/constants.js","../../loot-design/src/svg/v1/Checkmark.web.js","../../loot-core/src/client/actions/app.js","../../loot-design/src/components/Text.js","../../loot-design/src/svg/Delete.web.js","../../loot-design/src/svg/ExpandArrow.web.js","../../loot-core/src/client/actions/prefs.js","../../loot-core/src/client/actions/user.js","../../loot-core/src/client/actions/notifications.js","../../loot-core/src/shared/errors.js","../../loot-core/src/client/query-helpers.js","../../loot-core/src/shared/async.js","../../loot-core/src/client/actions/tutorial.js","../../loot-design/src/components/useProperFocus.js","components/LoggedInUser.js","components/Notifications.js","../../loot-design/src/components/modals/LoadBackup.js","../../loot-design/src/components/useResizeObserver.js","../../loot-design/src/components/KeyHandlers.js","../../loot-design/src/style.js","components/modals/CreateEncryptionKey.js","components/modals/FixEncryptionKey.js","../../loot-core/src/client/actions/account.js","../../loot-core/src/client/actions/debug.js","../../loot-core/src/client/actions/backups.js","../../loot-core/src/client/actions/sync.js","../../loot-core/src/client/actions/index.js","../../loot-design/src/components/Stack.js","../../loot-design/src/components/useSelected.js","components/Background.js","components/AppBackground.js","../../loot-core/src/platform/client/fetch/index.browser.js","../../loot-design/src/components/spreadsheet/format.js","../../loot-core/src/client/reducers/queries.js","browser-server.js","components/App.js","polyfills.js","components/FatalError.js","../../loot-design/src/components/FixedSizeList.js","../../loot-design/src/components/DateSelect.left.png","../../loot-design/src/components/DateSelect.right.png","../../loot-core/src/client/upgrade-notifications.js","../../loot-design/src/util/keys.js","components/manager/bg.svg","components/MobileWebMessage.js","global-events.js","../../loot-design/src/components/spreadsheet/useSheetValue.js","../../loot-core/src/client/shared-listeners.js","../../loot-core/src/client/SpreadsheetProvider.js","../../loot-design/src/svg/v1/Refresh.web.js","components/AnimatedRefresh.js","components/BankSyncStatus.js","../../loot-design/src/components/budget/BudgetMonthCountContext.js","components/Page.js","util/location-state.js","components/ActiveLocation.js","../../loot-core/src/client/data-hooks/payees.js","../../loot-core/src/client/data-hooks/accounts.js","../../loot-core/src/client/queries.js","../../loot-design/src/svg/v2/Calendar.web.js","components/budget/MonthCountSelector.js","../../loot-design/src/svg/v2/ArrowButtonRight1.web.js","../../loot-design/src/svg/v2/NavigationMenu.web.js","../../loot-design/src/svg/v1/ArrowLeft.web.js","../../loot-design/src/svg/v2/AlertTriangle.web.js","../../loot-design/src/svg/v1/ExclamationOutline.web.js","plaid.js","components/accounts/AccountSyncCheck.js","../../loot-design/src/components/spreadsheet/CellValue.js","../../loot-design/src/svg/v1/Add.web.js","../../loot-design/src/svg/v1/Wallet.web.js","../../loot-design/src/svg/v1/Reports.web.js","../../loot-design/src/svg/v2/ArrowButtonLeft1.web.js","../../loot-design/src/svg/v1/PiggyBank.web.js","../../loot-design/src/svg/v1/Cog.web.js","../../loot-design/src/components/sort.js","../../loot-design/src/components/sidebar.js","components/SidebarWithData.js","components/FloatableSidebar.js","components/Titlebar.js","../../loot-design/src/components/TutorialPoint.js","../../loot-design/src/svg/v2/Pencil1.web.js","../../loot-design/src/svg/v2/SearchAlternate.web.js","../../loot-design/src/svg/v2/DownloadThickBottom.web.js","../../loot-design/src/svg/v1/CheveronDown.web.js","../../loot-design/src/svg/v2/CheckCircle1.web.js","../../loot-design/src/svg/v2/ArrowsExpand3.web.js","../../loot-design/src/svg/v2/ArrowsShrink3.web.js","../../loot-core/src/client/query-hooks.js","../../loot-core/src/shared/transactions.js","../../loot-design/src/svg/v2/Remove.web.js","../../loot-design/src/components/Autocomplete.js","../../loot-design/src/svg/split.web.js","../../loot-design/src/components/CategorySelect.js","../../loot-design/src/components/PayeeAutocomplete.js","../../loot-design/src/components/AccountAutocomplete.js","../../loot-design/src/svg/RightArrow2.web.js","../../loot-design/src/svg/LeftArrow2.web.js","../../loot-design/src/svg/v2/Hyperlink2.web.js","../../loot-design/src/svg/v2/ArrowsSynchronize.web.js","../../loot-core/src/shared/arithmetic.js","../../loot-design/src/svg/v2/EditSkull1.web.js","../../loot-design/src/svg/v2/ValidationCheck.web.js","../../loot-design/src/svg/v2/FavoriteStar.web.js","components/schedules/StatusBadge.js","../../loot-core/src/shared/schedules.js","../../loot-core/src/client/data-hooks/schedules.js","components/accounts/TransactionsTable.js","../../loot-design/src/components/useMergedRefs.js","components/accounts/TransactionList.js","../../loot-core/src/shared/rules.js","../../loot-design/src/svg/v2/SettingsSliderAlternate.web.js","../../loot-design/src/svg/Subtract.web.js","../../loot-design/src/svg/Add.web.js","../../loot-design/src/components/RecurringSchedulePicker.js","components/util/GenericInput.js","../../loot-design/src/svg/v1/InformationOutline.web.js","components/modals/ManageRules.js","components/accounts/Filters.js","components/accounts/Account.js","../../loot-design/src/components/budget/MonthsContext.js","../../loot-design/src/components/budget/util.js","../../loot-design/src/components/budget/constants.js","../../loot-design/src/components/budget/rollover/TransferTooltip.js","../../loot-design/src/svg/v1/ArrowThinRight.web.js","../../loot-design/src/components/budget/BalanceWithCarryover.js","../../loot-design/src/svg/v2/ArrowButtonDown1.web.js","../../loot-design/src/svg/v2/ArrowButtonUp1.web.js","../../loot-design/src/components/budget/rollover/RolloverContext.js","../../loot-design/src/components/budget/rollover/HoldTooltip.js","../../loot-design/src/svg/v2/CustomNotesPaper.web.js","../../loot-design/src/components/NotesButton.js","../../loot-design/src/components/budget/rollover/BudgetSummary.js","../../loot-design/src/components/budget/rollover/rollover-components.js","../../loot-design/src/components/budget/report/ReportContext.js","../../loot-design/src/components/budget/report/BudgetSummary.js","../../loot-design/src/components/budget/report/components.js","../../loot-design/src/components/ElementQuery.js","../../loot-design/src/svg/v1/ArrowThinLeft.web.js","../../loot-design/src/components/budget/BudgetSummaries.js","../../loot-design/src/components/budget/index.js","../../loot-design/src/components/budget/DynamicBudgetTable.js","../../loot-core/src/shared/categories.js","components/budget/index.js","components/reports/util.js","components/reports/chart-theme.js","components/reports/Container.js","components/reports/Tooltip.js","components/reports/useReport.js","components/reports/graphs/net-worth-spreadsheet.js","components/reports/graphs/cash-flow-spreadsheet.js","components/reports/graphs/NetWorthGraph.js","components/reports/Change.js","components/reports/DateRange.js","components/reports/Overview.js","components/reports/Header.js","components/reports/NetWorth.js","components/reports/graphs/CashFlowGraph.js","components/reports/CashFlow.js","components/reports/index.js","../../loot-design/src/svg/v2/Check.web.js","components/util/DisplayId.js","components/schedules/SchedulesTable.js","components/schedules/index.js","../../loot-design/src/components/forms.js","components/accounts/SimpleTransactionsTable.js","../../loot-design/src/svg/v1/Subtract.web.js","components/util/AmountInput.js","components/modals/EditRule.js","components/schedules/EditSchedule.js","components/schedules/LinkSchedule.js","components/schedules/DiscoverSchedules.js","components/schedules/PostsOfflineNotification.js","components/tools/FixSplitsTool.js","../../loot-design/src/components/alerts.js","components/Settings.js","components/modals/CreateAccount.js","../../loot-core/src/shared/accounts.js","../../loot-design/src/components/modals/CreateLocalAccount.js","../../loot-design/src/components/modals/CloseAccount.js","../../loot-design/src/components/modals/SelectLinkedAccounts.js","../../loot-design/src/components/modals/ConfigureLinkedAccounts.js","../../loot-design/src/svg/merge.web.js","../../loot-design/src/components/payees.js","components/payees/ManagePayeesWithData.js","components/modals/MergeUnusedPayees.js","../../loot-design/src/components/modals/PlaidExternalMsg.js","components/modals/ConfirmCategoryDelete.js","components/modals/WelcomeScreen.js","../../loot-design/src/components/modals/ImportTransactions.js","../../loot-design/src/components/modals/EditField.js","components/Modals.js","components/GlobalKeys.js","components/FinancesApp.js","components/manager/ServerURL.js","../../loot-design/src/svg/v1/CloudCheck.web.js","../../loot-design/src/svg/v1/CloudDownload.web.js","../../loot-design/src/svg/v2/CloudUnknown.web.js","../../loot-design/src/svg/v1/FileDouble.web.js","../../loot-design/src/svg/v2/Key.web.js","../../loot-design/src/svg/v2/RefreshArrow.web.js","../../loot-design/src/components/manager/BudgetList.js","../../loot-design/src/components/manager/Import.js","../../loot-design/src/components/manager/ImportYNAB4.js","../../loot-design/src/components/manager/ImportYNAB5.js","../../loot-design/src/components/manager/DeleteFile.js","components/manager/Modals.js","components/manager/subscribe/common.js","components/manager/subscribe/Login.js","components/manager/subscribe/ConfirmPasswordForm.js","components/manager/subscribe/Bootstrap.js","components/manager/subscribe/Error.js","components/manager/subscribe/ChangePassword.js","components/manager/ConfigServer.js","components/manager/ManagementApp.js","../../loot-design/src/svg/v1/Close.web.js","components/UpdateNotification.js","browser-preload.browser.js","../../loot-core/src/platform/exceptions/index.browser.js","../../loot-design/src/components/View.js","../../loot-core/src/client/actions/modals.js","../../loot-core/src/client/platform.js","../../loot-core/src/client/reducers/app.js","../../loot-core/src/client/reducers/account.js","../../loot-core/src/client/reducers/debug.js","../../loot-core/src/client/reducers/profile.js","../../loot-core/src/client/reducers/prefs.js","../../loot-core/src/client/reducers/modals.js","../../loot-core/src/client/reducers/notifications.js","../../loot-core/src/client/reducers/budgets.js","../../loot-core/src/client/reducers/tutorial.js","../../loot-core/src/client/reducers/user.js","../../loot-core/src/client/reducers/index.js","index.js","../../loot-core/src/client/actions/budgets.js","../../loot-design/src/components/table.js","../../loot-core/src/platform/client/undo/index.web.js","../../loot-core/src/client/actions/queries.js","../../loot-design/src/components/spreadsheet/SpreadsheetContext.js","../../loot-design/src/svg/v1/Loading.web.js","../../loot-design/src/svg/v1/AnimatedLoading.web.js","../../loot-design/src/components/spreadsheet/NamespaceContext.js","../../loot-core/src/shared/query.js","../../loot-design/src/svg/v1/DotsHorizontalTriple.web.js","../../loot-design/src/components/DateSelect.js","../../loot-core/src/shared/months.js","../../loot-core/src/shared/util.js","../../loot-design/src/components/spreadsheet/SheetValue.js","../../loot-core/src/platform/uuid/index.web.js"],"names":["useStableCallback","callback","callbackRef","useRef","memoCallback","useCallback","args","current","useLayoutEffect","Block","props","style","innerRef","restProps","_objectWithoutProperties","_excluded","react__WEBPACK_IMPORTED_MODULE_0___default","a","createElement","Object","assign","ref","className","css","textDecoration","color","styles","text","backgroundColor","border","cursor","padding","font",":hover","Link","_ref45","children","nativeProps","_excluded2","_ref","smallText","AnchorLink","staticContext","to","exact","activeStyle","useHistory","createHref","pathname","match","useRouteMatch","path","react_router_dom__WEBPACK_IMPORTED_MODULE_6__","ExternalLink","React","forwardRef","onClick","e","preventDefault","window","Actual","openURLInBrowser","href","asAnchor","Button","bare","ButtonLink","withRouter","_ref46","history","location","_excluded3","react_router_dom__WEBPACK_IMPORTED_MODULE_5__","push","_ref47","pressed","primary","hover","disabled","hoveredStyle","_ref47$as","as","_excluded4","boxShadow","shadow","transform","transition","Component","buttonStyle","_objectSpread","alignItems","justifyContent","flexShrink","margin","overflow","display","borderRadius","colors","n7","p5","n9","n6","n1",":active","position","top","left","right","bottom","width","height","ButtonWithLoading","loading","buttonProps","_excluded5","_ref2","_View__WEBPACK_IMPORTED_MODULE_13__","_ref3","_svg_v1_AnimatedLoading__WEBPACK_IMPORTED_MODULE_11__","_ref4","opacity","flexDirection","defaultInputStyle","outline",":focus","b5","b7","::placeholder","Input","_ref48","inputRef","onEnter","onUpdate","focused","_excluded6","useProperFocus","mergeRefs","_ref5","onKeyDown","keyCode","onChange","target","value","flex","&, &:focus, &:hover","InputWithContent","_ref49","leftContent","rightContent","inputStyle","getStyle","_excluded7","_useState2","_slicedToArray","useState","setFocused","_ref6","_ref7","_ref8","onFocus","onBlur","fontSize","Select","_ref50","_excluded8","_ref9","lineHeight","borderWidth","paddingTop","zIndex","CustomSelect","options","_reach_listbox__WEBPACK_IMPORTED_MODULE_7__","_ref10","_ref11","arrow","loot_design_src_svg_ExpandArrow__WEBPACK_IMPORTED_MODULE_12__","_ref12","_ref13","map","label","key","Keybinding","keyName","_Text__WEBPACK_IMPORTED_MODULE_14__","_ref14","borderTop","n10","textTransform","Menu","header","footer","items","allItems","onMenuSelect","el","filter","x","_useState4","hoveredIndex","setHoveredIndex","useEffect","focus","filteredItems","item","line","type","currentIndex","indexOf","transformIndex","idx","Math","max","min","length","name","addEventListener","removeEventListener","_ref15","tabIndex","_ref16","_ref17","_ref18","lastItem","marginTop","_ref19","_ref20","onMouseEnter","onMouseLeave","_ref21","icon","iconSize","marginRight","_ref22","Symbol","textAlign","AlignedText","_ref51","leftStyle","rightStyle","_ref51$truncate","truncate","_excluded9","truncateStyle","textOverflow","whiteSpace","_ref23","_ref24","_ref25","marginBottom","P","_ref52","isLast","_excluded10","_ref27","_ref28","ModalContent","size","noAnimation","isCurrent","stackIndex","contentRef","mounted","rotateFactor","random","setProps","pointerEvents","setTimeout","_ref30","n2","alignSelf","fontWeight","Modal","title","isHidden","showHeader","showTitle","showClose","showOverlay","focusAfterClose","parent","contentStyle","overlayStyle","onClose","prevScope","hotkeys","getScope","setScope","react_modal__WEBPACK_IMPORTED_MODULE_4___default","isOpen","onRequestClose","shouldCloseOnOverlayClick","shouldFocusAfterRender","global","IS_DESIGN_MODE","shouldReturnFocusAfterClose","appElement","document","querySelector","parentSelector","content","overlay","willChange","minWidth","minHeight","shadowLarge","lightScrollbar","_ref31","_ref32","_ref33","_ref34","_ref35","_ref36","_svg_Delete__WEBPACK_IMPORTED_MODULE_10__","_ref37","_ref38","ModalButtons","focusButton","containerRef","button","_ref39","data-hidden","_ref40","_ref41","InlineField","labelWidth","paddingRight","FormError","_ref42","InitialFocus","node","setSelectionRange","cloneElement","HoverTarget","[object Object]","super","this","state","hovered","setState","componentDidUpdate","prevProps","render","_this$props","renderContent","IntersectionBoundary","createContext","useTooltip","setIsOpen","getOpenEvents","events","stopPropagation","close","Tooltip","constructor","createRef","setup","layout","mousedownHandler","documentElement","dataset","testid","reachPopover","parentNode","cleanup","componentDidMount","getContainer","forceUpdate","console","log","targetRect","forceTop","forceLayout","_this$props$ignoreBou","ignoreBoundary","context","body","getBoundsContainer","container","_this$props$offset","offset","contentEl","box","getBoundingClientRect","anchorEl","anchorRect","containerRect","boxHeight","testTop","testBottom","getOppositePosition","scrollTop","getStyleForPosition","componentWillUnmount","boxRect","Error","_this$props2","ReactDOM","createPortal","darkScrollbar","data-testid","contextType","__webpack_exports__","LOAD_TRANSACTIONS","SET_NEW_TRANSACTIONS","UPDATE_NEW_TRANSACTIONS","SET_LAST_TRANSACTION","MARK_ACCOUNT_READ","LOAD_ACCOUNTS","UPDATE_ACCOUNT","LOAD_CATEGORIES","ADD_CATEGORY","DELETE_CATEGORY","LOAD_PAYEES","LOAD_BANKS","SET_PROFILE","SET_PREFS","MERGE_LOCAL_PREFS","MERGE_GLOBAL_PREFS","SET_BUDGETS","SET_REMOTE_FILES","SET_ALL_FILES","SET_AVAILABLE_IMPORTS","CLOSE_BUDGET","SET_APP_STATE","DEBUG_CELL","PUSH_MODAL","REPLACE_MODAL","HIDE_MODALS","SHOW_MODALS","CLOSE_MODAL","POP_MODAL","ADD_NOTIFICATION","REMOVE_NOTIFICATION","GET_USER_DATA","SET_LAST_UNDO_STATE","SET_LAST_SPLIT_STATE","SET_ACCOUNTS_SYNCING","ACCOUNT_SYNC_STATUS","ACCOUNT_SYNC_FAILURES","SIGN_OUT","SET_TUTORIAL_STAGE","DEACTIVATE_TUTORIAL","SvgCheckmark","viewBox","d","fill","__webpack_require__","setAppState","updateApp","setLastUndoState","uploadFile","_platform_client_fetch__WEBPACK_IMPORTED_MODULE_0__","_constants__WEBPACK_IMPORTED_MODULE_1__","constants","async","applyAppUpdate","dispatch","updateInfo","undoState","filename","contents","send","Text","numberOfLines","Delete","_ref$color","version","xmlns","stroke","strokeWidth","strokeLinecap","strokeMiterlimit","x1","y1","x2","y2","ExpandArrow","loadPrefs","savePrefs","loadGlobalPrefs","saveGlobalPrefs","_constants__WEBPACK_IMPORTED_MODULE_0__","_modals__WEBPACK_IMPORTED_MODULE_1__","_platform_client_fetch__WEBPACK_IMPORTED_MODULE_2__","getState","prefs","currentPrefs","local","id","closeModal","globalPrefs","getUserData","loggedIn","signOut","_prefs__WEBPACK_IMPORTED_MODULE_2__","_budgets__WEBPACK_IMPORTED_MODULE_3__","data","loadAllFiles","closeBudget","uuid","require","addNotification","notification","v4Sync","addGenericErrorNotification","message","removeNotification","getUploadError","reason","meta","isMissingKey","getDownloadError","fileName","fileId","getCreateKeyError","error","getTestKeyError","runQuery","liveQuery","pagedQuery","query_helpers_LiveQuery","query_helpers_PagedQuery","q","query","serialize","onData","opts","LiveQuery","run","PagedQuery","prevData","i","listeners","tables","dependencies","find","table","has","subscribe","_fetchData","reqId","inflightRequestId","_await$makeRequest","makeRequest","Set","_unsubscribe","mappedData","mapData","listen","onlySync","unsubscribe","mapper","getQuery","getData","getNumListeners","isRunning","_optimisticUpdate","dataFunc","mappedDataFunc","optimisticUpdate","prevMappedData","inflight","restart","addListener","func","l","_fetchCount","calculate","$count","then","totalCount","runPromise","done","limit","pageCount","refetchUpToRow","defaultOrderBy","orderDesc","getPrimaryOrderBy","field","order","result","select","fullRow","concat","_fetchNext","previousData","mapped","onPageData","fetchNext","fn","promise","finally","once","isFinished","getTotalCount","startTutorialFirstTime","_platform_client_fetch__WEBPACK_IMPORTED_MODULE_1__","_platform__WEBPACK_IMPORTED_MODULE_2__","_modals__WEBPACK_IMPORTED_MODULE_3__","seenTutorial","Platform","env","pushModal","AvoidRefocusScrollProvider","react__WEBPACK_IMPORTED_MODULE_0__","n","AvoidRefocusScrollContext","keyRef","useMemo","onKeyChange","Provider","shouldFocus","useContext","prevShouldFocus","prev","view","selector","focusEl","matches","refocusContext","focusKey","getFocusedKey","preventScroll","tagName","focusElement","n5","fontStyle","connect","userData","user","files","budgets","allFiles","budgetId","actions","setLoading","menuOpen","setMenuOpen","loot_design_src_components_common__WEBPACK_IMPORTED_MODULE_5__","offline","__history","onChangePassword","Notification","onRemove","messageActions","sticky","internal","overlayLoading","setOverlayLoading","positive","processedMessage","loot_design_src_components_common__WEBPACK_IMPORTED_MODULE_4__","spacing","split","paragraph","parts","part","_match","actionName","slice","compileMessage","g3","r3","align","direction","g11","r11","y10","g5","r5","y4","maxWidth","& a","action","r4","y3","&:hover, &:active","g9","r10","y9","loot_design_src_svg_Delete__WEBPACK_IMPORTED_MODULE_5__","loot_design_src_svg_v1_AnimatedLoading__WEBPACK_IMPORTED_MODULE_6__","notifications","bindActionCreators","note","_common__WEBPACK_IMPORTED_MODULE_1__","_table__WEBPACK_IMPORTED_MODULE_2__","_style__WEBPACK_IMPORTED_MODULE_3__","maxHeight","paddingLeft","BackupTable","hoveredBackup","onHover","backups","onSelect","backup","collapsed","date","valueStyle","marginLeft","LoadBackup","backupDisabled","modalProps","latestBackup","isLatest","previousBackups","loadBackup","makeBackup","useResizeObserver","observer","ResizeObserver","entries","contentRect","disconnect","observe","KeyHandlers","hotkeys_js__WEBPACK_IMPORTED_MODULE_0__","react__WEBPACK_IMPORTED_MODULE_1__","react__WEBPACK_IMPORTED_MODULE_1___default","KeyScopeContext","KeyHandler","eventType","handler","scope","_handler","event","hk","keyup","unbind","method","keys","srcElement","metaKey","isContentEditable","readOnly","hasHiddenScrollbars","loot_core_src_client_platform__WEBPACK_IMPORTED_MODULE_0__","y5","y6","y7","y8","y11","r1","r2","r6","r7","r8","r9","b1","b2","b3","b4","b6","b8","b9","b10","b11","n3","n4","n8","n11","g1","g2","g4","g6","g7","g8","g10","p1","p2","p3","p4","p6","p7","p8","p9","p10","p11","selected","resolve","veryLargeText","largeText","letterSpacing","mediumText","verySmallText","page","pageHeader","borderBottomWidth","borderColor","purple2","borderStyle","grey4","paddingBottom","pageContent","staticText","userSelect","tnum","fontFeatureSettings","notFixed","hiddenScrollbars","onScrollbarChange","& ::-webkit-scrollbar","& ::-webkit-scrollbar-thumb","backgroundClip","& ::-webkit-scrollbar-thumb:vertical","scrollbarWidth","testScrollbars","innerHTML","appendChild","testNode","childNodes","offsetWidth","clientWidth","& li","CreateEncryptionKey","password","setPassword","_useState6","_useState8","setError","_useState10","showPassword","setShowPassword","isRecreating","recreate","loot_design_src_components_common__WEBPACK_IMPORTED_MODULE_2__","popModal","Fragment","onSubmit","res","sync","onCreateKey","FixEncryptionKey","hasExistingKey","cloudFileId","onSuccess","onUpdateKey","loot_design_src_components_common__WEBPACK_IMPORTED_MODULE_1__","onBack","setAccountsSyncing","markAccountFailed","errorType","errorCode","failed","markAccountSuccess","setFailedAccounts","syncErrors","unlinkAccount","getAccounts","linkAccount","institution","publicToken","accountId","upgradingId","getPayees","connectAccounts","accountIds","offbudgetIds","ids","syncAccounts","account","accountsSyncing","queries","accounts","_await$send","errors","newTransactions","matchedTransactions","updatedAccounts","category","code","forEach","setLastTransaction","transaction","parseTransactions","filepath","importTransactions","transactions","_await$send2","_await$send2$errors","added","updated","updateNewTransactions","changedId","markAccountRead","getBanks","banks","debugCell","sheet","backupId","loadBudget","unregister","profile","resetSync","alert","syncAndDownload","syncState","hasDownloaded","hasUpdated","modals","actions_prefs","app","tutorial","_View__WEBPACK_IMPORTED_MODULE_1__","_Text__WEBPACK_IMPORTED_MODULE_2__","Stack","justify","debug","isReversed","endsWith","isHorizontal","startsWith","validChildren","getChildren","Children","toArray","reduce","list","child","index","marginProp","isLastChild","iterateRange","range","from","start","end","useSelected","initialSelectedIds","_useReducer2","useReducer","selectedRange","selectedItems","hasModifierKey","deleteUntil","findIndex","p","startIdx","endIdx","add","delete","prevItems","every","filtered","prevState","undo","lastUndoState","useSelector","onUndo","messages","undoTag","tagged","deletedIds","msg","column","row","setItems","setSelectedItems","SelectedDispatch","SelectedItems","useSelectedDispatch","useSelectedItems","SelectedProvider","instance","fetchAllIds","latestItems","SelectedProviderWithItems","registerDispatch","background","BG","backgroundSize","Background","react_default","AppBackground","initializing","loadingText","components_Background","common","AppBackground_ref","AnimatedLoading_web","_require","captureException","captureBreadcrumb","replyHandlers","Map","messageQueue","globalWorker","ReconstructedError","stack","url","defineProperty","get","_stack","set","connectWorker","worker","onOpen","onError","postMessage","exc","includes","mutated","gc","listens","JSON","stringify","handleMessage","MessagePort","module","exports","init","Promise","reject","catchErrors","v4","snapshot","sendCatch","cb","arr","cb_","unlisten","format","loot_core_src_shared_util__WEBPACK_IMPORTED_MODULE_0__","val","charAt","formatted","integerToCurrency","parsed","parseFloat","isNaN","initialState","lastTransaction","categories","grouped","payees","earliestTransaction","update","group","groupId","cat","getAccountsById","memoizeOne","groupById","getPayeesById","getCategoriesById","categoryGroups","getActivePayees","accountsById","payee","transfer_acct","closed","Worker_fn","Worker","react_redux__WEBPACK_IMPORTED_MODULE_1__","glamor__WEBPACK_IMPORTED_MODULE_2__","loot_core_src_client_actions__WEBPACK_IMPORTED_MODULE_3__","loot_core_src_platform_client_fetch__WEBPACK_IMPORTED_MODULE_4__","_polyfills__WEBPACK_IMPORTED_MODULE_5__","loot_design_src_style__WEBPACK_IMPORTED_MODULE_6__","_FatalError__WEBPACK_IMPORTED_MODULE_7__","_manager_ManagementApp__WEBPACK_IMPORTED_MODULE_8__","_FinancesApp__WEBPACK_IMPORTED_MODULE_9__","_AppBackground__WEBPACK_IMPORTED_MODULE_10__","_UpdateNotification__WEBPACK_IMPORTED_MODULE_11__","_MobileWebMessage__WEBPACK_IMPORTED_MODULE_12__","showingTutorial","stage","fatalError","socketName","getServerSocket","initConnection","remoteFile","f","deleted","all","installPolyfills","checkScrollbars","componentDidCatch","errorInfo","SentryClient","extra","updateAppMenu","_this$state","buttonText","bind","loot_design_src_style__WEBPACK_IMPORTED_MODULE_2__","FatalError","showError","renderSimple","IDBFailure","relaunch","IS_SCROLLING_DEBOUNCE_INTERVAL","defaultItemKey","onResize","FixedSizeList","PureComponent","_outerRef","_resetIsScrollingTimeoutId","setRowAnimation","flag","animationEnabled","outerRef","classList","remove","onHeaderResize","rect","getItemOffset","itemSize","getItemSize","getEstimatedTotalSize","itemCount","getOffsetForIndexAndAlignment","scrollOffset","lastItemOffset","maxOffset","minOffset","middleOffset","round","ceil","floor","getStartIndexForOffset","getStopIndexForStartIndex","startIndex","numVisibleItems","_callOnItemsRendered","overscanStartIndex","overscanStopIndex","visibleStartIndex","visibleStopIndex","onItemsRendered","_callOnScroll","scrollDirection","scrollUpdateWasRequested","onScroll","_getItemStyle","itemStyleCache","_getItemStyleCache","hasOwnProperty","_","__","___","_onScrollVertical","_event$currentTarget","currentTarget","clientHeight","scrollHeight","isScrolling","_resetIsScrollingDebounced","_outerRefSetter","clearTimeout","_resetIsScrolling","lastPositions","needsAnimationRerender","initialScrollOffset","scrollTo","requestScrollUpdateHandled","scrollToItem","_callPropsCallbacks","getAnchoredScrollPos","anchored","indexForKey","baseOffset","anchoredPos","rerenderTimeout","_this$props3","innerElementType","innerTagName","renderRow","_this$props3$itemKey","itemKey","outerElementType","outerTagName","useIsScrolling","_this$_getRangeToRend2","_getRangeToRender","stopIndex","positions","lastPosition","animating","undefined","isAnimating","estimatedTotalSize","OuterElement","InnerElement","headerRef","_common__WEBPACK_IMPORTED_MODULE_3__","anchor","unanchor","isAnchored","_this$_getRangeToRend4","_this$state2","_this$props4","overscanCount","_this$state3","overscanBackward","overscanForward","defaultProps","headerHeight","checkForUpgradeNotifications","_platform__WEBPACK_IMPORTED_MODULE_1__","types","IS_BETA","locationPtr","ESC","TAB","ENTER","SHIFT","ALT","META","CTRL","SPACE","UP","DOWN","J","K","X","_keyHandlers","_modifierState","shift","ctrl","alt","modifier","handlers","toUpperCase","MobileWebMessage","appStoreURL","ua","navigator","userAgent","iOS","webkit","isOSX","innerWidth","cookie","show","setShow","Date","setTime","getTime","toGMTString","handleGlobalEvents","loot_core_src_platform_client_fetch__WEBPACK_IMPORTED_MODULE_0__","loot_core_src_platform_client_undo__WEBPACK_IMPORTED_MODULE_1__","loot_core_src_client_shared_listeners__WEBPACK_IMPORTED_MODULE_2__","store","onEventFromMain","info","status","updateStatusText","orphanedIds","updatedPayeeIds","payeeIds","targetPayeeId","sharedListeners","promises","getCategories","openModal","modalStack","replaceModal","closeBudgetUI","useSheetValue","binding","IS_TESTING","toString","sheetName","NamespaceContext","unresolved","unresolveName","spreadsheet","SpreadsheetContext","setResult","latestOnChange","latestValue","createQuery","newResult","listenForSyncEvent","attemptedSyncRepair","subtype","notif","learnMore","makeKey","uploadBudget","_store$getState$prefs","upload","closeAndDownloadBudget","SpreadsheetProvider","cellObservers","LRUValueCache","LRU","cellCache","observersDisabled","observeCell","disableObservers","enableObservers","prewarmCache","nodes","observers","fields","resolvedName","req","getCellNames","makeSpreadsheet","react","SvgRefresh","spin","keyframes","0%","100%","AnimatedRefresh","iconStyle","animation","Refresh_web","AnimatedRefresh_objectSpread","transitions","useTransition","enter","leave","unique","BankSyncStatus_ref","web","div","BankSyncStatus_ref3","BudgetMonthCountContext","BudgetMonthCountProvider","displayMax","setDisplayMax","mitt","useBudgetMonthCount","PageTypeContext","PageTypeProvider","usePageType","PageTitle","Page_ref","Page","modalSize","_usePageType","goBack","Page_ref2","VERSION","now","getLocationState","subfield","_version","ActiveLocationContext","ActiveLocationProvider","PayeesContext","PayeesProvider","payees_slicedToArray","setData","usePayees","CachedPayees","idKey","useCachedPayees","AccountsContext","AccountsProvider","accounts_slicedToArray","useAccounts","CachedAccounts","useCachedAccounts","getAccountFilter","is_parent","$or","payee.transfer_acct.offbudget","payee.transfer_acct","accountBalance","acct","splits","$sum","budgetedAccountBalance","account.offbudget","account.closed","offbudgetAccountBalance","uncategorizedQuery","rolloverBudget","incomeAvailable","lastMonthOverspent","forNextMonth","totalBudgeted","toBudget","fromLastMonth","totalIncome","totalSpent","totalBalance","groupSumAmount","groupIncomeReceived","groupBudgeted","groupBalance","catBudgeted","catSumAmount","catBalance","catCarryover","reportBudget","totalBudgetedExpense","totalBudgetedIncome","totalBudgetedSaved","totalSaved","totalLeftover","SvgCalendar","Calendar_web_objectSpread","Calendar","Calendar_web","& svg","& svg:hover","MonthCountSelector","maxMonths","calendars","MonthCountSelector_ref","SvgArrowButtonRight1","ArrowButtonRight1_web_objectSpread","SvgNavigationMenu","NavigationMenu_web_objectSpread","y","rx","ry","SvgArrowLeft","ArrowLeft_web_objectSpread","SvgAlertTriangle","AlertTriangle_web_objectSpread","SvgExclamationOutline","ExclamationOutline_web_objectSpread","_authorize","plaidToken","onMoveExternal","token","authorizeBank","metadata","failedAccounts","AccountSyncCheck_slicedToArray","open","setOpen","showAuth","unlink","AccountSyncCheck_ref","ExclamationOutline_web","AccountSyncCheck_ref2","AccountSyncCheck_ref3","AccountSyncCheck_ref4","getErrorMessage","AccountSyncCheck_ref6","bankId","linkToken","reauthorizeBank","AccountSyncCheck_ref7","CellValue","formatter","SheetValue","data-cellname","SvgAdd","Add_web_objectSpread","SvgWallet","Wallet_web_objectSpread","SvgReports","Reports_web_objectSpread","SvgArrowButtonLeft1","ArrowButtonLeft1_web_objectSpread","SvgPiggyBank","PiggyBank_web_objectSpread","clipPath","SvgCog","Cog_web_objectSpread","useDraggable","makePreview","canDrag","onDragChange","_onDragChange","_useDrag2","sort_slicedToArray","useDrag","collect","monitor","isDragging","begin","dragRef","useDroppable","onDrop","onLongHover","dropPos","setDropPos","_useDrop2","useDrop","accept","drop","hoverBoundingRect","hoverMiddleY","hoverClientY","getClientOffset","isOver","dropRef","timeout","ref1","ref2","DropHighlightPosContext","DropHighlight","pos","itemPos","topOffset","bottomOffset","posStyle","sort_ref","SIDEBAR_WIDTH","borderLeft","Item","onButtonPress","showButton","sidebar_ref","sidebar_ref2","sidebar_ref3","sidebar_ref4","sidebar_ref5","sidebar_ref6","Add_web","sidebar_ref7","sidebar_ref8","accountNameStyle","& .dot","Account","connected","outerStyle","offbudget","_useDroppable","sidebar_ref9","sidebar_ref10","sidebar_ref11","sidebar_ref12","spreadsheet_CellValue","Accounts","getAccountPath","budgetedAccountPath","offBudgetAccountPath","getBalanceQuery","getOnBudgetBalance","getOffBudgetBalance","showClosedAccounts","onAddAccount","onToggleClosedAccounts","onReorder","sidebar_slicedToArray","setIsDragging","offbudgetAccounts","budgetedAccounts","closedAccounts","drag","makeDropPadding","sidebar_ref16","sidebar_ref17","sidebar_ref18","ToggleButton","onFloat","ArrowButtonLeft1_web","MenuButton","useDispatch","sidebar_ref22","DotsHorizontalTriple_web","Sidebar","budgetName","isFloating","hasWindowButtons","isBrowser","OS","& .float","&:hover .float","WebkitAppRegion","_ref26","Cog_web","_ref29","sidebar_MenuButton","Wallet_web","Reports_web","PiggyBank_web","EditableBudgetName","SidebarWithData_slicedToArray","editing","setEditing","SidebarWithData_ref","defaultValue","trim","SidebarWithData_ref2","SidebarWithData_ref3","floatingSidebar","targetId","ui.showClosedAccounts","SidebarWithData_ref4","SidebarContext","SidebarProvider","emitter","emit","hide","on","listener","off","useSidebar","FloatableSidebar_slicedToArray","hidden","setHidden","sidebar","cleanups","onMouseOver","components_SidebarWithData","FloatableSidebar_ref","TitlebarContext","TitlebarProvider","sendEvent","UncategorizedButton","num","Titlebar_ref","SyncButton","localPrefs","onSync","Titlebar_slicedToArray","syncing","setSyncing","setSyncState","syncDisabled","AlertTriangle_web","Titlebar_ref2","Titlebar_ref3","BudgetTitlebar","showTooltip","setShowTooltip","reportBudgetEnabled","budgetType","Titlebar_ref4","Titlebar_ref5","Titlebar_ref6","Titlebar_ref7","Titlebar_ref8","Titlebar_ref9","& *","& .arrow-right","& .menu","&:hover .arrow-right","&:hover .menu","syncError","Titlebar_ref10","Titlebar_ref11","Titlebar_ref12","Titlebar_ref13","ArrowButtonRight1_web","Titlebar_ref14","NavigationMenu_web","Titlebar_ref15","react_router","ArrowLeft_web","Titlebar_ref16","accounts_AccountSyncCheck","params","Titlebar_ref17","Titlebar_ref18","LoggedInUser","Titlebar_ref19","TutorialPoint","setTutorialNode","expand","contextTypes","PropTypes","SvgPencil1","Pencil1_web_objectSpread","SvgSearchAlternate","SearchAlternate_web_objectSpread","SvgDownloadThickBottom","DownloadThickBottom_web_objectSpread","SvgCheveronDown","CheveronDown_web_objectSpread","SvgCheckCircle1","CheckCircle1_web_objectSpread","SvgArrowsExpand3","ArrowsExpand3_web_objectSpread","SvgArrowsShrink3","ArrowsShrink3_web_objectSpread","makeContext","queryState","QueryClass","Context","query_hooks_slicedToArray","useQuery","queryData","SplitTransactionError","total","difference","amount","makeChild","prefix","transactions_objectSpread","cleared","starting_balance_flag","is_child","parent_id","recalculateSplit","trans","subtransactions","acc","t","ungroupTransactions","groupTransaction","ungroupTransaction","replaceTransactions","transactionsCopy","parentIndex","findParentIndex","diff","curr","getSplit","newSplit","_deleted","splice","diffItems","newTransaction","newTrans","addSplitTransaction","prevSub","last","sort_order","updateTransaction","sub","deleteTransaction","splitTransaction","SvgRemove","Remove_web_objectSpread","findItem","strict","suggestions","getItemName","getItemId","getInitialState","embedded","initialFilterSuggestions","selectedItem","filteredSuggestions","originalItem","highlightedIndex","defaultFilterSuggestion","suggestion","toLowerCase","defaultFilterSuggestions","fireUpdate","sug","onInputValueChange","multi","highlightFirst","filterSuggestions","getHighlightedIndex","changes","hasFocus","Downshift","stateChangeTypes","controlledPropUpdatedSelectedItem","clickItem","defaultGetHighlightedIndex","onStateChange","inst","stateAndHelpers","tableBehavior","mouseUp","newState","keyDownArrowUp","keyDownArrowDown","lastChangeType","clearAfterSelect","onSelectAfter","input","inputProps","shouldSaveFromKey","defaultShouldSaveFromKey","isNulled","itemMouseEnter","defaultRenderInput","defaultRenderItems","getItemProps","openOnFocus","_props$inputProps","preventDownshiftDefault","originalValue","Autocomplete_objectSpread","defaultItemToString","SingleAutocomplete","lively","containerProps","tooltipStyle","onItemClick","tooltipProps","renderInput","renderItems","itemToString","updater","downshift_esm","inputValue","getInputProps","getRootProps","Autocomplete_ref","Autocomplete_ref2","Autocomplete_getInitialState","componentWillReceiveProps","bag","nextProps","_nextProps$filterSugg","_nextProps$itemToStri","currValue","updates","updateValue","MultiItem","Autocomplete_ref4","Autocomplete_ref5","Remove_web","Autocomplete_ref6","flexWrap","MultiAutocomplete","Autocomplete_objectWithoutProperties","Autocomplete_excluded","Autocomplete_slicedToArray","lastSelectedItems","onRemoveItem","Autocomplete","Autocomplete_ref7","Autocomplete_ref8","prevOnKeyDown","Autocomplete_ref9","AutocompleteFooterButton","Autocomplete_ref10","Autocomplete_ref11","AutocompleteFooter","Autocomplete_ref12","Autocomplete_ref13","Autocomplete_ref14","onMouseDown","Split","split_web_objectWithoutProperties","split_web_excluded","NativeCategorySelect","emptyLabel","CategorySelect_objectWithoutProperties","CategorySelect_excluded","CategoryList","lastGroup","CategorySelect_ref","CategorySelect_ref2","CategorySelect_ref3","split_web","CategorySelect_ref4","showGroup","cat_group","CategorySelect_ref5","groupName","CategoryAutocomplete","showSplitOption","onSplit","CategorySelect_excluded2","categorySuggestions","CategorySelect_objectSpread","getPayeeSuggestions","focusTransferPayees","activePayees","makeNew","rawPayee","stripNew","PayeeList","isFiltered","createNew","_items2","_toArray","first","rest","lastType","PayeeAutocomplete_ref","PayeeAutocomplete_ref2","PayeeAutocomplete_ref3","PayeeAutocomplete_ref4","showMoreMessage","PayeeAutocomplete_ref5","PayeeAutocomplete_ref6","PayeeAutocomplete","_ref10$showMakeTransf","showMakeTransfer","_ref10$showManagePaye","showManagePayees","_ref10$defaultFocusTr","defaultFocusTransferPayees","onManagePayees","PayeeAutocomplete_objectWithoutProperties","PayeeAutocomplete_excluded","PayeeAutocomplete_slicedToArray","setFocusTransferPayees","payeeSuggestions","PayeeAutocomplete_objectSpread","create","createPayee","Array","isArray","v","sort","r1exact","r2exact","isf","PayeeAutocomplete_ref7","PayeeAutocomplete_ref8","PayeeAutocomplete_ref9","AccountList","AccountAutocomplete_ref","AccountAutocomplete_ref2","AccountAutocomplete_ref3","AccountAutocomplete","AccountAutocomplete_objectWithoutProperties","AccountAutocomplete_excluded","RightArrow2","RightArrow2_web_objectWithoutProperties","RightArrow2_web_excluded","LeftArrow2","LeftArrow2_web_objectWithoutProperties","LeftArrow2_web_excluded","SvgHyperlink2","Hyperlink2_web_objectSpread","SvgArrowsSynchronize","ArrowsSynchronize_web_objectSpread","fail","str","char","next","ch","nextOperator","op","parseParens","expr","parseOperator","isNegative","numberStr","thousandsSep","getNumberFormat","separator","number","replace","parsePrimary","ops","prevParser","makeOperatorParser","evalArithmetic","expression","evaluate","ast","pow","parse","SvgEditSkull1","EditSkull1_web_objectSpread","SvgValidationCheck","ValidationCheck_web_objectSpread","SvgFavoriteStar","FavoriteStar_web_objectSpread","getStatusProps","Icon","EditSkull1","AlertTriangle","CalendarIcon","ValidationCheck","FavoriteStar","CheckCircle1","StatusBadge","_getStatusProps2","StatusBadge_ref","StatusBadge_ref2","titleFirst","getStatus","nextDate","completed","hasTrans","today","monthUtils","makeNumberSuffix","prettyDayName","day","SU","MO","TU","WE","TH","FR","SA","getRecurringDescription","config","interval","frequency","desc","patterns","typeOrder","valOrder","strs","uniqueDays","isSameDay","pattern","dayName","join","extractScheduleConds","conditions","cond","getScheduledAmount","num1","num2","loadStatuses","schedules","filters","schedule","dateCond","_conditions","c","$and","$gte","next_date","orderBy","groupBy","getHasTransactionsQuery","Boolean","s","useSchedules","schedules_slicedToArray","scheduleQuery","statusQuery","statuses","SchedulesContext","SchedulesProvider","useCachedSchedules","serializeTransaction","showZeroInDeposit","dateFormat","isPreviewId","debit","credit","isDateValid","parseISO","TransactionsTable_objectSpread","getParentTransaction","fromIndex","parentIdx","SplitsExpandedContext","useSplitsExpanded","expanded","mode","SplitsExpandedProvider","initialMode","cachedState","lastSplitState","reduxDispatch","TransactionsTable_slicedToArray","transitionId","splitState","TransactionHeader","memo","hasSelected","showAccount","showCategory","showBalance","dispatchSelected","components_table","TransactionsTable_ref","exposed","visibility","StatusCell","isChild","onEdit","isClearedField","statusProps","TransactionsTable_ref4","plain","TransactionsTable_ref5","PayeeCell","payeeId","inherited","transferAcct","importedPayee","isPreview","onCreatePayee","isCreatingPayee","TransactionsTable_ref6","TransactionsTable_ref2","TransactionsTable_ref3","getPayeePretty","onExpose","onSave","CellWithScheduleIcon","scheduleId","recurring","_date","TransactionsTable_ref7","ArrowsSynchronize_web","borderLeftWidth","&:hover","Transaction","originalTransaction","_props$backgroundColo","highlighted","matched","inheritedFields","focusedField","balance","_props$dateFormat","onDelete","onToggleSplit","prevShowZero","setPrevShowZero","prevTransaction","setPrevTransaction","setTransaction","deserialized","realTransaction","TransactionsTable_objectWithoutProperties","TransactionsTable_excluded","amountToInteger","currentDay","deserializeTransaction","imported_payee","notes","isParent","_transaction$_unmatch","_unmatched","isBudgetTransfer","isOffBudget","backgroundFocus","TransactionsTable_ref9","TransactionsTable_ref10","TransactionsTable_ref11","TransactionsTable_ref12","isTemporaryId","TransactionsTable_ref13","TransactionsTable_ref14","TransactionsTable_ref15","Hyperlink2_web","TransactionsTable_ref16","formatDate","DateSelect","acctId","cell","TransactionsTable_ref17","TransactionsTable_ref19","TransactionsTable_ref20","TransactionsTable_ref21","CheveronDown_web","TransactionsTable_ref22","TransactionsTable_ref23","obj","getDisplayValue","TransactionsTable_ref24","TransactionsTable_ref25","TransactionsTable_ref26","TransactionError","isDeposit","onAddSplit","TransactionsTable_ref27","TransactionsTable_ref28","TransactionsTable_ref29","TransactionsTable_ref30","makeTemporaryTransactions","currentAccountId","lastDate","borderBottom","NewTransaction","editingTransaction","hoveredTransaction","onAdd","TransactionsTable_ref31","TransactionsTable_Transaction","TransactionsTable_ref32","TransactionsTable_ref33","TransactionTable_","highlightedRows","focusedFied","balances","_this$props$dateForma","tableNavigator","isNew","isMatched","isExpanded","getParent","isChildDeposit","highlight","isAdding","newNavigator","_cachedParent","tableRef","_props$dateFormat2","renderEmpty","TransactionsTable_ref37","getNavigatorProps","onCheckNewEnter","editingId","onCloseAddTransaction","onAddTemporary","renderItem","loadMore","loadMoreTransactions","isSelected","onCheckEnter","TransactionTable","setNewTransactions","setHoveredTransaction","_useState12","prevIsAdding","setPrevIsAdding","splitsExpanded","prevSplitsExpanded","mergedRef","useMergedRefs","useTableNavigator","getFields","shouldAdd","latestState","savePending","afterSaveFunc","_useState14","forceRerender","afterSave","onApplyRules","_splitTransaction","newId","_addSplitTransaction","TransactionsTable_TransactionTable_","shiftKey","getLastTransaction","isSplit","saveDiff","remoteUpdates","TransactionList_objectSpread","learnCategories","saveDiffAndApply","remoteDiff","groupedTrans","applyChanges","applyTransactionDiff","TransactionList","allTransactions","headerContent","animated","onRefetch","onRefetchUpToRow","transactionsLatest","clearScrollTo","realizeTempTransactions","afterRules","getChangedValues","TransactionList_ref","TYPE_INFO","nullable","string","boolean","FIELD_TYPES","amountInflow","amountOutfow","mapField","inflow","outflow","friendlyOp","getFieldError","integerToAmount","rules_objectSpread","unparse","inputKey","rules_objectWithoutProperties","rules_excluded","unparsed","makeValue","currencyToAmount","SvgSettingsSliderAlternate","SettingsSliderAlternate_web_objectSpread","Subtract","Subtract_web_objectWithoutProperties","Subtract_web_excluded","Add","Add_web_objectWithoutProperties","Add_web_excluded","MAX_DAY_OF_WEEK_INTERVAL","FREQUENCY_OPTIONS","DAY_OF_MONTH_OPTIONS","DAY_OF_WEEK_OPTIONS","parseConfig","createMonthlyRecurrence","unparseConfig","RecurringSchedulePicker_objectSpread","validInterval","startDate","parseInt","reducer","recurrence","boundedRecurrence","SchedulePreview","previewDates","RecurringSchedulePicker_ref","RecurringSchedulePicker_ref2","RecurringSchedulePicker_ref3","intInterval","Number","isInteger","MonthlyPatterns","updateRecurrence","RecurringSchedulePicker_ref4","RecurringSchedulePicker_ref5","RecurringSchedulePicker_ref6","parsePatternValue","opt","RecurringSchedulePicker_ref7","RecurringSchedulePicker_ref8","Subtract_web","RecurringSchedulePicker_ref9","RecurringSchedulePicker_ref10","svg_Add_web","RecurringSchedulePicker_ref11","RecurringScheduleTooltip","currentConfig","RecurringSchedulePicker_slicedToArray","setPreviewDates","updateField","_await$sendCatch","count","RecurringSchedulePicker_ref12","RecurringSchedulePicker_ref13","htmlFor","RecurringSchedulePicker_ref14","placeholder","RecurringSchedulePicker_ref15","RecurringSchedulePicker_ref16","RecurringSchedulePicker_ref17","RecurringSchedulePicker_ref18","RecurringSchedulePicker_ref19","RecurringSchedulePicker_ref20","RecurringSchedulePicker","_useTooltip","RecurringSchedulePicker_ref21","GenericInput","_useSelector","showPlaceholder","GenericInput_objectSpread","getMonthYearFormat","GenericInput_ref","GenericInput_ref2","SvgInformationOutline","InformationOutline_web_objectSpread","SchedulesQuery","Value","inline","dataProp","describe","ManageRules_slicedToArray","setExpanded","formatValue","ManageRules_ref","ManageRules_ref2","displayed","numHidden","ManageRules_ref3","ManageRules_ref4","ManageRules_ref5","ManageRules_ref6","ManageRules_ref7","ManageRules_ref8","ManageRules_ref9","ConditionExpression","ManageRules_ref10","ManageRules_ref11","ManageRules_ref12","ScheduleValue","byId","ActionExpression","ManageRules_ref13","ManageRules_ref14","ManageRules_ref15","ManageRules_ref16","ManageRules_ref17","Rule","rule","onEditRule","ManageRules_ref18","ManageRules_ref19","ManageRules_ref20","ManageRules_ref21","ManageRules_ref22","RightArrow2_web","ManageRules_ref23","ManageRules_ref24","ManageRules_ref25","ManageRules_ref26","CellButton","& .animated .animated-row","SimpleTable","onHoverLeave","ManageRules_objectWithoutProperties","ManageRules_excluded","contentHeight","scrollRef","ManageRules_ref27","ManageRules_ref28","RulesHeader","RulesList","rules","hoveredRule","borderCollapsed","onCollapse","ManageRules","allRules","setAllRules","setRules","selectedInst","setHoveredRule","loadRules","loadedRules","onDeleteSelected","someDeletionsFailed","newRules","initiallyLoadPayees","loadData","newIdx","newRule","onCreateRule","ManageRules_ref29","ManageRules_ref30","ManageRules_ref31","ManageRules_ref32","ManageRules_ref33","ManageRules_ref34","ManageRules_ref35","ManageRules_ref36","filterFields","subfieldToOptions","month","year","ScopeTab","scopeTab","&,:hover,:active","OpButton","Filters_ref","Filters_ref2","ConfigureField","onApply","Filters_slicedToArray","setSubfield","prevOp","Filters_ref3","Filters_ref4","Filters_ref5","Filters_ref6","currOp","Filters_ref7","Filters_ref8","FilterButton","Filters_objectSpread","fieldsOpen","condOpen","deserializeField","SettingsSliderAlternate_web","Filters_ref9","Filters_ref10","parseDate","conditionErrors","FilterExpression","originalField","customName","Filters_ref11","Filters_ref12","Filters_ref13","Filters_ref14","Filters_ref15","Delete_web","Filters_ref16","AppliedFilters","editingFilter","Filters_ref17","borderTopWidth","EmptyMessage","Account_ref","Account_ref2","Account_ref3","Account_ref4","Account_ref5","ReconcilingMessage","balanceQuery","targetBalance","onDone","targetDiff","Account_ref6","Account_ref7","Account_ref8","CheckCircle1_web","Account_ref9","Account_ref10","Account_ref11","Account_ref12","Account_ref13","ReconcileTooltip","onReconcile","Account_ref14","elements","currencyToInteger","Account_ref15","Account_ref16","MenuTooltip","Account_ref17","AccountMenu","canSync","syncEnabled","showBalances","canShowBalances","Account_slicedToArray","tooltip","setTooltip","CategoryMenu","DetailedBalance","Account_ref18","Account_ref19","SelectedBalance","setBalance","rows","$oneof","r","finalIds","MoreBalances","uncleared","Account_ref20","Balances","showExtraBalances","onToggleExtraBalances","Account_ref21","&:hover svg","Account_objectSpread","Account_ref22","SelectedTransactionsButton","getTransaction","onShow","onUnlink","onScheduleAction","preview","linked","keyHandlers","firstId","transactionIds","& input::placeholder","AccountHeader","editingName","isNameEditable","workingHard","accountName","showEmptyMessage","reconcileAmount","canCalculateBalance","search","onSearch","onAddTransaction","onShowTransactions","onDoneReconciling","onSaveName","onExposeName","onImport","onBatchDelete","onBatchEdit","onBatchUnlink","onApplyFilter","onDeleteFilter","searchInput","account_id","mod+f","Account_ref23","Account_ref24","Account_ref25","Account_ref26","Pencil1_web","Account_ref27","Account_ref28","Account_ref29","Account_ref30","DownloadThickBottom_web","Account_ref31","Account_ref32","SearchAlternate_web","Account_ref33","Account_ref34","Account_ref35","Account_ref36","Account_ref37","Account_ref38","getScrolledItem","expand-splits","ArrowsShrink3_web","Account_ref39","ArrowsExpand3_web","Account_MenuButton","AllTransactions","scheduleData","prependTransactions","_payee","_account","_amount","AccountInternal","paged","refetchTransactions","fetchTransactions","makeRootQuery","rootQuery","currentQuery","updateQuery","locationState","onSearchDone","debounce","parsedDate","getDayMonthRegex","test","getDayMonthFormat","getShortYearRegex","getShortYearFormat","payee.name","$like","category.name","account.name","dayFromDate","$transform","$eq","$abs","$idiv","openFileDialog","extensions","onImported","didChange","onExport","exportedTransactions","saveFile","onTransactionsChange","updateAccount","openAccountCloseModal","reopenAccount","getAccountTitle","calculateBalances","selectedPayee","edit","idSet","parentId","applyFilters","customFilters","transactionCount","transactionsCount","latestDate","maybeRefetch","focusId","focusableMsgs","unlistens","modalShowing","firstLoad","splitsExpandedDispatch","expandSplits","transactionsFiltered","scrollToTop","$sumOver","filterName","_ref43","AccountHack","Account_AccountInternal","tutorialStage","actionCreators","useParams","useLocation","activeLocation","_account.closed","getValidMonthBounds","bounds","startMonth","endMonth","MonthsContext","MonthsProvider","numMonths","monthBounds","months","CategoryGroupsContext","addToBeBudgetedGroup","groups","makeAmountGrey","makeAmountStyle","greyed","makeAmountFullStyle","findSortDown","MONTH_BOX_SHADOW","TransferTooltip","initialAmount","initialAmountName","showToBeBudgeted","g","is_income","TransferTooltip_slicedToArray","setAmount","setCategory","submit","parsedAmount","TransferTooltip_ref","TransferTooltip_ref2","TransferTooltip_ref3","TransferTooltip_ref4","TransferTooltip_ref5","SvgArrowThinRight","ArrowThinRight_web_objectSpread","BalanceWithCarryover","carryover","carryoverValue","balanceValue","BalanceWithCarryover_ref","BalanceWithCarryover_ref2","BalanceWithCarryover_ref3","ArrowThinRight_web","BalanceWithCarryover_objectSpread","SvgArrowButtonDown1","ArrowButtonDown1_web_objectSpread","SvgArrowButtonUp1","ArrowButtonUp1_web_objectSpread","RolloverContext","summaryCollapsed","onBudgetAction","onToggleSummaryCollapse","currentMonth","RolloverContext_Context","HoldTooltip","HoldTooltip_slicedToArray","HoldTooltip_ref","HoldTooltip_ref2","HoldTooltip_ref3","HoldTooltip_ref4","SvgCustomNotesPaper","CustomNotesPaper_web_objectSpread","NotesTooltip","defaultNotes","NotesButton_slicedToArray","setNotes","NotesButton_ref","& button, & .hover-visible","NotesButton","defaultColor","tooltipPosition","live","useLiveQuery","hasNotes","NotesButton_ref2","NotesButton_ref3","NotesButton_ref4","CustomNotesPaper_web","TotalsList","prevMonthName","BudgetSummary_ref","BudgetSummary_ref2","BudgetSummary_ref3","BudgetSummary_ref4","BudgetSummary_ref5","BudgetSummary_ref6","BudgetSummary_ref7","BudgetSummary_ref8","BudgetSummary_ref9","BudgetSummary_ref10","ToBudget","initialValue","availableValue","BudgetSummary_ref11","component_es","BudgetSummary_ref13","& .hover-visible","&:hover .hover-visible","textDecorationSkip","_useRollover","BudgetSummary_slicedToArray","onMenuClose","ExpandOrCollapseIcon","ArrowButtonDown1","ArrowButtonUp1","BudgetSummary_ref14","BudgetSummary_ref15","BudgetSummary_ref16","BudgetSummary_ref17","BudgetSummary_ref18","BudgetSummary_ref19","BudgetSummary_ref20","BudgetSummary_ref21","BudgetSummary_ref22","BudgetSummary_ref23","BudgetSummary_ref24","BudgetSummary_ref25","BudgetSummary_ref26","BudgetSummary_ref27","CoverTooltip","rollover_components_slicedToArray","rollover_components_ref","rollover_components_ref2","rollover_components_ref3","rollover_components_ref4","BalanceTooltip","categoryId","monthIndex","menu","setMenu","rollover_components_ref5","toCategory","fromCategory","headerLabelStyle","BudgetTotalsMonth","rollover_components_ref6","rollover_components_ref7","rollover_components_ref8","rollover_components_ref9","rollover_components_ref10","rollover_components_ref11","rollover_components_ref12","IncomeHeaderMonth","rollover_components_ref13","rollover_components_ref14","ExpenseGroupMonth","rollover_components_ref15","rollover_components_ref16","valueProps","rollover_components_ref17","rollover_components_ref18","ExpenseCategoryMonth","onShowActivity","balanceTooltip","rollover_components_ref19","rollover_components_ref20","rollover_components_ref21","rollover_components_ref22","getValueStyle","formatExpr","unformatExpr","rollover_components_ref23","rollover_components_ref24","rollover_components_ref25","IncomeGroupMonth","rollover_components_ref26","rollover_components_ref27","IncomeCategoryMonth","rollover_components_ref28","rollover_components_ref29","rollover_components_ref30","rollover_components_ref31","ReportProvider","ReportContext_Context","PieProgress","progress","circum","PI","dash","gap","cx","cy","radius","strokeDasharray","fraction","denom","IncomeProgress","over","frac","report_BudgetSummary_ref","ExpenseProgress","report_BudgetSummary_ref2","BudgetTotal","ProgressComponent","report_BudgetSummary_ref3","report_BudgetSummary_ref4","report_BudgetSummary_ref5","report_BudgetSummary_ref6","IncomeTotal","projected","ExpenseTotal","Saved","budgetedSaved","saved","report_BudgetSummary_ref7","report_BudgetSummary_ref8","report_BudgetSummary_ref9","report_BudgetSummary_ref10","_useReport","report_BudgetSummary_slicedToArray","report_BudgetSummary_ref11","BudgetSummary_ref12","report_BudgetSummary_ref13","report_BudgetSummary_ref14","report_BudgetSummary_ref15","report_BudgetSummary_ref16","report_BudgetSummary_ref17","report_BudgetSummary_ref18","report_BudgetSummary_ref19","report_BudgetSummary_ref20","report_BudgetSummary_ref21","report_BudgetSummary_ref22","report_BudgetSummary_ref23","report_BudgetSummary_ref24","report_BudgetSummary_ref25","components_ref","components_ref2","components_ref3","components_ref4","components_ref5","components_ref6","components_ref7","components_ref8","components_ref9","components_ref10","GroupMonth","components_ref11","components_ref12","components_ref13","components_ref14","components_ref15","CategoryMonth","budgeted","currentSum","components_ref16","components_ref17","components_ref18","components_ref19","components_ref20","components_ref21","components_ref22","components_BalanceTooltip","findMatch","element","sizes","entry","SvgArrowThinLeft","ArrowThinLeft_web_objectSpread","BudgetSummaries","SummaryComponent","BudgetSummaries_slicedToArray","widthState","setWidthState","spring","scrollerRef","prevMonth0","allMonths","unshift","monthWidth","Spring","stiffness","damping","mass","fromValue","currentValue","prevMonth","reversed","offsetX","updateConfig","toValue","BudgetSummaries_ref","BudgetSummaries_ref2","BudgetSummaries_ref4","getScrollbarWidth","overflowY","overflowAnchor","BudgetTable","onEditMonth","onEditName","onReorderCategory","findSortUp","targetGroup","budget_objectSpread","onReorderGroup","moveVertically","dir","flattened","isGroup","nextIdx","catName","catId","resolveMonth","budgetCategoriesRef","draggingState","clearEditing","prewarmStartMonth","setCollapsed","newCategoryForGroup","dataComponents","isAddingGroup","onSaveCategory","onSaveGroup","onDeleteCategory","onDeleteGroup","onShowNewCategory","onHideNewCategory","onShowNewGroup","onHideNewGroup","budget_ref","budget_ref2","budget_ref3","budget_ref4","budget_BudgetTotals","MonthComponent","BudgetTotalsComponent","budget_ref5","budgetDataNode","BudgetCategories","editingCell","WebkitUserSelect","& button","&:hover button","SidebarCategory","dragPreview","dragging","temporary","budget_slicedToArray","budget_ref6","budget_ref7","budget_ref8","budget_ref9","budget_ref10","budget_ref11","budget_ref12","budget_ref13","budget_ref14","budget_ref15","budget_ref16","budget_ref17","budget_ref18","budget_ref19","SidebarGroup","onToggleCollapse","budget_ref20","ExpandArrow_web","budget_ref21","budget_ref22","budget_ref23","budget_ref24","budget_ref25","budget_ref26","budget_ref27","budget_ref28","budget_ref29","RenderMonths","component","editingIndex","_useContext","budget_ref30","budget_ref31","BudgetTotals","budget_ref32","budget_ref33","ExpenseGroup","dragState","_useDroppable2","catDropRef","catDropPos","budget_ref34","ROW_HEIGHT","ExpenseCategory","budgetArray","_useDroppable3","budget_ref35","IncomeGroup","budget_ref36","IncomeCategory","_useDroppable4","_separateGroups2","separateGroups","expenseGroups","incomeGroup","prototype","apply","setDragState","savedCollapsed","setSavedCollapsed","newDragState","hoveredId","hoveredPos","id_","budget_ref37","budget_ref38","ExpenseGroupComponent","ExpenseCategoryComponent","budget_ref39","IncomeHeader","IncomeHeaderComponent","IncomeGroupComponent","IncomeCategoryComponent","budget_ref40","budget_ref41","budget_ref42","budget_ref43","_ref44","BudgetPageHeader","onMonthSelect","budget_MonthPicker","numDisplayed","getValidMonth","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderRight","MonthPicker","getCurrentMonthName","monthNames","currentMonthName","selectedIndex","components_ElementQuery","monthName","lastSelectedIndex","getMonth","isMonthBudgeted","_ref53","_ref54","_ref55","_ref56","_ref57","ArrowThinLeft_web","DynamicBudgetTableInner","_ref$maxMonths","onMonthSelect_","onPreload","DynamicBudgetTable_objectWithoutProperties","DynamicBudgetTable_excluded","numPossible","estimatedTableWidth","getNumPossibleMonths","budget_BudgetTable","index_esm","addCategory","categories_objectSpread","updateCategory","moveCategory","moveCat","cats","moveCategoryGroup","moveGroup","deleteCategory","addGroup","updateGroup","deleteGroup","_initialBudgetMonth","Budget","prewarmMonth","values","warmingMonth","createCategory","components_budget_objectSpread","mustTransfer","transferCategory","createGroup","applyBudgetAction","categoryName","sortInfo","budget.summaryCollapsed","onTitlebarEvent","newType","prewarmAllMonths","initialized","collapsedPrefs","titlebar","loadCategories","budget.collapsed","onCopy","copyPreviousMonthInto","reportComponents","rolloverComponents","DynamicBudgetTable","components_budget_ref","report","rollover","components_budget_ref2","budget_Budget","useArgsMemo","fromDateRepr","fromDateReprToDay","runAll","baseLabelStyles","fontFamily","chart_theme","chart_theme_objectSpread","blueFadeStart","blueFadeEnd","redFadeStart","redFadeEnd","red","blue","area","strokeLinejoin","axis","grid","ticks","tickLabels","dependentAxis","independentAxis","bar","chart","Container","Container_ref","portalHost","active","scale","datum","_this$props$offsetX","offsetY","light","forceActive","xPos","labelPosition","before","premadeLabel","defaultEvents","VictoryTooltip","useReport","useReport_slicedToArray","results","setResults","createSpreadsheet","accountBalances","starting","hasNegative","startNetWorth","endNetWorth","graphData","debt","assets","change","net_worth_spreadsheet_ref","net_worth_spreadsheet_ref2","netWorth","totalChange","recalculate","_await$Promise$all2","net_worth_spreadsheet_slicedToArray","$lt","$lte","$month","simpleCashFlow","makeQuery","$gt","income","expense","cashFlowByDate","isConcise","where","_data","cash_flow_spreadsheet_slicedToArray","startingBalance","dates","incomes","expenses","totalExpenses","cash_flow_spreadsheet_ref","cash_flow_spreadsheet_ref2","Area","zero","startX","endX","gradientUnits","stopColor","theme","NetWorthGraph","compact","Chart","VictoryGroup","VictoryChart","reports_Container","NetWorthGraph_ref","domainPadding","containerComponent","victory_voronoi_container","voronoiDimension","VictoryBar","VictoryArea","labelComponent","reports_Tooltip","labels","victory_area","NetWorthGraph_ref2","victory_axis","tickFormat","tickValues","tickCount","crossAxis","Change","DateRange","getYear","DateRange_ref","Card","NetWorthCard","netWorthSpreadsheet","Overview_ref","Overview_ref2","Overview_ref3","Overview_ref4","reports_DateRange","Overview_ref5","Overview_ref6","reports_Change","Overview_ref7","graphs_NetWorthGraph","Overview_ref8","CashFlowCard","Overview_ref9","Overview_ref10","Overview_ref11","Overview_ref12","Overview_ref13","Overview_ref14","Overview_ref15","victory_group","colorScale","domain","Overview_ref16","victory_bar","Overview_ref17","Overview_ref18","Overview_ref19","Overview_ref20","Overview_ref21","boundedRange","earliest","latest","getLatestRange","Header","show1Month","onChangeDates","Header_ref","Header_ref2","Header_ref3","Header_ref4","Header_ref5","validateStart","pretty","Header_ref6","validateEnd","Header_ref7","Header_ref8","Header_ref9","Header_ref10","Header_ref11","getFullRange","NetWorth_slicedToArray","setEarliestMonth","setAllMonths","setStart","setEnd","earliestMonth","yearAgo","reverse","NetWorth_ref","reports_Header","NetWorth_ref2","NetWorth_ref3","NetWorth_ref4","NetWorth_ref5","CashFlowGraph","victory_chart","CashFlowGraph_ref","victory_line","CashFlowGraph_ref2","CashFlow","CashFlow_slicedToArray","setIsConcise","CashFlow_ref","endDay","CashFlow_ref2","CashFlow_ref3","CashFlow_ref4","CashFlow_ref5","CashFlow_ref6","CashFlow_ref7","CashFlow_ref8","graphs_CashFlowGraph","CashFlow_ref9","Reports","reports_ref","Overview","NetWorth","SvgCheck","Check_web_objectSpread","DisplayId","noneColor","DataComponent","OverflowMenu","onAction","SchedulesTable_slicedToArray","SchedulesTable_ref","SchedulesTable_ref2","ScheduleAmountCell","abs","isApprox","SchedulesTable_ref3","SchedulesTable_ref4","SchedulesTable","minimal","allowCompleted","showCompleted","setShowCompleted","inset","SchedulesTable_ref11","SchedulesTable_ref12","rowHeight","SchedulesTable_ref13","SchedulesTable_ref9","SchedulesTable_ref10","SchedulesTable_ref5","SchedulesTable_ref6","_amountOp","SchedulesTable_ref7","Check_web","SchedulesTable_ref8","renderSchedule","allowPopupsEscape","Schedules","flexBasis","resetNextDate","schedules_ref","schedules_ref2","SectionLabel","forms_ref","FormLabel","forms_ref2","FormField","appearance",":checked","::after","&.focus-visible:focus","::before","Checkbox","forms_ref3","TransactionRow","SimpleTransactionsTable_ref","SimpleTransactionsTable_ref2","SimpleTransactionsTable_ref3","SimpleTransactionsTable","memoFields","serializedTransactions","SimpleTransactionsTable_objectSpread","SimpleTransactionsTable_TransactionRow","headers","SimpleTransactionsTable_ref4","SvgSubtract","Subtract_web_objectSpread","fillRule","AmountInput","AmountInput_slicedToArray","negative","setNegative","setValue","fireChange","neg","AmountInput_ref","v1_Subtract_web","AmountInput_ref2","AmountInput_ref3","AmountInput_ref4","AmountInput_ref5","BetweenAmountInput","setNum1","setNum2","AmountInput_ref6","AmountInput_ref7","array","applyErrors","errorsArray","EditRule_objectSpread","getTransactionFields","FieldSelect","EditRule_ref","OpSelect","formatOp","EditorButtons","EditRule_ref2","EditRule_ref3","EditRule_ref4","EditRule_ref5","FieldError","EditRule_ref6","Editor","EditRule_ref7","ConditionEditor","conditionFields","condition","editorStyle","valueEditor","EditRule_ref8","ScheduleDescription","EditRule_ref9","EditRule_slicedToArray","EditRule_ref10","EditRule_ref11","EditRule_ref12","EditRule_ref13","EditRule_ref14","EditRule_ref15","EditRule_ref16","actionFields","ActionEditor","_action$inputKey","EditRule_ref17","EditRule_ref18","EditRule_ref19","StageInfo","EditRule_ref20","InformationOutline_web","EditRule_ref21","EditRule_ref22","StageButton","EditRule_ref23","EditRule_ref24","newInput","ConditionsList","onChangeConditions","addCondition","copy","EditRule_ref25","newCond","prevType","updateCondition","removeCondition","flexGrow","EditRule","defaultRule","originalOnSave","setConditions","setActions","setStage","setTransactions","scrollableEl","setUndoEnabled","addInitialAction","addAction","onChangeStage","EditRule_ref26","EditRule_ref27","EditRule_ref28","EditRule_ref29","EditRule_ref30","EditRule_ref31","EditRule_ref32","EditRule_ref33","conds","EditRule_ref34","EditRule_ref35","EditRule_ref36","onChangeAction","onRemoveAction","EditRule_ref37","EditRule_ref38","EditRule_ref39","EditRule_ref40","EditRule_ref41","EditRule_ref42","actionErrors","mergeFields","defaults","initial","EditSchedule_objectSpread","updateScheduleConditions","updateCond","amountOp","ScheduleDetails","_useParams","initialFields","adding","globalDispatch","EditSchedule_slicedToArray","condsSet","isCustom","_actions","posts_transaction","repeats","upcomingDates","transactionsMode","loadSchedule","_updateScheduleCondit","onLinkTransactions","onSwitchTransactions","EditSchedule_ref","EditSchedule_ref2","EditSchedule_ref3","EditSchedule_ref4","EditSchedule_ref5","EditSchedule_ref6","EditSchedule_ref7","EditSchedule_ref8","EditSchedule_ref9","EditSchedule_ref10","EditSchedule_ref11","EditSchedule_ref12","EditSchedule_ref13","checked","for","EditSchedule_ref14","EditSchedule_ref15","EditSchedule_ref16","EditSchedule_ref17","EditSchedule_ref18","EditSchedule_ref19","EditSchedule_ref20","ruleId","EditSchedule_ref21","EditSchedule_ref22","EditSchedule_ref23","EditSchedule_ref24","EditSchedule_ref25","EditSchedule_ref26","EditSchedule_ref27","onUnlinkTransactions","EditSchedule_ref28","EditSchedule_ref29","EditSchedule_ref30","EditSchedule_ref31","_updateScheduleCondit2","ScheduleLink","LinkSchedule_ref","DiscoverSchedulesTable","DiscoverSchedules_ref2","DiscoverSchedules_ref3","DiscoverSchedules_ref4","DiscoverSchedules_ref5","recurDescription","DiscoverSchedules_ref","DiscoverSchedules","DiscoverSchedules_slicedToArray","setSchedules","creating","setCreating","DiscoverSchedules_ref6","PostsOfflineNotification","plural","PostsOfflineNotification_ref","PostsOfflineNotification_ref2","FixSplitsTool","FixSplitsTool_slicedToArray","FixSplitsTool_ref3","FixSplitsTool_ref4","FixSplitsTool_ref5","FixSplitsTool_ref6","numBlankPayees","numCleared","numDeleted","FixSplitsTool_ref","fixed","FixSplitsTool_ref2","renderResults","Alert","& a, & a:active, & a:visited","alerts_ref","alerts_ref2","Information","InformationOutline","alerts_ref3","ExclamationOutline","dateFormats","Title","Settings_ref","Advanced","Settings_slicedToArray","resetting","setResetting","resettingCache","setResettingCache","Settings_ref2","Settings_ref3","Settings_ref4","Settings_ref5","Settings_ref6","Settings_ref7","Settings_ref8","Settings_ref9","::-webkit-scrollbar","GlobalSettings","documentDirChanged","setDirChanged","dirScrolled","Settings_ref10","Settings_ref11","Settings_ref12","documentDir","properties","Settings_ref13","Settings_ref14","Settings_ref15","autoUpdate","Settings_ref16","Settings_ref17","Settings_ref18","Settings_ref19","Settings_ref20","trackUsage","Settings_ref21","Settings_ref22","Settings_ref23","FileSettings","localServerURL","numberFormat","Settings_ref24","Settings_ref25","Settings_ref26","Settings_ref27","numberFormats","Settings_ref28","Settings_ref29","Settings_ref30","Settings_ref31","encryptKeyId","Settings_ref32","Settings_ref33","Settings_ref34","Settings_ref35","Settings_ref36","Settings_ref37","SettingsLink","Settings_ref38","Settings_ref39","Settings_ref40","Settings_ref41","Settings_ref42","currentModal","onConnect","onCreateLocalAccount","CreateAccount_ref","CreateAccount_ref2","CreateAccount_ref3","CreateAccount_ref4","CreateAccount_ref5","fromPlaidAccountType","prettyAccountType","determineOffBudget","CreateLocalAccount","showBack","formik_es6","validateOnChange","initialValues","validate","setErrors","createAccount","toRelaxedNumber","touched","handleChange","handleBlur","handleSubmit","isSubmitting","setFieldValue","CreateLocalAccount_ref","CreateLocalAccount_ref2","CreateLocalAccount_ref3","CreateLocalAccount_ref4","CreateLocalAccount_ref5","CreateLocalAccount_ref6","CreateLocalAccount_ref7","CreateLocalAccount_ref8","needsCategory","currentTransfer","CategorySelect","CloseAccount_objectWithoutProperties","CloseAccount_excluded","CloseAccount","canDelete","CloseAccount_slicedToArray","onbudget","CloseAccount_ref","transfer","closeAccount","CloseAccount_ref2","CloseAccount_ref3","CloseAccount_ref4","CloseAccount_ref5","CloseAccount_ref6","CloseAccount_ref7","forceCloseAccount","CloseAccount_ref8","CloseAccount_ref9","CloseAccount_ref10","selectedStyle","SelectLinkedAccounts_ref","SelectLinkedAccounts_ref2","SelectLinkedAccounts_ref3","SelectLinkedAccounts_ref4","SelectLinkedAccounts_ref5","SelectLinkedAccounts_ref6","mask","SelectLinkedAccounts","SelectLinkedAccounts_slicedToArray","selectedAccounts","setSelectedAccounts","onNext","SelectLinkedAccounts_ref7","SelectLinkedAccounts_ref8","SelectLinkedAccounts_EmptyMessage","SelectLinkedAccounts_Account","toggleAccount","SelectLinkedAccounts_ref9","SelectLinkedAccounts_ref10","ConfigureLinkedAccounts_ref","ConfigureLinkedAccounts_ref2","ConfigureLinkedAccounts_ref3","ConfigureLinkedAccounts_ref4","ConfigureLinkedAccounts_ref5","ConfigureLinkedAccounts_ref6","ConfigureLinkedAccounts_ref7","Checkmark_web","ConfigureLinkedAccounts_ref8","ConfigureLinkedAccounts_ref9","ConfigureLinkedAccounts","ConfigureLinkedAccounts_slicedToArray","setOffbudgetAccounts","hash","ConfigureLinkedAccounts_ref10","ConfigureLinkedAccounts_ref11","ConfigureLinkedAccounts_ref12","ConfigureLinkedAccounts_EmptyMessage","ConfigureLinkedAccounts_Account","ConfigureLinkedAccounts_ref13","ConfigureLinkedAccounts_ref14","Merge","merge_web_objectWithoutProperties","merge_web_excluded","singleText","pluralText","RuleButton","ruleCount","payees_ref","payees_ref2","payees_ref3","payees_ref4","Payee","onViewRules","ruleActions","payees_ref5","payees_ref6","data-focus-key","payees_ref7","PayeeTable","ruleCounts","components_payees_slicedToArray","setHovered","firstSelected","payees_ref8","PayeeTableHeader","payees_ref9","payees_ref10","PayeeMenu","payeesById","selectedPayees","onMerge","isDisabled","some","payees_ref11","payees_ref12","ManagePayees","tableNavigatorOpts","onBatchChange","payees_objectWithoutProperties","payees_excluded","setHighlightedRows","setFilter","resetAnimation","filteredPayees","applyFilter","_scrollTo","useImperativeHandle","selectRows","scroll","highlightRow","getSelectableIds","buttonsDisabled","payees_ref13","payees_ref14","payees_ref15","payees_ref16","payees_ref17","payees_ref18","payees_ref19","payees_ref20","payees_EmptyMessage","payees_ref21","initialPayees","ManagePayeesWithData_slicedToArray","setPayees","setRuleCounts","payeesRef","refetchRuleCounts","counts","mergeIds","highlightStyle","MergeUnusedPayees","allPayees","isEditingRule","m","MergeUnusedPayees_slicedToArray","shouldCreateRule","setShouldCreateRule","flashRef","targetPayee","fromNames","onMergeAndCreateRule","MergeUnusedPayees_ref","MergeUnusedPayees_ref2","MergeUnusedPayees_ref3","MergeUnusedPayees_ref4","MergeUnusedPayees_ref5","MergeUnusedPayees_ref6","MergeUnusedPayees_ref7","MergeUnusedPayees_ref8","MergeUnusedPayees_ref9","& a, & a:visited","PlaidExternalMsg","originalOnClose","PlaidExternalMsg_slicedToArray","waiting","setWaiting","success","setSuccess","onJump","onContinue","PlaidExternalMsg_ref2","PlaidExternalMsg_ref3","alerts_Error","PlaidExternalMsg_ref","renderError","PlaidExternalMsg_ref4","PlaidExternalMsg_ref5","PlaidExternalMsg_ref6","PlaidExternalMsg_ref7","PlaidExternalMsg_ref8","PlaidExternalMsg_ref10","PlaidExternalMsg_ref11","PlaidExternalMsg_ref12","ConfirmCategoryDelete","ConfirmCategoryDelete_ref","isIncome","ConfirmCategoryDelete_ref2","ConfirmCategoryDelete_ref3","ConfirmCategoryDelete_ref4","ConfirmCategoryDelete_ref5","ConfirmCategoryDelete_objectSpread","WelcomeScreen_ref","WelcomeScreen_ref2","pad","formatDate_","getFileType","ParsedDate","parseDateFormat","showParsed","ImportTransactions_ref","getInitialDateFormat","mappings","found","getInitialMappings","dateField","amountField","payeeField","notesField","applyFieldMappings","ImportTransactions_slicedToArray","parseAmount","looselyParseAmount","parseAmountFields","splitMode","flipAmount","rawTransaction","fieldMappings","_parseAmountFields","amountToCurrency","ImportTransactions_ref2","payee_name","ImportTransactions_ref3","ImportTransactions_ref4","ImportTransactions_ref5","SubLabel","ImportTransactions_ref6","SelectField","DateFormatSelect","delimiter","ImportTransactions_ref7","FlipAmountOption","ImportTransactions_ref8","SplitOption","ImportTransactions_ref9","ImportTransactions_ref10","FieldMappings","ImportTransactions_ref11","ImportTransactions_ref12","ImportTransactions_ref13","ImportTransactions_ref14","ImportTransactions_ref15","ImportTransactions_ref16","ImportTransactions_ref17","ImportTransactions_ref18","ImportTransactions_ref19","ImportTransactions_ref20","loadingState","setLoadingState","setFilename","filetype","setFileType","setFieldMappings","setSplitMode","_useState16","setFlipAmount","_useState18","csvDelimiter","setCsvDelimiter","_useState20","setParseDateFormat","_await$parseTransacti","initialSplitMode","ImportTransactions_ref21","ImportTransactions_ref22","ImportTransactions_ref23","ImportTransactions_ref24","ImportTransactions_ref25","getItemKey","ImportTransactions_ref26","ImportTransactions_Transaction","ImportTransactions_ref27","ImportTransactions_ref28","onNewFile","ImportTransactions_ref29","ImportTransactions_objectSpread","ImportTransactions_ref30","ImportTransactions_ref31","ImportTransactions_ref32","newFieldMappings","ImportTransactions_ref33","ImportTransactions_ref34","ImportTransactions_ref35","ImportTransactions_ref36","errorMessage","finalTransactions","_trans","finalTransaction","ImportTransactions_objectWithoutProperties","ImportTransactions_excluded","editor","autocompleteProps","EditField_ref","EditField_ref2","EditField_ref3","createLocation","modals_ImportTransactions","modals_CreateAccount","modals_CreateLocalAccount","modals_CloseAccount","modals_ConfirmCategoryDelete","didMount","willUnmount","payees_ManagePayeesWithData","modals_EditField","modals_WelcomeScreen","handleKeys","cleanupListeners","PageRoute","Routes","EditSchedule","LinkSchedule","Account_Account","Settings","StackedRoutes","locations","base","FinancesApp","createBrowserHistory","oldPush","call","location_state_objectSpread","makeLocationState","FinancesApp_ref2","components_GlobalKeys","FinancesApp_ref3","FloatableSidebar","FinancesApp_ref4","components_Titlebar","FinancesApp_ref5","FinancesApp_ref6","Notifications","components_BankSyncStatus","components_Modals","FinancesApp_FinancesApp","DndProvider","backend","Backend","ServerURL","setUrl","SvgCloudCheck","SvgCloudDownload","CloudDownload_web_objectSpread","SvgCloudUnknown","CloudUnknown_web_objectSpread","SvgFileDouble","FileDouble_web_objectSpread","SvgKey","Key_web_objectSpread","SvgRefreshArrow","RefreshArrow_web_objectSpread","getFileDescription","file","hasKey","FileMenu","onUpload","onDownload","DetailButton","BudgetList_slicedToArray","BudgetList_ref","BudgetList_ref2","FileState","CloudUnknown","CloudDownload","FileDouble","CloudCheck","BudgetList_ref4","File","selecting","_onSelect","Key_web","RefreshButton","onRefresh","Loading","RefreshArrow","BudgetList","onCreate","testMode","createBudget","_this$props2$files","BudgetList_BudgetTable","process","Import","availableImports","Import_slicedToArray","onSelectType","itemStyle","Import_ref","Import_ref2","Import_ref3","Import_ref4","Import_ref5","Import_ref6","Import_ref7","Import_ref8","Import_ref11","Import_ref12","Import_ref13","ImportYNAB4_slicedToArray","importing","setImporting","importBudget","err","ImportYNAB4_ref","ImportYNAB4_ref2","ImportYNAB4_ref3","ImportYNAB4_ref4","ImportYNAB4_ref5","ImportYNAB4_ref6","ImportYNAB4_ref7","& > div","ImportYNAB5_slicedToArray","ImportYNAB5_ref","ImportYNAB5_ref2","ImportYNAB5_ref3","ImportYNAB5_ref4","ImportYNAB5_ref5","ImportYNAB5_ref6","ImportYNAB5_ref7","DeleteMenu","DeleteFile_slicedToArray","onDeleteCloud","deleteBudget","onDeleteLocal","isRemote","DeleteFile_ref","DeleteFile_ref2","DeleteFile_ref3","DeleteFile_ref4","DeleteFile_ref5","DeleteFile_ref6","isLoggedIn","onPush","manager_BudgetList","downloadBudget","manager_Import","ImportYNAB4","ImportYNAB5","Modals_objectSpread","Modals_ref","useBootstrapped","common_slicedToArray","setChecked","ensure","bootstrapped","common_ref","common_ref2","Login","Login_slicedToArray","Login_ref","Login_ref2","Login_ref3","Login_ref4","autoFocus","Login_ref5","Login_ref6","Login_ref7","Login_ref8","demoMode","ConfirmPasswordForm","buttons","onSetPassword","ConfirmPasswordForm_slicedToArray","password1","setPassword1","password2","setPassword2","ConfirmPasswordForm_ref","ConfirmPasswordForm_ref2","ConfirmPasswordForm_ref3","ConfirmPasswordForm_ref4","ConfirmPasswordForm_ref5","Bootstrap","Bootstrap_slicedToArray","Bootstrap_ref","Bootstrap_ref2","Bootstrap_ref3","Bootstrap_ref4","Error_ref","Error_ref2","Error_ref3","ChangePassword","ChangePassword_slicedToArray","setMessage","ChangePassword_ref","ChangePassword_ref2","ChangePassword_ref3","ChangePassword_ref4","ChangePassword_ref5","ConfigServer","ConfigServer_slicedToArray","currentUrl","setCurrentUrl","ConfigServer_ref","ConfigServer_ref2","ConfigServer_ref3","ConfigServer_ref4","ConfigServer_ref5","ConfigServer_ref6","ConfigServer_ref7","Version","ManagementApp_ref","ACTUAL_VERSION","managerHasInitialized","currentModals","modal","alreadyLoading","showModal","ManagementApp_objectSpread","ManagementApp_ref2","ManagementApp_ref3","ManagementApp_ref4","ManagementApp_ref5","ManagementApp_ref6","Modals","ManagementApp_ref7","SvgClose","showUpdateNotification","releaseNotes","closeNotification","Close_web","_sentry_browser__WEBPACK_IMPORTED_MODULE_0__","_sentry_browser__WEBPACK_IMPORTED_MODULE_1__","_jlongster_sentry_metrics_actual__WEBPACK_IMPORTED_MODULE_2__","absurd_sql_dist_indexeddb_main_thread__WEBPACK_IMPORTED_MODULE_3__","worker_loader_browser_server__WEBPACK_IMPORTED_MODULE_4__","IS_DEV","IS_PERF_BUILD","PERF_BUILD","createBackendWorker","BackendWorker","initSQLBackend","isDev","activity","original","getComputedStyle","listenForPerfData","Sentry","dsn","release","ignoreErrors","integrations","SentryMetricIntegration","metric","dimensions","platform","__startProfile","__stopProfile","IS_FAKE_WEB","REACT_APP_RELEASE_TYPE","logToTerminal","reload","ext","dispatchEvent","MouseEvent","bubbles","cancelable","reader","FileReader","readAsArrayBuffer","onload","ev","__actionsForMenu","onerror","defaultFilename","dialogTitle","temp","download","rel","blob","Blob","URL","createObjectURL","isBudgetOpen","ipcConnect","reloadBackend","ctrlKey","redo","breadcrumb","addBreadcrumb","View","nativeStyle","hideModals","showModals","isWindows","isMac","isProbablySafari","isReactNativeWeb","selectedCell","debug_objectSpread","modals_objectSpread","reconcileFiles","localFiles","remoteFiles","reconciled","localFile","budgets_objectSpread","remote","sorted","name1","name2","fromYNAB","reducers","account_objectSpread","failures","profile_objectSpread","setNumberFormat","prefs_objectSpread","notifications_objectSpread","budgetes","imports","tutorial_objectSpread","deactivated","user_objectSpread","appReducer","combineReducers","createStore","src_objectSpread","initialAppState","applyMiddleware","thunk","boundActions","$send","$query","$q","es","App","getElementById","loadBudgets","loadRemoteFiles","confirm","_await$send4","getYNAB4Imports","TABLE_BACKGROUND_COLOR","fireBlur","CellContext","CellProvider","Field","oldBorderColor","_ref27$truncate","_common__WEBPACK_IMPORTED_MODULE_10__","Cell","viewProps","mouseCoords","viewRef","_useContext2","widthStyle","cellStyle","clientX","clientY","onMouseUp","Row","_ref29$backgroundColo","_ref29$borderColor","_ref29$inset","shouldHighlight","setShouldHighlight","prevHighlighted","rowRef","timer","&.animated .animated-cell","inputCellStyle","readonlyInputStyle","::selection","InputValue","InputCell","targetHeight","CustomCell","prevDefaultValue","setPrevDefaultValue","onBlur_","_ref33$props","dateSelectProps","_dateSelectProps$inpu","_DateSelect__WEBPACK_IMPORTED_MODULE_13__","DeleteCell","_svg_Delete__WEBPACK_IMPORTED_MODULE_6__","clickBehavior","SelectCell","partial","_svg_v1_Checkmark__WEBPACK_IMPORTED_MODULE_7__","SheetCell","_spreadsheet_SheetValue__WEBPACK_IMPORTED_MODULE_12__","activate","transitionDuration","activated","highlightOff","TableHeader","rowProps","_excluded11","SelectedItemsButton","_KeyHandlers__WEBPACK_IMPORTED_MODULE_11__","_svg_ExpandArrow__WEBPACK_IMPORTED_MODULE_8__","rowStyle","TableWithNavigator","_excluded12","Table","contentHeader","_ref39$rowHeight","_ref39$backgroundColo","listRef","_ref39$version","_excluded13","_navigator","listContainer","scrollContainer","initialScrollTo","listInitialized","--pos","getScrollOffset","alignment","shouldScroll","_svg_v1_AnimatedLoading__WEBPACK_IMPORTED_MODULE_9__","isEmpty","empty","getEmptyContent","react_virtualized_auto_sizer__WEBPACK_IMPORTED_MODULE_3__","_useProperFocus__WEBPACK_IMPORTED_MODULE_16__","_FixedSizeList__WEBPACK_IMPORTED_MODULE_4__","initialEditingId","initialFocusedField","moveKeys","setEditingId","setFocusedField","useStore","modalStackLength","flashInput","moveHorizontally","onFocusPrevious","onFocusNext","onMove","userProps","isPropagationStopped","fieldKeys","prevNumModals","numModals","relatedTarget","contains","HISTORY_SIZE","UNDO_STATE_MRU","currentUndoState","setUndoState","getUndoState","getTaggedState","transferId","rawGroup","offBudget","numTransactions","transferAccountId","forced","_undo","throttle","_redo","_undoEnabled","SvgLoading","_props$color","gradientId","stopOpacity","animationName","animationDuration","animationTimingFunction","animationIterationCount","AnimatedLoading","Loading_web","Query","filterExpressions","selectExpressions","groupExpressions","orderExpressions","calculation","rawMode","withDead","validateRefs","unfilter","exprs","exprSet","raw","withoutValidatedRefs","tableOptions","orderExprs","firstOrder","SvgDotsHorizontalTriple","pickerStyles","& .pika-single.actual-date-picker","& .actual-date-picker","& .pika-lendar","float","& .pika-label","& .pika-prev","backgroundImage","DateSelectLeft","& .pika-next","DateSelectRight","& .pika-table th","& abbr","& .pika-button","& .is-today .pika-button","& .is-selected .pika-button","DatePicker","picker","mountPoint","handleInputKeyDown","newDate","getDate","setDate","Pikaday","keyboardInput","defaultDate","setDefaultDate","dateString","destroy","_common__WEBPACK_IMPORTED_MODULE_11__","originalInputRef","parsedDefaultValue","selectedValue","setSelectedValue","userSelectedValue","altKey","_parse","_value$split2","monthFromDate","addMonths","subMonths","addDays","subDays","isAfter","month1","month2","_range","inclusive","rangeInclusive","_dayRange","days","dayRangeInclusive","getMonthIndex","getYearStart","getYearEnd","sheetForMonth","RegExp","regex","currencyFormatter","cleanUUID","mergeObjects","objects","composeCellChanges","merged","flattenArray","arrays","shallowEqual","b","numKeysA","numKeysB","obj1","obj2","hasChanged","hasFieldsChanged","changed","t2","partitionByField","existing","groupBySingle","_groupById","newItems","newGrouped","newItem","debugMemoFailure","setIn","getIn","throwError","fastSetMerge","set1","set2","finalSet","iter","locale","toRelaxedInteger","stringToInteger","amountToPrettyCurrency","toFixed","safeNumber","semverToNumber"],"mappings":"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","file":"static/js/main.a27b6a9d.chunk.js","sourcesContent":["import React, {\n useRef,\n useEffect,\n useLayoutEffect,\n useState,\n useCallback,\n useMemo\n} from 'react';\nimport { css } from 'glamor';\nimport mergeRefs from 'react-merge-refs';\nimport hotkeys from 'hotkeys-js';\nimport ReactModal from 'react-modal';\nimport {\n Route,\n NavLink,\n withRouter,\n useHistory,\n useRouteMatch\n} from 'react-router-dom';\nimport {\n Listbox,\n ListboxInput,\n ListboxButton,\n ListboxPopover,\n ListboxList,\n ListboxOption\n} from '@reach/listbox';\nimport { styles, colors } from '../style';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport Delete from '../svg/Delete';\nimport Loading from '../svg/v1/AnimatedLoading';\nimport ExpandArrow from 'loot-design/src/svg/ExpandArrow';\nimport View from './View';\nimport Text from './Text';\nimport Stack from './Stack';\nimport { useProperFocus } from './useProperFocus';\n\nexport View from './View';\nexport Text from './Text';\nexport Stack from './Stack';\n\nexport const useStableCallback = callback => {\n const callbackRef = useRef();\n const memoCallback = useCallback(\n (...args) => callbackRef.current(...args),\n []\n );\n useLayoutEffect(() => {\n callbackRef.current = callback;\n });\n return memoCallback;\n};\n\nexport function Block(props) {\n const { style, innerRef, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={innerRef}\n className={`${props.className || ''} ${css(props.style)}`}\n />\n );\n}\n\nexport function Link({ style, children, ...nativeProps }) {\n return (\n <button\n {...css(\n {\n textDecoration: 'none',\n color: styles.text,\n backgroundColor: 'transparent',\n border: 0,\n cursor: 'pointer',\n padding: 0,\n font: 'inherit',\n ':hover': {\n textDecoration: 'underline'\n }\n },\n styles.smallText,\n style\n )}\n {...nativeProps}\n >\n {children}\n </button>\n );\n}\n\nexport function AnchorLink({\n staticContext,\n to,\n exact,\n style,\n activeStyle,\n children\n}) {\n let history = useHistory();\n let href = history.createHref(typeof to === 'string' ? { pathname: to } : to);\n let match = useRouteMatch({ path: to, exact: true });\n\n return (\n <NavLink\n to={to}\n exact={exact}\n {...css([styles.smallText, style, match ? activeStyle : null])}\n >\n {children}\n </NavLink>\n );\n}\n\nexport const ExternalLink = React.forwardRef((props, ref) => {\n function onClick(e) {\n e.preventDefault();\n window.Actual.openURLInBrowser(props.href);\n }\n\n if (props.asAnchor) {\n // eslint-disable-next-line\n return <a ref={ref} {...props} onClick={onClick} />;\n }\n return <Button ref={ref} bare {...props} onClick={onClick} />;\n});\n\nfunction ButtonLink_({\n history,\n staticContext,\n to,\n style,\n activeStyle,\n match,\n location,\n ...props\n}) {\n return (\n <Route\n path={to}\n children={({ match }) => (\n <Button\n style={[style, match ? activeStyle : null]}\n {...props}\n onClick={e => {\n props.onClick && props.onClick(e);\n history.push(to);\n }}\n />\n )}\n />\n );\n}\n\n// eslint-disable-next-line\nexport const ButtonLink = withRouter(ButtonLink_);\n\nexport const Button = React.forwardRef(\n (\n {\n children,\n pressed,\n primary,\n hover,\n bare,\n style,\n disabled,\n hoveredStyle,\n activeStyle,\n as = 'button',\n ...nativeProps\n },\n ref\n ) => {\n hoveredStyle = [\n bare\n ? { backgroundColor: 'rgba(100, 100, 100, .15)' }\n : { boxShadow: styles.shadow },\n hoveredStyle\n ];\n activeStyle = [\n bare\n ? { backgroundColor: 'rgba(100, 100, 100, .25)' }\n : {\n transform: 'translateY(1px)',\n boxShadow:\n !bare &&\n (primary\n ? '0 1px 4px 0 rgba(0,0,0,0.3)'\n : '0 1px 4px 0 rgba(0,0,0,0.2)'),\n transition: 'none'\n },\n activeStyle\n ];\n\n let Component = as;\n let buttonStyle = [\n {\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n padding: bare ? '5px' : '5px 10px',\n margin: 0,\n overflow: 'hidden',\n display: 'flex',\n borderRadius: 4,\n backgroundColor: bare\n ? 'transparent'\n : primary\n ? disabled\n ? colors.n7\n : colors.p5\n : 'white',\n border: bare\n ? 'none'\n : '1px solid ' +\n (primary ? (disabled ? colors.n7 : colors.p5) : colors.n9),\n color: primary ? 'white' : disabled ? colors.n6 : colors.n1,\n transition: 'box-shadow .25s',\n ...styles.smallText\n },\n { ':hover': !disabled && hoveredStyle },\n { ':active': !disabled && activeStyle },\n hover && hoveredStyle,\n pressed && activeStyle,\n style\n ];\n\n return (\n <Component\n ref={ref}\n {...(typeof as === 'string'\n ? css(buttonStyle)\n : { style: buttonStyle })}\n disabled={disabled}\n {...nativeProps}\n >\n {children}\n </Component>\n );\n }\n);\n\nexport const ButtonWithLoading = React.forwardRef((props, ref) => {\n let { loading, children, ...buttonProps } = props;\n return (\n <Button\n {...buttonProps}\n style={[{ position: 'relative' }, buttonProps.style]}\n >\n {loading && (\n <View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n <Loading\n color=\"currentColor\"\n style={{ width: 20, height: 20, color: 'currentColor' }}\n />\n </View>\n )}\n <View\n style={{\n opacity: loading ? 0 : 1,\n flexDirection: 'row',\n alignItems: 'center'\n }}\n >\n {children}\n </View>\n </Button>\n );\n});\n\nconst defaultInputStyle = {\n outline: 0,\n backgroundColor: 'white',\n margin: 0,\n padding: 5,\n borderRadius: 4,\n border: '1px solid #d0d0d0'\n};\n\nexport function Input({\n style,\n inputRef,\n onEnter,\n onUpdate,\n focused,\n ...nativeProps\n}) {\n let ref = useRef();\n useProperFocus(ref, focused);\n\n return (\n <input\n ref={inputRef ? mergeRefs([inputRef, ref]) : ref}\n {...css([\n defaultInputStyle,\n {\n ':focus': {\n border: '1px solid ' + colors.b5,\n boxShadow: '0 1px 1px ' + colors.b7\n },\n '::placeholder': { color: colors.n7 }\n },\n styles.smallText,\n style\n ])}\n {...nativeProps}\n onKeyDown={e => {\n if (e.keyCode === 13 && onEnter) {\n onEnter(e);\n }\n\n nativeProps.onKeyDown && nativeProps.onKeyDown(e);\n }}\n onChange={e => {\n if (onUpdate) {\n onUpdate(e.target.value);\n }\n nativeProps.onChange && nativeProps.onChange(e);\n }}\n />\n );\n}\n\nexport function InputWithContent({\n leftContent,\n rightContent,\n inputStyle,\n style,\n getStyle,\n ...props\n}) {\n let [focused, setFocused] = useState(false);\n\n return (\n <View\n style={[\n defaultInputStyle,\n {\n padding: 0,\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center'\n },\n focused && {\n border: '1px solid ' + colors.b5,\n boxShadow: '0 1px 1px ' + colors.b7\n },\n style,\n getStyle && getStyle(focused)\n ]}\n >\n {leftContent}\n <Input\n {...props}\n style={[\n inputStyle,\n {\n flex: 1,\n '&, &:focus, &:hover': {\n border: 0,\n backgroundColor: 'transparent',\n boxShadow: 'none',\n color: 'inherit'\n }\n }\n ]}\n onFocus={e => {\n setFocused(true);\n props.onFocus && props.onFocus(e);\n }}\n onBlur={e => {\n setFocused(false);\n props.onBlur && props.onBlur(e);\n }}\n />\n {rightContent}\n </View>\n );\n}\n\nexport const Select = React.forwardRef(\n ({ style, children, ...nativeProps }, ref) => {\n return (\n <select\n ref={ref}\n {...css(\n {\n backgroundColor: 'transparent',\n height: 28,\n fontSize: 14,\n flex: 1,\n border: '1px solid #d0d0d0',\n borderRadius: 4,\n color: colors.n1,\n ':focus': {\n border: '1px solid ' + colors.b5,\n boxShadow: '0 1px 1px ' + colors.b7,\n outline: 'none'\n }\n },\n style\n )}\n {...nativeProps}\n >\n {children}\n </select>\n );\n }\n);\n\nexport function CustomSelect({ options, value, onChange, style }) {\n return (\n <ListboxInput\n value={value}\n onChange={onChange}\n style={{ lineHeight: '1em' }}\n >\n <ListboxButton\n {...css([{ borderWidth: 0, padding: 5, borderRadius: 4 }, style])}\n arrow={<ExpandArrow style={{ width: 7, height: 7, paddingTop: 3 }} />}\n />\n <ListboxPopover style={{ zIndex: 10000, outline: 0, borderRadius: 4 }}>\n <ListboxList>\n {options.map(([value, label]) => (\n <ListboxOption key={value} value={value}>\n {label}\n </ListboxOption>\n ))}\n </ListboxList>\n </ListboxPopover>\n </ListboxInput>\n );\n}\n\nexport function Keybinding({ keyName }) {\n return <Text style={{ fontSize: 10, color: colors.n6 }}>{keyName}</Text>;\n}\n\nexport function Menu({ header, footer, items: allItems, onMenuSelect }) {\n let el = useRef(null);\n let items = allItems.filter(x => x);\n let [hoveredIndex, setHoveredIndex] = useState(null);\n\n useEffect(() => {\n el.current.focus();\n\n let onKeyDown = e => {\n const UP = 38;\n const DOWN = 40;\n const ENTER = 13;\n\n let filteredItems = items.filter(\n item => item && item !== Menu.line && item.type !== Menu.label\n );\n let currentIndex = filteredItems.indexOf(items[hoveredIndex]);\n\n let transformIndex = idx => items.indexOf(filteredItems[idx]);\n\n switch (e.keyCode) {\n case UP:\n e.preventDefault();\n setHoveredIndex(\n hoveredIndex === null\n ? 0\n : transformIndex(Math.max(currentIndex - 1, 0))\n );\n break;\n case DOWN:\n e.preventDefault();\n setHoveredIndex(\n hoveredIndex === null\n ? 0\n : transformIndex(\n Math.min(currentIndex + 1, filteredItems.length - 1)\n )\n );\n break;\n case ENTER:\n e.preventDefault();\n if (hoveredIndex !== null) {\n onMenuSelect && onMenuSelect(items[hoveredIndex].name);\n }\n break;\n default:\n }\n };\n\n el.current.addEventListener('keydown', onKeyDown);\n\n return () => {\n el.current.removeEventListener('keydown', onKeyDown);\n };\n }, [hoveredIndex]);\n\n return (\n <View\n style={{ outline: 'none', borderRadius: 4, overflow: 'hidden' }}\n tabIndex={1}\n innerRef={el}\n >\n {header}\n {items.map((item, idx) => {\n if (item === Menu.line) {\n return (\n <View key={idx} style={{ margin: '3px 0px' }}>\n <View style={{ borderTop: '1px solid ' + colors.n10 }} />\n </View>\n );\n } else if (item.type === Menu.label) {\n return (\n <Text\n style={{\n color: colors.n6,\n fontSize: 11,\n lineHeight: '1em',\n textTransform: 'uppercase',\n margin: '3px 9px'\n }}\n >\n {item.name}\n </Text>\n );\n }\n\n let lastItem = items[idx - 1];\n\n return (\n <View\n key={item.name}\n style={[\n {\n cursor: 'default',\n padding: '9px 10px',\n marginTop:\n idx === 0 ||\n lastItem === Menu.line ||\n lastItem.type === Menu.label\n ? 0\n : -3,\n flexDirection: 'row',\n alignItems: 'center'\n },\n item.disabled && { color: colors.n7 },\n !item.disabled &&\n hoveredIndex === idx && { backgroundColor: colors.n10 }\n ]}\n onMouseEnter={() => setHoveredIndex(idx)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={e =>\n !item.disabled && onMenuSelect && onMenuSelect(item.name)\n }\n >\n {/* Force it to line up evenly */}\n <Text style={{ lineHeight: 0 }}>\n {item.icon &&\n React.createElement(item.icon, {\n width: item.iconSize || 10,\n height: item.iconSize || 10,\n style: { marginRight: 7, width: 10 }\n })}\n </Text>\n <Text>{item.text}</Text>\n <View style={{ flex: 1 }} />\n {item.key && <Keybinding keyName={item.key} />}\n </View>\n );\n })}\n {footer}\n </View>\n );\n}\n\nMenu.line = Symbol('menu-line');\nMenu.label = Symbol('menu-label');\n\nexport function AlignedText({\n left,\n right,\n style,\n leftStyle,\n rightStyle,\n truncate = 'left',\n ...nativeProps\n}) {\n const truncateStyle = {\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden'\n };\n\n return (\n <View\n style={[{ flexDirection: 'row', alignItems: 'center' }, style]}\n {...nativeProps}\n >\n <Block\n style={[\n { marginRight: 10 },\n truncate === 'left' && truncateStyle,\n leftStyle\n ]}\n >\n {left}\n </Block>\n <Block\n style={[\n { flex: 1, textAlign: 'right' },\n truncate === 'right' && truncateStyle,\n rightStyle\n ]}\n >\n {right}\n </Block>\n </View>\n );\n}\n\nexport function PlainCurrency({ amount, style }) {\n return <span style={style}>{integerToCurrency(amount)}</span>;\n}\n\nexport function PageHeader({ title, style }) {\n return (\n <View style={{ alignItems: 'flex-start' }}>\n <span style={[styles.pageHeader, style]}>{title}</span>\n </View>\n );\n}\n\nexport function P({ style, isLast, children, ...props }) {\n return (\n <div\n {...props}\n {...css(!isLast && { marginBottom: 15 }, style, { lineHeight: '1.5em' })}\n >\n {children}\n </div>\n );\n}\n\nexport function Strong({ style, children, ...props }) {\n return (\n <span {...props} {...css(style, { fontWeight: 500 })}>\n {children}\n </span>\n );\n}\n\nfunction ModalContent({\n style,\n size,\n noAnimation,\n isCurrent,\n stackIndex,\n children\n}) {\n let contentRef = useRef(null);\n let mounted = useRef(false);\n let rotateFactor = useRef(Math.random() * 10 - 5);\n\n useLayoutEffect(() => {\n if (contentRef.current == null) {\n return;\n }\n\n function setProps() {\n if (isCurrent) {\n contentRef.current.style.transform = 'translateY(0px) scale(1)';\n contentRef.current.style.pointerEvents = 'auto';\n } else {\n contentRef.current.style.transform = `translateY(-40px) scale(.95) rotate(${rotateFactor.current}deg)`;\n contentRef.current.style.pointerEvents = 'none';\n }\n }\n\n if (!mounted.current) {\n if (noAnimation) {\n contentRef.current.style.opacity = 1;\n contentRef.current.style.transform = 'translateY(0px) scale(1)';\n\n setTimeout(() => {\n if (contentRef.current) {\n contentRef.current.style.transition =\n 'opacity .1s, transform .1s cubic-bezier(.42, 0, .58, 1)';\n }\n }, 0);\n } else {\n contentRef.current.style.opacity = 0;\n contentRef.current.style.transform = 'translateY(10px) scale(1)';\n\n setTimeout(() => {\n if (contentRef.current) {\n mounted.current = true;\n contentRef.current.style.transition =\n 'opacity .1s, transform .1s cubic-bezier(.42, 0, .58, 1)';\n contentRef.current.style.opacity = 1;\n setProps();\n }\n }, 0);\n }\n } else {\n setProps();\n }\n }, [noAnimation, isCurrent, stackIndex]);\n\n return (\n <View\n innerRef={contentRef}\n style={[\n style,\n size && { width: size.width, height: size.height },\n noAnimation && !isCurrent && { display: 'none' }\n ]}\n >\n {children}\n </View>\n );\n}\n\nexport function Modal({\n title,\n isCurrent,\n isHidden,\n size,\n padding = 20,\n showHeader = true,\n showTitle = true,\n showClose = true,\n showOverlay = true,\n loading = false,\n noAnimation = false,\n focusAfterClose = true,\n stackIndex,\n parent,\n style,\n contentStyle,\n overlayStyle,\n children,\n onClose\n}) {\n useEffect(() => {\n // This deactivates any key handlers in the \"app\" scope. Ideally\n // each modal would have a name so they could each have their own\n // key handlers, but we'll do that later\n let prevScope = hotkeys.getScope();\n hotkeys.setScope('modal');\n return () => hotkeys.setScope(prevScope);\n }, []);\n\n return (\n <ReactModal\n isOpen={true}\n onRequestClose={onClose}\n shouldCloseOnOverlayClick={false}\n shouldFocusAfterRender={!global.IS_DESIGN_MODE}\n shouldReturnFocusAfterClose={focusAfterClose}\n appElement={document.querySelector('#root')}\n parentSelector={parent && (() => parent)}\n style={{\n content: {\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n overflow: 'visible',\n border: 0,\n fontSize: 14,\n backgroundColor: 'transparent',\n padding: 0,\n pointerEvents: 'auto',\n ...contentStyle\n },\n overlay: {\n zIndex: 3000,\n backgroundColor:\n showOverlay && stackIndex === 0 ? 'rgba(0, 0, 0, .1)' : 'none',\n pointerEvents: showOverlay ? 'auto' : 'none',\n ...overlayStyle,\n ...(parent\n ? {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0\n }\n : {})\n }\n }}\n >\n <ModalContent\n noAnimation={noAnimation}\n isCurrent={isCurrent}\n size={size}\n style={[\n {\n willChange: 'opacity, transform',\n minWidth: 500,\n minHeight: 0,\n boxShadow: styles.shadowLarge,\n borderRadius: 4,\n backgroundColor: 'white',\n opacity: isHidden ? 0 : 1\n },\n style,\n styles.lightScrollbar\n ]}\n >\n {showHeader && (\n <View\n style={{\n padding: 20,\n position: 'relative'\n }}\n >\n {showTitle && (\n <View\n style={{\n color: colors.n2,\n flex: 1,\n alignSelf: 'center',\n textAlign: 'center',\n // We need to force a width for the text-overflow\n // ellipses to work because we are aligning center.\n // This effectively gives it a padding of 20px\n width: 'calc(100% - 40px)'\n }}\n >\n <Text\n style={{\n fontSize: 25,\n fontWeight: 700,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {title}\n </Text>\n </View>\n )}\n\n <View\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center'\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n marginRight: 15\n }}\n >\n {showClose && (\n <Button\n bare\n onClick={e => onClose()}\n style={{ padding: '10px 10px' }}\n >\n <Delete width={10} />\n </Button>\n )}\n </View>\n </View>\n </View>\n )}\n <View style={{ padding, paddingTop: 0, flex: 1 }}>\n {typeof children === 'function' ? children() : children}\n </View>\n {loading && (\n <View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(255, 255, 255, .6)',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000\n }}\n >\n <Loading style={{ width: 20, height: 20 }} color={colors.n1} />\n </View>\n )}\n </ModalContent>\n </ReactModal>\n );\n}\n\nexport function ModalButtons({\n style,\n leftContent,\n focusButton = false,\n children\n}) {\n let containerRef = useRef(null);\n\n useEffect(() => {\n if (focusButton && containerRef.current) {\n let button = containerRef.current.querySelector(\n 'button:not([data-hidden])'\n );\n\n if (button) {\n button.focus();\n }\n }\n }, [focusButton]);\n\n return (\n <View\n innerRef={containerRef}\n style={[\n {\n flexDirection: 'row',\n marginTop: 30\n },\n style\n ]}\n >\n {/* Add a dummy button first so that when a user\n presses \"enter\" they do a normal submit, instead of\n activating the back button */}\n <Button data-hidden={true} style={{ display: 'none' }} />\n {leftContent}\n <View style={{ flex: 1 }} />\n {children}\n </View>\n );\n}\n\nexport function InlineField({ label, labelWidth, children, width, style }) {\n return (\n <label\n {...css(\n {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n margin: '7px 0',\n width\n },\n style\n )}\n >\n <div\n style={{\n width: labelWidth || 75,\n textAlign: 'right',\n paddingRight: 10\n }}\n >\n {label}:\n </div>\n {children}\n </label>\n );\n}\n\nexport function FormError({ style, children }) {\n return (\n <View style={[{ color: 'red', fontSize: 13 }, style]}>{children}</View>\n );\n}\n\nexport function InitialFocus({ children }) {\n let node = useRef(null);\n\n useEffect(() => {\n if (node.current && !global.IS_DESIGN_MODE) {\n // This is needed to avoid a strange interaction with\n // `ScopeTab`, which doesn't allow it to be focused at first for\n // some reason. Need to look into it.\n setTimeout(() => {\n if (node.current) {\n node.current.focus();\n node.current.setSelectionRange(0, 10000);\n }\n }, 0);\n }\n }, []);\n\n if (typeof children === 'function') {\n return children(node);\n }\n return React.cloneElement(children, { inputRef: node });\n}\n\nexport class HoverTarget extends React.Component {\n state = { hovered: false };\n\n onMouseEnter = () => {\n if (!this.props.disabled) {\n this.setState({ hovered: true });\n }\n };\n\n onMouseLeave = () => {\n if (!this.props.disabled) {\n this.setState({ hovered: false });\n }\n };\n\n componentDidUpdate(prevProps) {\n let { disabled } = this.props;\n if (disabled && this.state.hovered) {\n this.setState({ hovered: false });\n }\n }\n\n render() {\n let { style, contentStyle, children, renderContent } = this.props;\n return (\n <View style={style}>\n <View\n onMouseEnter={this.onMouseEnter}\n onMouseLeave={this.onMouseLeave}\n style={contentStyle}\n >\n {children}\n </View>\n {this.state.hovered && renderContent()}\n </View>\n );\n }\n}\n\nexport class TooltipTarget extends React.Component {\n state = { clicked: false };\n\n render() {\n return (\n <View style={[{ position: 'relative' }, this.props.style]}>\n <View\n style={{ flex: 1 }}\n onClick={() => this.setState({ clicked: true })}\n >\n {this.props.children}\n </View>\n {this.state.clicked &&\n this.props.renderContent(() => this.setState({ clicked: false }))}\n </View>\n );\n }\n}\n\nexport * from './tooltips';\nexport { useTooltip } from './tooltips';\n","import React, { useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport { css, before } from 'glamor';\nimport { styles } from '../style';\n\nexport const IntersectionBoundary = React.createContext();\n\nfunction visibleBoundingRect(el) {\n let rect = el.getBoundingClientRect();\n let parentRect = el.parentNode.getBoundingClientRect();\n\n let top = Math.max(rect.top, parentRect.top);\n let left = Math.max(rect.left, parentRect.left);\n let right = Math.min(\n rect.left + rect.width,\n parentRect.left + parentRect.width\n );\n let bottom = Math.min(\n rect.top + rect.height,\n parentRect.top + parentRect.height\n );\n\n return {\n top,\n left,\n width: right - left,\n height: bottom - top\n };\n}\n\nexport function useTooltip() {\n let [isOpen, setIsOpen] = useState(false);\n\n return {\n getOpenEvents: (events = {}) => ({\n onClick: e => {\n e.stopPropagation();\n events.onClick && events.onClick(e);\n setIsOpen(true);\n }\n }),\n isOpen,\n close: () => setIsOpen(false)\n };\n}\n\nexport class Tooltip extends React.Component {\n static contextType = IntersectionBoundary;\n state = { position: null };\n\n constructor(props) {\n super(props);\n this.position = props.position || 'bottom-right';\n this.contentRef = React.createRef();\n }\n\n setup() {\n this.layout();\n\n let mousedownHandler = e => {\n let node = e.target;\n\n while (node && node !== document.documentElement) {\n // Allow clicking reach popover that mount outside of\n // tooltips. Might need to think about this more, like what\n // kind of things can be click that shouldn't close a tooltip?\n if (\n node.dataset.testid === 'tooltip' ||\n node.dataset.reachPopover != null\n ) {\n break;\n }\n\n node = node.parentNode;\n }\n\n if (node === document.documentElement) {\n this.props.onClose && this.props.onClose();\n }\n };\n\n let escHandler = e => {\n if (e.keyCode === 27) {\n this.props.onClose && this.props.onClose();\n }\n };\n\n window.document.addEventListener('mousedown', mousedownHandler, false);\n this.contentRef.current.addEventListener('keydown', escHandler, false);\n\n this.cleanup = () => {\n window.document.removeEventListener('mousedown', mousedownHandler);\n };\n }\n\n componentDidMount() {\n if (this.getContainer()) {\n this.setup();\n } else {\n // TODO: write comment :)\n this.forceUpdate(() => {\n if (this.getContainer()) {\n this.setup();\n } else {\n console.log('Warning: could not mount tooltip, container missing');\n }\n });\n }\n }\n\n componentDidUpdate(prevProps) {\n // If providing the target rect manually, we can dynamically\n // update to it. We can't do this if we are reading directly from\n // the DOM since we don't know when it's updated.\n if (\n prevProps.targetRect !== this.props.targetRect ||\n prevProps.forceTop !== this.props.forceTop ||\n this.props.forceLayout\n ) {\n this.layout();\n }\n }\n\n getContainer() {\n let { ignoreBoundary = false } = this.props;\n\n if (!ignoreBoundary && this.context) {\n return this.context.current;\n }\n return document.body;\n }\n\n getBoundsContainer() {\n // If the container is a scrollable element, we want to do all the\n // bounds checking on the parent DOM element instead\n let container = this.getContainer();\n\n if (\n container.parentNode &&\n container.parentNode.style.overflow === 'auto'\n ) {\n return container.parentNode;\n }\n return container;\n }\n\n layout() {\n let { targetRect, offset = 0 } = this.props;\n let contentEl = this.contentRef.current;\n if (!contentEl) {\n return;\n }\n\n let box = contentEl.getBoundingClientRect();\n let anchorEl = this.target.parentNode;\n\n let anchorRect = targetRect || anchorEl.getBoundingClientRect();\n\n // Copy it so we can mutate it\n anchorRect = {\n top: anchorRect.top,\n left: anchorRect.left,\n width: anchorRect.width,\n height: anchorRect.height\n };\n\n let container = this.getBoundsContainer();\n if (!container) {\n return;\n }\n\n let containerRect = container.getBoundingClientRect();\n anchorRect.left -= containerRect.left;\n anchorRect.top -= containerRect.top;\n\n // This is a hack, but allow consumers to force a top position if\n // they already know it. This allows them to provide consistent\n // updates. We should generalize this and `targetRect`\n if (this.props.forceTop) {\n anchorRect.top = this.props.forceTop;\n } else {\n let boxHeight = box.height + offset;\n let testTop = anchorRect.top - boxHeight;\n let testBottom = anchorRect.top + anchorRect.height + boxHeight;\n\n if (\n // If it doesn't fit above it, switch it to below\n (this.position.indexOf('top') !== -1 && testTop < containerRect.top) ||\n // If it doesn't fit below it, switch it above only if it does\n // fit above it\n (this.position.indexOf('bottom') !== -1 &&\n (testBottom > containerRect.height && testTop > 0))\n ) {\n // Invert the position\n this.position = this.getOppositePosition(this.position);\n }\n\n anchorRect.top += container.scrollTop;\n }\n\n const style = this.getStyleForPosition(\n this.position,\n box,\n anchorRect,\n this.getContainer().getBoundingClientRect(),\n offset\n );\n\n contentEl.style.top = style.top;\n contentEl.style.bottom = style.bottom;\n contentEl.style.left = style.left;\n contentEl.style.right = style.right;\n contentEl.style.width = style.width;\n }\n\n componentWillUnmount() {\n if (this.cleanup) {\n this.cleanup();\n }\n }\n\n getOppositePosition(position) {\n switch (position) {\n case 'top':\n case 'top-left':\n return 'bottom';\n case 'top-right':\n return 'bottom-right';\n case 'bottom':\n case 'bottom-left':\n return 'top';\n case 'bottom-right':\n return 'top-right';\n case 'bottom-stretch':\n return 'top-stretch';\n case 'top-stretch':\n return 'bottom-stretch';\n case 'bottom-center':\n return 'top-center';\n case 'top-center':\n return 'bottom-center';\n default:\n }\n }\n\n getStyleForPosition(position, boxRect, anchorRect, containerRect, offset) {\n const style = {\n top: 'inherit',\n bottom: 'inherit',\n left: 'inherit',\n right: 'inherit'\n };\n\n if (\n position === 'top' ||\n position === 'top-right' ||\n position === 'top-left'\n ) {\n style.top = anchorRect.top - boxRect.height - offset + 'px';\n if (position === 'top-right') {\n style.left =\n anchorRect.left + (anchorRect.width - boxRect.width) + 'px';\n } else {\n style.left = anchorRect.left + 'px';\n // style.right = 0;\n }\n } else if (\n position === 'bottom' ||\n position === 'bottom-right' ||\n position === 'bottom-left'\n ) {\n style.top = anchorRect.top + anchorRect.height + offset + 'px';\n if (position === 'bottom-right') {\n style.left =\n anchorRect.left + (anchorRect.width - boxRect.width) + 'px';\n } else {\n style.left = anchorRect.left + 'px';\n // style.right = 0;\n }\n } else if (position === 'bottom-center') {\n style.top = anchorRect.top + anchorRect.height + offset + 'px';\n style.left =\n anchorRect.left - (boxRect.width - anchorRect.width) / 2 + 'px';\n } else if (position === 'top-center') {\n style.top = anchorRect.top - boxRect.height - offset + 'px';\n style.left =\n anchorRect.left - (boxRect.width - anchorRect.width) / 2 + 'px';\n } else if (position === 'left-center') {\n style.top =\n anchorRect.top - (boxRect.height - anchorRect.height) / 2 + 'px';\n style.left = anchorRect.left - boxRect.width + 'px';\n } else if (position === 'top-stretch') {\n style.bottom = containerRect.height - anchorRect.top + offset + 'px';\n style.left = anchorRect.left + 'px';\n style.width = anchorRect.width + 'px';\n } else if (position === 'bottom-stretch') {\n style.top = anchorRect.top + anchorRect.height + offset + 'px';\n style.left = anchorRect.left + 'px';\n style.width = anchorRect.width + 'px';\n } else {\n throw new Error('Invalid position for Tooltip: ' + position);\n }\n return style;\n }\n\n render() {\n const { children, width, style } = this.props;\n\n const contentStyle = {\n position: 'absolute',\n zIndex: 3000,\n\n padding: 5,\n width,\n boxShadow: styles.shadowLarge,\n borderRadius: 4,\n backgroundColor: 'white'\n // opacity: 0,\n // transition: 'transform .1s, opacity .1s',\n // transitionTimingFunction: 'ease-out'\n };\n\n // const enteredStyle = { opacity: 1, transform: 'none' };\n\n if (!this.getContainer()) {\n return null;\n }\n\n return (\n <div ref={el => (this.target = el)}>\n {ReactDOM.createPortal(\n <div\n {...css(contentStyle, style, styles.darkScrollbar)}\n ref={this.contentRef}\n data-testid=\"tooltip\"\n onClick={e => {\n // Click events inside a tooltip (e.g. when selecting a menu item) will bubble up\n // through the portal to parents in the React tree (as opposed to DOM parents).\n // This is undesirable. For example, clicking on a category group on a budget sheet\n // toggles that group, and so would clicking on a menu item in the settings menu\n // of that category group if the click event wasn't stopped from bubbling up.\n // This issue could be handled in different ways, but I think stopping propagation\n // here is sane; I can't see a scenario where you would want to take advantage of\n // click propagation from a tooltip back to its React parent.\n e.stopPropagation();\n }}\n >\n {children}\n </div>,\n this.getContainer()\n )}\n </div>\n );\n }\n}\n\nexport function Pointer({\n pointerDirection = 'up',\n pointerPosition = 'left',\n backgroundColor,\n borderColor = '#c0c0c0',\n border = true,\n color,\n style,\n innerStyle,\n pointerStyle,\n children\n}) {\n return (\n <div {...css({ position: 'relative' }, style)}>\n <div\n {...css(\n {\n zIndex: 3000,\n backgroundColor: backgroundColor,\n color: color,\n padding: 10,\n boxShadow: '0 2px 6px rgba(0, 0, 0, .25)',\n border: border && '1px solid ' + borderColor,\n borderRadius: 2\n },\n before({\n position: 'absolute',\n display: 'inline-block',\n backgroundColor,\n border: border && '1px solid ' + borderColor,\n borderLeft: 0,\n borderBottom: 0,\n width: 7,\n height: 7,\n boxShadow: '1px -1px 1px rgba(0, 0, 0, .05)',\n ...(pointerDirection === 'up'\n ? {\n transform: 'rotate(-45deg)',\n top: border ? -4 : -3,\n content: '\" \"',\n ...(pointerPosition === 'center'\n ? { left: 'calc(50% - 3.5px)' }\n : pointerPosition === 'left'\n ? { left: 40 }\n : { right: 40 })\n }\n : pointerDirection === 'down'\n ? {\n transform: 'rotate(135deg)',\n bottom: border ? -4 : -3,\n content: '\" \"',\n ...(pointerPosition === 'center'\n ? { left: 'calc(50% - 3.5px)' }\n : pointerPosition === 'left'\n ? { left: 40 }\n : { right: 40 })\n }\n : pointerDirection === 'right'\n ? {\n transform: 'rotate(45deg)',\n content: '\" \"',\n top: 'calc(50% - 3.5px)',\n right: -3\n }\n : {}),\n ...pointerStyle\n }),\n innerStyle\n )}\n >\n {children}\n </div>\n </div>\n );\n}\n","export default {\n LOAD_TRANSACTIONS: 'LOAD_TRANSACTIONS',\n SET_NEW_TRANSACTIONS: 'SET_NEW_TRANSACTIONS',\n UPDATE_NEW_TRANSACTIONS: 'UPDATE_NEW_TRANSACTIONS',\n SET_LAST_TRANSACTION: 'SET_LAST_TRANSACTION',\n MARK_ACCOUNT_READ: 'MARK_ACCOUNT_READ',\n LOAD_ACCOUNTS: 'LOAD_ACCOUNTS',\n UPDATE_ACCOUNT: 'UPDATE_ACCOUNT',\n LOAD_CATEGORIES: 'LOAD_CATEGORIES',\n ADD_CATEGORY: 'ADD_CATEGORY',\n DELETE_CATEGORY: 'DELETE_CATEGORY',\n LOAD_PAYEES: 'LOAD_PAYEES',\n LOAD_BANKS: 'LOAD_BANKS',\n SET_PROFILE: 'SET_PROFILE',\n SET_PREFS: 'SET_PREFS',\n MERGE_LOCAL_PREFS: 'MERGE_LOCAL_PREFS',\n MERGE_GLOBAL_PREFS: 'MERGE_GLOBAL_PREFS',\n SET_BUDGETS: 'SET_BUDGETS',\n SET_REMOTE_FILES: 'SET_REMOTE_FILES',\n SET_ALL_FILES: 'SET_ALL_FILES',\n SET_AVAILABLE_IMPORTS: 'SET_AVAILABLE_IMPORTS',\n CLOSE_BUDGET: 'CLOSE_BUDGET',\n SET_APP_STATE: 'SET_APP_STATE',\n DEBUG_CELL: 'DEBUG_CELL',\n PUSH_MODAL: 'PUSH_MODAL',\n REPLACE_MODAL: 'REPLACE_MODAL',\n HIDE_MODALS: 'HIDE_MODALS',\n SHOW_MODALS: 'SHOW_MODALS',\n CLOSE_MODAL: 'CLOSE_MODAL',\n POP_MODAL: 'POP_MODAL',\n ADD_NOTIFICATION: 'ADD_NOTIFICATION',\n REMOVE_NOTIFICATION: 'REMOVE_NOTIFICATION',\n GET_USER_DATA: 'GET_USER_DATA',\n SET_LAST_UNDO_STATE: 'SET_LAST_UNDO_STATE',\n SET_LAST_SPLIT_STATE: 'SET_LAST_SPLIT_STATE',\n SET_ACCOUNTS_SYNCING: 'SET_ACCOUNTS_SYNCING',\n ACCOUNT_SYNC_STATUS: 'ACCOUNT_SYNC_STATUS',\n ACCOUNT_SYNC_FAILURES: 'ACCOUNT_SYNC_FAILURES',\n SIGN_OUT: 'SIGN_OUT',\n\n SET_TUTORIAL_STAGE: 'SET_TUTORIAL_STAGE',\n DEACTIVATE_TUTORIAL: 'DEACTIVATE_TUTORIAL'\n};\n","import React from 'react';\n\nconst SvgCheckmark = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path d=\"M0 11l2-2 5 5L18 3l2 2L7 18z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport default SvgCheckmark;\n","import { send } from '../../platform/client/fetch';\nimport constants from '../constants';\n\nexport function setAppState(state) {\n return {\n type: constants.SET_APP_STATE,\n state\n };\n}\n\nexport function updateApp() {\n return async dispatch => {\n global.Actual.applyAppUpdate();\n dispatch(setAppState({ updateInfo: null }));\n };\n}\n\nexport function setLastUndoState(undoState) {\n return {\n type: constants.SET_LAST_UNDO_STATE,\n undoState\n };\n}\n\n// This is only used in the fake web version where everything runs in\n// the browser. It's a way to send a file to the backend to be\n// imported into the virtual filesystem.\nexport function uploadFile(filename, contents) {\n return dispatch => {\n return send('upload-file-web', { filename, contents });\n };\n}\n\nexport function focused() {\n return dispatch => {\n return send('app-focused');\n };\n}\n","import React from 'react';\nimport { css } from 'glamor';\n\nfunction Text(props) {\n // Pull `numberOfLines` off since it's only used in React Native\n const { numberOfLines, style, innerRef, ...restProps } = props;\n return (\n <span\n {...restProps}\n ref={innerRef}\n className={`${props.className || ''} ${css(props.style)}`}\n />\n );\n}\n\nexport default Text;\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction Delete({ width, height, style, color = \"currentColor\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 24 24\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line\n fill=\"none\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeMiterlimit=\"10\"\n x1=\"2\"\n y1=\"2\"\n x2=\"22\"\n y2=\"22\"\n />\n <line\n fill=\"none\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeMiterlimit=\"10\"\n x1=\"22\"\n y1=\"2\"\n x2=\"2\"\n y2=\"22\"\n />\n </svg>\n );\n}\n\nexport default Delete;\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction ExpandArrow({ width, height, style, color = \"currentColor\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 25 15\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill={color}\n className=\"path\"\n d=\"M24.4825085,0.57623494 C24.1741468,0.24939759 23.8086177,0.0861144578 23.3862628,0.0861144578 L1.55921502,0.0861144578 C1.13668942,0.0861144578 0.771416382,0.24939759 0.462798635,0.57623494 C0.154180887,0.903433735 0,1.29027108 0,1.73746988 C0,2.18457831 0.154180887,2.57141566 0.462798635,2.89834337 L11.3763652,14.4562048 C11.6853242,14.7830422 12.0505973,14.9466867 12.4727816,14.9466867 C12.8949659,14.9466867 13.2605802,14.7830422 13.568942,14.4562048 L24.4825085,2.89825301 C24.790785,2.57141566 24.9455631,2.18457831 24.9455631,1.73737952 C24.9455631,1.29027108 24.790785,0.903433735 24.4825085,0.57623494 Z\"\n />\n </svg>\n );\n}\n\nexport default ExpandArrow;\n","import constants from '../constants';\nimport { closeModal } from './modals';\nimport { send } from '../../platform/client/fetch';\n\nexport function loadPrefs() {\n return async (dispatch, getState) => {\n let prefs = await send('load-prefs');\n\n // Remove any modal state if switching between budgets\n let currentPrefs = getState().prefs.local;\n if (prefs && prefs.id && !currentPrefs) {\n dispatch(closeModal());\n }\n\n dispatch({\n type: constants.SET_PREFS,\n prefs,\n globalPrefs: await send('load-global-prefs')\n });\n\n return prefs;\n };\n}\n\nexport function savePrefs(prefs) {\n return async dispatch => {\n await send('save-prefs', prefs);\n dispatch({\n type: constants.MERGE_LOCAL_PREFS,\n prefs\n });\n };\n}\n\nexport function loadGlobalPrefs() {\n return async (dispatch, getState) => {\n let globalPrefs = await send('load-global-prefs');\n dispatch({\n type: constants.SET_PREFS,\n prefs: getState().prefs.local,\n globalPrefs\n });\n return globalPrefs;\n };\n}\n\nexport function saveGlobalPrefs(prefs) {\n return async dispatch => {\n await send('save-global-prefs', prefs);\n dispatch({\n type: constants.MERGE_GLOBAL_PREFS,\n globalPrefs: prefs\n });\n };\n}\n","import { send } from '../../platform/client/fetch';\nimport constants from '../constants';\nimport { loadGlobalPrefs } from './prefs';\nimport { loadAllFiles, closeBudget } from './budgets';\n\nexport function getUserData() {\n return async dispatch => {\n const data = await send('subscribe-get-user');\n\n dispatch({\n type: constants.GET_USER_DATA,\n data\n });\n return data;\n };\n}\n\nexport function loggedIn() {\n return async dispatch => {\n await dispatch(getUserData());\n\n // We want to be careful about how we call loadAllFiles. It will\n // turn the files state from null into an array, indicating that\n // we've loaded the files at least once. This first attempt at\n // loading files is important - the manager uses files to decide\n // if it should create a new file automatically (if there are no\n // files). If we call it before we have a properly logged in\n // user, later on it could trigger the codepath which\n // automatically creates a file, but we really haven't loaded\n // their files yet.\n //\n // Since the above comment was written, We let in users even if\n // their account is invalid. So we should list all their files\n // regardless. Previously, we kicked users out to a \"need payment\n // info\" screen and we didn't want to call this.\n dispatch(loadAllFiles());\n };\n}\n\nexport function signOut() {\n return async dispatch => {\n const data = await send('subscribe-sign-out');\n\n dispatch(getUserData());\n dispatch(loadGlobalPrefs());\n dispatch(closeBudget());\n dispatch({ type: constants.SIGN_OUT });\n };\n}\n","import constants from '../constants';\nconst uuid = require('../../platform/uuid');\n\nexport function addNotification(notification) {\n return {\n type: constants.ADD_NOTIFICATION,\n notification: {\n ...notification,\n id: notification.id || uuid.v4Sync()\n }\n };\n}\n\nexport function addGenericErrorNotification() {\n return addNotification({\n type: 'error',\n message:\n 'Something internally went wrong. You may want to restart the app if anything looks wrong. ' +\n 'We have been notified of the issue and will try to fix it soon.'\n });\n}\n\nexport function removeNotification(id) {\n return {\n type: constants.REMOVE_NOTIFICATION,\n id\n };\n}\n","export function getUploadError({ reason, meta }) {\n switch (reason) {\n case 'unauthorized':\n return 'You are not logged in.';\n case 'encrypt-failure':\n if (meta.isMissingKey) {\n return 'Encrypting your file failed because you are missing your encryption key. Create your key in the next step.';\n }\n return 'Encrypting the file failed. You have the correct key so this is an internal bug. To fix this, generate a new key in the next step.';\n case 'file-has-reset':\n // Something really weird happened - during reset a sanity\n // check on the server failed. The user just needs to\n // restart the whole process.\n return 'Something went wrong while resetting your file. Please try again.';\n case 'file-has-new-key':\n return 'Unable to encrypt your data because you are missing the key. Create the latest key in the next step.';\n case 'network':\n return 'Uploading the file failed. Check your network connection.';\n case 'beta-version':\n return 'You cannot perform this action in the beta version (resetting sync, deleting a file, etc).';\n default:\n return `An internal error occurred, sorry! Contact help@actualbudget.com for support. (ref: ${reason})`;\n }\n}\n\nexport function getDownloadError({ reason, meta, fileName }) {\n switch (reason) {\n case 'network':\n case 'download-failure':\n return 'Downloading the file failed. Check your network connection.';\n case 'invalid-zip-file':\n case 'invalid-meta-file':\n return 'Downloaded file is invalid, sorry! Contact help@actualbudget.com for support.';\n case 'decrypt-failure':\n return (\n 'Unable to decrypt file ' +\n (fileName || '(unknown)') +\n '. To change your key, first ' +\n 'download this file with the proper password.'\n );\n\n case 'out-of-sync-migrations':\n return (\n 'This budget cannot be loaded with this version of the app. ' +\n 'Make sure the app is up-to-date.'\n );\n\n default:\n let info = meta && meta.fileId ? `(fileId: ${meta.fileId})` : '';\n return (\n 'Something went wrong trying to download that file, sorry! Contact help@actualbudget.com for support. ' +\n info\n );\n }\n}\n\nexport function getCreateKeyError(error) {\n return getUploadError(error);\n}\n\nexport function getTestKeyError({ reason }) {\n switch (reason) {\n case 'network':\n return 'Unable to connect to the server. We need to access our server to get some information about your keys.';\n case 'old-key-style':\n return (\n 'This file is encrypted with an old unsupported key style. Recreate the key ' +\n 'on a device where the file is available, or use an older version of Actual to download ' +\n 'it.'\n );\n case 'decrypt-failure':\n return 'Unable to decrypt file with this password. Please try again.';\n default:\n return 'Something went wrong trying to create a key, sorry! Contact help@actualbudget.com for support.';\n }\n}\n\nexport function getSubscribeError({ reason }) {\n switch (reason) {\n case 'network':\n return 'Unable to reach the server. Check your internet connection';\n case 'exists':\n return 'An account with that email already exists. Did you mean to login?';\n case 'invalid-email':\n return 'Invalid email';\n default:\n return 'An error occurred. Please try again later.';\n }\n}\n","import { listen, send } from '../platform/client/fetch';\nimport { once, runAgain } from '../shared/async';\n\nimport q, { getPrimaryOrderBy } from '../shared/query';\nexport default q;\n\nexport async function runQuery(query) {\n return send('query', query.serialize());\n}\n\nexport function liveQuery(query, onData, opts) {\n let q = new LiveQuery(query, onData, opts);\n q.run();\n return q;\n}\n\nexport function pagedQuery(query, onData, opts) {\n let q = new PagedQuery(query, onData, opts);\n q.run();\n return q;\n}\n\n// Subscribe and refetch\nexport class LiveQuery {\n constructor(query, onData, opts = {}) {\n this.error = new Error();\n this.query = query;\n this.data = null;\n this.mappedData = null;\n this.dependencies = null;\n this.mapper = opts.mapper;\n this.onlySync = opts.onlySync;\n this.listeners = [];\n\n // Async coordination\n this.inflight = false;\n this.restart = false;\n\n if (onData) {\n this.addListener(onData);\n }\n }\n\n addListener(func) {\n this.listeners.push(func);\n\n return () => {\n this.listeners = this.listeners.filter(l => l !== func);\n };\n }\n\n onData = (data, prevData) => {\n for (let i = 0; i < this.listeners.length; i++) {\n this.listeners[i](data, prevData);\n }\n };\n\n onUpdate = tables => {\n // We might not know the dependencies if the first query result\n // hasn't come back yet\n if (\n this.dependencies == null ||\n tables.find(table => this.dependencies.has(table))\n ) {\n this.run();\n }\n };\n\n run = () => {\n this.subscribe();\n return this._fetchData(() => runQuery(this.query));\n };\n\n _fetchData = async makeRequest => {\n // TODO: precompile queries, or cache compilation results on the\n // backend. could give a query an id which makes it cacheable via\n // an LRU cache\n\n let reqId = Math.random();\n this.inflightRequestId = reqId;\n\n let { data, dependencies } = await makeRequest();\n\n // Regardless if this request was cancelled or not, save the\n // dependencies. The query can't change so all requests will\n // return the same deps.\n if (this.dependencies == null) {\n this.dependencies = new Set(dependencies);\n }\n\n // Only fire events if this hasn't been cancelled and if we're\n // still subscribed (`this._subscribe` will exist)\n if (this.inflightRequestId === reqId && this._unsubscribe) {\n let prevData = this.mappedData;\n this.data = data;\n this.mappedData = this.mapData(data);\n this.onData(this.mappedData, prevData);\n this.inflightRequestId = null;\n }\n };\n\n subscribe = () => {\n if (this._unsubscribe == null) {\n this._unsubscribe = listen('sync-event', ({ type, tables }) => {\n // If the user is doing optimistic updates, they don't want to\n // always refetch whenever something changes because it would\n // refetch all data after they've already updated the UI. This\n // voids the perf benefits of optimistic updates. Allow querys\n // to only react to remote syncs. By default, queries will\n // always update to all changes.\n //\n // TODO: errors?\n let syncTypes = this.onlySync ? ['success'] : ['applied', 'success'];\n\n if (syncTypes.indexOf(type) !== -1) {\n this.onUpdate(tables);\n }\n });\n }\n };\n\n unsubscribe = () => {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n };\n\n mapData = data => {\n if (this.mapper) {\n return this.mapper(data);\n }\n return data;\n };\n\n getQuery = () => {\n return this.query;\n };\n\n getData = () => {\n return this.mappedData;\n };\n\n getNumListeners = () => {\n return this.listeners.length;\n };\n\n isRunning = () => {\n return this._unsubscribe != null;\n };\n\n _optimisticUpdate = (dataFunc, mappedDataFunc) => {\n this.data = dataFunc(this.data);\n this.mappedData = mappedDataFunc(this.mappedData);\n };\n\n optimisticUpdate = (dataFunc, mappedDataFunc) => {\n let prevMappedData = this.mappedData;\n this._optimisticUpdate(dataFunc, mappedDataFunc);\n this.onData(this.mappedData, prevMappedData);\n };\n}\n\n// Paging\nexport class PagedQuery extends LiveQuery {\n constructor(query, onData, opts = {}) {\n super(query, onData, opts);\n this.totalCount = null;\n this.pageCount = opts.pageCount || 500;\n this.runPromise = null;\n this.done = false;\n this.onPageData = opts.onPageData || (() => {});\n }\n\n _fetchCount = () => {\n return runQuery(this.query.calculate({ $count: '*' })).then(({ data }) => {\n this.totalCount = data;\n });\n };\n\n run = () => {\n this.subscribe();\n\n this.runPromise = this._fetchData(async () => {\n this.done = false;\n\n // Also fetch the total count\n this._fetchCount();\n\n // If data is null, we haven't fetched anything yet so just\n // fetch the first page\n return runQuery(\n this.query.limit(\n this.data == null\n ? this.pageCount\n : Math.max(this.data.length, this.pageCount)\n )\n );\n });\n\n return this.runPromise;\n };\n\n refetchUpToRow = async (id, defaultOrderBy) => {\n this.runPromise = this._fetchData(async () => {\n this.done = false;\n\n // Also fetch the total count\n this._fetchCount();\n\n let orderDesc = getPrimaryOrderBy(this.query, defaultOrderBy);\n if (orderDesc == null) {\n throw new Error(`refetchUpToRow requires a query with orderBy`);\n }\n\n let { field, order } = orderDesc;\n\n let result = await runQuery(this.query.filter({ id }).select(field));\n if (result.data.length === 0) {\n // This row is not part of this set anymore, we can't do\n // this. We stop early to avoid possibly pulling in a ton of\n // data that we don't need\n return;\n }\n let fullRow = result.data[0];\n\n result = await runQuery(\n this.query.filter({\n [field]: {\n [order === 'asc' ? '$lte' : '$gte']: fullRow[field]\n }\n })\n );\n let data = result.data;\n\n // Load in an extra page to make room for the UI to show some\n // data after it\n result = await runQuery(\n this.query\n .filter({\n [field]: {\n [order === 'asc' ? '$gt' : '$lt']: fullRow[field]\n }\n })\n .limit(this.pageCount)\n );\n\n return {\n data: data.concat(result.data),\n dependencies: result.dependencies\n };\n });\n\n return this.runPromise;\n };\n\n // The public version of this function is created below and\n // throttled by `once`\n _fetchNext = async () => {\n while (this.inflightRequestId) {\n await this.runPromise;\n }\n\n let previousData = this.data;\n\n if (!this.done) {\n let { data } = await runQuery(\n this.query.limit(this.pageCount).offset(previousData.length)\n );\n\n // If either there is an existing request in flight or the data\n // has already changed underneath it, we can't reliably concat\n // the data since it's different now. Need to re-run the whole\n // process again\n if (this.inflightRequestId || previousData !== this.data) {\n return this._fetchNext();\n } else {\n if (data.length === 0) {\n this.done = true;\n } else {\n this.done = data.length < this.pageCount;\n this.data = this.data.concat(data);\n\n let prevData = this.mappedData;\n let mapped = this.mapData(data);\n this.mappedData = this.mappedData.concat(mapped);\n this.onPageData(mapped);\n this.onData(this.mappedData, prevData);\n }\n }\n }\n };\n\n fetchNext = once(this._fetchNext);\n\n isFinished = () => {\n return this.done;\n };\n\n getTotalCount = () => {\n return this.totalCount;\n };\n\n optimisticUpdate = (dataFunc, mappedDataFunc) => {\n let prevData = this.data;\n let prevMappedData = this.mappedData;\n\n this._optimisticUpdate(dataFunc, mappedDataFunc);\n this.totalCount += this.data.length - prevData.length;\n\n this.onData(this.mappedData, prevMappedData);\n };\n}\n","export function sequential(fn) {\n let sequenceState = {\n running: null,\n queue: []\n };\n\n function pump() {\n if (sequenceState.queue.length > 0) {\n const next = sequenceState.queue.shift();\n run(next.args, next.resolve, next.reject);\n } else {\n sequenceState.running = null;\n }\n }\n\n function run(args, resolve, reject) {\n sequenceState.running = fn(...args);\n\n sequenceState.running.then(\n val => {\n pump();\n resolve(val);\n },\n err => {\n pump();\n reject(err);\n }\n );\n }\n\n return (...args) => {\n if (!sequenceState.running) {\n return new Promise((resolve, reject) => {\n return run(args, resolve, reject);\n });\n } else {\n return new Promise((resolve, reject) => {\n sequenceState.queue.push({ resolve, reject, args });\n });\n }\n };\n}\n\nexport function once(fn) {\n let promise = null;\n let onceFn = (...args) => {\n if (!promise) {\n promise = fn(...args).finally(() => {\n promise = null;\n });\n return promise;\n }\n\n return promise;\n };\n\n return onceFn;\n}\n","import constants from '../constants';\nimport { send } from '../../platform/client/fetch';\nimport Platform from '../platform';\nimport { pushModal } from './modals';\n\nexport function startTutorialFirstTime() {\n return (dispatch, getState) => {\n let { seenTutorial } = getState().prefs.global;\n\n if (!seenTutorial) {\n send('set-tutorial-seen');\n if (Platform.env === 'web') {\n setTimeout(() => {\n dispatch(pushModal('welcome-screen'));\n }, 500);\n\n return true;\n }\n }\n return false;\n };\n}\n","import React, { useRef, useLayoutEffect, useContext, useMemo } from 'react';\n\nfunction getFocusedKey(el) {\n let node = el;\n // Search up to 10 parent nodes\n for (let i = 0; i < 10 && node; i++) {\n let key = node.dataset && node.dataset.focusKey;\n if (key) {\n return key;\n }\n node = node.parentNode;\n }\n\n return null;\n}\n\nexport function focusElement(el, refocusContext) {\n if (refocusContext) {\n let key = getFocusedKey(el);\n el.focus({ preventScroll: key && key === refocusContext.keyRef.current });\n refocusContext.onKeyChange(key);\n } else {\n el.focus();\n }\n\n if (el.tagName === 'INPUT') {\n el.setSelectionRange(0, 10000);\n }\n}\n\nlet AvoidRefocusScrollContext = React.createContext(null);\n\nexport function AvoidRefocusScrollProvider({ children }) {\n let keyRef = useRef(null);\n\n let value = useMemo(\n () => ({\n keyRef,\n onKeyChange: key => {\n keyRef.current = key;\n }\n }),\n [keyRef]\n );\n\n return (\n <AvoidRefocusScrollContext.Provider value={value}>\n {children}\n </AvoidRefocusScrollContext.Provider>\n );\n}\n\nexport function useProperFocus(ref, shouldFocus) {\n let context = useContext(AvoidRefocusScrollContext);\n let prevShouldFocus = useRef(null);\n\n useLayoutEffect(() => {\n let prev = prevShouldFocus.current;\n let view = ref.current;\n\n if (view && shouldFocus && (prev === null || prev === false)) {\n let selector = 'input,button,div[tabindex]';\n let focusEl = view.matches(selector)\n ? view\n : view.querySelector(selector);\n\n if (shouldFocus && focusEl) {\n focusElement(focusEl, context);\n }\n }\n\n prevShouldFocus.current = shouldFocus;\n }, [shouldFocus]);\n}\n","import React, { useState, useEffect } from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport * as actions from 'loot-core/src/client/actions';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n View,\n Text,\n Button,\n Tooltip,\n Menu\n} from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\nimport ExclamationSolid from 'loot-design/src/svg/v1/ExclamationSolid';\n\nfunction LoggedInUser({\n history,\n files,\n budgetId,\n userData,\n getUserData,\n setAppState,\n signOut,\n pushModal,\n closeBudget,\n style,\n color\n}) {\n let [loading, setLoading] = useState(true);\n let [menuOpen, setMenuOpen] = useState(false);\n\n useEffect(() => {\n getUserData().then(() => setLoading(false));\n }, []);\n\n async function onChangePassword() {\n await closeBudget();\n window.__history.push('/change-password');\n }\n\n function onMenuSelect(type) {\n setMenuOpen(false);\n\n switch (type) {\n case 'change-password':\n onChangePassword();\n break;\n case 'sign-out':\n signOut();\n break;\n default:\n }\n }\n\n function onClick() {\n setMenuOpen(true);\n }\n\n if (loading) {\n return (\n <Text style={[{ color: colors.n5, fontStyle: 'italic' }, style]}>\n Loading account...\n </Text>\n );\n } else if (userData) {\n if (userData.offline) {\n return <View style={[{ color }, style]}>Offline</View>;\n }\n\n return (\n <View style={[{ flexDirection: 'row', alignItems: 'center' }, style]}>\n <Button bare onClick={onClick} style={{ color }}>\n Server\n </Button>\n\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={onMenuSelect}\n items={[\n { name: 'change-password', text: 'Change password' },\n { name: 'sign-out', text: 'Sign out' }\n ].filter(x => x)}\n />\n </Tooltip>\n )}\n </View>\n );\n } else {\n return <View style={[{ color }, style]}>Not logged in</View>;\n }\n}\n\nexport default connect(\n state => ({\n userData: state.user.data,\n files: state.budgets.allFiles,\n budgetId: state.prefs.local && state.prefs.local.id\n }),\n actions\n)(withRouter(LoggedInUser));\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Button,\n ButtonWithLoading,\n Stack,\n ExternalLink\n} from 'loot-design/src/components/common';\nimport Delete from 'loot-design/src/svg/Delete';\nimport Loading from 'loot-design/src/svg/v1/AnimatedLoading';\nimport { styles, colors } from 'loot-design/src/style';\n\nfunction compileMessage(message, actions, setLoading, onRemove) {\n return (\n <Stack spacing={2}>\n {message.split(/\\n\\n/).map((paragraph, idx) => {\n let parts = paragraph.split(/(\\[[^\\]]*\\]\\([^)]*\\))/g);\n\n return (\n <Text key={idx} style={{ lineHeight: '1.4em' }}>\n {parts.map((part, idx) => {\n let match = part.match(/\\[([^\\]]*)\\]\\(([^)]*)\\)/);\n if (match) {\n let [_, text, href] = match;\n\n if (href[0] === '#') {\n let actionName = href.slice(1);\n return (\n // eslint-disable-next-line\n <a\n href=\"#\"\n onClick={async e => {\n e.preventDefault();\n if (actions[actionName]) {\n setLoading(true);\n await actions[actionName]();\n onRemove();\n }\n }}\n >\n {text}\n </a>\n );\n }\n\n return (\n <ExternalLink key={idx} asAnchor={true} href={match[2]}>\n {match[1]}\n </ExternalLink>\n );\n }\n return <Text key={idx}>{part}</Text>;\n })}\n </Text>\n );\n })}\n </Stack>\n );\n}\n\nfunction Notification({ notification, onRemove }) {\n let {\n id,\n type,\n title,\n message,\n messageActions,\n sticky,\n internal,\n button\n } = notification;\n\n let [loading, setLoading] = useState(false);\n let [overlayLoading, setOverlayLoading] = useState(false);\n\n useEffect(() => {\n if (type === 'error' && internal) {\n console.error('Internal error:', internal);\n }\n\n if (!sticky) {\n setTimeout(onRemove, 6500);\n }\n }, []);\n\n let positive = type === 'message';\n let error = type === 'error';\n\n let processedMessage = useMemo(\n () => compileMessage(message, messageActions, setOverlayLoading, onRemove),\n [message, messageActions]\n );\n\n return (\n <View\n style={{\n marginTop: 10,\n color: positive ? colors.g3 : error ? colors.r3 : colors.y2\n }}\n >\n <Stack\n align=\"center\"\n direction=\"row\"\n style={{\n padding: '14px 14px',\n fontSize: 14,\n backgroundColor: positive\n ? colors.g11\n : error\n ? colors.r11\n : colors.y10,\n borderTop: `3px solid ${\n positive ? colors.g5 : error ? colors.r5 : colors.y4\n }`,\n boxShadow: styles.shadowLarge,\n maxWidth: 550,\n\n '& a': { color: 'currentColor' }\n }}\n >\n <Stack align=\"flex-start\">\n {title && (\n <View style={{ fontWeight: 700, marginBottom: 10 }}>{title}</View>\n )}\n <View>{processedMessage}</View>\n {button && (\n <ButtonWithLoading\n bare\n loading={loading}\n onClick={async () => {\n setLoading(true);\n await button.action();\n onRemove();\n setLoading(false);\n }}\n style={{\n backgroundColor: 'transparent',\n border: `1px solid ${\n positive ? colors.g5 : error ? colors.r4 : colors.y3\n }`,\n color: 'currentColor',\n fontSize: 14,\n flexShrink: 0,\n '&:hover, &:active': {\n backgroundColor: positive\n ? colors.g9\n : error\n ? colors.r10\n : colors.y9\n }\n }}\n >\n {button.title}\n </ButtonWithLoading>\n )}\n </Stack>\n {sticky && (\n <Button\n bare\n style={{ flexShrink: 0, color: 'currentColor' }}\n onClick={onRemove}\n >\n <Delete style={{ width: 9, height: 9, color: 'currentColor' }} />\n </Button>\n )}\n </Stack>\n {overlayLoading && (\n <View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(250, 250, 250, .75)',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n <Loading\n color=\"currentColor\"\n style={{ width: 20, height: 20, color: 'currentColor' }}\n />\n </View>\n )}\n </View>\n );\n}\n\nfunction Notifications({ notifications, removeNotification, style }) {\n return (\n <View\n style={[\n {\n position: 'absolute',\n bottom: 20,\n right: 13,\n zIndex: 10000\n },\n style\n ]}\n >\n {notifications.map(note => (\n <Notification\n key={note.id}\n notification={note}\n onRemove={() => {\n if (note.onClose) {\n note.onClose();\n }\n removeNotification(note.id);\n }}\n />\n ))}\n </View>\n );\n}\n\nexport default connect(\n state => ({ notifications: state.notifications.notifications }),\n dispatch => bindActionCreators(actions, dispatch)\n)(Notifications);\n","import React from 'react';\nimport { View, Text, Block, Modal, Button } from '../common';\nimport { Row, Cell, DeleteCell } from '../table';\nimport { styles, colors } from '../../style';\n\nclass BackupTable extends React.Component {\n state = { hoveredBackup: null };\n\n onHover = id => {\n this.setState({ hoveredBackup: id });\n };\n\n render() {\n const { backups, onSelect } = this.props;\n const { hoveredBackup } = this.state;\n\n const borderColor = '#f0f0f0';\n return (\n <View\n style={{ flex: 1, maxHeight: 200, overflow: 'auto' }}\n onMouseLeave={() => this.onHover(null)}\n >\n {backups.map((backup, idx) => (\n <Row\n key={backup.id}\n collapsed={idx !== 0}\n focused={hoveredBackup === backup.id}\n onMouseEnter={() => this.onHover(backup.id)}\n onClick={() => onSelect(backup.id)}\n style={{ cursor: 'pointer' }}\n >\n <Cell\n width=\"flex\"\n value={backup.date ? backup.date : 'Revert to Latest'}\n valueStyle={{ paddingLeft: 20 }}\n />\n </Row>\n ))}\n </View>\n );\n }\n}\n\nfunction LoadBackup({\n budgetId,\n backups,\n backupDisabled,\n actions,\n modalProps\n}) {\n const latestBackup = backups.find(backup => backup.isLatest);\n const previousBackups = backups.filter(backup => !backup.isLatest);\n\n return (\n <Modal title=\"Load Backup\" padding={0} {...modalProps} style={{ flex: 0 }}>\n {() => (\n <View style={{ marginBottom: 30 }}>\n <View\n style={{\n margin: 20,\n marginTop: 0,\n marginBottom: 15,\n lineHeight: 1.5\n }}\n >\n {latestBackup ? (\n <Block>\n <Block style={{ marginBottom: 10 }}>\n <Text style={{ fontWeight: 600 }}>\n You are currently working from a backup.\n </Text>{' '}\n You can load a different backup or revert to the original\n version below.\n </Block>\n <Button\n primary\n onClick={() => actions.loadBackup(budgetId, latestBackup.id)}\n >\n Revert to original version\n </Button>\n </Block>\n ) : (\n <View style={{ alignItems: 'flex-start' }}>\n <Block style={{ marginBottom: 10 }}>\n Select a backup to load. After loading a backup, you will have\n a chance to revert to the current version in this screen.{' '}\n <Text style={{ fontWeight: 600 }}>\n If you use a backup, you will have to setup all your devices\n to sync from the new budget.\n </Text>\n </Block>\n <Button\n primary\n disabled={backupDisabled}\n onClick={() => actions.makeBackup()}\n >\n Backup Now\n </Button>\n </View>\n )}\n </View>\n {previousBackups.length === 0 ? (\n <Block style={{ color: colors.n6, marginLeft: 20 }}>\n No backups available\n </Block>\n ) : (\n <BackupTable\n backups={previousBackups}\n onSelect={id => actions.loadBackup(budgetId, id)}\n />\n )}\n </View>\n )}\n </Modal>\n );\n}\n\nexport default LoadBackup;\n","import React, { useRef, useCallback } from 'react';\n\nexport default function useResizeObserver(func) {\n let observer = useRef(null);\n if (!observer.current) {\n observer.current = new ResizeObserver(entries => {\n func(entries[0].contentRect);\n });\n }\n\n let elementRef = useCallback(el => {\n observer.current.disconnect();\n if (el) {\n observer.current.observe(el, { box: 'border-box' });\n }\n }, []);\n\n return elementRef;\n}\n","import hotkeys from 'hotkeys-js';\nimport React, { useEffect, useContext } from 'react';\n\nlet KeyScopeContext = React.createContext('app');\n\nhotkeys.filter = event => {\n var target = event.target || event.srcElement;\n var tagName = target.tagName;\n\n // This is the default behavior of hotkeys, except we only suppress\n // key presses if the meta key is not pressed\n if (\n !event.metaKey &&\n (target.isContentEditable ||\n ((tagName === 'INPUT' ||\n tagName === 'TEXTAREA' ||\n tagName === 'SELECT') &&\n !target.readOnly))\n ) {\n return false;\n }\n\n return true;\n};\n\nexport function KeyHandler({ keyName, eventType = 'keydown', handler }) {\n let scope = useContext(KeyScopeContext);\n\n if (eventType !== 'keyup' && eventType !== 'keydown') {\n throw new Error('KeyHandler: unknown event type: ' + eventType);\n }\n\n useEffect(() => {\n function _handler(event, hk) {\n // Right now it always overrides the default behavior, but in\n // the future we can make this customizable\n event.preventDefault();\n\n if (event.type === eventType && handler) {\n return handler(event, hk);\n }\n }\n hotkeys(keyName, { scope, keyup: true }, _handler);\n\n return () => {\n hotkeys.unbind({\n key: keyName,\n scope,\n method: _handler\n });\n };\n }, [keyName, handler, scope]);\n\n return null;\n}\n\nexport function KeyHandlers({ eventType, keys = {} }) {\n let handlers = Object.keys(keys).map(key => {\n return (\n <KeyHandler\n key={key}\n keyName={key}\n eventType={eventType}\n handler={keys[key]}\n />\n );\n });\n\n return handlers;\n}\n","import Platform from 'loot-core/src/client/platform';\n\nexport const debug = { borderWidth: 1, borderColor: 'red' };\n\nexport const colors = {\n y1: '#733309',\n y2: '#87540d',\n y3: '#B88115',\n y4: '#D4A31C',\n y5: '#E6BB20',\n y6: '#F2D047',\n y7: '#F5E35D',\n y8: '#FCF088',\n y9: '#FFF7C4',\n y10: '#FFFBEA',\n y11: '#FFFEFA',\n r1: '#610316',\n r2: '#8A041A',\n r3: '#AB091E',\n r4: '#CF1124',\n r5: '#E12D39',\n r6: '#EF4E4E',\n r7: '#F86A6A',\n r8: '#FF9B9B',\n r9: '#FFBDBD',\n r10: '#FFE3E3',\n r11: '#FFF1F1',\n b1: '#034388',\n b2: '#0B5FA3',\n b3: '#1271BF',\n b4: '#1980D4',\n b5: '#2B8FED',\n b6: '#40A5F7',\n b7: '#66B5FA',\n b8: '#8BCAFD',\n b9: '#B3D9FF',\n b10: '#E3F0FF',\n b11: '#F5FCFF',\n n1: '#102A43',\n n2: '#243B53',\n n3: '#334E68',\n n4: '#486581',\n n5: '#627D98',\n n6: '#829AB1',\n n7: '#9FB3C8',\n n8: '#BCCCDC',\n n9: '#D9E2EC',\n n10: '#E8ECF0',\n n11: '#F7FAFC',\n g1: '#014D40',\n g2: '#0C6B58',\n g3: '#147D64',\n g4: '#199473',\n g5: '#27AB83',\n g6: '#3EBD93',\n g7: '#65D6AD',\n g8: '#8EEDC7',\n g9: '#C6F7E2',\n g10: '#EFFCF6',\n g11: '#FAFFFD',\n p1: '#44056E',\n p2: '#580A94',\n p3: '#690CB0',\n p4: '#7A0ECC',\n p5: '#8719E0',\n p6: '#9446ED',\n p7: '#A368FC',\n p8: '#B990FF',\n p9: '#DAC4FF',\n p10: '#F2EBFE',\n p11: '#F9F6FE'\n};\n\ncolors.border = colors.n10;\ncolors.hover = '#fafafa';\ncolors.selected = colors.b9;\n\ncolors.resolve = (name, offset) => {\n switch (name) {\n case 'border':\n return colors['n' + (8 + offset)];\n default:\n }\n throw new Error('Unknown color name: ' + name);\n};\n\nexport const styles = {\n veryLargeText: {\n fontSize: 30,\n fontWeight: 600\n },\n largeText: {\n fontSize: 20,\n fontWeight: 700,\n letterSpacing: 0.5\n },\n mediumText: {\n fontSize: 15,\n fontWeight: 500\n },\n smallText: {\n fontSize: 13\n },\n verySmallText: {\n fontSize: 13\n },\n page: {\n // This is the height of the titlebar\n paddingTop: 36,\n minWidth: 500,\n flex: 1\n },\n pageHeader: {\n fontSize: 25,\n borderBottomWidth: 5,\n borderColor: colors.purple2,\n borderStyle: 'solid',\n display: 'inline',\n flex: 0,\n color: colors.grey4,\n marginTop: 40,\n marginBottom: 20,\n paddingBottom: 5\n },\n pageContent: {\n paddingLeft: 20,\n paddingRight: 20\n },\n staticText: {\n cursor: 'default',\n userSelect: 'none'\n },\n shadow: '0 2px 4px 0 rgba(0,0,0,0.1)',\n shadowLarge: '0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08)',\n tnum:\n Platform.env === 'web'\n ? {\n fontFeatureSettings: '\"tnum\"'\n }\n : null,\n notFixed: { fontFeatureSettings: '' }\n};\n\nlet hiddenScrollbars = false;\n\nfunction onScrollbarChange() {\n styles.lightScrollbar = !hiddenScrollbars && {\n '& ::-webkit-scrollbar': {\n width: 11,\n backgroundColor: 'rgba(200, 200, 200, .2)'\n },\n '& ::-webkit-scrollbar-thumb': {\n width: 7,\n borderRadius: 30,\n backgroundClip: 'padding-box',\n border: '2px solid rgba(0, 0, 0, 0)'\n },\n '& ::-webkit-scrollbar-thumb:vertical': {\n backgroundColor: '#d0d0d0'\n }\n };\n\n styles.darkScrollbar = !hiddenScrollbars && {\n '& ::-webkit-scrollbar': {\n width: 7,\n backgroundColor: 'rgba(0, 0, 0, 0)'\n },\n '& ::-webkit-scrollbar-thumb:vertical': {\n backgroundColor: 'rgba(200, 200, 200, .5)'\n }\n };\n\n styles.scrollbarWidth = hiddenScrollbars ? 0 : 13;\n}\n\nif (Platform.env === 'web') {\n function testScrollbars() {\n let el = document.createElement('div');\n el.innerHTML =\n '<div style=\"width:100px;height:100px;overflow:scroll;position:absolute;top:-9999px;\"/>';\n document.body.appendChild(el);\n let testNode = el.childNodes[0];\n if (testNode.offsetWidth === testNode.clientWidth) {\n return true;\n }\n return false;\n }\n\n hiddenScrollbars = testScrollbars();\n onScrollbarChange();\n\n window.addEventListener('focus', () => {\n hiddenScrollbars = testScrollbars();\n onScrollbarChange();\n });\n}\n\nexport const hasHiddenScrollbars = () => hiddenScrollbars;\n\nexport const mobileStyles = {\n header: {\n headerStyle: {\n backgroundColor: 'white',\n borderBottomWidth: 1,\n borderBottomColor: colors.n9,\n elevation: 0\n },\n headerTintColor: colors.n1,\n headerTitleStyle: {\n color: colors.n1,\n fontSize: 15,\n fontWeight: '600'\n },\n headerBackTitle: null\n },\n text: {\n color: colors.n1,\n fontSize: 16,\n lineHeight: 22.4\n },\n smallText: {\n color: colors.n1,\n fontSize: 15,\n lineHeight: 21\n },\n shadow: {\n shadowColor: '#9594A8',\n shadowOffset: { width: 0, height: 1 },\n shadowRadius: 1,\n shadowOpacity: 1,\n elevation: 2\n },\n shadowLarge: {\n shadowColor: '#9594A8',\n shadowOffset: { width: 0, height: 10 },\n shadowRadius: 10,\n shadowOpacity: 1,\n elevation: 3\n }\n};\n\nexport function transform(spec) {\n // We've made React Native Web simulate a mobile environment so it\n // won't return \"web\" here. Explicit check for it so we can override\n // mobile behavior and return a value appropriate for the web.\n if (Platform.env !== 'web' && !Platform.isReactNativeWeb) {\n return spec;\n }\n\n let r = spec.reduce((str, prop) => {\n let name = Object.keys(prop)[0];\n let value = prop[name];\n if (typeof value === 'number') {\n value = value + 'px';\n }\n\n return `${name}(${value})`;\n }, spec);\n return r;\n}\n","import React, { useState } from 'react';\nimport { css } from 'glamor';\nimport {\n View,\n Text,\n Stack,\n Modal,\n Button,\n ButtonWithLoading,\n ExternalLink,\n P,\n ModalButtons,\n Input,\n InitialFocus\n} from 'loot-design/src/components/common';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { styles, colors } from 'loot-design/src/style';\nimport { getCreateKeyError } from 'loot-core/src/shared/errors';\n\nexport default function CreateEncryptionKey({\n modalProps,\n actions,\n budgetId,\n options = {}\n}) {\n let [enabling, setEnabling] = useState(false);\n let [password, setPassword] = useState('');\n let [loading, setLoading] = useState(false);\n let [error, setError] = useState('');\n let [showPassword, setShowPassword] = useState(false);\n\n let isRecreating = options.recreate;\n\n async function onCreateKey() {\n if (password !== '' && !loading) {\n setLoading(true);\n setError(null);\n\n let res = await send('key-make', { password });\n if (res.error) {\n setLoading(null);\n setError(getCreateKeyError(res.error));\n return;\n }\n\n actions.loadGlobalPrefs();\n actions.loadAllFiles();\n actions.sync();\n\n setLoading(false);\n actions.popModal();\n }\n }\n\n return (\n <Modal\n {...modalProps}\n style={{ width: 600 }}\n title={isRecreating ? 'Generate new key' : 'Enable encryption'}\n onClose={() => actions.popModal()}\n >\n {() => (\n <>\n {!isRecreating ? (\n <>\n <P style={{ marginTop: 5 }}>\n To enable end-to-end encryption, you need to create a key. We\n will generate a key based on a password and use it to encrypt\n from now on. <strong>This requires a sync reset</strong> and all\n other devices will have to revert to this version of your data.{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/encrypted-syncing\"\n >\n Learn more\n </ExternalLink>\n </P>\n <P>\n <ul {...css({ marginTop: 0, '& li': { marginBottom: 8 } })}>\n <li>\n <strong>Important:</strong> if you forget this password{' '}\n <em>and</em> you don't have any local copies of your data,\n you will lose access to all your data. We cannot decrypt\n your data.\n </li>\n <li>\n This key only applies to this file. You will need to\n generate a new key for each file you want to encrypt.\n </li>\n <li>\n If you've already downloaded your data on other devices, you\n will need to reset them. Actual will automatically take you\n through this process.\n </li>\n </ul>\n </P>\n </>\n ) : (\n <>\n <P style={{ marginTop: 5 }}>\n This will generate a new key for encrypting your data.{' '}\n <strong>This requires a sync reset</strong> and all other\n devices will have to revert to this version of your data. Actual\n will take you through that process on those devices.{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/encrypted-syncing\"\n >\n Learn more\n </ExternalLink>\n </P>\n <P>\n Key generation is randomized. The same password will create\n different keys, so this will change your key regardless of the\n password being different.\n </P>\n </>\n )}\n <form\n onSubmit={e => {\n e.preventDefault();\n onCreateKey();\n }}\n >\n <View style={{ alignItems: 'center' }}>\n <Text style={{ fontWeight: 600, marginBottom: 3 }}>Password</Text>\n\n {error && (\n <View\n style={{\n color: colors.r4,\n textAlign: 'center',\n fontSize: 13,\n marginBottom: 3\n }}\n >\n {error}\n </View>\n )}\n\n <InitialFocus>\n <Input\n type={showPassword ? 'text' : 'password'}\n style={{ width: 300 }}\n onChange={e => setPassword(e.target.value)}\n />\n </InitialFocus>\n <Text style={{ marginTop: 5 }}>\n <label style={{ userSelect: 'none' }}>\n <input\n type=\"checkbox\"\n onClick={() => setShowPassword(!showPassword)}\n />{' '}\n Show password\n </label>\n </Text>\n </View>\n\n <ModalButtons style={{ marginTop: 20 }}>\n <ButtonWithLoading loading={loading} primary>\n Enable\n </ButtonWithLoading>\n </ModalButtons>\n </form>\n </>\n )}\n </Modal>\n );\n}\n","import React, { useState } from 'react';\nimport {\n View,\n Text,\n Modal,\n Button,\n ButtonWithLoading,\n P,\n ModalButtons,\n Input,\n InitialFocus,\n ExternalLink\n} from 'loot-design/src/components/common';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { styles, colors } from 'loot-design/src/style';\nimport { getTestKeyError } from 'loot-core/src/shared/errors';\n\nexport default function FixEncryptionKey({\n modalProps,\n actions,\n options = {}\n}) {\n let { hasExistingKey, cloudFileId, onSuccess } = options;\n\n let [password, setPassword] = useState('');\n let [error, setError] = useState('');\n let [loading, setLoading] = useState(false);\n let [showPassword, setShowPassword] = useState(false);\n\n async function onUpdateKey() {\n if (password !== '' && !loading) {\n setLoading(true);\n setError(null);\n\n let { error } = await send('key-test', {\n password,\n fileId: cloudFileId\n });\n if (error) {\n setError(getTestKeyError(error));\n setLoading(false);\n return;\n }\n\n actions.popModal();\n onSuccess && onSuccess();\n }\n }\n\n return (\n <Modal {...modalProps} showHeader={false} style={{ width: 600 }}>\n {() => (\n <View style={{ flex: 1 }}>\n <Text\n style={{\n fontSize: 25,\n fontWeight: 700,\n color: colors.n2,\n margin: '20px 0'\n }}\n >\n {hasExistingKey\n ? 'Unable to decrypt file'\n : 'This file is encrypted'}\n </Text>\n {hasExistingKey ? (\n <P>\n This file was encrypted with a different key than you are\n currently using. This probably means you changed your password.\n Enter your current password to update your key.{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/encrypted-syncing\"\n >\n Learn more\n </ExternalLink>\n </P>\n ) : (\n <P>\n We don{\"'\"}t have a key that encrypts or decrypts this file. Enter\n the password for this file to create the key for encryption.{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/encrypted-syncing\"\n >\n Learn more\n </ExternalLink>\n </P>\n )}\n <form\n onSubmit={e => {\n e.preventDefault();\n onUpdateKey();\n }}\n >\n <View\n style={{\n marginTop: 15,\n flexDirection: 'column',\n alignItems: 'center'\n }}\n >\n <Text style={{ fontWeight: 600, marginBottom: 5 }}>Password</Text>{' '}\n {error && (\n <View\n style={{\n color: colors.r4,\n textAlign: 'center',\n fontSize: 13,\n marginBottom: 3\n }}\n >\n {error}\n </View>\n )}\n <InitialFocus>\n <Input\n type={showPassword ? 'text' : 'password'}\n style={{ width: '50%' }}\n onChange={e => setPassword(e.target.value)}\n />\n </InitialFocus>\n <Text style={{ marginTop: 5 }}>\n <label style={{ userSelect: 'none' }}>\n <input\n type=\"checkbox\"\n onClick={() => setShowPassword(!showPassword)}\n />{' '}\n Show password\n </label>\n </Text>\n </View>\n\n <ModalButtons style={{ marginTop: 20 }}>\n <Button\n style={{ marginRight: 10 }}\n onClick={() => modalProps.onBack()}\n type=\"button\"\n >\n Back\n </Button>\n <ButtonWithLoading\n loading={loading}\n primary\n onClick={onUpdateKey}\n >\n {hasExistingKey ? 'Update key' : 'Create key'}\n </ButtonWithLoading>\n </ModalButtons>\n </form>\n </View>\n )}\n </Modal>\n );\n}\n","import { send } from '../../platform/client/fetch';\nimport constants from '../constants';\nimport { getPayees, getAccounts, filterTransactions } from './queries';\nimport { addNotification } from './notifications';\n\nexport function setAccountsSyncing(name) {\n return {\n type: constants.SET_ACCOUNTS_SYNCING,\n name\n };\n}\n\nexport function markAccountFailed(id, errorType, errorCode) {\n return {\n type: 'ACCOUNT_SYNC_STATUS',\n id,\n failed: true,\n errorType,\n errorCode\n };\n}\nexport function markAccountSuccess(id) {\n return {\n type: 'ACCOUNT_SYNC_STATUS',\n id,\n failed: false\n };\n}\nexport function setFailedAccounts(syncErrors) {\n return {\n type: 'ACCOUNT_SYNC_FAILURES',\n syncErrors\n };\n}\n\nexport function unlinkAccount(id) {\n return async dispatch => {\n await send('account-unlink', { id });\n dispatch(markAccountSuccess(id));\n dispatch(getAccounts());\n };\n}\n\nexport function linkAccount(institution, publicToken, accountId, upgradingId) {\n return async dispatch => {\n await send('accounts-link', {\n institution,\n publicToken,\n accountId,\n upgradingId\n });\n await dispatch(getPayees());\n await dispatch(getAccounts());\n };\n}\n\nexport function connectAccounts(\n institution,\n publicToken,\n accountIds,\n offbudgetIds\n) {\n return async dispatch => {\n let ids = await send('accounts-connect', {\n institution,\n publicToken,\n accountIds,\n offbudgetIds\n });\n await dispatch(getPayees());\n await dispatch(getAccounts());\n return ids;\n };\n}\n\nexport function syncAccounts(id) {\n return async (dispatch, getState) => {\n if (getState().account.accountsSyncing) {\n return false;\n }\n\n if (id) {\n let account = getState().queries.accounts.find(a => a.id === id);\n dispatch(setAccountsSyncing(account.name));\n } else {\n dispatch(setAccountsSyncing('__all'));\n }\n\n const {\n errors,\n newTransactions,\n matchedTransactions,\n updatedAccounts\n } = await send('accounts-sync', { id });\n dispatch(setAccountsSyncing(null));\n\n if (id) {\n let error = errors.find(error => error.accountId === id);\n\n if (error) {\n // We only want to mark the account as having problem if it\n // was a real syncing error.\n if (error.type === 'SyncError') {\n dispatch(markAccountFailed(id, error.category, error.code));\n }\n } else {\n dispatch(markAccountSuccess(id));\n }\n } else {\n dispatch(\n setFailedAccounts(\n errors\n .filter(error => error.type === 'SyncError')\n .map(error => ({\n id: error.accountId,\n type: error.category,\n code: error.code\n }))\n )\n );\n }\n\n errors.forEach(error => {\n if (error.type === 'SyncError') {\n dispatch(\n addNotification({\n type: 'error',\n message: error.message\n })\n );\n } else {\n dispatch(\n addNotification({\n type: 'error',\n message: error.message,\n internal: error.internal\n })\n );\n }\n });\n\n dispatch({\n type: constants.SET_NEW_TRANSACTIONS,\n newTransactions,\n matchedTransactions,\n updatedAccounts\n });\n\n return newTransactions.length > 0 || matchedTransactions.length > 0;\n };\n}\n\n// Remember the last transaction manually added to the system\nexport function setLastTransaction(transaction) {\n return {\n type: constants.SET_LAST_TRANSACTION,\n transaction\n };\n}\n\nexport function parseTransactions(filepath, options) {\n return async dispatch => {\n return await send('transactions-parse-file', {\n filepath,\n options\n });\n };\n}\n\nexport function importTransactions(id, transactions) {\n return async dispatch => {\n let { errors = [], added, updated } = await send('transactions-import', {\n accountId: id,\n transactions\n });\n\n errors.forEach(error => {\n dispatch(\n addNotification({\n type: 'error',\n message: error.message,\n internal: error.internal\n })\n );\n });\n\n dispatch({\n type: constants.SET_NEW_TRANSACTIONS,\n newTransactions: added,\n matchedTransactions: updated,\n updatedAccounts: added.length > 0 ? [id] : []\n });\n\n return added.length > 0 || updated.length > 0;\n };\n}\n\nexport function updateNewTransactions(changedId) {\n return {\n type: constants.UPDATE_NEW_TRANSACTIONS,\n changedId\n };\n}\n\nexport function markAccountRead(accountId) {\n return {\n type: constants.MARK_ACCOUNT_READ,\n accountId: accountId\n };\n}\n\nexport function getBanks() {\n return async dispatch => {\n dispatch({\n type: constants.LOAD_BANKS,\n banks: await send('banks')\n });\n };\n}\n","import constants from '../constants';\n\nexport function debugCell(sheet, name) {\n return {\n type: constants.DEBUG_CELL,\n sheet,\n name\n }\n}\n","import { send } from '../../platform/client/fetch';\nimport { closeBudget, loadBudget } from './budgets';\n\n// Take in the budget id so that backups can be loaded when a budget\n// isn't opened\nexport function loadBackup(budgetId, backupId) {\n return async (dispatch, getState) => {\n const prefs = getState().prefs.local;\n if (prefs && prefs.id) {\n await dispatch(closeBudget());\n }\n\n await send('backup-load', { id: budgetId, backupId });\n dispatch(loadBudget(budgetId));\n };\n}\n\nexport function makeBackup() {\n return async (dispatch, getState) => {\n const prefs = getState().prefs.local;\n if (prefs && prefs.id) {\n await send('backup-make', { id: prefs.id });\n }\n };\n}\n","import { send } from '../../platform/client/fetch';\nimport constants from '../constants';\nimport { loadPrefs } from './prefs';\nimport { createBudget, loadBudget } from './budgets';\nimport { getCategories, getAccounts, getPayees } from './queries';\nimport { syncAccounts } from './account';\nimport { setAppState } from './app';\nimport { pushModal } from './modals';\nimport { getUploadError } from '../../shared/errors';\n\nexport function unregister() {\n return async dispatch => {\n const profile = await send('unregister');\n dispatch({\n type: constants.SET_PROFILE,\n profile\n });\n };\n}\n\nexport function resetSync() {\n return async (dispatch, getState) => {\n let { error } = await send('sync-reset');\n\n if (error) {\n alert(getUploadError(error));\n\n if (\n (error.reason === 'encrypt-failure' && error.meta.isMissingKey) ||\n error.reason === 'file-has-new-key'\n ) {\n dispatch(\n pushModal('fix-encryption-key', {\n onSuccess: () => {\n // TODO: There won't be a loading indicator for this\n dispatch(resetSync());\n }\n })\n );\n } else if (error.reason === 'encrypt-failure') {\n dispatch(pushModal('create-encryption-key', { recreate: true }));\n }\n } else {\n await dispatch(sync());\n await dispatch(loadPrefs());\n }\n };\n}\n\nexport function sync() {\n return async (dispatch, getState) => {\n const prefs = getState().prefs.local;\n if (prefs && prefs.id) {\n let { error } = await send('sync');\n return { error };\n }\n };\n}\n\nexport function syncAndDownload(accountId) {\n return async (dispatch, getState) => {\n // It is *critical* that we sync first because of transaction\n // reconciliation. We want to get all transactions that other\n // clients have already made, so that imported transactions can be\n // reconciled against them. Otherwise, two clients will each add\n // new transactions from the bank and create duplicate ones.\n let syncState = await dispatch(sync());\n if (syncState.error) {\n return { error: syncState.error };\n }\n\n let hasDownloaded = await dispatch(syncAccounts(accountId));\n\n if (hasDownloaded) {\n // Sync again afterwards if new transactions were created\n let syncState = await dispatch(sync());\n if (syncState.error) {\n return { error: syncState.error };\n }\n\n // `hasDownloaded` is already true, we know there has been\n // updates\n return true;\n }\n return { hasUpdated: hasDownloaded || syncState.updated };\n };\n}\n","export * from './queries';\nexport * from './account';\nexport * from './debug';\nexport * from './modals';\nexport * from './notifications';\nexport * from './prefs';\nexport * from './budgets';\nexport * from './app';\nexport * from './tutorial';\nexport * from './backups';\nexport * from './sync';\nexport * from './user';\n","import React from 'react';\nimport View from './View';\nimport Text from './Text';\n\nfunction getChildren(key, children) {\n return React.Children.toArray(children).reduce((list, child) => {\n if (child) {\n if (child.type === React.Fragment) {\n return list.concat(getChildren(child.key, child.props.children));\n }\n list.push({ key: key + child.key, child });\n return list;\n }\n return list;\n }, []);\n}\n\nconst Stack = React.forwardRef(\n (\n {\n direction = 'column',\n align,\n justify,\n spacing = 3,\n children,\n debug,\n style\n },\n ref\n ) => {\n const isReversed = direction.endsWith('reverse');\n const isHorizontal = direction.startsWith('row');\n const validChildren = getChildren('', children);\n\n return (\n <View\n style={[\n {\n flexDirection: direction,\n alignItems: align,\n justifyContent: justify\n },\n style\n ]}\n innerRef={ref}\n >\n {validChildren.map(({ key, child }, index) => {\n let isLastChild = validChildren.length === index + 1;\n\n let marginProp;\n if (isHorizontal) {\n marginProp = isReversed ? 'marginLeft' : 'marginRight';\n } else {\n marginProp = isReversed ? 'marginTop' : 'marginBottom';\n }\n\n return React.cloneElement(\n typeof child === 'string' ? <Text>{child}</Text> : child,\n {\n key,\n style: [\n debug && { borderWidth: 1, borderColor: 'red' },\n isLastChild ? null : { [marginProp]: spacing * 5 },\n child.props ? child.props.style : null\n ]\n }\n );\n })}\n </View>\n );\n }\n);\n\nexport default Stack;\n","import React, {\n useContext,\n useReducer,\n useCallback,\n useEffect,\n useRef\n} from 'react';\nimport { hasModifierKey } from '../util/keys';\nimport { useSelector } from 'react-redux';\nimport * as undo from 'loot-core/src/platform/client/undo';\nimport { listen } from 'loot-core/src/platform/client/fetch';\n\nfunction iterateRange(range, func) {\n let from = Math.min(range.start, range.end);\n let to = Math.max(range.start, range.end);\n\n for (let i = from; i <= to; i++) {\n func(i);\n }\n}\n\nexport default function useSelected(name, items, initialSelectedIds) {\n let [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'select': {\n let { selectedRange } = state;\n let selectedItems = new Set(state.selectedItems);\n let { id } = action;\n\n if (hasModifierKey('shift') && selectedRange) {\n let idx = items.findIndex(p => p.id === id);\n let startIdx = items.findIndex(p => p.id === selectedRange.start);\n let endIdx = items.findIndex(p => p.id === selectedRange.end);\n let range;\n let deleteUntil;\n\n if (endIdx === -1) {\n range = { start: startIdx, end: idx };\n } else if (endIdx < startIdx) {\n if (idx <= startIdx) {\n range = { start: startIdx, end: idx };\n\n if (idx > endIdx) {\n deleteUntil = { start: idx - 1, end: endIdx };\n }\n } else {\n // Switching directions\n range = { start: endIdx, end: idx };\n }\n } else {\n if (idx >= startIdx) {\n range = { start: startIdx, end: idx };\n\n if (idx < endIdx) {\n deleteUntil = { start: idx + 1, end: endIdx };\n }\n } else {\n // Switching directions\n range = { start: endIdx, end: idx };\n }\n }\n\n iterateRange(range, i => selectedItems.add(items[i].id));\n\n if (deleteUntil) {\n iterateRange(deleteUntil, i => selectedItems.delete(items[i].id));\n }\n\n return {\n ...state,\n selectedItems,\n selectedRange: {\n start: items[range.start].id,\n end: items[range.end].id\n }\n };\n } else {\n let range = null;\n if (!selectedItems.delete(id)) {\n selectedItems.add(id);\n range = { start: id, end: null };\n }\n\n return {\n ...state,\n selectedItems,\n selectedRange: range\n };\n }\n }\n\n case 'select-none':\n return { ...state, selectedItems: new Set() };\n\n case 'select-all':\n return {\n ...state,\n selectedItems: new Set(action.ids || items.map(item => item.id)),\n selectedRange:\n action.ids && action.ids.length === 1\n ? { start: action.ids[0], end: null }\n : null\n };\n\n default:\n throw new Error('Unexpected action: ' + action.type);\n }\n },\n null,\n () => ({\n selectedItems: new Set(initialSelectedIds || []),\n selectedRange:\n initialSelectedIds && initialSelectedIds.length === 1\n ? { start: initialSelectedIds[0], end: null }\n : null\n })\n );\n\n let prevItems = useRef(items);\n useEffect(() => {\n if (state.selectedItems.size > 0) {\n // We need to make sure there are no ids in the selection that\n // aren't valid anymore. This happens if the item has been\n // deleted or otherwise removed from the current view. We do\n // this by cross-referencing the current selection with the\n // available item ids\n //\n // This effect may run multiple times while items is updated, we\n // need to make sure that we don't remove selected ids until the\n // items array *actually* changes. A component may render with\n // new `items` arrays that are the same, just fresh instances, but\n // we need to wait until the actual array changes. This solves\n // the case where undo-ing adds back items, but we remove the\n // selected item too early (because the component rerenders\n // multiple times)\n\n let ids = new Set(items.map(item => item.id));\n let isSame =\n prevItems.current.length === items.length &&\n prevItems.current.every(item => ids.has(item.id));\n\n if (!isSame) {\n let selected = [...state.selectedItems];\n let filtered = selected.filter(id => ids.has(id));\n\n // If the selected items has changed, update the selection\n if (selected.length !== filtered.length) {\n dispatch({ type: 'select-all', ids: filtered });\n }\n }\n }\n\n prevItems.current = items;\n }, [items, state.selectedItems]);\n\n useEffect(() => {\n let prevState = undo.getUndoState('selectedItems');\n undo.setUndoState('selectedItems', { name, items: state.selectedItems });\n return () => undo.setUndoState('selectedItems', prevState);\n }, [state.selectedItems]);\n\n let lastUndoState = useSelector(state => state.app.lastUndoState);\n\n useEffect(() => {\n function onUndo({ messages, undoTag }) {\n let tagged = undo.getTaggedState(undoTag);\n\n let deletedIds = new Set(\n messages\n .filter(msg => msg.column === 'tombstone' && msg.value === 1)\n .map(msg => msg.row)\n );\n\n if (\n tagged &&\n tagged.selectedItems &&\n tagged.selectedItems.name === name\n ) {\n dispatch({\n type: 'select-all',\n // Coerce the Set into an array\n ids: [...tagged.selectedItems.items].filter(id => !deletedIds.has(id))\n });\n }\n }\n\n if (lastUndoState && lastUndoState.current) {\n onUndo(lastUndoState.current);\n }\n\n return listen('undo-event', onUndo);\n }, []);\n\n return {\n items: state.selectedItems,\n setItems: state.setSelectedItems,\n dispatch\n };\n}\n\nlet SelectedDispatch = React.createContext(null);\nlet SelectedItems = React.createContext(null);\n\nexport function useSelectedDispatch() {\n return useContext(SelectedDispatch);\n}\n\nexport function useSelectedItems() {\n return useContext(SelectedItems);\n}\n\nexport function SelectedProvider({ instance, fetchAllIds, children }) {\n let latestItems = useRef(null);\n\n useEffect(() => {\n latestItems.current = instance.items;\n }, [instance.items]);\n\n let dispatch = useCallback(\n async action => {\n if (action.type === 'select-all') {\n if (latestItems.current && latestItems.current.size > 0) {\n return instance.dispatch({ type: 'select-none' });\n } else {\n if (fetchAllIds) {\n return instance.dispatch({\n type: 'select-all',\n ids: await fetchAllIds()\n });\n }\n return instance.dispatch({ type: 'select-all' });\n }\n }\n return instance.dispatch(action);\n },\n [instance.dispatch, fetchAllIds]\n );\n\n return (\n <SelectedItems.Provider value={instance.items}>\n <SelectedDispatch.Provider value={dispatch}>\n {children}\n </SelectedDispatch.Provider>\n </SelectedItems.Provider>\n );\n}\n\n// This can be helpful in class components if you cannot use the\n// custom hook\nexport function SelectedProviderWithItems({\n name,\n items,\n initialSelectedIds,\n fetchAllIds,\n registerDispatch,\n children\n}) {\n let selected = useSelected(name, items, initialSelectedIds);\n\n useEffect(() => {\n registerDispatch && registerDispatch(selected.dispatch);\n }, [registerDispatch]);\n\n return (\n <SelectedProvider\n instance={selected}\n fetchAllIds={fetchAllIds}\n children={children}\n />\n );\n}\n","import React from 'react';\nimport { css } from 'glamor';\n\nimport BG from './manager/bg.svg';\n\nfunction Background({ selected }) {\n return (\n <div\n {...css({\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n background: `url(${BG}) no-repeat center center fixed`,\n backgroundSize: '100% 100%'\n })}\n ></div>\n );\n}\n\nexport default Background;\n","import React, { useState } from 'react';\nimport { View, Block } from 'loot-design/src/components/common';\nimport { css } from 'glamor';\nimport Background from './Background';\nimport AnimatedLoading from 'loot-design/src/svg/v1/AnimatedLoading';\nimport { colors } from 'loot-design/src/style';\n\nfunction AppBackground({ initializing, loadingText }) {\n return (\n <React.Fragment>\n <Background />\n\n {(loadingText != null || initializing) && (\n <View\n {...css({\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n padding: 50,\n paddingTop: 200,\n color: colors.n1,\n alignItems: 'center'\n })}\n >\n <Block style={{ marginBottom: 20, fontSize: 18 }}>\n {loadingText}\n </Block>\n <AnimatedLoading width={25} color={colors.n1} />\n </View>\n )}\n </React.Fragment>\n );\n}\n\nexport default AppBackground;\n","const undo = require('../undo');\nconst { captureException, captureBreadcrumb } = require('../../exceptions');\nconst uuid = require('../../uuid');\nlet replyHandlers = new Map();\nlet listeners = new Map();\nlet messageQueue = [];\n\nlet globalWorker = null;\n\nclass ReconstructedError extends Error {\n constructor(message, stack, url, line, column) {\n super(message);\n this.name = this.constructor.name;\n this.message = message;\n\n Object.defineProperty(this, 'stack', {\n get: function() {\n return 'extended ' + this._stack;\n },\n set: function(value) {\n this._stack = value;\n }\n });\n\n this.stack = stack;\n this.url = url;\n this.line = line;\n this.column = column;\n }\n}\n\nfunction handleMessage(msg) {\n if (msg.type === 'error') {\n // An error happened while handling a message so cleanup the\n // current reply handler. We don't care about the actual error -\n // generic backend errors are handled separately and if you want\n // more specific handling you should manually forward the error\n // through a normal reply.\n const { id } = msg;\n replyHandlers.delete(id);\n } else if (msg.type === 'reply') {\n const { id, result, mutated, undoTag } = msg;\n\n const handler = replyHandlers.get(id);\n if (handler) {\n replyHandlers.delete(id);\n\n if (!mutated) {\n undo.gc(undoTag);\n }\n\n handler.resolve(result);\n }\n } else if (msg.type === 'push') {\n const { name, args } = msg;\n\n const listens = listeners.get(name);\n if (listens) {\n for (let i = 0; i < listens.length; i++) {\n let stop = listens[i](args);\n if (stop === true) {\n break;\n }\n }\n }\n } else {\n // Ignore internal messages that start with __\n if (!msg.type.startsWith('__')) {\n throw new Error('Unknown message type: ' + JSON.stringify(msg));\n }\n }\n}\n\n// Note that this does not support retry. If the worker\n// dies, it will permanently be disconnected. That should be OK since\n// I don't think a worker should ever die due to a system error.\nfunction connectWorker(worker, onOpen, onError) {\n globalWorker = worker;\n\n worker.addEventListener('message', event => {\n let msg = event.data;\n\n // The worker implementation implements its own concept of a\n // 'connect' event because the worker is immediately\n // available, but we don't know when the backend is actually\n // ready to handle messages.\n if (msg.type === 'connect') {\n // Send any messages that were queued while closed\n if (messageQueue.length > 0) {\n messageQueue.forEach(msg => worker.postMessage(msg));\n messageQueue = [];\n }\n\n onOpen();\n } else if (msg.type === 'app-init-failure') {\n onError(msg);\n } else if (msg.type === 'capture-exception') {\n captureException(\n msg.stack\n ? new ReconstructedError(\n msg.message,\n msg.stack,\n msg.url,\n msg.line,\n msg.column\n )\n : msg.exc\n );\n\n if (msg.message && msg.message.includes('indexeddb-quota-error')) {\n alert(\n 'We hit a limit on the local storage available. ' +\n 'Edits may not be saved. Please contact help@actualbudget.com to help debug this.'\n );\n }\n } else if (msg.type === 'capture-breadcrumb') {\n captureBreadcrumb(msg.data);\n } else {\n handleMessage(msg);\n }\n });\n\n // In browsers that don't support wasm in workers well (Safari),\n // we run the server on the main process for now. This might not\n // actually be a worker, but instead a message port which we\n // need to start.\n if (worker instanceof MessagePort) {\n worker.start();\n }\n}\n\nmodule.exports.init = async function init(worker) {\n return new Promise((resolve, reject) =>\n connectWorker(worker, resolve, reject)\n );\n};\n\nmodule.exports.send = function send(name, args, { catchErrors = false } = {}) {\n return new Promise((resolve, reject) => {\n uuid.v4().then(id => {\n replyHandlers.set(id, { resolve, reject });\n if (globalWorker) {\n globalWorker.postMessage({\n id,\n name,\n args,\n undoTag: undo.snapshot(),\n catchErrors\n });\n } else {\n messageQueue.push({\n id,\n name,\n args,\n undoTag: undo.snapshot(),\n catchErrors\n });\n }\n });\n });\n};\n\nmodule.exports.sendCatch = function send(name, args) {\n return module.exports.send(name, args, { catchErrors: true });\n};\n\nmodule.exports.listen = function listen(name, cb) {\n if (!listeners.get(name)) {\n listeners.set(name, []);\n }\n listeners.get(name).push(cb);\n\n return () => {\n let arr = listeners.get(name);\n listeners.set(name, arr.filter(cb_ => cb_ !== cb));\n };\n};\n\nmodule.exports.unlisten = function unlisten(name) {\n listeners.set(name, []);\n};\n","import { integerToCurrency } from 'loot-core/src/shared/util';\n\nexport default function format(value, type = 'string') {\n switch (type) {\n case 'string':\n const val = JSON.stringify(value);\n if (val.charAt(0) === '\"' && val.charAt(val.length - 1) === '\"') {\n return val.slice(1, -1);\n }\n return val;\n case 'number':\n return '' + value;\n case 'financial-with-sign':\n let formatted = format(value, 'financial');\n if (value >= 0) {\n return '+' + formatted;\n }\n return formatted;\n case 'financial':\n if (value == null || value === '') {\n return integerToCurrency(0);\n } else if (typeof value === 'string') {\n const parsed = parseFloat(value);\n value = isNaN(parsed) ? 0 : parsed;\n }\n\n if (typeof value !== 'number') {\n throw new Error(\n 'Value is not a number (' + typeof value + '): ' + value\n );\n }\n\n return integerToCurrency(value);\n default:\n throw new Error('Unknown format type: ' + type);\n }\n}\n","import constants from '../constants';\nimport memoizeOne from 'memoize-one';\nimport { groupById } from '../../shared/util';\n\nconst initialState = {\n newTransactions: [],\n matchedTransactions: [],\n lastTransaction: null,\n updatedAccounts: [],\n accounts: [],\n categories: {\n grouped: [],\n list: []\n },\n payees: [],\n earliestTransaction: null\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.SET_NEW_TRANSACTIONS:\n return {\n ...state,\n newTransactions: action.newTransactions || [],\n matchedTransactions: action.matchedTransactions || [],\n updatedAccounts: action.updatedAccounts || []\n };\n case constants.UPDATE_NEW_TRANSACTIONS:\n return {\n ...state,\n newTransactions: state.newTransactions.filter(\n id => id !== action.changedId\n ),\n matchedTransactions: state.matchedTransactions.filter(\n id => id !== action.changedId\n )\n };\n case constants.SET_LAST_TRANSACTION:\n return {\n ...state,\n lastTransaction: action.transaction\n };\n case constants.MARK_ACCOUNT_READ:\n return {\n ...state,\n updatedAccounts: state.updatedAccounts.filter(\n id => id !== action.accountId\n )\n };\n case constants.LOAD_ACCOUNTS:\n return {\n ...state,\n accounts: action.accounts\n };\n case constants.UPDATE_ACCOUNT: {\n return {\n ...state,\n accounts: state.accounts.map(account => {\n if (account.id === action.account.id) {\n return { ...account, ...action.account };\n }\n return account;\n })\n };\n }\n case constants.LOAD_CATEGORIES:\n return {\n ...state,\n categories: action.categories\n };\n case constants.LOAD_PAYEES:\n return {\n ...state,\n payees: action.payees\n };\n case constants.ADD_CATEGORY: {\n let category = { id: 'temp', name: action.name };\n\n return {\n ...state,\n categories: {\n grouped: state.categories.grouped.map(group => {\n if (group.id === action.groupId) {\n return { ...group, categories: [category, ...group.categories] };\n }\n return group;\n }),\n list: [category, ...state.categories.list]\n }\n };\n }\n case constants.DELETE_CATEGORY: {\n return {\n ...state,\n categories: {\n grouped: state.categories.grouped.map(group => {\n return {\n ...group,\n categories: group.categories.filter(cat => cat.id !== action.id)\n };\n }),\n list: state.categories.list.filter(cat => cat.id !== action.id)\n }\n };\n }\n\n default:\n }\n return state;\n}\n\nexport const getAccountsById = memoizeOne(accounts => groupById(accounts));\nexport const getPayeesById = memoizeOne(payees => groupById(payees));\nexport const getCategoriesById = memoizeOne(categoryGroups => {\n let res = {};\n categoryGroups.forEach(group => {\n group.categories.forEach(cat => {\n res[cat.id] = cat;\n });\n });\n return res;\n});\n\nexport const getActivePayees = memoizeOne((payees, accounts) => {\n let accountsById = getAccountsById(accounts);\n\n return payees.filter(payee => {\n if (payee.transfer_acct) {\n let account = accountsById[payee.transfer_acct];\n return account != null && !account.closed;\n }\n return true;\n });\n});\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"static/js/browser-server.06b54be5.worker.js\");\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { css } from 'glamor';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n init as initConnection,\n send\n} from 'loot-core/src/platform/client/fetch';\nimport installPolyfills from '../polyfills';\nimport { styles, hasHiddenScrollbars } from 'loot-design/src/style';\nimport FatalError from './FatalError';\nimport ManagementApp from './manager/ManagementApp';\nimport FinancesApp from './FinancesApp';\nimport AppBackground from './AppBackground';\nimport UpdateNotification from './UpdateNotification';\nimport MobileWebMessage from './MobileWebMessage';\n\nclass App extends React.Component {\n state = {\n fatalError: null,\n initializing: true,\n hiddenScrollbars: hasHiddenScrollbars()\n };\n\n async init() {\n const socketName = await global.Actual.getServerSocket();\n\n try {\n await initConnection(socketName);\n } catch (e) {\n if (e.type === 'app-init-failure') {\n this.setState({ initializing: false, fatalError: e });\n return;\n } else {\n throw e;\n }\n }\n\n // Load any global prefs\n let globalPrefs = await this.props.loadGlobalPrefs();\n\n // Open the last opened budget, if any\n const budgetId = await send('get-last-opened-backup');\n if (budgetId) {\n await this.props.loadBudget(budgetId);\n\n // Check to see if this file has been remotely deleted (but\n // don't block on this in case they are offline or something)\n send('get-remote-files').then(files => {\n if (files) {\n let remoteFile = files.find(f => f.fileId === this.props.cloudFileId);\n if (remoteFile && remoteFile.deleted) {\n this.props.closeBudget();\n }\n }\n });\n }\n }\n\n async componentDidMount() {\n await Promise.all([installPolyfills(), this.init()]);\n\n this.setState({ initializing: false });\n\n let checkScrollbars = () => {\n if (this.state.hiddenScrollbars !== hasHiddenScrollbars()) {\n this.setState({ hiddenScrollbars: hasHiddenScrollbars() });\n }\n };\n window.addEventListener('focus', checkScrollbars);\n this.cleanup = () => window.removeEventListener('focus', checkScrollbars);\n }\n\n componentDidCatch(error, errorInfo) {\n if (process.env.NODE_ENV !== 'development') {\n window.SentryClient.captureException(error, { extra: errorInfo });\n }\n this.setState({ fatalError: error });\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.budgetId !== prevProps.budgetId) {\n global.Actual.updateAppMenu(!!this.props.budgetId);\n }\n }\n\n render() {\n const { budgetId, loadingText, showingTutorial } = this.props;\n const { fatalError, initializing, hiddenScrollbars } = this.state;\n\n return (\n <div\n key={hiddenScrollbars ? 'hidden-scrollbars' : 'scrollbars'}\n {...css([\n {\n height: '100%',\n backgroundColor: '#E8ECF0',\n overflow: 'hidden'\n },\n styles.lightScrollbar\n ])}\n >\n {fatalError ? (\n <React.Fragment>\n <AppBackground />\n <FatalError error={fatalError} buttonText=\"Restart app\" />\n </React.Fragment>\n ) : initializing ? (\n <AppBackground\n initializing={initializing}\n loadingText={loadingText}\n />\n ) : budgetId ? (\n <FinancesApp />\n ) : (\n <React.Fragment>\n <AppBackground\n initializing={initializing}\n loadingText={loadingText}\n />\n <ManagementApp />\n </React.Fragment>\n )}\n\n <UpdateNotification />\n <MobileWebMessage />\n </div>\n );\n }\n}\n\nexport default connect(\n state => ({\n budgetId: state.prefs.local && state.prefs.local.id,\n cloudFileId: state.prefs.local && state.prefs.local.cloudFileId,\n loadingText: state.app.loadingText,\n showingTutorial: state.tutorial.stage !== null\n }),\n actions\n)(App);\n","export default async function installPolyfills() {\n if ('ResizeObserver' in window === false) {\n const module = await import('@juggle/resize-observer');\n window.ResizeObserver = module.ResizeObserver;\n }\n}\n","import React from 'react';\nimport {\n View,\n Stack,\n Text,\n Block,\n Modal,\n P,\n Link,\n Button\n} from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\n\nclass FatalError extends React.Component {\n state = { showError: false };\n\n renderSimple(error) {\n let msg;\n if (error.IDBFailure) {\n // IndexedDB wasn't able to open the database\n msg = (\n <Text>\n Your browser doesn{\"'\"}t support IndexedDB in this environment, a\n feature that Actual requires to run. This might happen if you are in\n private browsing mode. Please try a different browser or turn off\n private browsing.\n </Text>\n );\n } else {\n // This indicates the backend failed to initialize. Show the\n // user something at least so they aren't looking at a blank\n // screen\n msg = (\n <Text>\n There was a problem loading the app in this browser version. If this\n continues to be a problem, you can{' '}\n <a href=\"https://actualbudget.com/download\">\n download the desktop app\n </a>\n .\n </Text>\n );\n }\n\n return (\n <View\n style={{\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%'\n }}\n >\n <Stack\n style={{\n paddingBottom: 100,\n maxWidth: 500,\n color: colors.r4,\n lineHeight: '1.5em',\n fontSize: 15,\n '& a': { color: colors.r4 }\n }}\n >\n <Text>{msg}</Text>\n <Text>\n Contact{' '}\n <a href=\"mailto:help@actualbudget.com\">help@actualbudget.com</a> for\n support\n </Text>\n </Stack>\n </View>\n );\n }\n\n render() {\n const { buttonText, error } = this.props;\n const { showError } = this.state;\n\n if (error.type === 'app-init-failure') {\n return this.renderSimple(error);\n }\n\n return (\n <Modal isCurrent={true} showClose={false} title=\"Fatal Error\">\n {() => (\n <View style={{ maxWidth: 500 }}>\n <P>\n There was an unrecoverable error in the UI. Sorry! This error has\n been reported and hopefully will be fixed soon.\n </P>\n <P>\n If you want to talk about what happened or give any feedback, send\n an email to{' '}\n <a\n href=\"mailto:help@actualbudget.com\"\n style={{ color: colors.p4 }}\n >\n help@actualbudget.com\n </a>\n .\n </P>\n <P>\n <Button onClick={() => window.Actual.relaunch()}>{buttonText}</Button>\n </P>\n <P isLast={true} style={{ fontSize: 11 }}>\n <Link\n onClick={() => this.setState({ showError: true })}\n style={{ color: colors.p4 }}\n >\n Show Error\n </Link>\n {showError && (\n <Block\n style={{\n marginTop: 5,\n height: 100,\n overflow: 'auto'\n }}\n >\n {error.stack}\n </Block>\n )}\n </P>\n </View>\n )}\n </Modal>\n );\n }\n}\nexport default FatalError;\n","import React from 'react';\nimport memoizeOne from 'memoize-one';\nimport useResizeObserver from './useResizeObserver';\nimport { View } from './common';\n\nconst IS_SCROLLING_DEBOUNCE_INTERVAL = 150;\n\nconst defaultItemKey = (index, data) => index;\n\nfunction ResizeObserver({ onResize, children }) {\n let ref = useResizeObserver(onResize);\n return children(ref);\n}\n\nexport class FixedSizeList extends React.PureComponent {\n _outerRef;\n _resetIsScrollingTimeoutId = null;\n\n static defaultProps = {\n direction: 'ltr',\n renderRow: undefined,\n layout: 'vertical',\n overscanCount: 2,\n useIsScrolling: false,\n headerHeight: 0\n };\n\n constructor(props) {\n super(props);\n\n this.lastPositions = React.createRef();\n this.lastPositions.current = new Map();\n this.needsAnimationRerender = React.createRef();\n this.needsAnimationRerender.current = false;\n this.animationEnabled = false;\n\n this.state = {\n instance: this,\n isScrolling: false,\n scrollDirection: 'forward',\n scrollOffset:\n typeof this.props.initialScrollOffset === 'number'\n ? this.props.initialScrollOffset\n : 0,\n scrollUpdateWasRequested: false\n };\n }\n\n scrollTo(scrollOffset) {\n scrollOffset = Math.max(0, scrollOffset);\n\n this.setState(prevState => {\n if (prevState.scrollOffset === scrollOffset) {\n return null;\n }\n\n this.requestScrollUpdateHandled = false;\n return {\n scrollDirection:\n prevState.scrollOffset < scrollOffset ? 'forward' : 'backward',\n scrollOffset: scrollOffset,\n scrollUpdateWasRequested: true\n };\n }, this._resetIsScrollingDebounced);\n }\n\n scrollToItem(index, align = 'auto') {\n const { itemCount } = this.props;\n const { scrollOffset } = this.state;\n\n index = Math.max(0, Math.min(index, itemCount - 1));\n\n this.scrollTo(\n this.getOffsetForIndexAndAlignment(index, align, scrollOffset)\n );\n }\n\n componentDidMount() {\n const { direction, initialScrollOffset, layout } = this.props;\n\n if (typeof initialScrollOffset === 'number' && this._outerRef != null) {\n let outerRef = this._outerRef;\n outerRef = this._outerRef;\n outerRef.scrollTop = initialScrollOffset;\n }\n\n this._callPropsCallbacks();\n }\n\n getAnchoredScrollPos() {\n if (this.anchored && this.props.indexForKey && this._outerRef != null) {\n let index = this.props.indexForKey(this.anchored.key);\n let baseOffset = this.getOffsetForIndexAndAlignment(index, 'start');\n let outerRef = this._outerRef;\n return baseOffset + this.anchored.offset;\n }\n return null;\n }\n\n componentDidUpdate() {\n const { scrollOffset, scrollUpdateWasRequested } = this.state;\n\n let anchoredPos = this.getAnchoredScrollPos();\n if (anchoredPos != null) {\n const outerRef = this._outerRef;\n outerRef.scrollTop = anchoredPos;\n } else if (\n scrollUpdateWasRequested &&\n !this.requestScrollUpdateHandled &&\n this._outerRef != null\n ) {\n this.requestScrollUpdateHandled = true;\n const outerRef = this._outerRef;\n outerRef.scrollTop = scrollOffset;\n }\n\n if (this.needsAnimationRerender.current) {\n this.needsAnimationRerender.current = false;\n this.rerenderTimeout = setTimeout(() => {\n this.forceUpdate();\n }, 10);\n }\n\n this._callPropsCallbacks();\n }\n\n componentWillUnmount() {\n if (this._resetIsScrollingTimeoutId !== null) {\n clearTimeout(this._resetIsScrollingTimeoutId);\n }\n }\n\n render() {\n const {\n className,\n height,\n header,\n innerRef,\n innerElementType,\n innerTagName,\n itemCount,\n renderRow,\n itemKey = defaultItemKey,\n outerElementType,\n outerTagName,\n style,\n useIsScrolling,\n width,\n version\n } = this.props;\n const { isScrolling } = this.state;\n\n const [startIndex, stopIndex] = this._getRangeToRender();\n const positions = new Map();\n\n const items = [];\n if (itemCount > 0) {\n for (let index = startIndex; index <= stopIndex; index++) {\n let key = itemKey(index);\n let style = this._getItemStyle(index);\n let lastPosition = this.lastPositions.current.get(key);\n let animating = false;\n positions.set(key, style.top);\n\n if (\n this.animationEnabled &&\n lastPosition != null &&\n lastPosition !== style.top\n ) {\n // A reorder has happened. Render it in the old place, then\n // animate it to the new one\n style = { ...style, top: lastPosition };\n this.needsAnimationRerender.current = true;\n animating = true;\n }\n\n items.push(\n renderRow({\n index,\n key,\n style,\n isScrolling: useIsScrolling ? isScrolling : undefined,\n isAnimating: animating\n })\n );\n }\n }\n\n this.lastPositions.current = positions;\n\n // Read this value AFTER items have been created,\n // So their actual sizes (if variable) are taken into consideration.\n let estimatedTotalSize = this.getEstimatedTotalSize();\n\n let OuterElement = outerElementType || outerTagName || 'div';\n let InnerElement = innerElementType || innerTagName || 'div';\n\n return (\n <ResizeObserver onResize={this.onHeaderResize}>\n {headerRef => (\n <OuterElement\n className={className}\n onScroll={this._onScrollVertical}\n ref={this._outerRefSetter}\n style={{\n height,\n width,\n overflow: 'auto',\n ...style\n }}\n >\n <View innerRef={headerRef}>{header}</View>\n <InnerElement\n ref={innerRef}\n style={{\n position: 'relative',\n height: estimatedTotalSize,\n width: '100%',\n pointerEvents: isScrolling ? 'none' : undefined\n }}\n >\n {items}\n </InnerElement>\n </OuterElement>\n )}\n </ResizeObserver>\n );\n }\n\n setRowAnimation = flag => {\n this.animationEnabled = flag;\n\n let outerRef = this._outerRef;\n if (outerRef) {\n if (this.animationEnabled) {\n outerRef.classList.add('animated');\n } else {\n outerRef.classList.remove('animated');\n }\n }\n };\n\n onHeaderResize = rect => {\n // this.setState({ headerHeight: rect.height });\n };\n\n anchor() {\n let itemKey = this.props.itemKey || defaultItemKey;\n\n let outerRef = this._outerRef;\n let scrollOffset = outerRef ? outerRef.scrollTop : 0;\n let index = this.getStartIndexForOffset(scrollOffset);\n let key = itemKey(index);\n\n this.anchored = {\n key,\n offset: scrollOffset - this.getItemOffset(index)\n };\n }\n\n unanchor() {\n this.anchored = null;\n }\n\n isAnchored() {\n return this.anchored != null;\n }\n\n getItemOffset = index => index * this.props.itemSize;\n getItemSize = index => this.props.itemSize;\n getEstimatedTotalSize = () => this.props.itemSize * this.props.itemCount;\n\n getOffsetForIndexAndAlignment = (index, align, scrollOffset) => {\n const size = this.props.height;\n const lastItemOffset = Math.max(\n 0,\n this.props.itemCount * this.props.itemSize - size\n );\n const maxOffset = Math.min(lastItemOffset, index * this.props.itemSize);\n const minOffset = Math.max(\n 0,\n index * this.props.itemSize - size + this.props.itemSize\n );\n\n if (align === 'smart') {\n if (\n scrollOffset >= minOffset - size &&\n scrollOffset <= maxOffset + size\n ) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n case 'end':\n return minOffset;\n case 'center': {\n // \"Centered\" offset is usually the average of the min and max.\n // But near the edges of the list, this doesn't hold true.\n const middleOffset = Math.round(\n minOffset + (maxOffset - minOffset) / 2\n );\n if (middleOffset < Math.ceil(size / 2)) {\n return 0; // near the beginning\n } else if (middleOffset > lastItemOffset + Math.floor(size / 2)) {\n return lastItemOffset; // near the end\n } else {\n return middleOffset;\n }\n }\n case 'auto':\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n };\n\n getStartIndexForOffset = offset =>\n Math.max(\n 0,\n Math.min(\n this.props.itemCount - 1,\n Math.floor(offset / this.props.itemSize)\n )\n );\n\n getStopIndexForStartIndex = (startIndex, scrollOffset) => {\n const offset = startIndex * this.props.itemSize;\n const size = this.props.width;\n const numVisibleItems = Math.ceil(\n (size + scrollOffset - offset) / this.props.itemSize\n );\n return Math.max(\n 0,\n Math.min(\n this.props.itemCount - 1,\n startIndex + numVisibleItems - 1 // -1 is because stop index is inclusive\n )\n );\n };\n\n _callOnItemsRendered = memoizeOne(\n (\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex\n ) =>\n this.props.onItemsRendered({\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex\n })\n );\n\n _callOnScroll = memoizeOne(\n (scrollDirection, scrollOffset, scrollUpdateWasRequested) =>\n this.props.onScroll({\n scrollDirection,\n scrollOffset,\n scrollUpdateWasRequested\n })\n );\n\n _callPropsCallbacks() {\n if (typeof this.props.onItemsRendered === 'function') {\n const { itemCount } = this.props;\n if (itemCount > 0) {\n const [\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex\n ] = this._getRangeToRender();\n this._callOnItemsRendered(\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex\n );\n }\n }\n\n if (typeof this.props.onScroll === 'function') {\n const {\n scrollDirection,\n scrollOffset,\n scrollUpdateWasRequested\n } = this.state;\n this._callOnScroll(\n scrollDirection,\n scrollOffset,\n scrollUpdateWasRequested\n );\n }\n }\n\n // Lazily create and cache item styles while scrolling,\n // So that pure component sCU will prevent re-renders.\n // We maintain this cache, and pass a style prop rather than index,\n // So that List can clear cached styles and force item re-render if necessary.\n _getItemStyle = index => {\n const { direction, itemSize, layout } = this.props;\n\n const itemStyleCache = this._getItemStyleCache(itemSize, layout, direction);\n\n let style;\n if (itemStyleCache.hasOwnProperty(index)) {\n style = itemStyleCache[index];\n } else {\n const offset = this.getItemOffset(index);\n const size = this.getItemSize(index);\n\n itemStyleCache[index] = style = {\n position: 'absolute',\n left: 0,\n top: offset,\n height: size,\n width: '100%'\n };\n }\n\n return style;\n };\n\n _getItemStyleCache = memoizeOne((_, __, ___) => ({}));\n\n _getRangeToRender() {\n let { itemCount, overscanCount } = this.props;\n let { isScrolling, scrollDirection, scrollOffset } = this.state;\n\n let anchoredPos = this.getAnchoredScrollPos();\n if (anchoredPos != null) {\n scrollOffset = anchoredPos;\n }\n\n if (itemCount === 0) {\n return [0, 0, 0, 0];\n }\n\n const startIndex = this.getStartIndexForOffset(scrollOffset);\n const stopIndex = this.getStopIndexForStartIndex(startIndex, scrollOffset);\n\n // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n const overscanBackward =\n !isScrolling || scrollDirection === 'backward'\n ? Math.max(1, overscanCount)\n : 1;\n const overscanForward =\n !isScrolling || scrollDirection === 'forward'\n ? Math.max(1, overscanCount)\n : 1;\n\n return [\n Math.max(0, startIndex - overscanBackward),\n Math.max(0, Math.min(itemCount - 1, stopIndex + overscanForward)),\n startIndex,\n stopIndex\n ];\n }\n\n _onScrollVertical = event => {\n let { clientHeight, scrollHeight, scrollTop } = event.currentTarget;\n\n this.setState(prevState => {\n if (prevState.scrollOffset === scrollTop) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n }\n\n let scrollOffset = scrollTop;\n\n return {\n isScrolling: true,\n scrollDirection:\n prevState.scrollOffset < scrollOffset ? 'forward' : 'backward',\n scrollOffset,\n scrollUpdateWasRequested: false\n };\n }, this._resetIsScrollingDebounced);\n };\n\n _outerRefSetter = ref => {\n const { outerRef } = this.props;\n\n this._outerRef = ref;\n\n if (typeof outerRef === 'function') {\n outerRef(ref);\n } else if (\n outerRef != null &&\n typeof outerRef === 'object' &&\n outerRef.hasOwnProperty('current')\n ) {\n outerRef.current = ref;\n }\n };\n\n _resetIsScrollingDebounced = () => {\n if (this._resetIsScrollingTimeoutId !== null) {\n clearTimeout(this._resetIsScrollingTimeoutId);\n }\n\n this._resetIsScrollingTimeoutId = setTimeout(\n this._resetIsScrolling,\n IS_SCROLLING_DEBOUNCE_INTERVAL\n );\n };\n\n _resetIsScrolling = () => {\n this._resetIsScrollingTimeoutId = null;\n\n this.setState({ isScrolling: false }, () => {\n // Clear style cache after state update has been committed.\n // This way we don't break pure sCU for items that don't use isScrolling param.\n this._getItemStyleCache(-1, null);\n });\n };\n}\n","module.exports = __webpack_public_path__ + \"static/media/DateSelect.left.1ae92674.png\";","module.exports = __webpack_public_path__ + \"static/media/DateSelect.right.2a470dc0.png\";","import { send } from '../platform/client/fetch';\nimport Platform from './platform';\n\nexport default function checkForUpgradeNotifications(\n addNotification,\n resetSync,\n // Note: history is only available on desktop\n history\n) {\n // TODO: Probably should only show one of these at at time?\n send('get-upgrade-notifications').then(types => {\n types.forEach(type => {\n switch (type) {\n case 'schedules': {\n let message =\n 'Track bills and subscriptions and much more with scheduled transactions. We can search all your existing transactions and try to find existing schedules.\\n\\n' +\n (global.IS_BETA\n ? 'NOTE: You are using the beta version, and this will not reset your sync data. This is safe to do.'\n : '');\n\n if (Platform.env === 'mobile') {\n message =\n 'Track bills and subscriptions and much more with scheduled transactions. Upcoming transactions will be shown in the accounts screen. Use the desktop app to create schedules.';\n }\n\n addNotification({\n type: 'message',\n title: 'Scheduled transactions are now available!',\n message,\n sticky: true,\n id: 'find-schedules',\n button: Platform.env !== 'mobile' && {\n title: 'Find schedules',\n action: async () => {\n // eslint-disable-next-line\n __history &&\n // eslint-disable-next-line\n __history.push('/schedule/discover', {\n // eslint-disable-next-line\n locationPtr: __history.location\n });\n }\n },\n onClose: () => {\n send('seen-upgrade-notification', { type: 'schedules' });\n }\n });\n break;\n }\n\n case 'repair-splits':\n if (history) {\n addNotification({\n type: 'message',\n title: 'Split transactions now support transfers & payees',\n message:\n 'The payee field is now available on split transactions, allowing you to perform transfers on individual split transactions.\\n\\nAll existing split transactions have a blank payee and we recommend using the tool below to set the payee from the parent. [View a video walkthrough](https://actualbudget.com/blog/split-transactions-transfer)',\n sticky: true,\n id: 'repair-splits',\n button: {\n title: 'Repair splits...',\n action: () =>\n history.push('/tools/fix-splits', {\n locationPtr: history.location\n })\n },\n onClose: () => {\n send('seen-upgrade-notification', { type: 'repair-splits' });\n }\n });\n }\n break;\n\n default:\n }\n });\n });\n}\n","// TODO: This is a barebones module for now, need to think about a\n// generic way keys are handled across the app\n\nexport const keys = {\n ESC: 27,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n ALT: 18,\n META: 91,\n CTRL: 17,\n SPACE: 32,\n UP: 38,\n DOWN: 40,\n J: 74,\n K: 75,\n X: 88\n};\n\nlet _keyHandlers = {};\n\nlet _modifierState = {\n shift: false,\n ctrl: false,\n alt: false,\n meta: false\n};\n\nexport function hasModifierKey(modifier) {\n return !!_modifierState[modifier];\n}\n\nexport function registerKeyHandler(key, func) {\n if (!_keyHandlers[key]) {\n _keyHandlers[key] = [];\n }\n _keyHandlers[key].push(func);\n\n return () => {\n _keyHandlers[key] = _keyHandlers[key].filter(f => f !== func);\n };\n}\n\ndocument.addEventListener('keydown', e => {\n if (e.keyCode === keys.SHIFT) {\n _modifierState.shift = true;\n }\n if (e.keyCode === keys.CTRL) {\n _modifierState.ctrl = true;\n }\n if (e.keyCode === keys.ALT) {\n _modifierState.alt = true;\n }\n if (e.keyCode === keys.META) {\n _modifierState.meta = true;\n }\n\n if (!(e.target && e.target.matches('input'))) {\n let handlers = _keyHandlers[e.key.toUpperCase()];\n if (handlers && handlers.length > 0) {\n handlers[handlers.length - 1](_modifierState);\n e.preventDefault();\n e.stopPropagation();\n }\n }\n});\n\ndocument.addEventListener('keyup', e => {\n if (e.keyCode === keys.SHIFT) {\n _modifierState.shift = false;\n }\n if (e.keyCode === keys.CTRL) {\n _modifierState.ctrl = false;\n }\n if (e.keyCode === keys.ALT) {\n _modifierState.alt = false;\n }\n if (e.keyCode === keys.META) {\n _modifierState.meta = false;\n }\n});\n","module.exports = __webpack_public_path__ + \"static/media/bg.ad9dce3b.svg\";","import React, { useState } from 'react';\nimport {\n View,\n Text,\n Button,\n ExternalLink\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\n\nfunction isOSX() {\n var ua = window.navigator.userAgent;\n var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);\n var webkit = !!ua.match(/WebKit/i);\n return iOS && webkit && !ua.match(/CriOS/i);\n}\n\nfunction isMobile() {\n // Simple detection: if the screen width it too small\n return window.innerWidth < 600;\n}\n\nlet buttonStyle = { border: 0, fontSize: 15, padding: '10px 13px' };\n\nexport default function MobileWebMessage() {\n let appStoreURL = isOSX()\n ? 'https://itunes.apple.com/us/app/actual-budget-your-finances/id1444818585'\n : 'https://play.google.com/store/apps/details?id=com.shiftreset.actual';\n\n let [show, setShow] = useState(\n isMobile() && !document.cookie.match(/hideMobileMessage=true/)\n );\n\n function onTry() {\n setShow(false);\n\n // Set a cookie for 5 minutes\n let d = new Date();\n d.setTime(d.getTime() + 1000 * 60 * 5);\n document.cookie =\n 'hideMobileMessage=true;path=/;expires=' + d.toGMTString();\n }\n\n if (!show) {\n return null;\n }\n\n return (\n <View\n style={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: colors.n1,\n color: 'white',\n padding: 10,\n margin: 10,\n borderRadius: 6,\n zIndex: 10000,\n fontSize: 15,\n boxShadow: styles.shadowLarge\n }}\n >\n <Text style={{ lineHeight: '1.5em' }}>\n <strong>It looks like you are using a mobile device.</strong> This app\n is built for desktop, but you can try it anyway. For the best mobile\n experience, download the app.\n </Text>\n\n <View\n style={{\n marginTop: 20,\n flexDirection: 'row',\n justifyContent: 'flex-end'\n }}\n >\n <Button style={buttonStyle} onClick={onTry}>\n Try it anyway\n </Button>\n <ExternalLink\n bare={false}\n href={appStoreURL}\n style={[buttonStyle, { marginLeft: 10 }]}\n >\n Download app\n </ExternalLink>\n </View>\n </View>\n );\n}\n","import { send, listen } from 'loot-core/src/platform/client/fetch';\nimport * as undo from 'loot-core/src/platform/client/undo';\nimport * as sharedListeners from 'loot-core/src/client/shared-listeners';\n\nexport function handleGlobalEvents(actions, store) {\n global.Actual.onEventFromMain('update-downloaded', (event, info) => {\n actions.setAppState({ updateInfo: info });\n });\n\n global.Actual.onEventFromMain('update-error', msg => {\n // Ignore errors. We don't want to constantly bug the user if they\n // always have a flaky connection or have intentionally disabled\n // updates. They will see the error in the about page if they try\n // to update.\n });\n\n listen('server-error', info => {\n actions.addGenericErrorNotification();\n });\n\n listen('update-loading-status', status => {\n switch (status) {\n case 'updating':\n actions.updateStatusText('Updating...');\n break;\n default:\n }\n });\n\n listen('orphaned-payees', ({ orphanedIds, updatedPayeeIds }) => {\n // Right now, it prompts to merge into the first payee\n actions.pushModal('merge-unused-payees', {\n payeeIds: orphanedIds,\n targetPayeeId: updatedPayeeIds[0]\n });\n });\n\n listen('schedules-offline', ({ payees }) => {\n let history = window.__history;\n if (history) {\n history.push(`/schedule/posts-offline-notification`, {\n locationPtr: history.location,\n payees\n });\n }\n });\n\n async function onManage() {\n let tempId = await send('make-user-temp-id');\n let url = 'https://actualbudget.com/account?tempId=' + tempId;\n window.Actual.openURLInBrowser(url);\n }\n\n // This is experimental: we sync data locally automatically when\n // data changes from the backend\n listen('sync-event', async ({ type, tables }) => {\n // We don't need to query anything until the file is loaded, and\n // sync events might come in if the file is being synced before\n // being loaded (happens when downloading)\n let prefs = store.getState().prefs.local;\n if (prefs && prefs.id) {\n if (type === 'applied') {\n if (tables.includes('payees') || tables.includes('payee_mapping')) {\n actions.getPayees();\n }\n }\n }\n });\n\n // TODO: Should this run on mobile too?\n listen('sync-event', async ({ type }) => {\n if (type === 'unauthorized') {\n actions.addNotification({\n type: 'warning',\n message: 'Unable to authenticate with server',\n sticky: true,\n id: 'auth-issue'\n });\n }\n });\n\n sharedListeners.listenForSyncEvent(actions, store);\n\n listen('undo-event', undoState => {\n let { messages, tables, undoTag } = undoState;\n let promises = [];\n\n if (\n tables.includes('categories') ||\n tables.includes('category_groups') ||\n tables.includes('category_mapping')\n ) {\n promises.push(actions.getCategories());\n }\n\n if (tables.includes('accounts')) {\n promises.push(actions.getAccounts());\n }\n\n let tagged = undo.getTaggedState(undoTag);\n\n if (tagged) {\n Promise.all(promises).then(() => {\n actions.setLastUndoState(undoState);\n\n // If a modal has been tagged, open it instead of navigating\n if (tagged.openModal) {\n let { modalStack } = store.getState().modals;\n\n if (\n modalStack.length === 0 ||\n modalStack[modalStack.length - 1].name !== tagged.openModal\n ) {\n actions.replaceModal(tagged.openModal);\n }\n } else {\n actions.closeModal();\n\n if (window.location.href !== tagged.url) {\n window.location.href = tagged.url;\n // This stops propagation of the undo event, which is\n // important because if we are changing URLs any existing\n // undo listeners on the current page don't need to be run\n return true;\n }\n }\n });\n }\n });\n\n listen('fallback-write-error', () => {\n actions.addNotification({\n type: 'error',\n title: 'Unable to save changes',\n sticky: true,\n message:\n 'This browser only supports using the app in one tab at a time, ' +\n 'and another tab has opened the app. No changes will be saved ' +\n 'from this tab; please close it and continue working in the other one.'\n });\n });\n\n listen('start-load', () => {\n actions.closeBudgetUI();\n actions.setAppState({ loadingText: '' });\n });\n\n listen('finish-load', () => {\n actions.closeModal();\n actions.setAppState({ loadingText: null });\n actions.loadPrefs();\n });\n\n listen('start-import', () => {\n actions.closeBudgetUI();\n actions.setAppState({ loadingText: 'Importing...' });\n });\n\n listen('finish-import', () => {\n actions.closeModal();\n actions.setAppState({ loadingText: null });\n actions.loadPrefs();\n });\n\n listen('show-budgets', () => {\n actions.closeBudgetUI();\n actions.setAppState({ loadingText: null });\n });\n}\n","import { useContext, useState, useRef, useLayoutEffect } from 'react';\nimport NamespaceContext from './NamespaceContext.js';\nimport SpreadsheetContext from './SpreadsheetContext';\n\nfunction unresolveName(name) {\n let idx = name.indexOf('!');\n if (idx !== -1) {\n return {\n sheet: name.slice(0, idx),\n name: name.slice(idx + 1)\n };\n }\n return { sheet: null, name };\n}\n\nexport default function useSheetValue(binding, onChange) {\n if (!binding) {\n throw new Error('SheetValue binding is required');\n }\n if (global.IS_TESTING && typeof binding !== 'string' && !binding.name) {\n binding = { ...binding, name: binding.value.toString() };\n }\n\n binding =\n typeof binding === 'string' ? { name: binding, value: null } : binding;\n\n if (binding.name == null) {\n throw new Error('Binding name is now required');\n }\n\n // Get the current sheet name, and unresolve the binding name if\n // necessary (you might pass a fully resolve name like foo!name)\n let sheetName = useContext(NamespaceContext) || '__global';\n let unresolved = unresolveName(binding.name);\n if (unresolved.sheet) {\n sheetName = unresolved.sheet;\n binding = { ...binding, name: unresolved.name };\n }\n\n let spreadsheet = useContext(SpreadsheetContext);\n let [result, setResult] = useState({\n name: sheetName + '!' + binding.name,\n value: binding.value,\n query: binding.query\n });\n let latestOnChange = useRef(onChange);\n let latestValue = useRef(result.value);\n\n useLayoutEffect(() => {\n latestOnChange.current = onChange;\n latestValue.current = result.value;\n });\n\n useLayoutEffect(\n () => {\n if (binding.query) {\n spreadsheet.createQuery(sheetName, binding.name, binding.query);\n }\n\n return spreadsheet.bind(sheetName, binding, null, newResult => {\n if (latestOnChange.current) {\n latestOnChange.current(newResult);\n }\n\n if (newResult.value !== latestValue.current) {\n setResult(newResult);\n }\n });\n },\n [sheetName, binding.name]\n );\n\n return result.value;\n}\n","import { listen, send } from '../platform/client/fetch';\n\nexport function listenForSyncEvent(actions, store) {\n let attemptedSyncRepair = false;\n\n listen('sync-event', info => {\n let { type, subtype, meta, tables } = info;\n\n let prefs = store.getState().prefs.local;\n if (!prefs || !prefs.id) {\n // Do nothing if no budget is loaded\n return;\n }\n\n if (type === 'success') {\n if (attemptedSyncRepair) {\n attemptedSyncRepair = false;\n\n actions.addNotification({\n title: 'Syncing has been fixed!',\n message: 'Happy budgeting!',\n type: 'message'\n });\n }\n\n if (tables.includes('prefs')) {\n actions.loadPrefs();\n }\n\n if (\n tables.includes('categories') ||\n tables.includes('category_groups') ||\n tables.includes('category_mapping')\n ) {\n actions.getCategories();\n }\n\n if (tables.includes('payees') || tables.includes('payee_mapping')) {\n actions.getPayees();\n }\n\n if (tables.includes('accounts')) {\n actions.getAccounts();\n }\n } else if (type === 'error') {\n let notif = null;\n let learnMore =\n '[Learn more](https://actualbudget.com/docs/overview/syncing-across-devices/#debugging-sync-issues)';\n\n switch (subtype) {\n case 'out-of-sync':\n if (attemptedSyncRepair) {\n notif = {\n title: 'Your data is still out of sync',\n message:\n 'We were unable to repair your sync state, sorry! You need to reset your sync state. ' +\n learnMore,\n sticky: true,\n id: 'reset-sync',\n button: {\n title: 'Reset sync',\n action: actions.resetSync\n }\n };\n } else {\n // A bug happened during the sync process. Sync state needs\n // to be reset.\n notif = {\n title: 'Your data is out of sync',\n message:\n 'There was a problem syncing your data. We can try to repair your sync state ' +\n 'to fix it. ' +\n learnMore,\n type: 'warning',\n sticky: true,\n id: 'repair-sync',\n button: {\n title: 'Repair',\n action: async () => {\n attemptedSyncRepair = true;\n await send('sync-repair');\n actions.sync();\n }\n }\n };\n }\n break;\n\n case 'file-old-version':\n // Tell the user something is wrong with the key state on\n // the server and the key needs to be recreated\n notif = {\n title: 'Actual has updated the syncing format',\n message:\n 'This happens rarely (if ever again). The internal syncing format ' +\n 'has changed and you need to reset sync. This will upload data from ' +\n 'this device and revert all other devices. ' +\n '[Learn more about what this means](https://actualbudget.com/docs/overview/syncing-across-devices/#what-does-resetting-sync-mean).' +\n '\\n\\nOld encryption keys are not migrated. If using ' +\n 'encryption, [reset encryption here](#makeKey).',\n messageActions: {\n makeKey: () => actions.pushModal('create-encryption-key')\n },\n sticky: true,\n id: 'old-file',\n button: {\n title: 'Reset sync',\n action: actions.resetSync\n }\n };\n break;\n\n case 'file-key-mismatch':\n // Tell the user something is wrong with the key state on\n // the server and the key needs to be recreated\n notif = {\n title: 'Your encryption key need to be reset',\n message:\n 'Something went wrong when registering your encryption key id. ' +\n 'You need to recreate your key. ' +\n learnMore,\n sticky: true,\n id: 'invalid-key-state',\n button: {\n title: 'Reset key',\n action: () => actions.pushModal('create-encryption-key')\n }\n };\n\n break;\n\n case 'file-not-found':\n notif = {\n title: 'This file is not a cloud file',\n message:\n 'You need to register it to take advantage ' +\n 'of syncing which allows you to use it across devices and never worry ' +\n 'about losing your data. ' +\n learnMore,\n type: 'warning',\n sticky: true,\n id: 'register-file',\n button: {\n title: 'Register',\n action: async () => {\n await actions.uploadBudget();\n actions.sync();\n actions.loadPrefs();\n }\n }\n };\n break;\n\n case 'file-needs-upload':\n notif = {\n title: 'File needs upload',\n message:\n 'Something went wrong when creating this cloud file. You need ' +\n 'to upload this file to fix it. ' +\n learnMore,\n sticky: true,\n id: 'upload-file',\n button: { title: 'Upload', action: actions.resetSync }\n };\n break;\n\n case 'file-has-reset':\n case 'file-has-new-key':\n // These two cases happen when the current group or key on\n // the server does not match the local one. This can mean a\n // few things depending on the state, and we try to show an\n // appropriate message and call to action to fix it.\n let { groupId, cloudFileId } = store.getState().prefs.local;\n\n notif = {\n title: 'Syncing has been reset on this cloud file',\n message:\n 'You need to revert it to continue syncing. Any unsynced ' +\n 'data will be lost. If you like, you can instead ' +\n '[upload this file](#upload) to be the latest version. ' +\n learnMore,\n messageActions: { upload: actions.resetSync },\n sticky: true,\n id: 'needs-revert',\n button: {\n title: 'Revert',\n action: () => actions.closeAndDownloadBudget(cloudFileId)\n }\n };\n break;\n case 'encrypt-failure':\n case 'decrypt-failure':\n if (meta.isMissingKey) {\n notif = {\n title: 'Missing encryption key',\n message:\n 'Unable to encrypt your data because you are missing the key. ' +\n 'Create your key to sync your data.',\n sticky: true,\n id: 'encrypt-failure-missing',\n button: {\n title: 'Create key',\n action: () =>\n actions.pushModal('fix-encryption-key', {\n onSuccess: () => actions.sync()\n })\n }\n };\n } else {\n notif = {\n message:\n 'Unable to encrypt your data. You have the correct ' +\n 'key so this is likely an internal failure. To fix this, ' +\n 'reset your sync data with a new key.',\n sticky: true,\n id: 'encrypt-failure',\n button: {\n title: 'Reset key',\n action: () =>\n actions.pushModal('create-encryption-key', {\n onSuccess: () => actions.sync()\n })\n }\n };\n }\n break;\n case 'invalid-schema':\n notif = {\n title: 'Update required',\n message:\n \"We couldn't apply changes from the server. This probably means you \" +\n 'need to update the app to support the latest database.',\n type: 'warning'\n };\n break;\n case 'apply-failure':\n notif = {\n message:\n \"We couldn't apply that change to the database. This is a bug, \" +\n 'and it has been reported.'\n };\n break;\n case 'beta-version':\n case 'network':\n // Show nothing\n break;\n default:\n notif = {\n message:\n 'We had problems syncing your changes. This is a bug, ' +\n 'and it has been reported.'\n };\n }\n\n if (notif) {\n actions.addNotification({ type: 'error', ...notif });\n }\n }\n });\n}\n","import * as React from 'react';\nimport { useEffect, useMemo } from 'react';\nimport LRU from 'lru-cache';\nimport SpreadsheetContext from 'loot-design/src/components/spreadsheet/SpreadsheetContext';\nimport { listen, send } from '../platform/client/fetch';\n\nfunction makeSpreadsheet() {\n const cellObservers = {};\n const LRUValueCache = new LRU({ max: 1200 });\n const cellCache = {};\n let observersDisabled = false;\n\n class Spreadsheet {\n observeCell(name, cb) {\n if (!cellObservers[name]) {\n cellObservers[name] = [];\n }\n cellObservers[name].push(cb);\n\n return () => {\n cellObservers[name] = cellObservers[name].filter(x => x !== cb);\n\n if (cellObservers[name].length === 0) {\n cellCache[name] = null;\n }\n };\n }\n\n disableObservers() {\n observersDisabled = true;\n }\n\n enableObservers() {\n observersDisabled = false;\n }\n\n prewarmCache(name, value) {\n LRUValueCache.set(name, value);\n }\n\n listen() {\n return listen('cells-changed', function(nodes) {\n if (!observersDisabled) {\n // TODO: batch react so only renders once\n nodes.forEach(node => {\n const observers = cellObservers[node.name];\n if (observers) {\n observers.forEach(func => func(node));\n cellCache[node.name] = Promise.resolve(node);\n LRUValueCache.set(node.name, node);\n }\n });\n }\n });\n }\n\n bind(sheetName = '__global', binding, fields, cb) {\n binding =\n typeof binding === 'string' ? { name: binding, value: null } : binding;\n\n let resolvedName = `${sheetName}!${binding.name}`;\n let cleanup = this.observeCell(resolvedName, cb);\n\n // Always synchronously call with the existing value if it has one.\n // This is a display optimization to avoid flicker. The LRU cache\n // will keep a number of recent nodes in memory.\n if (LRUValueCache.has(resolvedName)) {\n cb(LRUValueCache.get(resolvedName));\n }\n\n if (cellCache[resolvedName] != null) {\n cellCache[resolvedName].then(cb);\n } else {\n const req = this.get(sheetName, binding.name, fields);\n cellCache[resolvedName] = req;\n\n req.then(result => {\n // We only want to call the callback if it's still waiting on\n // the same request. If we've received a `cells-changed` event\n // for this already then it's already been called and we don't\n // need to call it again (and potentially could be calling it\n // with an old value depending on the order of messages)\n if (cellCache[resolvedName] === req) {\n LRUValueCache.set(resolvedName, result);\n cb(result);\n }\n });\n }\n\n return cleanup;\n }\n\n get(sheetName, name) {\n return send('getCell', { sheetName, name });\n }\n\n getCellNames(sheetName) {\n return send('getCellNamesInSheet', { sheetName });\n }\n\n createQuery(sheetName, name, query) {\n return send('create-query', {\n sheetName,\n name,\n query: query.serialize()\n });\n }\n }\n\n return new Spreadsheet();\n}\n\nexport function SpreadsheetProvider({ children }) {\n let spreadsheet = useMemo(() => makeSpreadsheet(), []);\n\n useEffect(() => {\n return spreadsheet.listen();\n }, [spreadsheet]);\n\n return (\n <SpreadsheetContext.Provider value={spreadsheet}>\n {children}\n </SpreadsheetContext.Provider>\n );\n}\n","import React from 'react';\n\nconst SvgRefresh = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M10 3v2a5 5 0 0 0-3.54 8.54l-1.41 1.41A7 7 0 0 1 10 3zm4.95 2.05A7 7 0 0 1 10 17v-2a5 5 0 0 0 3.54-8.54l1.41-1.41zM10 20l-4-4 4-4v8zm0-12V0l4 4-4 4z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgRefresh;\n","import React from 'react';\nimport { css } from 'glamor';\nimport { View } from 'loot-design/src/components/common';\nimport Refresh from 'loot-design/src/svg/v1/Refresh';\n\nlet spin = css.keyframes({\n '0%': { transform: 'rotateZ(0deg)' },\n '100%': { transform: 'rotateZ(360deg)' }\n});\n\nlet spinStop = css.keyframes({\n '0%': { transform: 'rotateZ(0deg)' },\n '100%': { transform: 'rotateZ(180deg)' }\n});\n\nexport default function AnimatedRefresh({ animating, iconStyle }) {\n return (\n <View\n style={[{ animation: animating ? `${spin} 1s infinite linear` : null }]}\n >\n <Refresh\n width={14}\n height={14}\n style={{ color: 'currentColor', ...iconStyle }}\n />\n </View>\n );\n}\n","import React, { useState } from 'react';\nimport { connect } from 'react-redux';\nimport { useTransition, animated } from 'react-spring';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View, Text } from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport AnimatedRefresh from './AnimatedRefresh';\n\nfunction BankSyncStatus({ accountsSyncing }) {\n let name = accountsSyncing\n ? accountsSyncing === '__all'\n ? 'accounts'\n : accountsSyncing\n : null;\n\n const transitions = useTransition(name, null, {\n from: { opacity: 0, transform: 'translateY(-100px)' },\n enter: { opacity: 1, transform: 'translateY(0)' },\n leave: { opacity: 0, transform: 'translateY(-100px)' },\n unique: true\n });\n\n return (\n <View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n marginTop: 5,\n alignItems: 'center',\n zIndex: 501\n }}\n >\n {transitions.map(\n ({ item, key, props }) =>\n item && (\n <animated.div key={key} style={props}>\n <View\n style={{\n borderRadius: 4,\n backgroundColor: colors.b9,\n color: colors.b1,\n padding: '5px 13px',\n flexDirection: 'row',\n alignItems: 'center',\n boxShadow: styles.shadow\n }}\n >\n <AnimatedRefresh\n animating={true}\n iconStyle={{ color: colors.b1 }}\n />\n <Text>Syncing {item}</Text>\n </View>\n </animated.div>\n )\n )}\n </View>\n );\n}\n\nexport default connect(\n state => ({\n accountsSyncing: state.account.accountsSyncing\n }),\n actions\n)(BankSyncStatus);\n","import React, { useContext, useState } from 'react';\nimport mitt from 'mitt';\n\nexport let BudgetMonthCountContext = React.createContext();\n\nexport function BudgetMonthCountProvider({ children }) {\n let [displayMax, setDisplayMax] = useState(1);\n let emitter = mitt();\n\n return (\n <BudgetMonthCountContext.Provider value={{ displayMax, setDisplayMax }}>\n {children}\n </BudgetMonthCountContext.Provider>\n );\n}\n\nexport function useBudgetMonthCount() {\n return useContext(BudgetMonthCountContext);\n}\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Modal, View, Text } from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\n\nlet PageTypeContext = React.createContext({ type: 'page' });\n\nexport function PageTypeProvider({ type, current, children }) {\n return (\n <PageTypeContext.Provider value={{ type, current }}>\n {children}\n </PageTypeContext.Provider>\n );\n}\n\nexport function usePageType() {\n return React.useContext(PageTypeContext);\n}\n\nfunction PageTitle({ name }) {\n return (\n <Text style={{ fontSize: 25, fontWeight: 500, marginBottom: 15 }}>\n {name}\n </Text>\n );\n}\n\nexport function Page({ title, modalSize, children }) {\n let { type, current } = usePageType();\n let history = useHistory();\n\n if (type === 'modal') {\n let size = modalSize;\n if (typeof modalSize === 'string') {\n size =\n modalSize === 'medium' ? { width: 750, height: 600 } : { width: 600 };\n }\n\n return (\n <Modal\n title={title}\n isCurrent={current}\n size={size}\n onClose={() => history.goBack()}\n >\n {children}\n </Modal>\n );\n }\n\n return (\n <View style={[styles.page, { paddingLeft: 20, paddingRight: 20, flex: 1 }]}>\n <PageTitle name={title} />\n {children}\n </View>\n );\n}\n","let VERSION = Date.now();\n\nexport function makeLocationState(state) {\n return { ...state, _version: VERSION };\n}\n\nexport function getLocationState(location, subfield) {\n if (location.state && location.state._version === VERSION) {\n return subfield ? location.state[subfield] : location.state;\n }\n return null;\n}\n","import React, { useContext } from 'react';\n\nlet ActiveLocationContext = React.createContext(null);\n\nexport function ActiveLocationProvider({ location, children }) {\n return (\n <ActiveLocationContext.Provider value={location} children={children} />\n );\n}\n\nexport function useActiveLocation() {\n return useContext(ActiveLocationContext);\n}\n","import React, { useMemo, useEffect, useState, useContext } from 'react';\nimport q, { liveQuery, runQuery } from 'loot-core/src/client/query-helpers';\nimport { getPayeesById } from 'loot-core/src/client/reducers/queries';\n\nexport function usePayees() {\n let [data, setData] = useState(null);\n\n useEffect(() => {\n let query = liveQuery(q('payees').select('*'), async payees => {\n if (query) {\n setData(payees);\n }\n });\n\n return () => {\n query.unsubscribe();\n query = null;\n };\n }, []);\n\n return data;\n}\n\nlet PayeesContext = React.createContext(null);\n\nexport function PayeesProvider({ children }) {\n let data = usePayees();\n return <PayeesContext.Provider value={data} children={children} />;\n}\n\nexport function CachedPayees({ children, idKey }) {\n let data = useCachedPayees({ idKey });\n return children(data);\n}\n\nexport function useCachedPayees({ idKey } = {}) {\n let data = useContext(PayeesContext);\n return idKey && data ? getPayeesById(data) : data;\n}\n","import React, { useMemo, useEffect, useState, useContext } from 'react';\nimport q, { liveQuery, runQuery } from 'loot-core/src/client/query-helpers';\nimport { getAccountsById } from 'loot-core/src/client/reducers/queries';\n\nexport function useAccounts() {\n let [data, setData] = useState(null);\n\n useEffect(() => {\n let query = liveQuery(q('accounts').select('*'), async accounts => {\n if (query) {\n setData(accounts);\n }\n });\n\n return () => {\n query.unsubscribe();\n query = null;\n };\n }, []);\n\n return data;\n}\n\nlet AccountsContext = React.createContext(null);\n\nexport function AccountsProvider({ children }) {\n let data = useAccounts();\n return <AccountsContext.Provider value={data} children={children} />;\n}\n\nexport function CachedAccounts({ children, idKey }) {\n let data = useCachedAccounts({ idKey });\n return children(data);\n}\n\nexport function useCachedAccounts({ idKey } = {}) {\n let data = useContext(AccountsContext);\n return idKey && data ? getAccountsById(data) : data;\n}\n","import { parse as parseDate, isValid as isDateValid } from 'date-fns';\nimport { currencyToAmount, amountToInteger } from '../shared/util';\nimport {\n dayFromDate,\n getDayMonthRegex,\n getDayMonthFormat,\n getShortYearRegex,\n getShortYearFormat\n} from '../shared/months';\nimport q from '../shared/query';\n\nfunction isInteger(num) {\n return (num | 0) === num;\n}\n\nexport function getAccountFilter(accountId, field = 'account') {\n if (accountId) {\n if (accountId === 'budgeted') {\n return {\n [`${field}.offbudget`]: false,\n [`${field}.closed`]: false\n };\n } else if (accountId === 'offbudget') {\n return {\n [`${field}.offbudget`]: true,\n [`${field}.closed`]: false\n };\n } else if (accountId === 'uncategorized') {\n return {\n [`${field}.offbudget`]: false,\n category: null,\n is_parent: false,\n $or: [\n {\n 'payee.transfer_acct.offbudget': true,\n 'payee.transfer_acct': null\n }\n ]\n };\n } else {\n return { [field]: accountId };\n }\n }\n\n return null;\n}\n\nexport function makeTransactionsQuery(accountId) {\n let query = q('transactions').options({ splits: 'grouped' });\n\n let filter = getAccountFilter(accountId);\n if (filter) {\n query = query.filter(filter);\n }\n\n return query;\n}\n\nexport function makeTransactionSearchQuery(currentQuery, search, dateFormat) {\n let amount = currencyToAmount(search);\n\n // Support various date formats\n let parsedDate;\n if (getDayMonthRegex(dateFormat).test(search)) {\n parsedDate = parseDate(search, getDayMonthFormat(dateFormat), new Date());\n } else if (getShortYearRegex(dateFormat).test(search)) {\n parsedDate = parseDate(search, getShortYearFormat(dateFormat), new Date());\n } else {\n parsedDate = parseDate(search, dateFormat, new Date());\n }\n\n return currentQuery.filter({\n $or: {\n 'payee.name': { $like: `%${search}%` },\n notes: { $like: `%${search}%` },\n 'category.name': { $like: `%${search}%` },\n 'account.name': { $like: `%${search}%` },\n $or: [\n isDateValid(parsedDate) && { date: dayFromDate(parsedDate) },\n amount != null && {\n amount: { $transform: '$abs', $eq: amountToInteger(amount) }\n },\n amount != null &&\n isInteger(amount) && {\n amount: {\n $transform: { $abs: { $idiv: ['$', 100] } },\n $eq: amount\n }\n }\n ].filter(Boolean)\n }\n });\n}\n\nexport function accountBalance(acct) {\n return {\n name: `balance-${acct.id}`,\n query: q('transactions')\n .filter({ account: acct.id })\n .options({ splits: 'none' })\n .calculate({ $sum: '$amount' })\n };\n}\n\nexport function allAccountBalance() {\n return {\n query: q('transactions')\n .filter({ 'account.closed': false })\n .calculate({ $sum: '$amount' }),\n name: 'accounts-balance'\n };\n}\n\nexport function budgetedAccountBalance() {\n return {\n name: `budgeted-accounts-balance`,\n query: q('transactions')\n .filter({ 'account.offbudget': false, 'account.closed': false })\n .calculate({ $sum: '$amount' })\n };\n}\n\nexport function offbudgetAccountBalance() {\n return {\n name: `offbudget-accounts-balance`,\n query: q('transactions')\n .filter({ 'account.offbudget': true, 'account.closed': false })\n .calculate({ $sum: '$amount' })\n };\n}\n\nlet uncategorizedQuery = q('transactions').filter({\n 'account.offbudget': false,\n category: null,\n $or: [\n {\n 'payee.transfer_acct.offbudget': true,\n 'payee.transfer_acct': null\n }\n ]\n});\n\nexport function uncategorizedBalance() {\n return {\n name: 'uncategorized-balance',\n query: uncategorizedQuery.calculate({ $sum: '$amount' })\n };\n}\n\nexport function uncategorizedCount() {\n return {\n name: 'uncategorized-amount',\n query: uncategorizedQuery.calculate({ $count: '$id' })\n };\n}\n\nexport const rolloverBudget = {\n incomeAvailable: 'available-funds',\n lastMonthOverspent: 'last-month-overspent',\n forNextMonth: 'buffered',\n totalBudgeted: 'total-budgeted',\n toBudget: 'to-budget',\n\n fromLastMonth: 'from-last-month',\n totalIncome: 'total-income',\n totalSpent: 'total-spent',\n totalBalance: 'total-leftover',\n\n groupSumAmount: id => `group-sum-amount-${id}`,\n groupIncomeReceived: 'total-income',\n\n groupBudgeted: id => `group-budget-${id}`,\n groupBalance: id => `group-leftover-${id}`,\n\n catBudgeted: id => `budget-${id}`,\n catSumAmount: id => `sum-amount-${id}`,\n catBalance: id => `leftover-${id}`,\n catCarryover: id => `carryover-${id}`\n};\n\nexport const reportBudget = {\n totalBudgetedExpense: 'total-budgeted',\n totalBudgetedIncome: 'total-budget-income',\n totalBudgetedSaved: 'total-saved',\n\n totalIncome: 'total-income',\n totalSpent: 'total-spent',\n totalSaved: 'real-saved',\n\n totalLeftover: 'total-leftover',\n groupSumAmount: id => `group-sum-amount-${id}`,\n groupIncomeReceived: 'total-income',\n\n groupBudgeted: id => `group-budget-${id}`,\n groupBalance: id => `group-leftover-${id}`,\n\n catBudgeted: id => `budget-${id}`,\n catSumAmount: id => `sum-amount-${id}`,\n catBalance: id => `leftover-${id}`,\n catCarryover: id => `carryover-${id}`\n};\n","import React from 'react';\n\nconst SvgCalendar = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M21.5 3h-2.75a.25.25 0 0 1-.25-.25V1a1 1 0 0 0-2 0v4.75a.75.75 0 0 1-.75.75.75.75 0 0 1-.75-.75V3.5a.5.5 0 0 0-.5-.5H8.25A.25.25 0 0 1 8 2.751V1a1 1 0 1 0-2 0v4.75a.75.75 0 0 1-.75.75.75.75 0 0 1-.75-.75V3.5A.5.5 0 0 0 4 3H2.5a2 2 0 0 0-2 2v17a2 2 0 0 0 2 2h19a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zM21 22H3a.5.5 0 0 1-.5-.5v-12A.5.5 0 0 1 3 9h18a.5.5 0 0 1 .5.5v12a.5.5 0 0 1-.5.5z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCalendar;\n","import React, { useState, useLayoutEffect } from 'react';\nimport { styles, colors } from 'loot-design/src/style';\nimport { View, Text } from 'loot-design/src/components/common';\nimport { useBudgetMonthCount } from 'loot-design/src/components/budget/BudgetMonthCountContext';\nimport CalendarIcon from 'loot-design/src/svg/v2/Calendar';\n\nfunction Calendar({ color, onClick }) {\n return (\n <CalendarIcon\n style={{ width: 13, height: 13, color: color, marginRight: 5 }}\n onClick={onClick}\n />\n );\n}\n\nexport function MonthCountSelector({ maxMonths, onChange }) {\n let { displayMax } = useBudgetMonthCount();\n\n let style = { width: 15, height: 15, color: colors.n8 };\n let activeStyle = { color: colors.n5 };\n\n // It doesn't make sense to show anything if we can only fit one\n // month\n if (displayMax <= 1) {\n return null;\n }\n\n let calendars = [];\n for (let i = 1; i <= displayMax; i++) {\n calendars.push(\n <Calendar\n key={i}\n color={maxMonths >= i ? colors.n5 : colors.n8}\n onClick={() => onChange(i)}\n />\n );\n }\n\n return (\n <View\n style={{\n flexDirection: 'row',\n marginRight: 20,\n marginTop: -1,\n '& svg': {\n transition: 'transform .15s'\n },\n '& svg:hover': {\n transform: 'scale(1.2)'\n }\n }}\n title=\"Choose the number of months shown at a time\"\n >\n {calendars}\n </View>\n );\n}\n","import React from 'react';\n\nconst SvgArrowButtonRight1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M13.584 12a2.643 2.643 0 0 1-.775 1.875l-9.541 9.541a1.768 1.768 0 0 1-2.5-2.5l8.739-8.739a.25.25 0 0 0 0-.354L.768 3.084a1.768 1.768 0 0 1 2.5-2.5l9.541 9.541A2.643 2.643 0 0 1 13.584 12z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M23.75 12a2.643 2.643 0 0 1-.775 1.875l-9.541 9.541a1.768 1.768 0 0 1-2.5-2.5l8.739-8.739a.25.25 0 0 0 0-.354l-8.739-8.739a1.768 1.768 0 0 1 2.5-2.5l9.541 9.541A2.643 2.643 0 0 1 23.75 12z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowButtonRight1;\n","import React from 'react';\n\nconst SvgNavigationMenu = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <rect\n x={0.5}\n y={2.5}\n width={23}\n height={3}\n rx={1}\n ry={1}\n fill=\"currentColor\"\n />\n <rect\n x={0.5}\n y={10.5}\n width={23}\n height={3}\n rx={1}\n ry={1}\n fill=\"currentColor\"\n />\n <rect\n x={0.5}\n y={18.5}\n width={23}\n height={3}\n rx={1}\n ry={1}\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgNavigationMenu;\n","import React from 'react';\n\nconst SvgArrowLeft = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M3.828 9l6.071-6.071-1.414-1.414L0 10l.707.707 7.778 7.778 1.414-1.414L3.828 11H20V9H3.828z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowLeft;\n","import React from 'react';\n\nconst SvgAlertTriangle = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M23.119 20L13.772 2.15a2 2 0 0 0-3.543 0L.881 20a2 2 0 0 0 1.772 2.928h18.694A2 2 0 0 0 23.119 20zM11 8.423a1 1 0 0 1 2 0v6a1 1 0 1 1-2 0zm1.05 11.51h-.028a1.528 1.528 0 0 1-1.522-1.47 1.476 1.476 0 0 1 1.448-1.53h.028A1.527 1.527 0 0 1 13.5 18.4a1.475 1.475 0 0 1-1.45 1.533z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgAlertTriangle;\n","import React from 'react';\n\nconst SvgExclamationOutline = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm12.73-1.41A8 8 0 1 0 4.34 4.34a8 8 0 0 0 11.32 11.32zM9 5h2v6H9V5zm0 8h2v2H9v-2z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgExclamationOutline;\n","import { send } from 'loot-core/src/platform/client/fetch';\n\nfunction _authorize(pushModal, plaidToken, { onSuccess, onClose }) {\n pushModal('plaid-external-msg', {\n onMoveExternal: async () => {\n let token = await send('create-web-token');\n let url = 'http://link.actualbudget.com/?token=' + token;\n // let url = 'http://localhost:8080/?token=' + token;\n if (plaidToken) {\n url = url + '&plaidToken=' + plaidToken;\n }\n window.Actual.openURLInBrowser(url);\n\n let { error, data } = await send('poll-web-token', { token });\n\n return { error, data };\n },\n\n onClose,\n onSuccess\n });\n}\n\nexport async function authorizeBank(pushModal, { upgradingId } = {}) {\n _authorize(pushModal, null, {\n onSuccess: async data => {\n pushModal('select-linked-accounts', {\n institution: data.metadata.institution,\n publicToken: data.publicToken,\n accounts: data.metadata.accounts,\n upgradingId\n });\n }\n });\n}\n\nexport async function reauthorizeBank(pushModal, bankId, onSuccess) {\n let { error, linkToken } = await send('make-plaid-public-token', {\n bankId\n });\n\n // We don't do anything with the error right now\n if (!linkToken) {\n return false;\n }\n\n // When the modal is closed here, always try to re-sync the account\n // by calling `onSuccess`\n _authorize(pushModal, linkToken, { onSuccess, onClose: onSuccess });\n return true;\n}\n","import React, { useState } from 'react';\nimport { Route, withRouter } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View, Text, Button, Tooltip } from 'loot-design/src/components/common';\nimport ExclamationOutline from 'loot-design/src/svg/v1/ExclamationOutline';\nimport { colors } from 'loot-design/src/style';\nimport { reauthorizeBank } from '../../plaid';\n\nfunction getErrorMessage(type, code) {\n switch (type.toUpperCase()) {\n case 'ITEM_ERROR':\n switch (code.toUpperCase()) {\n case 'NO_ACCOUNTS':\n return 'No open accounts could be found. Did you close the account? If so, unlink the account.';\n case 'ITEM_LOGIN_REQUIRED':\n return 'Your password or something else has changed with your bank and you need to login again.';\n default:\n }\n break;\n\n case 'INVALID_INPUT':\n switch (code.toUpperCase()) {\n case 'INVALID_ACCESS_TOKEN':\n return 'Item is no longer authorized. You need to login again.';\n default:\n }\n break;\n\n case 'API_ERROR':\n switch (code.toUpperCase()) {\n case 'PLANNED_MAINTENANCE':\n return 'Our servers are currently undergoing maintenance and will be available again soon.';\n default:\n }\n break;\n\n case 'RATE_LIMIT_EXCEEDED':\n return 'Rate limit exceeded for this item. Please try again later.';\n\n default:\n }\n\n return 'An internal error occurred. Try to login again, or contact help@actualbudget.com for support.';\n}\n\nfunction AccountSyncCheck({\n id,\n accounts,\n failedAccounts,\n syncAndDownload,\n markAccountSuccess,\n unlinkAccount,\n pushModal,\n closeModal,\n getAccounts,\n addNotification\n}) {\n if (!failedAccounts) {\n return null;\n }\n\n let error = failedAccounts.get(id);\n if (!error) {\n return null;\n }\n\n let [open, setOpen] = useState(false);\n\n let account = accounts.find(account => account.id === id);\n let { type, code } = error;\n let showAuth =\n (type === 'ITEM_ERROR' && code === 'ITEM_LOGIN_REQUIRED') ||\n (type === 'INVALID_INPUT' && code === 'INVALID_ACCESS_TOKEN');\n\n function reauth() {\n setOpen(false);\n\n let modalOpened = reauthorizeBank(pushModal, account.bankId, () => {\n closeModal();\n\n // Re-sync accounts. If there are multiple failed account, that\n // means all accounts were synced to resync all of them.\n // Multiple accounts can be tied to the same bank id.\n syncAndDownload(failedAccounts.size > 1 ? null : account.id);\n });\n\n if (!modalOpened) {\n addNotification({\n type: 'error',\n message: 'Unable to process this item, sorry!'\n });\n }\n }\n\n async function unlink() {\n unlinkAccount(account.id);\n setOpen(false);\n }\n\n return (\n <View>\n <Button\n bare\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n color: colors.r5,\n backgroundColor: colors.r10,\n padding: '4px 8px',\n borderRadius: 4\n }}\n onClick={() => setOpen(true)}\n >\n <ExclamationOutline\n style={{\n width: 14,\n height: 14,\n marginRight: 5,\n color: 'currentColor'\n }}\n />{' '}\n This account is experiencing connection problems. Let{\"'\"}s fix it.\n </Button>\n\n {open && (\n <Tooltip\n position=\"bottom-left\"\n onClose={() => setOpen(false)}\n style={{ fontSize: 14, padding: 15, maxWidth: 400 }}\n >\n <div style={{ marginBottom: '1.15em' }}>\n The server returned the following error:\n </div>\n\n <div style={{ marginBottom: '1.25em', color: colors.r5 }}>\n {getErrorMessage(error.type, error.code)}\n </div>\n\n <View style={{ justifyContent: 'flex-end', flexDirection: 'row' }}>\n {showAuth ? (\n <>\n <Button onClick={unlink}>Unlink</Button>\n <Button primary onClick={reauth} style={{ marginLeft: 5 }}>\n Reauthorize\n </Button>\n </>\n ) : (\n <Button onClick={unlink}>Unlink account</Button>\n )}\n </View>\n </Tooltip>\n )}\n </View>\n );\n}\n\nexport default connect(\n state => ({\n accounts: state.queries.accounts,\n failedAccounts: state.account.failedAccounts\n }),\n actions\n)(AccountSyncCheck);\n","import React from 'react';\nimport format from './format';\nimport SheetValue from './SheetValue';\nimport Text from '../Text';\nimport { styles } from '../../style';\n\nfunction CellValue({ binding, type, formatter, style, getStyle, debug }) {\n return (\n <SheetValue binding={binding} debug={debug}>\n {({ name, value }) => {\n return (\n <Text\n style={[\n type === 'financial' && styles.tnum,\n style,\n getStyle && getStyle(value)\n ]}\n numberOfLines={1}\n data-testid={name}\n data-cellname={name}\n >\n {formatter ? formatter(value) : format(value, type)}\n </Text>\n );\n }}\n </SheetValue>\n );\n}\n\nexport default CellValue;\n","import React from 'react';\n\nconst SvgAdd = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n fill=\"currentColor\"\n className=\"path\"\n d=\"M23 11.5a1.5 1.5 0 0 1-1.5 1.5h-20a1.5 1.5 0 0 1 0-3h20a1.5 1.5 0 0 1 1.5 1.5z\"\n />\n <path\n fill=\"currentColor\"\n className=\"path\"\n d=\"M11.5 23a1.5 1.5 0 0 1-1.5-1.5v-20a1.5 1.5 0 0 1 3 0v20a1.5 1.5 0 0 1-1.5 1.5z\"\n />\n </svg>\n);\n\nexport default SvgAdd;\n","import React from 'react';\n\nconst SvgWallet = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M0 4c0-1.1.9-2 2-2h15a1 1 0 0 1 1 1v1H2v1h17a1 1 0 0 1 1 1v10a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V4zm16.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgWallet;\n","import React from 'react';\n\nconst SvgReports = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M19 18h-1v-8c0-.6-.4-1-1-1s-1 .4-1 1v8h-3V1c0-.6-.4-1-1-1s-1 .4-1 1v17H8V7c0-.6-.4-1-1-1s-1 .4-1 1v11H3V3c0-.6-.4-1-1-1s-1 .4-1 1v15c-.6 0-1 .4-1 1s.4 1 1 1h18c.6 0 1-.4 1-1s-.4-1-1-1z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgReports;\n","import React from 'react';\n\nconst SvgArrowButtonLeft1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M10.416 12a2.643 2.643 0 0 1 .775-1.875L20.732.584a1.768 1.768 0 0 1 2.5 2.5l-8.739 8.739a.25.25 0 0 0 0 .354l8.739 8.739a1.768 1.768 0 0 1-2.5 2.5l-9.541-9.541A2.643 2.643 0 0 1 10.416 12z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M.25 12a2.643 2.643 0 0 1 .775-1.875L10.566.584a1.768 1.768 0 0 1 2.5 2.5l-8.739 8.739a.25.25 0 0 0 0 .354l8.739 8.739a1.768 1.768 0 0 1-2.5 2.5l-9.541-9.541A2.643 2.643 0 0 1 .25 12z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowButtonLeft1;\n","import React from 'react';\n\nconst SvgPiggyBank = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <g clipPath=\"url(#piggy-bank_svg__clip0)\">\n <path\n d=\"M1.857 7.612H.98a.98.98 0 0 0-.98.98v2.224c0 .449.184.857.51 1.163.612.551 1.816 1.49 3.735 2.368a.571.571 0 0 1 .306.346l.939 3.286a.484.484 0 0 0 .469.347h1.47a.479.479 0 0 0 .469-.367l.47-1.817a.262.262 0 0 1 .326-.183c.571.122 1.183.163 1.795.163.613 0 1.225-.061 1.796-.163.143-.02.286.06.327.183l.47 1.817a.502.502 0 0 0 .468.367h1.47a.484.484 0 0 0 .47-.347l1.224-4.245a.487.487 0 0 1 .122-.224c.919-.98 1.53-2.163 1.735-3.47h.49c.53 0 .959-.448.938-.979-.02-.51-.47-.918-.98-.918h-.448C18.06 4.673 14.632 2 10.489 2c-1.775 0-3.428.49-4.755 1.326-.591-.408-1.469-.734-2.693-.632-.49.04-.715.612-.388.959.408.429.796 1 .877 1.735L1.857 7.612zm3.122.98a.862.862 0 0 1-.857-.858c0-.469.388-.857.857-.857.47 0 .858.388.858.857 0 .47-.388.858-.858.858z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"piggy-bank_svg__clip0\">\n <path fill=\"currentColor\" d=\"M0 0h20v20H0z\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default SvgPiggyBank;\n","import React from 'react';\n\nconst SvgCog = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M3.94 6.5L2.22 3.64l1.42-1.42L6.5 3.94c.52-.3 1.1-.54 1.7-.7L9 0h2l.8 3.24c.6.16 1.18.4 1.7.7l2.86-1.72 1.42 1.42-1.72 2.86c.3.52.54 1.1.7 1.7L20 9v2l-3.24.8c-.16.6-.4 1.18-.7 1.7l1.72 2.86-1.42 1.42-2.86-1.72c-.52.3-1.1.54-1.7.7L11 20H9l-.8-3.24c-.6-.16-1.18-.4-1.7-.7l-2.86 1.72-1.42-1.42 1.72-2.86c-.3-.52-.54-1.1-.7-1.7L0 11V9l3.24-.8c.16-.6.4-1.18.7-1.7zM10 13a3 3 0 1 0 0-6 3 3 0 0 0 0 6z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCog;\n","import React, {\n useEffect,\n useRef,\n useLayoutEffect,\n useMemo,\n useState,\n useContext\n} from 'react';\nimport { useDrag, useDrop } from 'react-dnd';\nimport { colors } from '../style';\nimport { View } from './common';\n\nexport function useMergedRefs(ref1, ref2) {\n return useMemo(() => {\n function ref(value) {\n [ref1, ref2].forEach(ref => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n ref.current = value;\n }\n });\n }\n\n return ref;\n }, [ref1, ref2]);\n}\n\nexport function useDraggable({\n item,\n type,\n makePreview,\n children,\n canDrag,\n onDragChange\n}) {\n let _onDragChange = useRef(onDragChange);\n\n //eslint-disable-next-line\n const [{ isDragging }, dragRef] = useDrag({\n item: { type, item },\n collect: monitor => ({ isDragging: monitor.isDragging() }),\n\n begin(monitor) {\n _onDragChange.current({ state: 'start-preview', type, item });\n\n setTimeout(() => {\n _onDragChange.current({ state: 'start' });\n }, 0);\n },\n\n end(item, monitor) {\n _onDragChange.current({ state: 'end', type, item });\n },\n\n canDrag() {\n return canDrag;\n }\n });\n\n useLayoutEffect(() => {\n _onDragChange.current = onDragChange;\n });\n\n return { dragRef };\n}\n\nexport function useDroppable({ types, id, onDrop, onLongHover }) {\n let ref = useRef(null);\n let [dropPos, setDropPos] = useState(null);\n\n // eslint-disable-next-line\n let [{ isOver }, dropRef] = useDrop({\n accept: types,\n drop({ item }, monitor) {\n onDrop(item.id, dropPos, id);\n },\n hover({ item, type }, monitor) {\n let hoverBoundingRect = ref.current.getBoundingClientRect();\n let hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n let clientOffset = monitor.getClientOffset();\n let hoverClientY = clientOffset.y - hoverBoundingRect.top;\n let pos = hoverClientY < hoverMiddleY ? 'top' : 'bottom';\n\n setDropPos(pos);\n },\n collect(monitor) {\n return { isOver: monitor.isOver() };\n }\n });\n\n useEffect(() => {\n let timeout;\n if (onLongHover && isOver) {\n timeout = setTimeout(onLongHover, 700);\n }\n\n return () => timeout && clearTimeout(timeout);\n }, [isOver]);\n\n return {\n dropRef: useMergedRefs(dropRef, ref),\n dropPos: isOver ? dropPos : null\n };\n}\n\nexport const DropHighlightPosContext = React.createContext(null);\n\nexport function DropHighlight({ pos, offset = {} }) {\n if (pos == null) {\n return null;\n }\n\n let itemPos = useContext(DropHighlightPosContext);\n let topOffset = (itemPos === 'first' ? 2 : 0) + (offset.top || 0);\n let bottomOffset = (itemPos === 'last' ? 2 : 0) + (offset.bottom || 0);\n\n let posStyle =\n pos === 'top' ? { top: -2 + topOffset } : { bottom: -1 + bottomOffset };\n\n return (\n <View\n style={[\n {\n position: 'absolute',\n left: 2,\n right: 2,\n borderRadius: 3,\n height: 3,\n background: `linear-gradient(90deg, ${colors.b4} 0%, ${colors.b5} 100%)`,\n zIndex: 10000,\n pointerEvents: 'none'\n },\n posStyle\n ]}\n />\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport { css } from 'glamor';\nimport {\n View,\n Block,\n AlignedText,\n AnchorLink,\n ButtonLink,\n Button,\n Menu,\n Tooltip\n} from './common';\nimport { pushModal } from 'loot-core/src/client/actions/modals';\nimport { closeBudget } from 'loot-core/src/client/actions/budgets';\nimport Platform from 'loot-core/src/client/platform';\nimport CellValue from './spreadsheet/CellValue';\nimport Add from '../svg/v1/Add';\nimport CalendarIcon from '../svg/v2/Calendar';\nimport { styles, colors } from '../style';\nimport Wallet from '../svg/v1/Wallet';\nimport Reports from '../svg/v1/Reports';\nimport ArrowButtonLeft1 from '../svg/v2/ArrowButtonLeft1';\nimport PiggyBank from 'loot-design/src/svg/v1/PiggyBank';\nimport Cog from '../svg/v1/Cog';\nimport DotsHorizontalTriple from '../svg/v1/DotsHorizontalTriple';\n\nimport { useDraggable, useDroppable, DropHighlight } from './sort.js';\n\nexport const SIDEBAR_WIDTH = 240;\n\nexport function Item({\n children,\n icon,\n title,\n style,\n to,\n exact,\n onButtonPress\n}) {\n const showButton = title === 'Accounts';\n\n return (\n <View style={style}>\n <AnchorLink\n style={[\n {\n ...styles.mediumText,\n paddingTop: 9,\n paddingBottom: 9,\n paddingLeft: 19,\n paddingRight: 10,\n textDecoration: 'none',\n color: colors.n9\n },\n { ':hover': { backgroundColor: colors.n2 } }\n ]}\n to={to}\n exact={exact}\n activeStyle={{\n borderLeft: '4px solid ' + colors.p8,\n paddingLeft: 19 - 4,\n color: colors.p8\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n height: 20\n }}\n >\n {icon}\n <Block style={{ marginLeft: 8 }}>{title}</Block>\n <View style={{ flex: 1 }} />\n {showButton && (\n <Button\n bare\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n onButtonPress();\n }}\n >\n <Add width={12} height={12} style={{ color: colors.n6 }} />\n </Button>\n )}\n </View>\n </AnchorLink>\n\n {children ? <View style={{ marginTop: 5 }}>{children}</View> : null}\n </View>\n );\n}\n\nlet accountNameStyle = [\n {\n marginTop: -2,\n marginBottom: 2,\n paddingTop: 4,\n paddingBottom: 4,\n paddingRight: 15,\n paddingLeft: 10,\n textDecoration: 'none',\n color: colors.n9\n },\n { ':hover': { backgroundColor: colors.n2 } },\n styles.smallText\n];\n\nfunction Account({\n name,\n account,\n connected,\n failed,\n updated,\n to,\n query,\n style,\n outerStyle,\n onDragChange,\n onDrop\n}) {\n let type = account\n ? account.closed\n ? 'account-closed'\n : account.offbudget\n ? 'account-offbudget'\n : 'account-onbudget'\n : 'title';\n\n let { dragRef } = useDraggable({\n type,\n onDragChange,\n item: { id: account && account.id },\n canDrag: account != null\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: account ? [type] : [],\n id: account && account.id,\n onDrop: onDrop\n });\n\n return (\n <View innerRef={dropRef} style={[{ flexShrink: 0 }, outerStyle]}>\n <View>\n <DropHighlight pos={dropPos} />\n <View innerRef={dragRef}>\n <AnchorLink\n ref={dragRef}\n to={to}\n style={[\n accountNameStyle,\n style,\n { position: 'relative', borderLeft: '4px solid transparent' },\n updated && { fontWeight: 700 }\n ]}\n activeStyle={{\n borderColor: colors.p8,\n color: colors.p8,\n // This is kind of a hack, but we don't ever want the account\n // that the user is looking at to be \"bolded\" which means it\n // has unread transactions. The system does mark is read and\n // unbolds it, but it still \"flashes\" bold so this just\n // ignores it if it's active\n fontWeight: 'normal',\n '& .dot': {\n backgroundColor: colors.p8,\n transform: 'translateX(-4.5px)'\n }\n }}\n >\n <View\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n flexDirection: 'row',\n alignItems: 'center'\n }}\n >\n <div\n className=\"dot\"\n {...css({\n marginRight: 3,\n width: 5,\n height: 5,\n borderRadius: 5,\n backgroundColor: failed ? colors.r7 : colors.g5,\n marginLeft: 2,\n transition: 'transform .3s',\n opacity: connected ? 1 : 0\n })}\n />\n </View>\n\n <AlignedText\n left={name}\n right={\n <CellValue debug={true} binding={query} type=\"financial\" />\n }\n />\n </AnchorLink>\n </View>{' '}\n </View>\n </View>\n );\n}\n\nexport function Accounts({\n accounts,\n failedAccounts,\n updatedAccounts,\n to,\n icon,\n history,\n getAccountPath,\n budgetedAccountPath,\n offBudgetAccountPath,\n getBalanceQuery,\n getOnBudgetBalance,\n getOffBudgetBalance,\n showClosedAccounts,\n onAddAccount,\n onToggleClosedAccounts,\n onReorder\n}) {\n let [isDragging, setIsDragging] = useState(false);\n let offbudgetAccounts = useMemo(\n () =>\n accounts.filter(\n account => account.closed === 0 && account.offbudget === 1\n ),\n [accounts]\n );\n let budgetedAccounts = useMemo(\n () =>\n accounts.filter(\n account => account.closed === 0 && account.offbudget === 0\n ),\n [accounts]\n );\n let closedAccounts = useMemo(\n () => accounts.filter(account => account.closed === 1),\n [accounts]\n );\n\n function onDragChange(drag) {\n setIsDragging(drag.state === 'start');\n }\n\n let makeDropPadding = (i, length) => {\n if (i === 0) {\n return {\n paddingTop: isDragging ? 15 : 0,\n marginTop: isDragging ? -15 : 0\n };\n } else if (i === length - 1) {\n return {\n paddingBottom: 15\n };\n }\n return null;\n };\n\n return (\n <Item\n title=\"Accounts\"\n to={to}\n icon={icon}\n exact={true}\n style={{ marginBottom: 5, flex: 1 }}\n onButtonPress={onAddAccount}\n >\n <View style={{ overflow: 'auto', marginTop: -5 }}>\n {budgetedAccounts.length > 0 && (\n <Account\n name=\"For budget\"\n to={budgetedAccountPath}\n query={getOnBudgetBalance()}\n style={{ marginTop: 15, color: colors.n6 }}\n />\n )}\n\n {budgetedAccounts.map((account, i) => (\n <Account\n key={account.id}\n name={account.name}\n account={account}\n connected={!!account.bankId}\n failed={failedAccounts && failedAccounts.has(account.id)}\n updated={updatedAccounts && updatedAccounts.includes(account.id)}\n to={getAccountPath(account)}\n query={getBalanceQuery(account)}\n onDragChange={onDragChange}\n onDrop={onReorder}\n outerStyle={makeDropPadding(i, budgetedAccounts.length)}\n />\n ))}\n\n {offbudgetAccounts.length > 0 && (\n <Account\n name=\"Off budget\"\n to={offBudgetAccountPath}\n query={getOffBudgetBalance()}\n style={{ color: colors.n6 }}\n />\n )}\n\n {offbudgetAccounts.map((account, i) => (\n <Account\n key={account.id}\n name={account.name}\n account={account}\n connected={!!account.bankId}\n failed={failedAccounts && failedAccounts.has(account.id)}\n updated={updatedAccounts && updatedAccounts.includes(account.id)}\n to={getAccountPath(account)}\n query={getBalanceQuery(account)}\n onDragChange={onDragChange}\n onDrop={onReorder}\n outerStyle={makeDropPadding(i, offbudgetAccounts.length)}\n />\n ))}\n\n {closedAccounts.length > 0 && (\n <View\n style={[\n accountNameStyle,\n {\n marginTop: 15,\n color: colors.n6,\n flexDirection: 'row',\n userSelect: 'none',\n alignItems: 'center',\n flexShrink: 0\n }\n ]}\n onClick={onToggleClosedAccounts}\n >\n {'Closed Accounts' + (showClosedAccounts ? '' : '...')}\n </View>\n )}\n\n {showClosedAccounts &&\n closedAccounts.map((account, i) => (\n <Account\n key={account.id}\n name={account.name}\n account={account}\n to={getAccountPath(account)}\n query={getBalanceQuery(account)}\n onDragChange={onDragChange}\n onDrop={onReorder}\n />\n ))}\n </View>\n </Item>\n );\n}\n\nfunction ToggleButton({ style, onFloat }) {\n return (\n <View className=\"float\" style={[style, { flexShrink: 0 }]}>\n <Button bare onClick={onFloat}>\n <ArrowButtonLeft1 style={{ width: 13, height: 13, color: colors.n5 }} />\n </Button>\n </View>\n );\n}\n\nconst MenuButton = withRouter(function MenuButton({ history }) {\n let dispatch = useDispatch();\n let [menuOpen, setMenuOpen] = useState(false);\n\n function onMenuSelect(type) {\n setMenuOpen(false);\n\n switch (type) {\n case 'open-payees':\n dispatch(pushModal('manage-payees'));\n break;\n case 'open-rules':\n dispatch(pushModal('manage-rules'));\n break;\n case 'find-schedules':\n history.push('/schedule/discover', { locationPtr: history.location });\n break;\n case 'repair-splits':\n history.push('/tools/fix-splits', { locationPtr: history.location });\n break;\n case 'settings':\n history.push('/settings');\n break;\n case 'close':\n dispatch(closeBudget());\n break;\n default:\n }\n }\n\n let items = [\n { name: 'open-payees', text: 'Manage Payees' },\n { name: 'open-rules', text: 'Manage Rules' },\n { name: 'find-schedules', text: 'Find schedules' },\n { name: 'repair-splits', text: 'Repair split transactions' },\n Menu.line,\n { name: 'settings', text: 'Settings' },\n { name: 'close', text: 'Close File' }\n ];\n\n return (\n <Button\n bare\n style={{\n color: colors.n5,\n flexShrink: 0\n }}\n activeStyle={{ color: colors.p7 }}\n onClick={() => setMenuOpen(true)}\n >\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: 'inherit', transform: 'rotateZ(0deg)' }}\n />\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu onMenuSelect={onMenuSelect} items={items} />\n </Tooltip>\n )}\n </Button>\n );\n});\n\nexport function Sidebar({\n style,\n budgetName,\n accounts,\n failedAccounts,\n updatedAccounts,\n getBalanceQuery,\n getOnBudgetBalance,\n getOffBudgetBalance,\n showClosedAccounts,\n isFloating,\n onFloat,\n onAddAccount,\n onToggleClosedAccounts,\n onReorder\n}) {\n let hasWindowButtons = !Platform.isBrowser && Platform.OS === 'mac';\n\n return (\n <View\n style={[\n {\n width: SIDEBAR_WIDTH,\n color: colors.n9,\n overflow: 'auto',\n backgroundColor: colors.n1,\n '& .float': {\n opacity: 0,\n transition: 'opacity .25s, width .25s',\n width: hasWindowButtons ? null : 0\n },\n '&:hover .float': {\n opacity: 1,\n width: hasWindowButtons ? null : 'auto'\n }\n },\n style\n ]}\n >\n {hasWindowButtons && (\n <ToggleButton\n style={[\n {\n height: isFloating ? 0 : 36,\n alignItems: 'flex-end',\n justifyContent: 'center',\n overflow: 'hidden',\n WebkitAppRegion: 'drag',\n paddingRight: 8\n }\n ]}\n onFloat={onFloat}\n />\n )}\n <View\n style={[\n {\n paddingTop: 35,\n height: 30,\n flexDirection: 'row',\n alignItems: 'center',\n margin: '0 8px 23px 20px',\n transition: 'padding .4s'\n },\n hasWindowButtons && {\n paddingTop: 20,\n justifyContent: 'flex-start'\n }\n ]}\n >\n {budgetName}\n\n {!Platform.isBrowser && (\n <ButtonLink\n bare\n to=\"/settings\"\n style={{\n // Needed for Windows? No idea why this is displayed as block\n display: 'inherit',\n color: colors.n5,\n marginLeft: hasWindowButtons ? 0 : 5,\n flexShrink: 0\n }}\n activeStyle={{ color: colors.p7 }}\n >\n <Cog width={15} height={15} style={{ color: 'inherit' }} />\n </ButtonLink>\n )}\n\n <View style={{ flex: 1, flexDirection: 'row' }} />\n\n {!hasWindowButtons && <ToggleButton onFloat={onFloat} />}\n {Platform.isBrowser && <MenuButton />}\n </View>\n <Item\n title=\"Budget\"\n icon={<Wallet width={15} height={15} style={{ color: 'inherit' }} />}\n to=\"/budget\"\n />\n <Item\n title=\"Reports\"\n icon={<Reports width={15} height={15} style={{ color: 'inherit' }} />}\n to=\"/reports\"\n />\n <Item\n title=\"Schedules\"\n icon={\n <CalendarIcon width={15} height={15} style={{ color: 'inherit' }} />\n }\n to=\"/schedules\"\n />\n <Accounts\n to=\"/accounts\"\n icon={<PiggyBank width={15} height={15} style={{ color: 'inherit' }} />}\n accounts={accounts}\n failedAccounts={failedAccounts}\n updatedAccounts={updatedAccounts}\n getAccountPath={account => `/accounts/${account.id}`}\n budgetedAccountPath=\"/accounts/budgeted\"\n offBudgetAccountPath=\"/accounts/offbudget\"\n getBalanceQuery={getBalanceQuery}\n getOnBudgetBalance={getOnBudgetBalance}\n getOffBudgetBalance={getOffBudgetBalance}\n showClosedAccounts={showClosedAccounts}\n onAddAccount={onAddAccount}\n onToggleClosedAccounts={onToggleClosedAccounts}\n onReorder={onReorder}\n />\n </View>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport { select } from 'glamor';\nimport lively from '@jlongster/lively';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { styles, colors } from 'loot-design/src/style';\nimport {\n Button,\n Input,\n InitialFocus,\n View,\n Text\n} from 'loot-design/src/components/common';\nimport { Sidebar } from 'loot-design/src/components/sidebar';\nimport * as actions from 'loot-core/src/client/actions';\nimport * as queries from 'loot-core/src/client/queries';\n\nfunction EditableBudgetName({ prefs, savePrefs }) {\n const [editing, setEditing] = useState(false);\n\n if (editing) {\n return (\n <InitialFocus>\n <Input\n style={{\n width: 160,\n fontSize: 16,\n fontWeight: 500\n }}\n defaultValue={prefs.budgetName}\n onEnter={async e => {\n const newBudgetName = e.target.value;\n if (newBudgetName.trim() !== '') {\n await savePrefs({\n budgetName: e.target.value\n });\n setEditing(false);\n }\n }}\n onBlur={() => setEditing(false)}\n />\n </InitialFocus>\n );\n } else {\n return (\n <Button\n bare\n style={{\n color: colors.n9,\n fontSize: 16,\n fontWeight: 500,\n marginLeft: -5,\n flex: '0 auto'\n }}\n onClick={() => setEditing(true)}\n >\n <Text style={{ whiteSpace: 'nowrap', overflow: 'hidden' }}>\n {prefs.budgetName || 'A budget has no name'}\n </Text>\n </Button>\n );\n }\n}\n\nfunction SidebarWithData({\n accounts,\n failedAccounts,\n updatedAccounts,\n replaceModal,\n prefs,\n floatingSidebar,\n savePrefs,\n saveGlobalPrefs,\n getAccounts\n}) {\n useEffect(() => void getAccounts(), [getAccounts]);\n\n async function onReorder(id, dropPos, targetId) {\n if (dropPos === 'bottom') {\n let idx = accounts.findIndex(a => a.id === targetId) + 1;\n targetId = idx < accounts.length ? accounts[idx].id : null;\n }\n\n await send('account-move', { id, targetId });\n await getAccounts();\n }\n\n return (\n <Sidebar\n isFloating={floatingSidebar}\n budgetName={<EditableBudgetName prefs={prefs} savePrefs={savePrefs} />}\n accounts={accounts}\n failedAccounts={failedAccounts}\n updatedAccounts={updatedAccounts}\n getBalanceQuery={queries.accountBalance}\n getOnBudgetBalance={queries.budgetedAccountBalance}\n getOffBudgetBalance={queries.offbudgetAccountBalance}\n onFloat={() => saveGlobalPrefs({ floatingSidebar: !floatingSidebar })}\n onReorder={onReorder}\n onAddAccount={() =>\n replaceModal(\n prefs['flags.syncAccount'] ? 'add-account' : 'add-local-account'\n )\n }\n showClosedAccounts={prefs['ui.showClosedAccounts']}\n onToggleClosedAccounts={() =>\n savePrefs({\n 'ui.showClosedAccounts': !prefs['ui.showClosedAccounts']\n })\n }\n style={[{ flex: 1 }, styles.darkScrollbar]}\n />\n );\n}\n\nexport default withRouter(\n connect(\n state => ({\n accounts: state.queries.accounts,\n failedAccounts: state.account.failedAccounts,\n updatedAccounts: state.queries.updatedAccounts,\n prefs: state.prefs.local,\n floatingSidebar: state.prefs.global.floatingSidebar\n }),\n dispatch => bindActionCreators(actions, dispatch)\n )(SidebarWithData)\n);\n","import React, { useState, useEffect, useContext } from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport mitt from 'mitt';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View } from 'loot-design/src/components/common';\nimport { SIDEBAR_WIDTH } from 'loot-design/src/components/sidebar';\nimport { colors } from 'loot-design/src/style';\n\nimport SidebarWithData from './SidebarWithData';\n\nconst SidebarContext = React.createContext(null);\n\nexport function SidebarProvider({ children }) {\n let emitter = mitt();\n return (\n <SidebarContext.Provider\n value={{\n show: () => emitter.emit('show'),\n hide: () => emitter.emit('hide'),\n on: (name, listener) => {\n emitter.on(name, listener);\n return () => emitter.off(name, listener);\n }\n }}\n >\n {children}\n </SidebarContext.Provider>\n );\n}\n\nexport function useSidebar() {\n return useContext(SidebarContext);\n}\n\nfunction Sidebar({ floatingSidebar }) {\n let [hidden, setHidden] = useState(true);\n let sidebar = useSidebar();\n\n if (!floatingSidebar && hidden) {\n setHidden(false);\n }\n\n useEffect(() => {\n let cleanups = [\n sidebar.on('show', () => setHidden(false)),\n sidebar.on('hide', () => setHidden(true))\n ];\n return () => {\n cleanups.forEach(fn => fn());\n };\n }, [sidebar]);\n\n return (\n <>\n {floatingSidebar && (\n <View\n onMouseOver={() => setHidden(false)}\n onMouseLeave={() => setHidden(true)}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: hidden ? 0 : 160,\n zIndex: 999\n }}\n ></View>\n )}\n\n <View\n onMouseOver={\n floatingSidebar\n ? e => {\n e.stopPropagation();\n setHidden(false);\n }\n : null\n }\n onMouseLeave={floatingSidebar ? () => setHidden(true) : null}\n style={{\n position: 'absolute',\n top: 50,\n // If not floating, the -50 takes into account the transform below\n bottom: floatingSidebar ? 50 : -50,\n zIndex: 1001,\n borderRadius: '0 6px 6px 0',\n overflow: 'hidden',\n boxShadow:\n !floatingSidebar || hidden\n ? 'none'\n : '0 15px 30px 0 rgba(0,0,0,0.25), 0 3px 15px 0 rgba(0,0,0,.5)',\n transform: `translateY(${!floatingSidebar ? -50 : 0}px)\n translateX(${hidden ? -SIDEBAR_WIDTH : 0}px)`,\n transition: 'transform .5s, box-shadow .5s'\n }}\n >\n <SidebarWithData />\n </View>\n\n <View\n style={[\n {\n backgroundColor: colors.n1,\n opacity: floatingSidebar ? 0 : 1,\n transform: `translateX(${floatingSidebar ? -50 : 0}px)`,\n transition: 'transform .4s, opacity .2s',\n width: SIDEBAR_WIDTH\n },\n floatingSidebar && {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0\n }\n ]}\n ></View>\n </>\n );\n}\n\nexport default withRouter(\n connect(\n state => ({ floatingSidebar: state.prefs.global.floatingSidebar }),\n actions\n )(Sidebar)\n);\n","import React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n useContext\n} from 'react';\nimport { Switch, Route, withRouter } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport * as queries from 'loot-core/src/client/queries';\nimport { listen } from 'loot-core/src/platform/client/fetch';\nimport Platform from 'loot-core/src/client/platform';\nimport { colors } from 'loot-design/src/style';\nimport {\n View,\n Text,\n ButtonLink,\n Button,\n ButtonWithLoading,\n Tooltip,\n P\n} from 'loot-design/src/components/common';\nimport SheetValue from 'loot-design/src/components/spreadsheet/SheetValue';\nimport { MonthCountSelector } from './budget/MonthCountSelector';\nimport ArrowButtonRight1 from 'loot-design/src/svg/v2/ArrowButtonRight1';\nimport NavigationMenu from 'loot-design/src/svg/v2/NavigationMenu';\nimport ArrowLeft from 'loot-design/src/svg/v1/ArrowLeft';\nimport AlertTriangle from 'loot-design/src/svg/v2/AlertTriangle';\nimport AccountSyncCheck from './accounts/AccountSyncCheck';\nimport LoggedInUser from './LoggedInUser';\nimport AnimatedRefresh from './AnimatedRefresh';\nimport { useSidebar } from './FloatableSidebar';\n\nexport let TitlebarContext = React.createContext();\n\nexport function TitlebarProvider({ children }) {\n let listeners = useRef([]);\n\n function sendEvent(msg) {\n listeners.current.forEach(func => func(msg));\n }\n\n function subscribe(listener) {\n listeners.current.push(listener);\n return () =>\n (listeners.current = listeners.current.filter(func => func !== listener));\n }\n\n return (\n <TitlebarContext.Provider\n value={{ sendEvent, subscribe }}\n children={children}\n />\n );\n}\n\nexport function UncategorizedButton() {\n return (\n <SheetValue binding={queries.uncategorizedCount()}>\n {node => {\n const num = node.value;\n return (\n num !== 0 && (\n <ButtonLink\n bare\n to=\"/accounts/uncategorized\"\n style={{ color: colors.r5 }}\n >\n {num} uncategorized {num === 1 ? 'transaction' : 'transactions'}\n </ButtonLink>\n )\n );\n }}\n </SheetValue>\n );\n}\n\nfunction SyncButton({ localPrefs, style, onSync }) {\n let [syncing, setSyncing] = useState(false);\n let [syncState, setSyncState] = useState(null);\n\n useEffect(() => {\n let unlisten = listen('sync-event', ({ type, subtype, syncDisabled }) => {\n if (type === 'start') {\n setSyncing(true);\n setSyncState(null);\n } else {\n // Give the layout some time to apply the starting animation\n // so we always finish it correctly even if it's almost\n // instant\n setTimeout(() => {\n setSyncing(false);\n }, 20);\n }\n\n if (type === 'error') {\n // Use the offline state if either there is a network error or\n // if this file isn't a \"cloud file\". You can't sync a local\n // file.\n if (subtype === 'network') {\n setSyncState('offline');\n } else if (!localPrefs.cloudFileId) {\n setSyncState('local');\n } else {\n setSyncState('error');\n }\n } else if (type === 'success') {\n setSyncState(syncDisabled ? 'disabled' : null);\n }\n });\n\n return unlisten;\n }, []);\n\n return (\n <Button\n bare\n style={[\n style,\n {\n WebkitAppRegion: 'none',\n color:\n syncState === 'error'\n ? colors.r4\n : syncState === 'disabled' ||\n syncState === 'offline' ||\n syncState === 'local'\n ? colors.n6\n : null\n }\n ]}\n onClick={onSync}\n >\n {syncState === 'error' ? (\n <AlertTriangle width={13} style={{ color: 'currentColor' }} />\n ) : (\n <AnimatedRefresh animating={syncing} />\n )}\n <Text style={{ marginLeft: 3 }}>\n {syncState === 'disabled'\n ? 'Disabled'\n : syncState === 'offline'\n ? 'Offline'\n : 'Sync'}\n </Text>\n </Button>\n );\n}\n\nfunction BudgetTitlebar({ globalPrefs, saveGlobalPrefs, localPrefs }) {\n let { sendEvent } = useContext(TitlebarContext);\n let [loading, setLoading] = useState(false);\n let [showTooltip, setShowTooltip] = useState(false);\n\n let reportBudgetEnabled = localPrefs['flags.reportBudget'];\n\n function onSwitchType() {\n setLoading(true);\n if (!loading) {\n sendEvent('budget/switch-type');\n }\n }\n\n useEffect(() => {\n setLoading(false);\n }, [localPrefs.budgetType]);\n\n let { budgetType } = localPrefs;\n\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <MonthCountSelector\n maxMonths={globalPrefs.maxMonths || 1}\n onChange={value => saveGlobalPrefs({ maxMonths: value })}\n />\n {reportBudgetEnabled && (\n <View style={{ marginLeft: -5 }}>\n <Button\n bare\n loading={loading}\n style={{\n alignSelf: 'flex-start',\n padding: '4px 7px'\n }}\n title=\"Learn more about budgeting\"\n onClick={() => setShowTooltip(true)}\n >\n {budgetType === 'report' ? 'Report budget' : 'Rollover budget'}\n </Button>\n {showTooltip && (\n <Tooltip\n position=\"bottom-left\"\n onClose={() => setShowTooltip(false)}\n style={{\n padding: 10,\n maxWidth: 400\n }}\n >\n <P>\n You are currently using a{' '}\n <Text style={{ fontWeight: 600 }}>\n {budgetType === 'report'\n ? 'Report budget'\n : 'Rollover budget'}\n .\n </Text>{' '}\n Switching will not lose any data and you can always switch back.\n </P>\n <P>\n <ButtonWithLoading\n primary\n loading={loading}\n onClick={onSwitchType}\n >\n Switch to a{' '}\n {budgetType === 'report'\n ? 'Rollover budget'\n : 'Report budget'}\n </ButtonWithLoading>\n </P>\n <P isLast={true}>\n <a // eslint-disable-line\n href=\"#\"\n style={{\n color: colors.n4,\n fontStyle: 'italic'\n }}\n >\n How do these types of budgeting work?\n </a>\n </P>\n </Tooltip>\n )}\n </View>\n )}\n </View>\n );\n}\n\nfunction Titlebar({\n location,\n globalPrefs,\n saveGlobalPrefs,\n localPrefs,\n userData,\n floatingSidebar,\n syncError,\n setAppState,\n style,\n sync\n}) {\n let sidebar = useSidebar();\n\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 15px',\n height: 36,\n pointerEvents: 'none',\n '& *': {\n pointerEvents: 'auto'\n }\n },\n !Platform.isBrowser &&\n Platform.OS === 'mac' &&\n floatingSidebar && { paddingLeft: 80 },\n style\n ]}\n >\n {floatingSidebar && (\n <Button\n bare\n style={{\n marginRight: 8,\n '& .arrow-right': { opacity: 0, transition: 'opacity .3s' },\n '& .menu': { opacity: 1, transition: 'opacity .3s' },\n '&:hover .arrow-right': { opacity: 1 },\n '&:hover .menu': { opacity: 0 }\n }}\n onMouseEnter={() => sidebar.show()}\n onMouseLeave={() => sidebar.hide()}\n onClick={() => {\n saveGlobalPrefs({ floatingSidebar: !floatingSidebar });\n }}\n >\n <View style={{ width: 15, height: 15 }}>\n <ArrowButtonRight1\n className=\"arrow-right\"\n style={{\n width: 13,\n height: 13,\n color: colors.n5,\n position: 'absolute',\n top: 1,\n left: 1\n }}\n />\n <NavigationMenu\n className=\"menu\"\n style={{\n width: 15,\n height: 15,\n color: colors.n5,\n position: 'absolute',\n top: 0,\n left: 0\n }}\n />\n </View>\n </Button>\n )}\n\n <Switch>\n <Route\n path=\"/accounts\"\n exact\n children={props => {\n let state = props.location.state || {};\n return state.goBack ? (\n <Button onClick={() => props.history.goBack()} bare>\n <ArrowLeft\n width={10}\n height={10}\n style={{ marginRight: 5, color: 'currentColor' }}\n />{' '}\n Back\n </Button>\n ) : null;\n }}\n />\n\n <Route\n path=\"/accounts/:id\"\n exact\n children={props => {\n return (\n props.match && <AccountSyncCheck id={props.match.params.id} />\n );\n }}\n />\n\n <Route\n path=\"/budget\"\n exact\n children={() => (\n <BudgetTitlebar\n globalPrefs={globalPrefs}\n saveGlobalPrefs={saveGlobalPrefs}\n localPrefs={localPrefs}\n />\n )}\n />\n </Switch>\n <View style={{ flex: 1 }} />\n <UncategorizedButton />\n <SyncButton\n style={{ marginLeft: 10 }}\n localPrefs={localPrefs}\n onSync={sync}\n />\n <LoggedInUser style={{ marginLeft: 10 }} />\n </View>\n );\n}\n\nexport default withRouter(\n connect(\n state => ({\n globalPrefs: state.prefs.global,\n localPrefs: state.prefs.local,\n userData: state.user.data,\n floatingSidebar: state.prefs.global.floatingSidebar\n }),\n actions\n )(Titlebar)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass TutorialPoint extends React.Component {\n static contextTypes = {\n setTutorialNode: PropTypes.func\n };\n\n ref = el => {\n if (this.context.setTutorialNode) {\n this.context.setTutorialNode(this.props.name, el, this.props.expand);\n }\n };\n\n render() {\n return <div ref={this.ref} />;\n }\n}\n\nexport default TutorialPoint;\n","import React from 'react';\n\nconst SvgPencil1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M15.067 3.986a.5.5 0 0 0-.354-.148.5.5 0 0 0-.354.147L3.437 14.91a.5.5 0 0 0 0 .707l4.948 4.948a.5.5 0 0 0 .707 0L20.009 9.648a.5.5 0 0 0 0-.706zM2.43 16.8a.5.5 0 0 0-.489-.127.5.5 0 0 0-.351.364L.084 23.314a.5.5 0 0 0 .133.47.507.507 0 0 0 .47.132l6.272-1.5a.5.5 0 0 0 .237-.84zM23.2 2.924L21.077.8a2.5 2.5 0 0 0-3.532 0l-1.418 1.417a.5.5 0 0 0 0 .707l4.95 4.949a.5.5 0 0 0 .707 0L23.2 6.454a2.5 2.5 0 0 0 0-3.53z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgPencil1;\n","import React from 'react';\n\nconst SvgSearchAlternate = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M23.384 21.619l-6.529-6.529a9.284 9.284 0 1 0-1.768 1.768l6.529 6.529a1.266 1.266 0 0 0 1.768 0 1.251 1.251 0 0 0 0-1.768zM2.75 9.5a6.75 6.75 0 1 1 6.75 6.75A6.758 6.758 0 0 1 2.75 9.5z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgSearchAlternate;\n","import React from 'react';\n\nconst SvgDownloadThickBottom = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M8.616 1.741A1.455 1.455 0 0 1 10.07.287h3.392a1.455 1.455 0 0 1 1.453 1.454v8.228a.25.25 0 0 0 .25.25h2.9a1.138 1.138 0 0 1 .827 2l-6.1 6.1a1.489 1.489 0 0 1-2.056 0l-6.1-6.1a1.137 1.137 0 0 1 .827-2h2.9a.249.249 0 0 0 .25-.25z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M0 19.677a4.039 4.039 0 0 0 4.035 4.035h15.93A4.039 4.039 0 0 0 24 19.677V17.8a1.225 1.225 0 0 0-2.449 0v1.874a1.588 1.588 0 0 1-1.586 1.586H4.035a1.588 1.588 0 0 1-1.586-1.586V17.8A1.225 1.225 0 0 0 0 17.8z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgDownloadThickBottom;\n","import React from 'react';\n\nconst SvgCheveronDown = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCheveronDown;\n","import React from 'react';\n\nconst SvgCheckCircle1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M12 0a12 12 0 1 0 12 12A12.014 12.014 0 0 0 12 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 0 1-1.43.188l-4.888-3.908a1 1 0 1 1 1.25-1.562l4.076 3.261 6.227-8.451a1 1 0 1 1 1.61 1.183z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCheckCircle1;\n","import React from 'react';\n\nconst SvgArrowsExpand3 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M19.611 2.571h-3.754a1.286 1.286 0 1 1 0-2.571h6.857A1.286 1.286 0 0 1 24 1.286v6.857a1.286 1.286 0 0 1-2.571 0V4.39L15.48 10.34a1.286 1.286 0 0 1-1.817-1.817l5.948-5.95zM1.286 14.571a1.286 1.286 0 0 1 1.285 1.286v3.754l5.949-5.946a1.286 1.286 0 0 1 1.817 1.817L4.39 21.429h3.753a1.285 1.285 0 1 1 0 2.571H1.286A1.286 1.286 0 0 1 0 22.714v-6.857a1.286 1.286 0 0 1 1.286-1.286z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowsExpand3;\n","import React from 'react';\n\nconst SvgArrowsShrink3 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M14.143 1.714A1.286 1.286 0 0 1 15.429 3v3.753L21.806.377a1.286 1.286 0 0 1 1.817 1.817l-6.376 6.377H21a1.286 1.286 0 1 1 0 2.572h-6.857a1.286 1.286 0 0 1-1.286-1.286V3a1.286 1.286 0 0 1 1.286-1.286zM9.857 22.286A1.285 1.285 0 0 1 8.571 21v-3.753l-6.377 6.376a1.286 1.286 0 0 1-1.817-1.817l6.376-6.377H3a1.286 1.286 0 0 1 0-2.572h6.857a1.286 1.286 0 0 1 1.286 1.286V21a1.286 1.286 0 0 1-1.286 1.286z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowsShrink3;\n","import React, { useState, useContext, useMemo, useEffect } from 'react';\nimport { runQuery, liveQuery, LiveQuery, PagedQuery } from './query-helpers';\n\nfunction makeContext(queryState, opts, QueryClass) {\n let query = new QueryClass(queryState, null, opts);\n let Context = React.createContext(null);\n\n function Provider({ children }) {\n let [data, setData] = useState(query.getData());\n let value = useMemo(() => ({ data, query }), [data, query]);\n\n useEffect(() => {\n if (query.getNumListeners() !== 0) {\n throw new Error(\n 'Query already has listeners. You cannot use the same query context `Provider` twice'\n );\n }\n\n let unlisten = query.addListener(data => setData(data));\n\n // Start the query if it hasn't run yet. Most likely it's not\n // running, however the user can freely start the query early if\n // they want\n if (!query.isRunning()) {\n query.run();\n }\n\n // There's a small chance data has changed between rendering and\n // running this effect, so just in case set this again. Note\n // this won't rerender if the data is the same\n setData(query.getData());\n\n return () => {\n unlisten();\n query.unsubscribe();\n };\n }, []);\n\n return <Context.Provider value={value} children={children} />;\n }\n\n function useQuery() {\n let queryData = useContext(Context);\n if (queryData == null) {\n throw new Error(\n \"`useQuery` tried to access a query that hasn't been run. You need to put its `Provider` in a parent component\"\n );\n }\n return queryData;\n }\n\n return {\n Provider,\n useQuery\n };\n}\n\nexport function queryContext(queryState, opts) {\n let Context = React.createContext(null);\n\n function Provider({ children }) {\n let [data, setData] = useState(null);\n let value = useMemo(() => ({ data }), [data]);\n\n useEffect(() => {\n async function run() {\n let { data } = await runQuery(queryState, opts);\n setData(data);\n }\n run();\n }, []);\n\n return <Context.Provider value={value} children={children} />;\n }\n\n function useQuery() {\n return useContext(Context);\n }\n\n return {\n Provider,\n useQuery\n };\n}\n\nexport function liveQueryContext(query, opts) {\n return makeContext(query, opts, LiveQuery);\n}\n\nexport function pagedQueryContext(query, opts) {\n return makeContext(query, opts, PagedQuery);\n}\n\nexport function useLiveQuery(query, opts) {\n let [data, setData] = useState(null);\n\n useEffect(() => {\n let live = liveQuery(\n query,\n async data => {\n if (live) {\n setData(data);\n }\n },\n opts\n );\n\n return () => {\n live.unsubscribe();\n live = null;\n };\n }, [query]);\n\n return { data };\n}\n\nfunction usePagedQuery(query) {\n // TODO\n}\n","import { last, diffItems, getChangedValues, applyChanges } from './util';\nconst uuid = require('../platform/uuid');\n\n// The amount might be null when adding a new transaction\nfunction num(n) {\n return typeof n === 'number' ? n : 0;\n}\n\nfunction SplitTransactionError(total, parent) {\n let difference = num(parent.amount) - total;\n\n return {\n type: 'SplitTransactionError',\n version: 1,\n difference\n };\n}\n\nexport function makeChild(parent, data) {\n let prefix = parent.id === 'temp' ? 'temp' : '';\n\n return {\n amount: 0,\n ...data,\n payee: data.payee || parent.payee,\n id: data.id ? data.id : prefix + uuid.v4Sync(),\n account: parent.account,\n date: parent.date,\n cleared: parent.cleared != null ? parent.cleared : null,\n starting_balance_flag:\n parent.starting_balance_flag != null\n ? parent.starting_balance_flag\n : null,\n is_child: true,\n parent_id: parent.id,\n error: null\n };\n}\n\nexport function recalculateSplit(trans) {\n // Calculate the new total of split transactions and make sure\n // that it equals the parent amount\n const total = trans.subtransactions.reduce(\n (acc, t) => acc + num(t.amount),\n 0\n );\n return {\n ...trans,\n error:\n total === num(trans.amount) ? null : SplitTransactionError(total, trans)\n };\n}\n\nexport function findParentIndex(transactions, idx) {\n // This relies on transactions being sorted in a way where parents\n // are always before children, which is enforced in the db layer.\n // Walk backwards and find the last parent;\n while (idx >= 0) {\n let trans = transactions[idx];\n if (trans.is_parent) {\n return idx;\n }\n idx--;\n }\n return null;\n}\n\nexport function getSplit(transactions, parentIndex) {\n let split = [transactions[parentIndex]];\n let curr = parentIndex + 1;\n while (curr < transactions.length && transactions[curr].is_child) {\n split.push(transactions[curr]);\n curr++;\n }\n return split;\n}\n\nexport function ungroupTransactions(transactions) {\n let x = transactions.reduce((list, parent) => {\n let { subtransactions, ...trans } = parent;\n subtransactions = subtransactions || [];\n\n list.push(trans);\n\n for (let i = 0; i < subtransactions.length; i++) {\n list.push(subtransactions[i]);\n }\n return list;\n }, []);\n return x;\n}\n\nexport function groupTransaction(split) {\n return { ...split[0], subtransactions: split.slice(1) };\n}\n\nexport function ungroupTransaction(split) {\n if (split == null) {\n return null;\n }\n return ungroupTransactions([split]);\n}\n\nexport function applyTransactionDiff(groupedTrans, diff) {\n return groupTransaction(applyChanges(diff, ungroupTransaction(groupedTrans)));\n}\n\nexport function replaceTransactions(transactions, id, func) {\n let idx = transactions.findIndex(t => t.id === id);\n let trans = transactions[idx];\n let transactionsCopy = [...transactions];\n\n if (idx === -1) {\n throw new Error('Tried to edit unknown transaction id: ' + id);\n }\n\n if (trans.is_parent || trans.is_child) {\n let parentIndex = findParentIndex(transactions, idx);\n if (parentIndex == null) {\n console.log('Cannot find parent index');\n return { diff: { deleted: [], updated: [] } };\n }\n\n let split = getSplit(transactions, parentIndex);\n let grouped = func(groupTransaction(split));\n let newSplit = ungroupTransaction(grouped);\n\n let diff;\n if (newSplit == null) {\n // If everything was deleted, just delete the parent which will\n // delete everything\n diff = { deleted: [{ id: split[0].id }], updated: [] };\n grouped = { id: split[0].id, _deleted: true };\n transactionsCopy.splice(parentIndex, split.length);\n } else {\n diff = diffItems(split, newSplit);\n transactionsCopy.splice(parentIndex, split.length, ...newSplit);\n }\n\n return { data: transactionsCopy, newTransaction: grouped, diff };\n } else {\n let grouped = func(trans);\n let newTrans = ungroupTransaction(grouped) || [];\n if (grouped) {\n grouped.subtransactions = grouped.subtransactions || [];\n }\n transactionsCopy.splice(idx, 1, ...newTrans);\n\n return {\n data: transactionsCopy,\n newTransaction: grouped || { id: trans.id, _deleted: true },\n diff: diffItems([trans], newTrans)\n };\n }\n}\n\nexport function addSplitTransaction(transactions, id) {\n return replaceTransactions(transactions, id, trans => {\n if (!trans.is_parent) {\n return trans;\n }\n let prevSub = last(trans.subtransactions);\n trans.subtransactions.push(\n makeChild(trans, {\n amount: 0,\n sort_order: num(prevSub && prevSub.sort_order) - 1\n })\n );\n return trans;\n });\n}\n\nexport function updateTransaction(transactions, transaction) {\n return replaceTransactions(transactions, transaction.id, trans => {\n if (trans.is_parent) {\n let parent = trans.id === transaction.id ? transaction : trans;\n let sub = trans.subtransactions.map(t => {\n // Make sure to update the children to reflect the updated\n // properties (if the parent updated)\n\n let child = t;\n if (trans.id === transaction.id) {\n child = {\n ...t,\n payee: t.payee === trans.payee ? transaction.payee : t.payee\n };\n } else if (t.id === transaction.id) {\n child = transaction;\n }\n\n return makeChild(parent, child);\n });\n\n return recalculateSplit({ ...parent, subtransactions: sub });\n } else {\n return transaction;\n }\n });\n}\n\nexport function deleteTransaction(transactions, id) {\n return replaceTransactions(transactions, id, trans => {\n if (trans.is_parent) {\n if (trans.id === id) {\n return null;\n } else if (trans.subtransactions.length === 1) {\n return {\n ...trans,\n subtransactions: null,\n is_parent: false,\n error: null\n };\n } else {\n let sub = trans.subtransactions.filter(t => t.id !== id);\n return recalculateSplit({ ...trans, subtransactions: sub });\n }\n } else {\n return null;\n }\n });\n}\n\nexport function splitTransaction(transactions, id) {\n return replaceTransactions(transactions, id, trans => {\n if (trans.is_parent || trans.is_child) {\n return trans;\n }\n\n return {\n ...trans,\n is_parent: true,\n error: num(trans.amount) === 0 ? null : SplitTransactionError(0, trans),\n subtransactions: [makeChild(trans, { amount: 0, sort_order: -1 })]\n };\n });\n}\n\nexport function realizeTempTransactions(transactions) {\n let parent = transactions.find(t => !t.is_child);\n parent = { ...parent, id: uuid.v4Sync() };\n\n let children = transactions.filter(t => t.is_child);\n return [\n parent,\n ...children.map(child => ({\n ...child,\n id: uuid.v4Sync(),\n parent_id: parent.id\n }))\n ];\n}\n","import React from 'react';\n\nconst SvgRemove = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M.439 21.44a1.5 1.5 0 0 0 2.122 2.121l9.262-9.261a.25.25 0 0 1 .354 0l9.262 9.263a1.5 1.5 0 1 0 2.122-2.121L14.3 12.177a.25.25 0 0 1 0-.354l9.263-9.262A1.5 1.5 0 0 0 21.439.44L12.177 9.7a.25.25 0 0 1-.354 0L2.561.44A1.5 1.5 0 0 0 .439 2.561L9.7 11.823a.25.25 0 0 1 0 .354z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgRemove;\n","import React, { useState, useRef, useEffect } from 'react';\nimport lively from '@jlongster/lively';\nimport Downshift from 'downshift';\nimport { css } from 'glamor';\nimport { colors } from '../style';\nimport Remove from '../svg/v2/Remove';\nimport { View, Input, Tooltip, Button } from './common';\n\nfunction findItem(strict, suggestions, value) {\n if (strict) {\n let idx = suggestions.findIndex(item => item.id === value);\n return idx === -1 ? null : suggestions[idx];\n }\n\n return value;\n}\n\nfunction getItemName(item) {\n if (item == null) {\n return '';\n } else if (typeof item === 'string') {\n return item;\n }\n return item.name || '';\n}\n\nfunction getItemId(item) {\n if (typeof item === 'string') {\n return item;\n }\n return item ? item.id : null;\n}\n\nfunction getInitialState({\n props: {\n value,\n suggestions,\n embedded,\n isOpen = false,\n strict,\n initialFilterSuggestions\n }\n}) {\n let selectedItem = findItem(strict, suggestions, value);\n let filteredSuggestions = initialFilterSuggestions\n ? initialFilterSuggestions(suggestions, value)\n : null;\n\n return {\n selectedItem,\n value: selectedItem ? getItemName(selectedItem) : '',\n originalItem: selectedItem,\n filteredSuggestions,\n highlightedIndex: null,\n isOpen: embedded || isOpen\n };\n}\n\nfunction componentWillReceiveProps(bag, nextProps) {\n let {\n strict,\n suggestions,\n filterSuggestions = defaultFilterSuggestions,\n initialFilterSuggestions,\n value,\n itemToString = defaultItemToString\n } = nextProps;\n let { value: currValue } = bag.state;\n let updates = null;\n\n function updateValue() {\n let selectedItem = findItem(strict, suggestions, value);\n if (selectedItem) {\n updates = updates || {};\n updates.value = itemToString(selectedItem);\n updates.selectedItem = selectedItem;\n }\n }\n\n if (bag.props.value !== value) {\n updateValue();\n }\n\n // TODO: Something is causing a rerender immediately after first\n // render, and this condition is true, causing items to be filtered\n // twice. This shouldn't effect functionality (I think), but look\n // into this later\n if (bag.props.suggestions !== suggestions) {\n let filteredSuggestions = null;\n\n if (bag.state.highlightedIndex != null) {\n filteredSuggestions = filterSuggestions(suggestions, currValue);\n } else {\n filteredSuggestions = initialFilterSuggestions\n ? initialFilterSuggestions(suggestions, currValue)\n : null;\n }\n\n updates = updates || {};\n updateValue();\n updates.filteredSuggestions = filteredSuggestions;\n }\n\n return updates;\n}\n\nexport function defaultFilterSuggestion(suggestion, value) {\n return getItemName(suggestion)\n .toLowerCase()\n .includes(value.toLowerCase());\n}\n\nexport function defaultFilterSuggestions(suggestions, value) {\n return suggestions.filter(suggestion =>\n defaultFilterSuggestion(suggestion, value)\n );\n}\n\nfunction fireUpdate(onUpdate, strict, suggestions, index, value) {\n // If the index is null, look up the id in the suggestions. If the\n // value is empty it will select nothing (as expected). If it's not\n // empty but nothing is selected, it still resolves to an id. It\n // would very confusing otherwise: the menu could be in a state\n // where nothing is highlighted but there is a valid value.\n\n let selected = null;\n if (!strict) {\n selected = value;\n } else {\n if (index == null) {\n // If passing in a value directly, validate the id\n let sug = suggestions.find(sug => sug.id === value);\n if (sug) {\n selected = sug.id;\n }\n } else if (index < suggestions.length) {\n selected = suggestions[index].id;\n }\n }\n\n onUpdate && onUpdate(selected);\n}\n\nfunction onInputValueChange(\n {\n props: {\n suggestions,\n onUpdate,\n multi,\n highlightFirst,\n strict,\n filterSuggestions = defaultFilterSuggestions,\n getHighlightedIndex\n },\n state: { isOpen }\n },\n value,\n changes\n) {\n // OMG this is the dumbest thing ever. I need to remove Downshift\n // and build my own component. For some reason this is fired on blur\n // with an empty value which clears out the input when the app blurs\n if (!document.hasFocus()) {\n return;\n }\n\n // Do nothing if it's simply updating the selected item\n if (\n changes.type ===\n Downshift.stateChangeTypes.controlledPropUpdatedSelectedItem\n ) {\n return;\n }\n\n // Otherwise, filter the items and always the first item if\n // desired\n const filteredSuggestions = filterSuggestions(suggestions, value);\n\n if (value === '') {\n // A blank value shouldn't highlight any item so that the field\n // can be left blank if desired\n\n if (changes.type !== Downshift.stateChangeTypes.clickItem) {\n fireUpdate(onUpdate, strict, filteredSuggestions, null, null);\n }\n\n return {\n value,\n filteredSuggestions,\n highlightedIndex: null\n };\n } else {\n let defaultGetHighlightedIndex = filteredSuggestions => {\n return highlightFirst && filteredSuggestions.length ? 0 : null;\n };\n let highlightedIndex = (getHighlightedIndex || defaultGetHighlightedIndex)(\n filteredSuggestions\n );\n\n if (changes.type !== Downshift.stateChangeTypes.clickItem) {\n fireUpdate(\n onUpdate,\n strict,\n filteredSuggestions,\n highlightedIndex,\n value\n );\n }\n\n return {\n value,\n filteredSuggestions,\n highlightedIndex\n };\n }\n}\n\nfunction onStateChange({ props, state, inst }, changes, stateAndHelpers) {\n if (\n props.tableBehavior &&\n changes.type === Downshift.stateChangeTypes.mouseUp\n ) {\n return;\n }\n\n const newState = {};\n if ('highlightedIndex' in changes) {\n newState.highlightedIndex = changes.highlightedIndex;\n }\n if ('isOpen' in changes) {\n newState.isOpen = props.embedded ? true : changes.isOpen;\n }\n if ('selectedItem' in changes) {\n newState.selectedItem = changes.selectedItem;\n }\n\n // We only ever want to update the value if the user explicitly\n // highlighted an item via the keyboard. It shouldn't change with\n // mouseover; otherwise the user could accidentally hover over an\n // item without realizing it and change the value.\n if (\n state.isOpen &&\n (changes.type === Downshift.stateChangeTypes.keyDownArrowUp ||\n changes.type === Downshift.stateChangeTypes.keyDownArrowDown)\n ) {\n fireUpdate(\n props.onUpdate,\n props.strict,\n state.filteredSuggestions || props.suggestions,\n newState.highlightedIndex != null\n ? newState.highlightedIndex\n : state.highlightedIndex,\n state.value\n );\n }\n\n inst.lastChangeType = changes.type;\n return newState;\n}\n\nfunction onSelect(\n { props: { onSelect, clearAfterSelect, suggestions }, inst },\n item\n) {\n if (onSelect) {\n // I AM NOT PROUD OF THIS OK??\n // This WHOLE FILE is a mess anyway\n // OK SIT DOWN AND I WILL EXPLAIN\n // This component uses `componentWillReceiveProps` and in there\n // it will re-filter suggestions if the suggestions change and\n // a `highlightedIndex` exists. When we select something,\n // we clear `highlightedIndex` so it should show all suggestions\n // again. HOWEVER, in the case of a multi-autocomplete, it's\n // changing the suggestions every time something is selected.\n // In that case, cWRP is running *before* our state setting that\n // cleared `highlightedIndex`. Forcing this to run later assures\n // us that we will clear out local state before cWRP runs.\n // YEAH THAT'S ALL OK I JUST WANT TO SHIP THIS\n setTimeout(() => {\n onSelect(getItemId(item));\n }, 0);\n }\n return onSelectAfter(suggestions, clearAfterSelect, inst);\n}\n\nfunction onSelectAfter(suggestions, clearAfterSelect, inst) {\n if (clearAfterSelect) {\n return {\n value: '',\n selectedItem: null,\n highlightedIndex: null,\n filteredSuggestions: suggestions\n };\n } else if (inst.input) {\n inst.input.setSelectionRange(0, 10000);\n }\n}\n\nfunction onChange({ props: { inputProps } }, e) {\n const { onChange } = inputProps || {};\n onChange && onChange(e.target.value);\n}\n\nfunction onKeyDown(\n {\n props: {\n suggestions,\n clearAfterSelect,\n initialFilterSuggestions,\n embedded,\n onUpdate,\n onSelect,\n inputProps,\n shouldSaveFromKey = defaultShouldSaveFromKey,\n strict\n },\n state: {\n selectedItem,\n filteredSuggestions,\n highlightedIndex,\n originalItem,\n isNulled,\n isOpen,\n value\n },\n inst\n },\n e\n) {\n let ENTER = 13;\n let ESC = 27;\n let { onKeyDown } = inputProps || {};\n\n // If the dropdown is open, an item is highlighted, and the user\n // pressed enter, always capture that and handle it ourselves\n if (isOpen) {\n if (e.keyCode === ENTER) {\n if (highlightedIndex != null) {\n if (inst.lastChangeType === Downshift.stateChangeTypes.itemMouseEnter) {\n // If the last thing the user did was hover an item, intentionally\n // ignore the default behavior of selecting the item. It's too\n // common to accidentally hover an item and then save it\n e.preventDefault();\n } else {\n // Otherwise, stop propagation so that the table navigator\n // doesn't handle it\n e.stopPropagation();\n }\n } else if (!strict) {\n // Handle it ourselves\n e.stopPropagation();\n onSelect(value);\n return onSelectAfter(suggestions, clearAfterSelect, inst);\n } else {\n // No highlighted item, still allow the table to save the item\n // as `null`, even though we're allowing the table to move\n e.preventDefault();\n onKeyDown && onKeyDown(e);\n }\n } else if (shouldSaveFromKey(e)) {\n e.preventDefault();\n onKeyDown && onKeyDown(e);\n }\n }\n\n // Handle escape ourselves\n if (e.keyCode === ESC) {\n e.preventDefault();\n\n if (!embedded) {\n e.stopPropagation();\n }\n\n let filteredSuggestions = initialFilterSuggestions\n ? initialFilterSuggestions(suggestions, getItemName(originalItem))\n : null;\n fireUpdate(onUpdate, strict, suggestions, null, getItemId(originalItem));\n return {\n value: getItemName(originalItem),\n selectedItem: findItem(strict, suggestions, originalItem),\n filteredSuggestions,\n highlightedIndex: null,\n isOpen: embedded ? true : false\n };\n }\n}\n\nfunction defaultRenderInput(props) {\n return <Input {...props} />;\n}\n\nfunction defaultRenderItems(items, getItemProps, highlightedIndex) {\n return (\n <div>\n {items.map((item, index) => {\n let name = getItemName(item);\n return (\n <div\n {...getItemProps({ item })}\n key={name}\n {...css({\n padding: 5,\n cursor: 'default',\n backgroundColor: highlightedIndex === index ? colors.n4 : null\n })}\n >\n {name}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction defaultShouldSaveFromKey(e) {\n // Enter\n return e.keyCode === 13;\n}\n\nfunction onFocus({ inst, props: { inputProps = {}, openOnFocus = true } }, e) {\n inputProps.onFocus && inputProps.onFocus(e);\n\n if (openOnFocus) {\n return { isOpen: true };\n }\n}\n\nfunction onBlur({ inst, props, state: { selectedItem } }, e) {\n let { inputProps = {}, onSelect } = props;\n\n e.preventDownshiftDefault = true;\n inputProps.onBlur && inputProps.onBlur(e);\n\n if (!props.tableBehavior) {\n if (e.target.value === '') {\n onSelect && onSelect(null);\n return { selectedItem: null, originalValue: null, isOpen: false };\n }\n\n // If not using table behavior, reset the input on blur. Tables\n // handle saving the value on blur.\n let value = selectedItem ? getItemId(selectedItem) : null;\n\n return getInitialState({\n props: {\n ...props,\n value,\n originalValue: value\n }\n });\n } else {\n return { isOpen: false };\n }\n}\n\nfunction defaultItemToString(item) {\n return item ? getItemName(item) : '';\n}\n\nfunction _SingleAutocomplete({\n props: {\n focused,\n embedded,\n containerProps,\n inputProps,\n children,\n suggestions,\n tooltipStyle,\n onItemClick,\n strict,\n tooltipProps,\n renderInput = defaultRenderInput,\n renderItems = defaultRenderItems,\n itemToString = defaultItemToString\n },\n state: { value, selectedItem, filteredSuggestions, highlightedIndex, isOpen },\n updater,\n inst\n}) {\n const filtered = filteredSuggestions || suggestions;\n\n return (\n <Downshift\n onSelect={updater(onSelect)}\n highlightedIndex={highlightedIndex}\n selectedItem={selectedItem || null}\n itemToString={itemToString}\n inputValue={value}\n isOpen={isOpen}\n onInputValueChange={updater(onInputValueChange)}\n onStateChange={updater(onStateChange)}\n >\n {({\n getInputProps,\n getItemProps,\n getRootProps,\n isOpen,\n inputValue,\n selectedItem,\n highlightedIndex\n }) => (\n // Super annoying but it works best to return a div so we\n // can't use a View here, but we can fake it be using the\n // className\n <div\n className={'view ' + css({ display: 'flex' }).toString()}\n {...containerProps}\n >\n {renderInput(\n getInputProps({\n focused,\n ...inputProps,\n onFocus: updater(onFocus),\n onBlur: updater(onBlur),\n onKeyDown: updater(onKeyDown),\n onChange: updater(onChange)\n })\n )}\n {isOpen &&\n filtered.length > 0 &&\n (embedded ? (\n <View style={{ marginTop: 5 }} data-testid=\"autocomplete\">\n {renderItems(\n filtered,\n getItemProps,\n highlightedIndex,\n inputValue\n )}\n </View>\n ) : (\n <Tooltip\n position=\"bottom-stretch\"\n offset={2}\n style={{\n padding: 0,\n backgroundColor: colors.n1,\n color: 'white',\n ...tooltipStyle\n }}\n {...tooltipProps}\n data-testid=\"autocomplete\"\n >\n {renderItems(\n filtered,\n getItemProps,\n highlightedIndex,\n inputValue\n )}\n </Tooltip>\n ))}\n </div>\n )}\n </Downshift>\n );\n}\n\nconst SingleAutocomplete = lively(_SingleAutocomplete, {\n getInitialState,\n componentWillReceiveProps\n});\n\nfunction MultiItem({ name, onRemove }) {\n return (\n <View\n style={{\n alignItems: 'center',\n flexDirection: 'row',\n backgroundColor: colors.b9,\n padding: '2px 4px',\n margin: '2px',\n borderRadius: 4\n }}\n >\n {name}\n <Button type=\"button\" bare style={{ marginLeft: 1 }} onClick={onRemove}>\n <Remove style={{ width: 8, height: 8 }} />\n </Button>\n </View>\n );\n}\n\nexport function MultiAutocomplete({\n value: selectedItems,\n onSelect,\n suggestions,\n strict,\n ...props\n}) {\n let [focused, setFocused] = useState(false);\n let lastSelectedItems = useRef();\n\n useEffect(() => {\n lastSelectedItems.current = selectedItems;\n });\n\n function onRemoveItem(id) {\n let items = selectedItems.filter(i => i !== id);\n onSelect(items);\n }\n\n function onAddItem(id) {\n if (id) {\n id = id.trim();\n onSelect([...selectedItems, id], id);\n }\n }\n\n function onKeyDown(e, prevOnKeyDown) {\n if (e.key === 'Backspace' && e.target.value === '') {\n onRemoveItem(selectedItems[selectedItems.length - 1]);\n }\n\n prevOnKeyDown && prevOnKeyDown(e);\n }\n\n return (\n <Autocomplete\n {...props}\n value={null}\n suggestions={suggestions.filter(\n item => !selectedItems.includes(getItemId(item))\n )}\n onSelect={onAddItem}\n clearAfterSelect\n highlightFirst\n strict={strict}\n tooltipProps={{\n forceLayout: lastSelectedItems.current !== selectedItems\n }}\n renderInput={props => (\n <View\n style={[\n {\n display: 'flex',\n flexWrap: 'wrap',\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: 'white',\n borderRadius: 4,\n border: '1px solid #d0d0d0'\n },\n focused && {\n border: '1px solid ' + colors.b5,\n boxShadow: '0 1px 1px ' + colors.b7\n }\n ]}\n >\n {selectedItems.map((item, idx) => {\n item = findItem(strict, suggestions, item);\n return (\n item && (\n <MultiItem\n key={getItemId(item) || idx}\n name={getItemName(item)}\n onRemove={() => onRemoveItem(getItemId(item))}\n />\n )\n );\n })}\n <Input\n {...props}\n onKeyDown={e => onKeyDown(e, props.onKeyDown)}\n onFocus={e => {\n setFocused(true);\n props.onFocus(e);\n }}\n onBlur={e => {\n setFocused(false);\n props.onBlur(e);\n }}\n style={[\n {\n flex: 1,\n minWidth: 30,\n border: 0,\n ':focus': { border: 0, boxShadow: 'none' }\n },\n props.style\n ]}\n />\n </View>\n )}\n />\n );\n}\n\nexport function AutocompleteFooterButton({\n title,\n style,\n hoveredStyle,\n onClick\n}) {\n return (\n <Button\n style={[\n {\n fontSize: 12,\n color: colors.n10,\n backgroundColor: 'transparent',\n borderColor: colors.n5\n },\n style\n ]}\n hoveredStyle={[\n { backgroundColor: 'rgba(200, 200, 200, .25)' },\n hoveredStyle\n ]}\n onClick={onClick}\n >\n {title}\n </Button>\n );\n}\n\nexport function AutocompleteFooter({ show = true, embedded, children }) {\n return (\n show && (\n <View\n style={[\n { flexShrink: 0 },\n embedded ? { paddingTop: 5 } : { padding: 5 }\n ]}\n onMouseDown={e => e.preventDefault()}\n >\n {children}\n </View>\n )\n );\n}\n\nexport default function Autocomplete({ multi, ...props }) {\n if (multi) {\n return <MultiAutocomplete {...props} />;\n } else {\n return <SingleAutocomplete {...props} />;\n }\n}\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction Split({ width, height, style, color = \"currentColor\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M30 9L26 5\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M30 9L26 13\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M6 5L2 9\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M2 9L6 13\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10 9H3\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 9H29\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 15L22 9\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 15L10 9\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 28L16 15\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport default Split;\n","import React, { useMemo } from 'react';\nimport { View, Text, Select } from './common';\nimport Autocomplete, { defaultFilterSuggestion } from './Autocomplete';\nimport { styles, colors } from '../style';\nimport Split from '../svg/split';\n\nexport const NativeCategorySelect = React.forwardRef(\n ({ categoryGroups, emptyLabel, ...nativeProps }, ref) => {\n return (\n <Select {...nativeProps} ref={ref}>\n <option value=\"\">{emptyLabel || 'Select category...'}</option>\n {categoryGroups.map(group => (\n <optgroup key={group.id} label={group.name}>\n {group.categories.map(category => (\n <option key={category.id} value={category.id}>\n {category.name}\n </option>\n ))}\n </optgroup>\n ))}\n </Select>\n );\n }\n);\n\nexport function CategoryList({\n items,\n getItemProps,\n highlightedIndex,\n embedded,\n footer\n}) {\n let lastGroup = null;\n\n return (\n <View>\n <View\n style={[\n {\n overflow: 'auto',\n padding: '5px 0'\n },\n !embedded && { maxHeight: 175 }\n ]}\n >\n {items.map((item, idx) => {\n if (item.id === 'split') {\n return (\n <View\n key=\"split\"\n {...(getItemProps ? getItemProps({ item }) : null)}\n style={{\n backgroundColor:\n highlightedIndex === idx ? colors.n4 : 'transparent',\n borderRadius: embedded ? 4 : 0,\n flexShrink: 0,\n flexDirection: 'row',\n alignItems: 'center',\n fontSize: 11,\n fontWeight: 500,\n color: colors.g8,\n padding: '6px 8px'\n }}\n data-testid=\"split-transaction-button\"\n >\n <Text style={{ lineHeight: 0 }}>\n <Split width={10} height={10} style={{ marginRight: 5 }} />\n </Text>\n Split Transaction\n </View>\n );\n }\n\n const showGroup = item.cat_group !== lastGroup;\n lastGroup = item.cat_group;\n return (\n <React.Fragment key={item.id}>\n {showGroup && (\n <div\n style={{\n color: colors.y9,\n padding: '4px 9px'\n }}\n data-testid=\"category-item-group\"\n >\n {item.groupName}\n </div>\n )}\n <div\n {...(getItemProps ? getItemProps({ item }) : null)}\n style={{\n backgroundColor:\n highlightedIndex === idx ? colors.n4 : 'transparent',\n padding: 4,\n paddingLeft: 20,\n borderRadius: embedded ? 4 : 0\n }}\n data-testid={\n 'category-item' +\n (highlightedIndex === idx ? '-highlighted' : '')\n }\n >\n {item.name}\n </div>\n </React.Fragment>\n );\n })}\n </View>\n {footer}\n </View>\n );\n}\n\nexport default function CategoryAutocomplete({\n categoryGroups,\n showSplitOption,\n embedded,\n onSplit,\n ...props\n}) {\n let categorySuggestions = useMemo(\n () =>\n categoryGroups.reduce(\n (list, group) =>\n list.concat(\n group.categories.map(category => ({\n ...category,\n groupName: group.name\n }))\n ),\n showSplitOption ? [{ id: 'split', name: '' }] : []\n ),\n [categoryGroups]\n );\n\n return (\n <Autocomplete\n strict={true}\n highlightFirst={true}\n embedded={embedded}\n getHighlightedIndex={suggestions => {\n if (suggestions.length === 0) {\n return null;\n } else if (suggestions[0].id === 'split') {\n return suggestions.length > 1 ? 1 : null;\n }\n return 0;\n }}\n filterSuggestions={(suggestions, value) => {\n return suggestions.filter(suggestion => {\n return (\n suggestion.id === 'split' ||\n defaultFilterSuggestion(suggestion, value) ||\n suggestion.groupName.toLowerCase().includes(value.toLowerCase())\n );\n });\n }}\n suggestions={categorySuggestions}\n renderItems={(items, getItemProps, highlightedIndex) => (\n <CategoryList\n items={items}\n embedded={embedded}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n />\n )}\n {...props}\n />\n );\n}\n","import React, { useState, useMemo, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { getActivePayees } from 'loot-core/src/client/reducers/queries';\nimport { createPayee } from 'loot-core/src/client/actions/queries';\nimport { useCachedPayees } from 'loot-core/src/client/data-hooks/payees';\nimport { useCachedAccounts } from 'loot-core/src/client/data-hooks/accounts';\nimport { View } from './common';\nimport Add from '../svg/v1/Add';\nimport Autocomplete, {\n defaultFilterSuggestion,\n AutocompleteFooter,\n AutocompleteFooterButton\n} from './Autocomplete';\nimport { colors } from '../style';\n\nfunction getPayeeSuggestions(payees, focusTransferPayees, accounts) {\n let activePayees = accounts ? getActivePayees(payees, accounts) : payees;\n\n if (focusTransferPayees && activePayees) {\n activePayees = activePayees.filter(p => !!p.transfer_acct);\n }\n\n return activePayees || [];\n}\n\nfunction makeNew(value, rawPayee) {\n if (value === 'new' && !rawPayee.current.startsWith('new:')) {\n return 'new:' + rawPayee.current;\n }\n return value;\n}\n\n// Convert the fully resolved new value into the 'new' id that can be\n// looked up in the suggestions\nfunction stripNew(value) {\n if (typeof value === 'string' && value.startsWith('new:')) {\n return 'new';\n }\n return value;\n}\n\nexport function PayeeList({\n items,\n getItemProps,\n highlightedIndex,\n embedded,\n inputValue,\n footer\n}) {\n let isFiltered = items.filtered;\n let createNew = null;\n items = [...items];\n\n // If the \"new payee\" item exists, create it as a special-cased item\n // with the value of the input so it always shows whatever the user\n // entered\n if (items[0].id === 'new') {\n let [first, ...rest] = items;\n createNew = first;\n items = rest;\n }\n\n let offset = createNew ? 1 : 0;\n let lastType = null;\n\n return (\n <View>\n <View\n style={[\n { overflow: 'auto', padding: '5px 0' },\n !embedded && { maxHeight: 175 }\n ]}\n >\n {createNew && (\n <View\n {...(getItemProps ? getItemProps({ item: createNew }) : null)}\n style={{\n flexShrink: 0,\n padding: '6px 9px',\n backgroundColor:\n highlightedIndex === 0 ? colors.n4 : 'transparent',\n borderRadius: embedded ? 4 : 0\n }}\n >\n <View\n style={{\n display: 'block',\n color: colors.g8,\n borderRadius: 4,\n fontSize: 11,\n fontWeight: 500\n }}\n >\n <Add\n width={8}\n height={8}\n style={{\n color: colors.g8,\n marginRight: 5,\n display: 'inline-block'\n }}\n />\n Create Payee \"{inputValue}\"\n </View>\n </View>\n )}\n\n {items.map((item, idx) => {\n let type = item.transfer_acct ? 'account' : 'payee';\n let title;\n if (type === 'payee' && lastType !== type) {\n title = 'Payees';\n } else if (type === 'account' && lastType !== type) {\n title = 'Transfer To/From';\n }\n let showMoreMessage = idx === items.length - 1 && isFiltered;\n lastType = type;\n\n return (\n <React.Fragment key={item.id}>\n {title && (\n <div\n key={'title-' + idx}\n style={{\n color: colors.y9,\n padding: '4px 9px'\n }}\n >\n {title}\n </div>\n )}\n\n <div\n {...(getItemProps ? getItemProps({ item }) : null)}\n key={item.id}\n style={{\n backgroundColor:\n highlightedIndex === idx + offset\n ? colors.n4\n : 'transparent',\n borderRadius: embedded ? 4 : 0,\n padding: 4,\n paddingLeft: 20\n }}\n >\n {item.name}\n </div>\n\n {showMoreMessage && (\n <div\n style={{\n fontSize: 11,\n padding: 5,\n color: colors.n5,\n textAlign: 'center'\n }}\n >\n More payees are available, search to find them\n </div>\n )}\n </React.Fragment>\n );\n })}\n </View>\n {footer}\n </View>\n );\n}\n\nexport default function PayeeAutocomplete({\n value,\n inputProps,\n showMakeTransfer = true,\n showManagePayees = false,\n defaultFocusTransferPayees = false,\n tableBehavior,\n embedded,\n onUpdate,\n onSelect,\n onManagePayees,\n ...props\n}) {\n let payees = useCachedPayees();\n let accounts = useCachedAccounts();\n\n let [focusTransferPayees, setFocusTransferPayees] = useState(defaultFocusTransferPayees);\n let payeeSuggestions = useMemo(\n () => [\n { id: 'new', name: '' },\n ...getPayeeSuggestions(payees, focusTransferPayees, accounts)\n ],\n [payees, focusTransferPayees, accounts]\n );\n\n let rawPayee = useRef('');\n let dispatch = useDispatch();\n\n async function handleSelect(value) {\n if (tableBehavior) {\n onSelect && onSelect(makeNew(value, rawPayee));\n } else {\n let create = () => dispatch(createPayee(rawPayee.current));\n\n if (Array.isArray(value)) {\n value = await Promise.all(value.map(v => (v === 'new' ? create() : v)));\n } else {\n if (value === 'new') {\n value = await create();\n }\n }\n onSelect && onSelect(value);\n }\n }\n\n return (\n <Autocomplete\n key={focusTransferPayees ? 'transfers' : 'all'}\n strict={true}\n embedded={embedded}\n value={stripNew(value)}\n suggestions={payeeSuggestions}\n tableBehavior={tableBehavior}\n itemToString={item => {\n if (!item) {\n return '';\n } else if (item.id === 'new') {\n return rawPayee.current;\n }\n return item.name;\n }}\n inputProps={{\n ...inputProps,\n onChange: text => (rawPayee.current = text)\n }}\n onUpdate={value => onUpdate && onUpdate(makeNew(value, rawPayee))}\n onSelect={handleSelect}\n getHighlightedIndex={suggestions => {\n if (suggestions.length > 1 && suggestions[0].id === 'new') {\n return 1;\n }\n return 0;\n }}\n filterSuggestions={(suggestions, value) => {\n let filtered = suggestions.filter((suggestion, idx) => {\n if (suggestion.id === 'new') {\n return !value || value === '' || focusTransferPayees ? false : true;\n }\n\n return defaultFilterSuggestion(suggestion, value);\n });\n\n filtered.sort((p1, p2) => {\n let r1 = p1.name.toLowerCase().startsWith(value.toLowerCase());\n let r2 = p2.name.toLowerCase().startsWith(value.toLowerCase());\n let r1exact = p1.name.toLowerCase() === value.toLowerCase();\n let r2exact = p2.name.toLowerCase() === value.toLowerCase();\n\n // (maniacal laughter) mwahaHAHAHAHAH\n if (p1.id === 'new') {\n return -1;\n } else if (p2.id === 'new') {\n return 1;\n } else {\n if (r1exact && !r2exact) {\n return -1;\n } else if (!r1exact && r2exact) {\n return 1;\n } else {\n if (r1 === r2) {\n return 0;\n } else if (r1 && !r2) {\n return -1;\n } else {\n return 1;\n }\n }\n }\n });\n\n let isf = filtered.length > 100;\n filtered = filtered.slice(0, 100);\n filtered.filtered = isf;\n\n if (filtered.length >= 2 && filtered[0].id === 'new') {\n if (filtered[1].name.toLowerCase() === value.toLowerCase()) {\n return filtered.slice(1);\n }\n }\n return filtered;\n }}\n initialFilterSuggestions={suggestions => {\n let filtered = false;\n let res = suggestions.filter((suggestion, idx) => {\n if (suggestion.id === 'new') {\n // Never show the \"create new\" initially\n return false;\n }\n\n if (idx >= 100 && !suggestion.transfer_acct) {\n filtered = true;\n return false;\n }\n return true;\n });\n\n if (filtered) {\n res.filtered = true;\n }\n return res;\n }}\n renderItems={(items, getItemProps, highlightedIndex, inputValue) => (\n <PayeeList\n items={items}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n inputValue={inputValue}\n embedded={embedded}\n footer={\n <AutocompleteFooter embedded={embedded}>\n {showMakeTransfer && (\n <AutocompleteFooterButton\n title=\"Make Transfer\"\n style={[\n showManagePayees && { marginBottom: 5 },\n focusTransferPayees && {\n backgroundColor: colors.y8,\n color: colors.g2,\n borderColor: colors.y8\n }\n ]}\n hoveredStyle={\n focusTransferPayees && {\n backgroundColor: colors.y8,\n colors: colors.y2\n }\n }\n onClick={() => {\n onUpdate && onUpdate(null);\n setFocusTransferPayees(!focusTransferPayees);\n }}\n />\n )}\n {showManagePayees && (\n <AutocompleteFooterButton\n title=\"Manage Payees\"\n onClick={() => onManagePayees()}\n />\n )}\n </AutocompleteFooter>\n }\n />\n )}\n {...props}\n />\n );\n}\n","import React from 'react';\nimport { useCachedAccounts } from 'loot-core/src/client/data-hooks/accounts';\nimport Autocomplete from './Autocomplete';\nimport { View } from './common';\nimport { colors } from '../style';\n\nexport function AccountList({\n items,\n getItemProps,\n highlightedIndex,\n embedded\n}) {\n let lastItem = null;\n\n return (\n <View>\n <View\n style={[\n { overflow: 'auto', padding: '5px 0' },\n !embedded && { maxHeight: 175 }\n ]}\n >\n {items.map((item, idx) => {\n const showGroup = lastItem\n ? item.offbudget !== lastItem.offbudget\n : true;\n const group = item.offbudget ? 'Off Budget' : 'For Budget';\n lastItem = item;\n\n return [\n showGroup ? (\n <div\n key={group}\n style={{\n color: colors.y9,\n padding: '4px 9px'\n }}\n data-testid=\"account-item-group\"\n >\n {group}\n </div>\n ) : null,\n <div\n {...(getItemProps ? getItemProps({ item }) : null)}\n key={item.id}\n style={{\n backgroundColor:\n highlightedIndex === idx ? colors.n4 : 'transparent',\n padding: 4,\n paddingLeft: 20,\n borderRadius: embedded ? 4 : 0\n }}\n data-testid={\n 'account-item' +\n (highlightedIndex === idx ? '-highlighted' : '')\n }\n >\n {item.name}\n </div>\n ];\n })}\n </View>\n </View>\n );\n}\n\nexport default function AccountAutocomplete({ embedded, ...props }) {\n let accounts = useCachedAccounts() || [];\n\n return (\n <Autocomplete\n strict={true}\n highlightFirst={true}\n embedded={embedded}\n suggestions={accounts}\n renderItems={(items, getItemProps, highlightedIndex) => (\n <AccountList\n items={items}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n embedded={embedded}\n />\n )}\n {...props}\n />\n );\n}\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction RightArrow2({ width, height, style, color = \"black\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 91 51\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill={color}\n className=\"path\"\n d=\"M63.0035243,0.00287814875 C61.7906378,0.0600658892 60.7317989,0.842666173 60.3212412,1.985385 C59.9106836,3.12810382 60.2293609,4.40562012 61.1285243,5.22162815 L79.4410243,22.0341281 L3.15977426,22.0341281 C3.05570186,22.0291281 2.95134666,22.0291281 2.84727426,22.0341281 C1.27629006,22.1156281 -0.078297035,23.6193781 0.00352426499,25.1903781 C0.085345265,26.7612781 1.58881846,28.1162281 3.15977426,28.0341281 L79.4410243,28.0341281 L61.1285243,44.8153781 C60.2782139,45.5247824 59.8877978,46.6448836 60.1129217,47.7291351 C60.3380455,48.8133866 61.142102,49.6854787 62.204541,49.9977376 C63.2669799,50.3099965 64.4150384,50.0116459 65.1910243,49.2216281 L89.1910243,27.2216281 C89.8053452,26.6537206 90.1546504,25.8551089 90.1546504,25.0185031 C90.1546504,24.1818974 89.8053452,23.3832857 89.1910243,22.8153781 L65.1910243,0.815378149 C64.6013672,0.2604644 63.812455,-0.0325601255 63.0035243,0.00287814875 Z\"\n />\n </svg>\n );\n}\n\nexport default RightArrow2;\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction LeftArrow2({ width, height, style, color = \"black\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 91 51\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill={color}\n className=\"path\"\n d=\"M30.2563657,48.6143861 C30.2183019,47.790406 29.8626205,47.0158388 29.2674654,46.4614308 L10.8027839,29.0634209 L87.7179501,29.0634209 C87.8228144,29.068595 87.9281828,29.068595 88.0330471,29.0634209 C89.6171025,28.9790826 90.9828587,27.4229632 90.9004294,25.7972517 C90.818,24.1715403 89.3017535,22.7693512 87.7179501,22.8544657 L10.8027839,22.8544657 L29.2674654,5.48879403 C30.5505402,4.39032637 30.7227091,2.43243582 29.6523878,1.11587861 C28.5820665,-0.200678607 26.6743435,-0.377892537 25.3915208,0.720575124 C25.3146371,0.786286567 25.2410305,0.855878607 25.171205,0.929092537 L0.971759003,23.6952617 C-0.255102493,24.8594408 -0.330221607,26.8235403 0.803875346,28.0826647 C0.857567867,28.1424259 0.913781163,28.1998587 0.971759003,28.2549632 L25.171205,51.0211323 C25.7656039,51.5954607 26.5614127,51.8986647 27.3768837,51.8619284 C29.0458892,51.7812119 30.3347618,50.3270229 30.2563657,48.6143861 Z\"\n />\n </svg>\n );\n}\n\nexport default LeftArrow2;\n","import React from 'react';\n\nconst SvgHyperlink2 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M12.406 14.905a1 1 0 0 0-.543 1.307 1 1 0 0 1-.217 1.09l-2.828 2.829a2 2 0 0 1-2.828 0L3.868 18.01a2 2 0 0 1 0-2.829L6.7 12.353a1.013 1.013 0 0 1 1.091-.217 1 1 0 0 0 .763-1.849 3.034 3.034 0 0 0-3.268.652l-2.832 2.828a4.006 4.006 0 0 0 0 5.657l2.122 2.121a4 4 0 0 0 5.656 0l2.829-2.828a3.008 3.008 0 0 0 .651-3.27 1 1 0 0 0-1.306-.542z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7.757 16.241a1.011 1.011 0 0 0 1.414 0l7.779-7.778a1 1 0 0 0-1.414-1.414l-7.779 7.778a1 1 0 0 0 0 1.414z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.546 4.574l-2.121-2.121a4.006 4.006 0 0 0-5.657 0l-2.829 2.828a3.006 3.006 0 0 0-.651 3.269 1 1 0 1 0 1.849-.764 1 1 0 0 1 .217-1.086l2.828-2.828a2 2 0 0 1 2.829 0l2.121 2.121a2 2 0 0 1 0 2.829L17.3 11.645a1.015 1.015 0 0 1-1.091.217 1 1 0 0 0-.765 1.849 3.026 3.026 0 0 0 3.27-.651l2.828-2.828a4.007 4.007 0 0 0 .004-5.658z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgHyperlink2;\n","import React from 'react';\n\nconst SvgArrowsSynchronize = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <g fill=\"#000\">\n <path\n d=\"M23.962 17.457l-.82-3.297a1.287 1.287 0 0 0-1.56-.934l-3.294.823a1.286 1.286 0 0 0-.343 2.35L19 17.03A9.538 9.538 0 0 1 12 20.604a8.652 8.652 0 0 1-8.085-5.667 1.286 1.286 0 0 0-2.415.884A11.232 11.232 0 0 0 12 23.175a12.108 12.108 0 0 0 9.214-4.8l.839.503a1.286 1.286 0 0 0 1.91-1.415zM2.422 10.774l3.295-.823a1.286 1.286 0 0 0 .352-2.35l-.972-.583A9.588 9.588 0 0 1 12 3.396a8.652 8.652 0 0 1 8.085 5.667A1.286 1.286 0 0 0 22.5 8.18 11.232 11.232 0 0 0 12 .825 12.242 12.242 0 0 0 2.866 5.68l-.919-.552a1.286 1.286 0 0 0-1.91 1.414l.82 3.297a1.287 1.287 0 0 0 1.246.974 1.311 1.311 0 0 0 .32-.04z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n);\n\nexport default SvgArrowsSynchronize;\n","import { getNumberFormat } from './util';\n\nfunction fail(state, msg) {\n throw new Error(\n msg + ': ' + JSON.stringify(state.str.slice(state.index, 10))\n );\n}\n\nfunction char(state) {\n return state.str[state.index];\n}\n\nfunction next(state) {\n if (state.index >= state.str.length) {\n return null;\n }\n\n let ch = char(state);\n state.index++;\n return ch;\n}\n\nfunction isEnd(state) {\n return state.index >= state.str.length;\n}\n\nfunction nextOperator(state, op) {\n if (char(state) === op) {\n next(state);\n return true;\n }\n\n return false;\n}\n\nfunction parsePrimary(state) {\n // We only support numbers\n let isNegative = char(state) === '-';\n if (isNegative) {\n next(state);\n }\n\n // TODO: Support currency symbols better\n if (char(state) === '$') {\n next(state);\n }\n\n // TODO: The regex should probably respect the number format better,\n // and we should do more strict parsing\n let numberStr = '';\n while (char(state) && char(state).match(/[0-9,.]/)) {\n let thousandsSep = getNumberFormat().separator === ',' ? '.' : ',';\n\n // Don't include the thousands separator\n if (char(state) === thousandsSep) {\n next(state);\n } else {\n numberStr += next(state);\n }\n }\n\n if (numberStr === '') {\n fail(state, 'Unexpected character');\n }\n\n let number = parseFloat(numberStr.replace(getNumberFormat().separator, '.'));\n return isNegative ? -number : number;\n}\n\nfunction parseParens(state) {\n if (char(state) === '(') {\n next(state);\n let expr = parseOperator(state);\n\n if (char(state) !== ')') {\n fail(state, 'Unbalanced parentheses');\n }\n\n next(state);\n return expr;\n }\n\n return parsePrimary(state);\n}\n\nfunction makeOperatorParser(...ops) {\n return ops.reduce((prevParser, op) => {\n return state => {\n let node = prevParser(state);\n while (nextOperator(state, op)) {\n node = { op, left: node, right: prevParser(state) };\n }\n return node;\n };\n }, parseParens);\n}\n\n// These operators go from high to low order of precedence\nlet parseOperator = makeOperatorParser('^', '/', '*', '-', '+');\n\nfunction parse(expression) {\n let state = { str: expression.replace(/\\s/g, ''), index: 0 };\n return parseOperator(state);\n}\n\nfunction evaluate(ast) {\n if (typeof ast === 'number') {\n return ast;\n }\n\n let { left, right, op } = ast;\n\n switch (op) {\n case '+':\n return evaluate(left) + evaluate(right);\n case '-':\n return evaluate(left) - evaluate(right);\n case '*':\n return evaluate(left) * evaluate(right);\n case '/':\n return evaluate(left) / evaluate(right);\n case '^':\n return Math.pow(evaluate(left), evaluate(right));\n default:\n throw new Error('Unknown operator: ' + op);\n }\n}\n\nexport default function evalArithmetic(expression, defaultValue = null) {\n // An empty expression always evals to the default\n if (expression === '') {\n return defaultValue;\n }\n\n let result;\n try {\n result = evaluate(parse(expression));\n } catch (e) {\n // If it errors, return the default value\n return defaultValue;\n }\n\n // Never return NaN\n return isNaN(result) ? defaultValue : result;\n}\n","import React from 'react';\n\nconst SvgEditSkull1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M12 0a10.286 10.286 0 0 0-6.243 18.45 1.714 1.714 0 0 1 .672 1.36v1.619A2.571 2.571 0 0 0 9 24a1.714 1.714 0 0 0 1.714-1.714V21a1.286 1.286 0 0 1 2.572 0v1.286A1.714 1.714 0 0 0 15 24a2.571 2.571 0 0 0 2.571-2.571V19.81a1.714 1.714 0 0 1 .672-1.36A10.286 10.286 0 0 0 12 0zM7.714 12.429a2.143 2.143 0 1 1 2.143-2.143 2.143 2.143 0 0 1-2.143 2.143zm8.572 0a2.143 2.143 0 1 1 2.143-2.143 2.143 2.143 0 0 1-2.143 2.143z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgEditSkull1;\n","import React from 'react';\n\nconst SvgValidationCheck = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M7.176 22.5a4.111 4.111 0 0 1-3.17-1.486l-3.62-4.6a1.8 1.8 0 1 1 2.828-2.228l3.6 4.56a.384.384 0 0 0 .379.152.52.52 0 0 0 .408-.197L20.794 2.177a1.8 1.8 0 1 1 2.812 2.246L10.39 20.964A4.12 4.12 0 0 1 7.2 22.5z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgValidationCheck;\n","import React from 'react';\n\nconst SvgFavoriteStar = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M23.91 9.113a1.785 1.785 0 0 0-1.453-1.227l-6.132-.926-2.714-5.506a1.863 1.863 0 0 0-3.222 0l-2.78 5.552-6.066.88a1.798 1.798 0 0 0-1 3.068l4.428 4.361-1.028 6.055a1.797 1.797 0 0 0 2.607 1.895l5.488-2.865 5.429 2.858a1.797 1.797 0 0 0 2.607-1.895l-1.011-6.128 4.394-4.286a1.786 1.786 0 0 0 .454-1.836z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgFavoriteStar;\n","import React from 'react';\nimport { colors } from 'loot-design/src/style';\nimport { View, Text } from 'loot-design/src/components/common';\nimport { titleFirst } from 'loot-core/src/shared/util';\n\nimport EditSkull1 from 'loot-design/src/svg/v2/EditSkull1';\nimport AlertTriangle from 'loot-design/src/svg/v2/AlertTriangle';\nimport CalendarIcon from 'loot-design/src/svg/v2/Calendar';\nimport ValidationCheck from 'loot-design/src/svg/v2/ValidationCheck';\nimport FavoriteStar from 'loot-design/src/svg/v2/FavoriteStar';\nimport CheckCircle1 from 'loot-design/src/svg/v2/CheckCircle1';\n\nexport function getStatusProps(status) {\n let color, backgroundColor, Icon;\n\n switch (status) {\n case 'missed':\n color = colors.r1;\n backgroundColor = colors.r10;\n Icon = EditSkull1;\n break;\n case 'due':\n color = colors.y1;\n backgroundColor = colors.y9;\n Icon = AlertTriangle;\n break;\n case 'upcoming':\n color = colors.p1;\n backgroundColor = colors.p10;\n Icon = CalendarIcon;\n break;\n case 'paid':\n color = colors.g2;\n backgroundColor = colors.g10;\n Icon = ValidationCheck;\n break;\n case 'completed':\n color = colors.n4;\n backgroundColor = colors.n11;\n Icon = FavoriteStar;\n break;\n case 'pending':\n color = colors.g4;\n backgroundColor = colors.g11;\n Icon = CalendarIcon;\n break;\n case 'scheduled':\n color = colors.n1;\n backgroundColor = colors.n11;\n Icon = CalendarIcon;\n break;\n default:\n color = colors.n1;\n backgroundColor = colors.n11;\n Icon = CheckCircle1;\n break;\n }\n\n return { color, backgroundColor, Icon };\n}\n\nexport function StatusIcon({ status }) {\n let { color } = getStatusProps(status);\n\n return <Icon style={{ width: 13, height: 13, color }} />;\n}\n\nexport function StatusBadge({ status, style }) {\n let { color, backgroundColor, Icon } = getStatusProps(status);\n return (\n <View\n style={[\n {\n color,\n backgroundColor,\n padding: '6px 8px',\n borderRadius: 4,\n flexDirection: 'row',\n alignItems: 'center',\n flexShrink: 0\n },\n style\n ]}\n >\n <Icon\n style={{\n width: 13,\n height: 13,\n color: 'inherit',\n marginRight: 7\n }}\n />\n <Text style={{ lineHeight: '1em' }}>{titleFirst(status)}</Text>\n </View>\n );\n}\n","import * as monthUtils from './months';\nimport q from './query';\n\nexport function getStatus(nextDate, completed, hasTrans) {\n let today = monthUtils.currentDay();\n\n if (completed) {\n return 'completed';\n } else if (hasTrans) {\n return 'paid';\n } else if (nextDate === today) {\n return 'due';\n } else if (nextDate > today && nextDate <= monthUtils.addDays(today, 7)) {\n return 'upcoming';\n } else if (nextDate < today) {\n return 'missed';\n } else {\n return 'scheduled';\n }\n}\n\nexport function getHasTransactionsQuery(schedules) {\n let filters = schedules.map(schedule => {\n let dateCond = schedule._conditions.find(c => c.field === 'date');\n return {\n $and: {\n schedule: schedule.id,\n date: {\n $gte:\n dateCond && dateCond.op === 'is'\n ? schedule.next_date\n : monthUtils.subDays(schedule.next_date, 2)\n }\n }\n };\n });\n\n return q('transactions')\n .filter({ $or: filters })\n .orderBy({ date: 'desc' })\n .groupBy('schedule')\n .select(['schedule', 'date']);\n}\n\nfunction makeNumberSuffix(num) {\n // Slight abuse of date-fns to turn a number like \"1\" into the full\n // form \"1st\" but formatting a date with that number\n return monthUtils.format(new Date(2020, 0, num, 12), 'do');\n}\n\nfunction prettyDayName(day) {\n let days = {\n SU: 'Sunday',\n MO: 'Monday',\n TU: 'Tuesday',\n WE: 'Wednesday',\n TH: 'Thursday',\n FR: 'Friday',\n SA: 'Saturday'\n };\n return days[day];\n}\n\nexport function getRecurringDescription(config) {\n let interval = config.interval || 1;\n\n switch (config.frequency) {\n case 'weekly': {\n let desc = 'Every ';\n desc += interval !== 1 ? `${interval} weeks` : 'week';\n desc += ' on ' + monthUtils.format(config.start, 'EEEE');\n return desc;\n }\n case 'monthly': {\n let desc = 'Every ';\n desc += interval !== 1 ? `${interval} months` : 'month';\n\n if (config.patterns && config.patterns.length > 0) {\n // Sort the days ascending. We filter out -1 because that\n // represents \"last days\" and should always be last, but this\n // sort would put them first\n let patterns = [...config.patterns]\n .sort((p1, p2) => {\n let typeOrder =\n (p1.type === 'day' ? 1 : 0) - (p2.type === 'day' ? 1 : 0);\n let valOrder = p1.value - p2.value;\n\n if (typeOrder === 0) {\n return valOrder;\n }\n return typeOrder;\n })\n .filter(p => p.value !== -1);\n\n // Add on all -1 values to the end\n patterns = patterns.concat(config.patterns.filter(p => p.value === -1));\n\n desc += ' on the ';\n\n let strs = [];\n\n let uniqueDays = new Set(patterns.map(p => p.type));\n let isSameDay = uniqueDays.length === 1 && !uniqueDays.has('day');\n\n for (let pattern of patterns) {\n if (pattern.type === 'day') {\n if (pattern.value === -1) {\n strs.push('last day');\n } else {\n // Example: 15th day\n strs.push(makeNumberSuffix(pattern.value));\n }\n } else {\n let dayName = isSameDay ? '' : ' ' + prettyDayName(pattern.type);\n\n if (pattern.value === -1) {\n // Example: last Monday\n strs.push('last' + dayName);\n } else {\n // Example: 3rd Monday\n strs.push(makeNumberSuffix(pattern.value) + dayName);\n }\n }\n }\n\n if (strs.length > 2) {\n desc += strs.slice(0, strs.length - 1).join(', ');\n desc += ', and ';\n desc += strs[strs.length - 1];\n } else {\n desc += strs.join(' and ');\n }\n\n if (isSameDay) {\n desc += ' ' + prettyDayName(patterns[0].type);\n }\n } else {\n desc += ' on the ' + monthUtils.format(config.start, 'do');\n }\n\n return desc;\n }\n case 'yearly': {\n let desc = 'Every ';\n desc += interval !== 1 ? `${interval} years` : 'year';\n desc += ' on ' + monthUtils.format(config.start, 'LLL do');\n return desc;\n }\n default:\n return 'Recurring error';\n }\n}\n\nexport function recurConfigToRSchedule(config) {\n let base = {\n start: monthUtils.parseDate(config.start),\n frequency: config.frequency.toUpperCase(),\n byHourOfDay: [12]\n };\n\n if (config.interval) {\n base.interval = config.interval;\n }\n\n let abbrevDay = name => name.slice(0, 2).toUpperCase();\n\n switch (config.frequency) {\n case 'weekly':\n // Nothing to do\n return [base];\n case 'monthly':\n if (config.patterns && config.patterns.length > 0) {\n let days = config.patterns.filter(p => p.type === 'day');\n let dayNames = config.patterns.filter(p => p.type !== 'day');\n\n return [\n days.length > 0 && { ...base, byDayOfMonth: days.map(p => p.value) },\n dayNames.length > 0 && {\n ...base,\n byDayOfWeek: dayNames.map(p => [abbrevDay(p.type), p.value])\n }\n ].filter(Boolean);\n } else {\n // Nothing to do\n return [base];\n }\n case 'yearly':\n return [base];\n default:\n throw new Error('Invalid recurring date config');\n }\n}\n\nexport function extractScheduleConds(conditions) {\n return {\n payee:\n conditions.find(cond => cond.op === 'is' && cond.field === 'payee') ||\n conditions.find(\n cond => cond.op === 'is' && cond.field === 'description'\n ) ||\n null,\n account:\n conditions.find(cond => cond.op === 'is' && cond.field === 'account') ||\n conditions.find(cond => cond.op === 'is' && cond.field === 'acct') ||\n null,\n amount:\n conditions.find(\n cond =>\n (cond.op === 'is' ||\n cond.op === 'isapprox' ||\n cond.op === 'isbetween') &&\n cond.field === 'amount'\n ) || null,\n date:\n conditions.find(\n cond =>\n (cond.op === 'is' || cond.op === 'isapprox') && cond.field === 'date'\n ) || null\n };\n}\n\nexport function getScheduledAmount(amount) {\n if (amount && typeof amount !== 'number') {\n return ((amount.num1 + amount.num2) / 2) | 0;\n }\n return amount;\n}\n","import React, { useMemo, useEffect, useState, useContext } from 'react';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport {\n getStatus,\n getHasTransactionsQuery\n} from 'loot-core/src/shared/schedules';\nimport q, { liveQuery, runQuery } from 'loot-core/src/client/query-helpers';\nimport { send } from 'loot-core/src/platform/client/fetch';\n\nfunction loadStatuses(schedules, onData) {\n return liveQuery(getHasTransactionsQuery(schedules), onData, {\n mapper: data => {\n let hasTrans = new Set(data.filter(Boolean).map(row => row.schedule));\n\n return new Map(\n schedules.map(s => [\n s.id,\n getStatus(s.next_date, s.completed, hasTrans.has(s.id))\n ])\n );\n }\n });\n}\n\nexport function useSchedules({ transform } = {}) {\n let [data, setData] = useState(null);\n\n useEffect(() => {\n let query = q('schedules').select('*');\n let scheduleQuery, statusQuery;\n\n scheduleQuery = liveQuery(\n transform ? transform(query) : query,\n async schedules => {\n if (scheduleQuery) {\n if (statusQuery) {\n statusQuery.unsubscribe();\n }\n\n statusQuery = loadStatuses(schedules, statuses =>\n setData({ schedules, statuses })\n );\n }\n }\n );\n\n return () => {\n if (scheduleQuery) {\n scheduleQuery.unsubscribe();\n }\n if (statusQuery) {\n statusQuery.unsubscribe();\n }\n };\n }, [transform]);\n\n return data;\n}\n\nlet SchedulesContext = React.createContext(null);\n\nexport function SchedulesProvider({ transform, children }) {\n let data = useSchedules({ transform });\n return <SchedulesContext.Provider value={data} children={children} />;\n}\n\nexport function useCachedSchedules() {\n return useContext(SchedulesContext);\n}\n","import React, {\n useState,\n useRef,\n useMemo,\n useCallback,\n useLayoutEffect,\n useEffect,\n useImperativeHandle,\n useContext,\n useReducer\n} from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport {\n format as formatDate,\n parse as parseDate,\n parseISO,\n isValid as isDateValid\n} from 'date-fns';\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport {\n View,\n Text,\n Stack,\n Tooltip,\n Button\n} from 'loot-design/src/components/common';\nimport CategoryAutocomplete from 'loot-design/src/components/CategorySelect';\nimport PayeeAutocomplete from 'loot-design/src/components/PayeeAutocomplete';\nimport AccountAutocomplete from 'loot-design/src/components/AccountAutocomplete';\nimport DateSelect from 'loot-design/src/components/DateSelect';\nimport RightArrow2 from 'loot-design/src/svg/RightArrow2';\nimport LeftArrow2 from 'loot-design/src/svg/LeftArrow2';\nimport Hyperlink2 from 'loot-design/src/svg/v2/Hyperlink2';\nimport DeleteIcon from 'loot-design/src/svg/Delete';\nimport CheveronDown from 'loot-design/src/svg/v1/CheveronDown';\nimport CalendarIcon from 'loot-design/src/svg/v2/Calendar';\nimport ArrowsSynchronize from 'loot-design/src/svg/v2/ArrowsSynchronize';\nimport {\n integerToCurrency,\n amountToInteger,\n applyChanges,\n debugMemoFailure,\n titleFirst\n} from 'loot-core/src/shared/util';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport {\n getAccountsById,\n getPayeesById,\n getCategoriesById\n} from 'loot-core/src/client/reducers/queries';\nimport { currentDay, dayFromDate, addDays } from 'loot-core/src/shared/months';\nimport {\n splitTransaction,\n updateTransaction,\n deleteTransaction,\n addSplitTransaction,\n ungroupTransaction\n} from 'loot-core/src/shared/transactions';\nimport { styles, colors } from 'loot-design/src/style';\nimport {\n Cell,\n Field,\n Row,\n InputCell,\n SelectCell,\n DeleteCell,\n CustomCell,\n CellButton,\n useTableNavigator,\n Table,\n ROW_HEIGHT\n} from 'loot-design/src/components/table';\nimport {\n useSelectedDispatch,\n useSelectedItems\n} from 'loot-design/src/components/useSelected';\nimport { keys } from 'loot-design/src/util/keys';\nimport { useMergedRefs } from 'loot-design/src/components/useMergedRefs';\nimport { getStatusProps } from '../schedules/StatusBadge';\nimport { useCachedSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\n\nlet TABLE_BACKGROUND_COLOR = colors.n11;\n\nfunction getDisplayValue(obj, name) {\n return obj ? obj[name] : '';\n}\n\nfunction serializeTransaction(transaction, showZeroInDeposit, dateFormat) {\n let { amount, date } = transaction;\n\n if (isPreviewId(transaction.id)) {\n amount = getScheduledAmount(amount);\n }\n\n let debit = amount < 0 ? -amount : null;\n let credit = amount > 0 ? amount : null;\n\n if (amount === 0) {\n if (showZeroInDeposit) {\n credit = 0;\n } else {\n debit = 0;\n }\n }\n\n // Validate the date format\n if (!isDateValid(parseISO(date))) {\n // Be a little forgiving if the date isn't valid. This at least\n // stops the UI from crashing, but this is a serious problem with\n // the data. This allows the user to go through and see empty\n // dates and manually fix them.\n date = null;\n }\n\n return {\n ...transaction,\n date,\n debit: debit != null ? integerToCurrency(debit) : '',\n credit: credit != null ? integerToCurrency(credit) : ''\n };\n}\n\nfunction deserializeTransaction(transaction, originalTransaction, dateFormat) {\n let { debit, credit, date, ...realTransaction } = transaction;\n\n let amount;\n if (debit !== '') {\n let parsed = evalArithmetic(debit, null);\n amount = parsed != null ? -parsed : null;\n } else {\n amount = evalArithmetic(credit, null);\n }\n\n amount =\n amount != null ? amountToInteger(amount) : originalTransaction.amount;\n\n if (date == null) {\n date = originalTransaction.date || currentDay();\n }\n\n return { ...realTransaction, date, amount };\n}\n\nfunction getParentTransaction(transactions, fromIndex) {\n let trans = transactions[fromIndex];\n let parent;\n let parentIdx = fromIndex;\n while (parentIdx >= 0) {\n if (transactions[parentIdx].id === trans.parent_id) {\n // Found the parent\n return transactions[parentIdx];\n }\n parentIdx--;\n }\n\n return null;\n}\n\nfunction isLastChild(transactions, index) {\n let trans = transactions[index];\n return (\n trans &&\n trans.is_child &&\n (transactions[index + 1] == null ||\n transactions[index + 1].parent_id !== trans.parent_id)\n );\n}\n\nlet SplitsExpandedContext = React.createContext(null);\n\nexport function useSplitsExpanded() {\n let data = useContext(SplitsExpandedContext);\n\n return useMemo(\n () => ({\n ...data,\n expanded: id =>\n data.state.mode === 'collapse'\n ? !data.state.ids.has(id)\n : data.state.ids.has(id)\n }),\n [data]\n );\n}\n\nexport function SplitsExpandedProvider({ children, initialMode = 'expand' }) {\n let cachedState = useSelector(state => state.app.lastSplitState);\n let reduxDispatch = useDispatch();\n\n let [state, dispatch] = useReducer((state, action) => {\n switch (action.type) {\n case 'toggle-split': {\n let ids = new Set([...state.ids]);\n let { id } = action;\n if (ids.has(id)) {\n ids.delete(id);\n } else {\n ids.add(id);\n }\n return { ...state, ids };\n }\n case 'open-split': {\n let ids = new Set([...state.ids]);\n let { id } = action;\n if (state.mode === 'collapse') {\n ids.delete(id);\n } else {\n ids.add(id);\n }\n return { ...state, ids };\n }\n case 'set-mode': {\n return {\n ...state,\n mode: action.mode,\n ids: new Set(),\n transitionId: null\n };\n }\n case 'switch-mode':\n if (state.transitionId != null) {\n // You can only transition once at a time\n return state;\n }\n\n return {\n ...state,\n mode: state.mode === 'expand' ? 'collapse' : 'expand',\n transitionId: action.id,\n ids: new Set()\n };\n case 'finish-switch-mode':\n return { ...state, transitionId: null };\n default:\n throw new Error('Unknown action type: ' + action.type);\n }\n }, cachedState.current || { ids: new Set(), mode: initialMode });\n\n useEffect(() => {\n if (state.transitionId != null) {\n // This timeout allows animations to finish\n setTimeout(() => {\n dispatch({ type: 'finish-switch-mode' });\n }, 250);\n }\n }, [state.transitionId]);\n\n useEffect(() => {\n // In a finished state, cache the state\n if (state.transitionId == null) {\n reduxDispatch({ type: 'SET_LAST_SPLIT_STATE', splitState: state });\n }\n }, [state]);\n\n let value = useMemo(() => ({ state, dispatch }), [state, dispatch]);\n\n return (\n <SplitsExpandedContext.Provider value={value}>\n {children}\n </SplitsExpandedContext.Provider>\n );\n}\n\nexport const TransactionHeader = React.memo(\n ({ hasSelected, showAccount, showCategory, showBalance }) => {\n let dispatchSelected = useSelectedDispatch();\n\n return (\n <Row\n borderColor={colors.n9}\n backgroundColor=\"white\"\n style={{\n color: colors.n4,\n fontWeight: 300,\n zIndex: 200\n }}\n >\n <SelectCell\n exposed={true}\n focused={false}\n selected={hasSelected}\n width={20}\n onSelect={() => dispatchSelected({ type: 'select-all' })}\n />\n <Cell value=\"Date\" width={110} />\n {showAccount && <Cell value=\"Account\" width=\"flex\" />}\n <Cell value=\"Payee\" width=\"flex\" />\n <Cell value=\"Notes\" width=\"flex\" />\n {showCategory && <Cell value=\"Category\" width=\"flex\" />}\n <Cell value=\"Payment\" width={80} textAlign=\"right\" />\n <Cell value=\"Deposit\" width={80} textAlign=\"right\" />\n {showBalance && <Cell value=\"Balance\" width={85} textAlign=\"right\" />}\n <Field width={21} truncate={false} />\n <Cell value=\"\" width={15 + styles.scrollbarWidth} />\n </Row>\n );\n }\n);\n\nfunction getPayeePretty(transaction, payee, transferAcct) {\n let { payee: payeeId } = transaction;\n\n if (transferAcct) {\n const Icon = transaction.amount > 0 ? LeftArrow2 : RightArrow2;\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center'\n }}\n >\n <Icon width={10} height={8} style={{ marginRight: 5, flexShrink: 0 }} />\n <div>{transferAcct.name}</div>\n </View>\n );\n } else if (payee && !payee.transfer_acct) {\n // Check to make sure this isn't a transfer because in the rare\n // occasion that the account has been deleted but the payee is\n // still there, we don't want to show the name.\n return payee.name;\n } else if (payeeId && payeeId.startsWith('new:')) {\n return payeeId.slice('new:'.length);\n }\n\n return '';\n}\n\nfunction StatusCell({\n id,\n focused,\n selected,\n status,\n isChild,\n onEdit,\n onUpdate\n}) {\n let isClearedField = status === 'cleared' || status == null;\n let statusProps = getStatusProps(status);\n\n let props = {\n color:\n status === 'cleared'\n ? colors.g5\n : status === 'missed'\n ? colors.r6\n : status === 'due'\n ? colors.y5\n : selected\n ? colors.b7\n : colors.n6\n };\n\n function onSelect() {\n if (isClearedField) {\n onUpdate('cleared', !(status === 'cleared'));\n }\n }\n\n return (\n <Cell\n name=\"cleared\"\n width=\"auto\"\n focused={focused}\n style={{ padding: 1 }}\n plain\n >\n <CellButton\n style={[\n {\n padding: 3,\n border: '1px solid transparent',\n borderRadius: 50,\n ':focus': {\n border: '1px solid ' + props.color,\n boxShadow: `0 1px 2px ${props.color}`\n }\n },\n\n isChild && { visibility: 'hidden' }\n ]}\n onEdit={() => onEdit(id, 'cleared')}\n onSelect={onSelect}\n >\n {React.createElement(statusProps.Icon, {\n style: {\n width: 13,\n height: 13,\n color: props.color,\n marginTop: status === 'due' ? -1 : 0\n }\n })}\n </CellButton>\n </Cell>\n );\n}\n\nfunction PayeeCell({\n id,\n payeeId,\n focused,\n inherited,\n payees,\n accounts,\n valueStyle,\n transaction,\n payee,\n transferAcct,\n importedPayee,\n isPreview,\n onEdit,\n onUpdate,\n onCreatePayee,\n onManagePayees\n}) {\n let isCreatingPayee = useRef(false);\n\n return (\n <CustomCell\n width=\"flex\"\n name=\"payee\"\n value={payeeId}\n valueStyle={[valueStyle, inherited && { color: colors.n8 }]}\n formatter={value => getPayeePretty(transaction, payee, transferAcct)}\n exposed={focused}\n title={importedPayee || payeeId}\n onExpose={!isPreview && (name => onEdit(id, name))}\n onUpdate={async value => {\n onUpdate('payee', value);\n\n if (value && value.startsWith('new:') && !isCreatingPayee.current) {\n isCreatingPayee.current = true;\n let id = await onCreatePayee(value.slice('new:'.length));\n onUpdate('payee', id);\n isCreatingPayee.current = false;\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle\n }) => {\n return (\n <>\n <PayeeAutocomplete\n payees={payees}\n accounts={accounts}\n value={payeeId}\n shouldSaveFromKey={shouldSaveFromKey}\n inputProps={{\n onBlur,\n onKeyDown,\n style: inputStyle\n }}\n showManagePayees={true}\n tableBehavior={true}\n defaultFocusTransferPayees={transaction.is_child}\n focused={true}\n onUpdate={onUpdate}\n onSelect={onSave}\n onManagePayees={() => onManagePayees(payeeId)}\n />\n </>\n );\n }}\n </CustomCell>\n );\n}\n\nfunction CellWithScheduleIcon({ scheduleId, children }) {\n let scheduleData = useCachedSchedules();\n\n let schedule = scheduleData.schedules.find(s => s.id === scheduleId);\n\n if (schedule == null) {\n // This must be a deleted schedule\n return children;\n }\n\n let recurring = schedule._date && !!schedule._date.frequency;\n\n let style = {\n width: 13,\n height: 13,\n marginLeft: 5,\n marginRight: 3,\n color: 'inherit'\n };\n let Icon = recurring ? ArrowsSynchronize : CalendarIcon;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row', alignItems: 'stretch' }}>\n <Cell exposed={true}>\n {() =>\n recurring ? (\n <ArrowsSynchronize style={style} />\n ) : (\n <CalendarIcon style={{ ...style, transform: 'translateY(-1px)' }} />\n )\n }\n </Cell>\n\n {children}\n </View>\n );\n}\n\nexport const Transaction = React.memo(function Transaction(props) {\n let {\n transaction: originalTransaction,\n editing,\n backgroundColor = 'white',\n showAccount,\n showBalance,\n showZeroInDeposit,\n style,\n hovered,\n selected,\n highlighted,\n added,\n matched,\n expanded,\n inheritedFields,\n focusedField,\n categoryGroups,\n payees,\n accounts,\n balance,\n dateFormat = 'MM/dd/yyyy',\n onSave,\n onEdit,\n onHover,\n onDelete,\n onSplit,\n onManagePayees,\n onCreatePayee,\n onToggleSplit\n } = props;\n\n let dispatchSelected = useSelectedDispatch();\n\n let [prevShowZero, setPrevShowZero] = useState(showZeroInDeposit);\n let [prevTransaction, setPrevTransaction] = useState(originalTransaction);\n let [transaction, setTransaction] = useState(\n serializeTransaction(originalTransaction, showZeroInDeposit, dateFormat)\n );\n let isPreview = isPreviewId(transaction.id);\n\n if (\n originalTransaction !== prevTransaction ||\n showZeroInDeposit !== prevShowZero\n ) {\n setTransaction(\n serializeTransaction(originalTransaction, showZeroInDeposit, dateFormat)\n );\n setPrevTransaction(originalTransaction);\n setPrevShowZero(showZeroInDeposit);\n }\n\n function onUpdate(name, value) {\n if (transaction[name] !== value) {\n let newTransaction = { ...transaction, [name]: value };\n\n if (\n name === 'account' &&\n value &&\n getAccountsById(accounts)[value].offbudget\n ) {\n newTransaction.category = null;\n }\n\n // If entering an amount in either of the credit/debit fields, we\n // need to clear out the other one so it's always properly\n // translated into the desired amount (see\n // `deserializeTransaction`)\n if (name === 'credit') {\n newTransaction['debit'] = '';\n } else if (name === 'debit') {\n newTransaction['credit'] = '';\n }\n\n // Don't save a temporary value (a new payee) which will be\n // filled in with a real id later\n if (name === 'payee' && value && value.startsWith('new:')) {\n setTransaction(newTransaction);\n } else {\n let deserialized = deserializeTransaction(\n newTransaction,\n originalTransaction,\n dateFormat\n );\n // Run the transaction through the formatting so that we know\n // it's always showing the formatted result\n setTransaction(\n serializeTransaction(deserialized, showZeroInDeposit, dateFormat)\n );\n onSave(deserialized);\n }\n }\n }\n\n let {\n id,\n debit,\n credit,\n payee: payeeId,\n imported_payee: importedPayee,\n notes,\n date,\n account: accountId,\n category,\n cleared,\n is_parent: isParent,\n _unmatched = false\n } = transaction;\n\n // Join in some data\n let payee = payees && payeeId && getPayeesById(payees)[payeeId];\n let account = accounts && accountId && getAccountsById(accounts)[accountId];\n let transferAcct =\n payee &&\n payee.transfer_acct &&\n getAccountsById(accounts)[payee.transfer_acct];\n\n let isChild = transaction.is_child;\n let borderColor = selected ? colors.b8 : colors.border;\n let isBudgetTransfer = transferAcct && transferAcct.offbudget === 0;\n let isOffBudget = account && account.offbudget === 1;\n\n let valueStyle = added ? { fontWeight: 600 } : null;\n let backgroundFocus = hovered || focusedField === 'select';\n\n return (\n <Row\n borderColor={borderColor}\n backgroundColor={\n selected\n ? colors.selected\n : backgroundFocus\n ? colors.hover\n : isPreview\n ? '#fcfcfc'\n : backgroundColor\n }\n highlighted={highlighted}\n style={[\n style,\n isPreview && { color: colors.n5, fontStyle: 'italic' },\n _unmatched && { opacity: 0.5 }\n ]}\n onMouseEnter={() => onHover && onHover(transaction.id)}\n >\n {isChild && (\n <Field\n borderColor=\"transparent\"\n width={110}\n style={{\n width: 110,\n backgroundColor: colors.n11,\n borderBottomWidth: 0\n }}\n />\n )}\n {isChild && showAccount && (\n <Field\n borderColor=\"transparent\"\n style={{\n flex: 1,\n backgroundColor: colors.n11,\n opacity: 0\n }}\n />\n )}\n\n {isTemporaryId(transaction.id) ? (\n isChild ? (\n <DeleteCell\n onDelete={() => onDelete && onDelete(transaction.id)}\n exposed={hovered || editing}\n style={[isChild && { borderLeftWidth: 1 }, { lineHeight: 0 }]}\n />\n ) : (\n <Cell width={20} />\n )\n ) : (\n <SelectCell\n exposed={hovered || selected || editing}\n focused={focusedField === 'select'}\n onSelect={() => {\n dispatchSelected({ type: 'select', id: transaction.id });\n }}\n onEdit={() => onEdit(id, 'select')}\n selected={selected}\n style={[isChild && { borderLeftWidth: 1 }]}\n value={\n matched && (\n <Hyperlink2 style={{ width: 13, height: 13, color: colors.n7 }} />\n )\n }\n />\n )}\n\n {!isChild && (\n <CustomCell\n name=\"date\"\n width={110}\n exposed={focusedField === 'date'}\n value={date}\n valueStyle={valueStyle}\n formatter={date =>\n date ? formatDate(parseISO(date), dateFormat) : ''\n }\n onExpose={!isPreview && (name => onEdit(id, name))}\n onUpdate={value => {\n onUpdate('date', value);\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle\n }) => (\n <DateSelect\n value={date || ''}\n dateFormat={dateFormat}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n shouldSaveFromKey={shouldSaveFromKey}\n tableBehavior={true}\n onUpdate={onUpdate}\n onSelect={onSave}\n />\n )}\n </CustomCell>\n )}\n\n {!isChild && showAccount && (\n <CustomCell\n name=\"account\"\n width=\"flex\"\n value={accountId}\n formatter={acctId => {\n let acct = acctId && getAccountsById(accounts)[acctId];\n if (acct) {\n return acct.name;\n }\n return '';\n }}\n valueStyle={valueStyle}\n exposed={focusedField === 'account'}\n onExpose={!isPreview && (name => onEdit(id, name))}\n onUpdate={async value => {\n // Only ever allow non-null values\n if (value) {\n onUpdate('account', value);\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle\n }) => (\n <AccountAutocomplete\n value={accountId}\n accounts={accounts}\n shouldSaveFromKey={shouldSaveFromKey}\n tableBehavior={true}\n focused={true}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n onUpdate={onUpdate}\n onSelect={onSave}\n />\n )}\n </CustomCell>\n )}\n {(() => {\n let cell = (\n <PayeeCell\n id={id}\n payeeId={payeeId}\n focused={focusedField === 'payee'}\n inherited={inheritedFields && inheritedFields.has('payee')}\n payees={payees}\n accounts={accounts}\n valueStyle={valueStyle}\n transaction={transaction}\n payee={payee}\n transferAcct={transferAcct}\n importedPayee={importedPayee}\n isPreview={isPreview}\n onEdit={onEdit}\n onUpdate={onUpdate}\n onCreatePayee={onCreatePayee}\n onManagePayees={onManagePayees}\n />\n );\n\n if (transaction.schedule) {\n return (\n <CellWithScheduleIcon scheduleId={transaction.schedule}>\n {cell}\n </CellWithScheduleIcon>\n );\n }\n return cell;\n })()}\n\n {isPreview ? (\n <Cell name=\"notes\" width=\"flex\" />\n ) : (\n <InputCell\n width=\"flex\"\n name=\"notes\"\n exposed={focusedField === 'notes'}\n focused={focusedField === 'notes'}\n value={notes || ''}\n valueStyle={valueStyle}\n onExpose={!isPreview && (name => onEdit(id, name))}\n inputProps={{\n value: notes || '',\n onUpdate: onUpdate.bind(null, 'notes')\n }}\n />\n )}\n\n {isPreview ? (\n <Cell width=\"flex\" style={{ alignItems: 'flex-start' }} exposed={true}>\n {() => (\n <View\n style={{\n color:\n notes === 'missed'\n ? colors.r6\n : notes === 'due'\n ? colors.y4\n : selected\n ? colors.b5\n : colors.n6,\n backgroundColor:\n notes === 'missed'\n ? colors.r10\n : notes === 'due'\n ? colors.y9\n : selected\n ? colors.b8\n : colors.n10,\n margin: '0 5px',\n padding: '3px 7px',\n borderRadius: 4\n }}\n >\n {titleFirst(notes)}\n </View>\n )}\n </Cell>\n ) : isParent ? (\n <Cell\n name=\"category\"\n width=\"flex\"\n focused={focusedField === 'category'}\n style={{ padding: 0 }}\n plain\n >\n <CellButton\n style={{\n alignSelf: 'flex-start',\n color: colors.n6,\n borderRadius: 4,\n transition: 'none',\n '&:hover': {\n backgroundColor: 'rgba(100, 100, 100, .15)',\n color: colors.n5\n }\n }}\n disabled={isTemporaryId(transaction.id)}\n onEdit={() => onEdit(id, 'category')}\n onSelect={() => onToggleSplit(id)}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n borderRadius: 4,\n flex: 1,\n padding: 4\n }}\n >\n {isParent && (\n <CheveronDown\n style={{\n width: 14,\n height: 14,\n color: 'currentColor',\n transition: 'transform .08s',\n transform: expanded ? 'rotateZ(0)' : 'rotateZ(-90deg)'\n }}\n />\n )}\n <Text style={{ fontStyle: 'italic', userSelect: 'none' }}>\n Split\n </Text>\n </View>\n </CellButton>\n </Cell>\n ) : isBudgetTransfer || isOffBudget || isPreview ? (\n <InputCell\n name=\"category\"\n width=\"flex\"\n exposed={focusedField === 'category'}\n focused={focusedField === 'category'}\n onExpose={!isPreview && (name => onEdit(id, name))}\n value={\n isParent\n ? 'Split'\n : isOffBudget\n ? 'Off Budget'\n : isBudgetTransfer\n ? 'Transfer'\n : ''\n }\n valueStyle={valueStyle}\n style={{ fontStyle: 'italic', color: '#c0c0c0', fontWeight: 300 }}\n inputProps={{\n readOnly: true,\n style: { fontStyle: 'italic' }\n }}\n />\n ) : (\n <CustomCell\n name=\"category\"\n width=\"flex\"\n value={category}\n formatter={value =>\n value\n ? getDisplayValue(\n getCategoriesById(categoryGroups)[value],\n 'name'\n )\n : transaction.id\n ? 'Categorize'\n : ''\n }\n exposed={focusedField === 'category'}\n onExpose={name => onEdit(id, name)}\n valueStyle={\n !category\n ? {\n fontStyle: 'italic',\n fontWeight: 300,\n color: colors.p8\n }\n : valueStyle\n }\n onUpdate={async value => {\n if (value === 'split') {\n onSplit(transaction.id);\n } else {\n onUpdate('category', value);\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle\n }) => (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={category}\n focused={true}\n tableBehavior={true}\n showSplitOption={!isChild && !isParent}\n shouldSaveFromKey={shouldSaveFromKey}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n onUpdate={onUpdate}\n onSelect={onSave}\n />\n )}\n </CustomCell>\n )}\n\n <InputCell\n type=\"input\"\n width={80}\n name=\"debit\"\n exposed={focusedField === 'debit'}\n focused={focusedField === 'debit'}\n value={debit == null ? '' : debit}\n valueStyle={valueStyle}\n textAlign=\"right\"\n title={debit}\n onExpose={!isPreview && (name => onEdit(id, name))}\n style={[isParent && { fontStyle: 'italic' }, styles.tnum]}\n inputProps={{\n value: debit,\n onUpdate: onUpdate.bind(null, 'debit')\n }}\n />\n\n <InputCell\n type=\"input\"\n width={80}\n name=\"credit\"\n exposed={focusedField === 'credit'}\n focused={focusedField === 'credit'}\n value={credit == null ? '' : credit}\n valueStyle={valueStyle}\n textAlign=\"right\"\n title={credit}\n onExpose={!isPreview && (name => onEdit(id, name))}\n style={[isParent && { fontStyle: 'italic' }, styles.tnum]}\n inputProps={{\n value: credit,\n onUpdate: onUpdate.bind(null, 'credit')\n }}\n />\n\n {showBalance && (\n <Cell\n name=\"balance\"\n value={\n balance == null || isChild || isPreview\n ? ''\n : integerToCurrency(balance)\n }\n valueStyle={{ color: balance < 0 ? colors.r4 : colors.g4 }}\n style={styles.tnum}\n width={85}\n textAlign=\"right\"\n />\n )}\n\n <StatusCell\n id={id}\n focused={focusedField === 'cleared'}\n selected={selected}\n isPreview={isPreview}\n status={isPreview ? notes : cleared ? 'cleared' : null}\n isChild={isChild}\n onEdit={onEdit}\n onUpdate={onUpdate}\n />\n\n <Cell width={15} />\n </Row>\n );\n});\n\nexport function TransactionError({ error, isDeposit, onAddSplit, style }) {\n switch (error.type) {\n case 'SplitTransactionError':\n if (error.version === 1) {\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 5px'\n },\n style\n ]}\n data-testid=\"transaction-error\"\n >\n <Text>\n Amount left:{' '}\n <Text style={{ fontWeight: 500 }}>\n {integerToCurrency(\n isDeposit ? error.difference : -error.difference\n )}\n </Text>\n </Text>\n <View style={{ flex: 1 }} />\n <Button\n style={{ marginLeft: 15, padding: '4px 10px' }}\n primary\n onClick={onAddSplit}\n >\n Add Split\n </Button>\n </View>\n );\n }\n break;\n default:\n return null;\n }\n}\n\nfunction makeTemporaryTransactions(currentAccountId, lastDate) {\n return [\n {\n id: 'temp',\n date: lastDate || currentDay(),\n account: currentAccountId || null,\n cleared: false,\n amount: 0\n }\n ];\n}\n\nfunction isTemporaryId(id) {\n return id.indexOf('temp') !== -1;\n}\n\nexport function isPreviewId(id) {\n return id.indexOf('preview/') !== -1;\n}\n\nfunction NewTransaction({\n transactions,\n accounts,\n currentAccountId,\n categoryGroups,\n payees,\n editingTransaction,\n hoveredTransaction,\n focusedField,\n showAccount,\n showCategory,\n showBalance,\n dateFormat,\n onHover,\n onClose,\n onSplit,\n onEdit,\n onDelete,\n onSave,\n onAdd,\n onAddSplit,\n onManagePayees,\n onCreatePayee\n}) {\n const error = transactions[0].error;\n const isDeposit = transactions[0].amount > 0;\n\n return (\n <View\n style={{\n borderBottom: '1px solid #ebebeb',\n paddingBottom: 6,\n backgroundColor: 'white'\n }}\n data-testid=\"new-transaction\"\n onKeyDown={e => {\n if (e.keyCode === 27) {\n onClose();\n }\n }}\n onMouseLeave={() => onHover(null)}\n >\n {transactions.map((transaction, idx) => (\n <Transaction\n key={transaction.id}\n editing={editingTransaction === transaction.id}\n hovered={hoveredTransaction === transaction.id}\n transaction={transaction}\n showAccount={showAccount}\n showCategory={showCategory}\n showBalance={showBalance}\n focusedField={editingTransaction === transaction.id && focusedField}\n showZeroInDeposit={isDeposit}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n dateFormat={dateFormat}\n expanded={true}\n onHover={onHover}\n onEdit={onEdit}\n onSave={onSave}\n onSplit={onSplit}\n onDelete={onDelete}\n onAdd={onAdd}\n onManagePayees={onManagePayees}\n onCreatePayee={onCreatePayee}\n style={{ marginTop: -1 }}\n />\n ))}\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 6,\n marginRight: 20\n }}\n >\n <Button\n style={{ marginRight: 10, padding: '4px 10px' }}\n onClick={() => onClose()}\n data-testid=\"cancel-button\"\n >\n Cancel\n </Button>\n {error ? (\n <TransactionError\n error={error}\n isDeposit={isDeposit}\n onAddSplit={() => onAddSplit(transactions[0].id)}\n />\n ) : (\n <Button\n style={{ padding: '4px 10px' }}\n primary\n onClick={onAdd}\n data-testid=\"add-button\"\n >\n Add\n </Button>\n )}\n </View>\n </View>\n );\n}\n\nclass TransactionTable_ extends React.Component {\n container = React.createRef();\n state = { highlightedRows: null };\n\n componentDidMount() {\n this.highlight = ids => {\n this.setState({ highlightedRows: new Set(ids) }, () => {\n this.setState({ highlightedRows: null });\n });\n };\n }\n\n componentWillReceiveProps(nextProps) {\n const { isAdding } = this.props;\n if (!isAdding && nextProps.isAdding) {\n this.props.newNavigator.onEdit('temp', 'date');\n }\n }\n\n componentDidUpdate() {\n this._cachedParent = null;\n }\n\n getParent(trans, index) {\n let { transactions } = this.props;\n\n if (this._cachedParent && this._cachedParent.id === trans.parent_id) {\n return this._cachedParent;\n }\n\n if (trans.parent_id) {\n this._cachedParent = getParentTransaction(transactions, index);\n return this._cachedParent;\n }\n\n return null;\n }\n\n renderRow = ({ item, index, position, editing, focusedFied, onEdit }) => {\n const { highlightedRows } = this.state;\n const {\n transactions,\n selectedItems,\n hoveredTransaction,\n accounts,\n categoryGroups,\n payees,\n showAccount,\n showCategory,\n balances,\n dateFormat = 'MM/dd/yyyy',\n tableNavigator,\n isNew,\n isMatched,\n isExpanded\n } = this.props;\n\n let trans = item;\n let hovered = hoveredTransaction === trans.id;\n let selected = selectedItems.has(trans.id);\n let highlighted =\n !selected && (highlightedRows ? highlightedRows.has(trans.id) : false);\n\n let parent = this.getParent(trans, index);\n let isChildDeposit = parent && parent.amount > 0;\n let expanded = isExpanded && isExpanded((parent || trans).id);\n\n // For backwards compatibility, read the error of the transaction\n // since in previous versions we stored it there. In the future we\n // can simplify this to just the parent\n let error = expanded\n ? (parent && parent.error) || trans.error\n : trans.error;\n\n return (\n <>\n {(!expanded || isLastChild(transactions, index)) &&\n error &&\n error.type === 'SplitTransactionError' && (\n <Tooltip\n position=\"bottom-right\"\n width={250}\n forceTop={position}\n forceLayout={true}\n style={{ transform: 'translate(-5px, 2px)' }}\n >\n <TransactionError\n error={error}\n isDeposit={isChildDeposit}\n onAddSplit={() => this.props.onAddSplit(trans.id)}\n />\n </Tooltip>\n )}\n <Transaction\n editing={editing}\n transaction={trans}\n showAccount={showAccount}\n showCategory={showCategory}\n showBalance={!!balances}\n hovered={hovered}\n selected={selected}\n highlighted={highlighted}\n added={isNew && isNew(trans.id)}\n expanded={isExpanded && isExpanded(trans.id)}\n matched={isMatched && isMatched(trans.id)}\n showZeroInDeposit={isChildDeposit}\n balance={balances && balances[trans.id] && balances[trans.id].balance}\n focusedField={editing && tableNavigator.focusedField}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n inheritedFields={\n parent && parent.payee === trans.payee\n ? new Set(['payee'])\n : new Set()\n }\n dateFormat={dateFormat}\n onHover={this.props.onHover}\n onEdit={tableNavigator.onEdit}\n onSave={this.props.onSave}\n onDelete={this.props.onDelete}\n onSplit={this.props.onSplit}\n onManagePayees={this.props.onManagePayees}\n onCreatePayee={this.props.onCreatePayee}\n onToggleSplit={this.props.onToggleSplit}\n />\n </>\n );\n };\n\n render() {\n let { props } = this;\n let {\n tableNavigator,\n tableRef,\n dateFormat = 'MM/dd/yyyy',\n newNavigator,\n renderEmpty,\n onHover,\n onScroll\n } = props;\n\n return (\n <View\n innerRef={this.container}\n style={[{ flex: 1, cursor: 'default' }, props.style]}\n >\n <View>\n <TransactionHeader\n hasSelected={props.selectedItems.size > 0}\n showAccount={props.showAccount}\n showCategory={props.showCategory}\n showBalance={!!props.balances}\n />\n\n {props.isAdding && (\n <View\n {...newNavigator.getNavigatorProps({\n onKeyDown: e => props.onCheckNewEnter(e)\n })}\n >\n <NewTransaction\n transactions={props.newTransactions}\n editingTransaction={newNavigator.editingId}\n hoveredTransaction={props.hoveredTransaction}\n focusedField={newNavigator.focusedField}\n accounts={props.accounts}\n currentAccountId={props.currentAccountId}\n categoryGroups={props.categoryGroups}\n payees={this.props.payees || []}\n showAccount={props.showAccount}\n showCategory={props.showCategory}\n showBalance={!!props.balances}\n dateFormat={dateFormat}\n onClose={props.onCloseAddTransaction}\n onAdd={this.props.onAddTemporary}\n onAddSplit={this.props.onAddSplit}\n onSplit={this.props.onSplit}\n onEdit={newNavigator.onEdit}\n onSave={this.props.onSave}\n onDelete={this.props.onDelete}\n onHover={this.props.onHover}\n onManagePayees={this.props.onManagePayees}\n onCreatePayee={this.props.onCreatePayee}\n />\n </View>\n )}\n </View>\n {/*// * On Windows, makes the scrollbar always appear\n // the full height of the container ??? */}\n\n <View\n style={[{ flex: 1, overflow: 'hidden' }]}\n data-testid=\"transaction-table\"\n onMouseLeave={() => onHover(null)}\n >\n <Table\n navigator={tableNavigator}\n ref={tableRef}\n items={props.transactions}\n renderItem={this.renderRow}\n renderEmpty={renderEmpty}\n loadMore={props.loadMoreTransactions}\n isSelected={id => props.selectedItems.has(id)}\n onKeyDown={e => props.onCheckEnter(e)}\n onScroll={onScroll}\n />\n\n {props.isAdding && (\n <div\n key=\"shadow\"\n style={{\n position: 'absolute',\n top: -20,\n left: 0,\n right: 0,\n height: 20,\n backgroundColor: 'red',\n boxShadow: '0 0 6px rgba(0, 0, 0, .20)'\n }}\n />\n )}\n </View>\n </View>\n );\n }\n}\n\nexport let TransactionTable = React.forwardRef((props, ref) => {\n let [newTransactions, setNewTransactions] = useState(null);\n let [hoveredTransaction, setHoveredTransaction] = useState(\n props.hoveredTransaction\n );\n let [prevIsAdding, setPrevIsAdding] = useState(false);\n let splitsExpanded = useSplitsExpanded();\n let prevSplitsExpanded = useRef(null);\n\n let tableRef = useRef(null);\n let mergedRef = useMergedRefs(tableRef, ref);\n\n let transactions = useMemo(() => {\n let result;\n if (splitsExpanded.state.transitionId != null) {\n let index = props.transactions.findIndex(\n t => t.id === splitsExpanded.state.transitionId\n );\n result = props.transactions.filter((t, idx) => {\n if (t.parent_id) {\n if (idx >= index) {\n return splitsExpanded.expanded(t.parent_id);\n } else if (prevSplitsExpanded.current) {\n return prevSplitsExpanded.current.expanded(t.parent_id);\n }\n }\n return true;\n });\n } else {\n if (\n prevSplitsExpanded.current &&\n prevSplitsExpanded.current.state.transitionId != null\n ) {\n tableRef.current.anchor();\n tableRef.current.setRowAnimation(false);\n }\n prevSplitsExpanded.current = splitsExpanded;\n\n result = props.transactions.filter(t => {\n if (t.parent_id) {\n return splitsExpanded.expanded(t.parent_id);\n }\n return true;\n });\n }\n\n prevSplitsExpanded.current = splitsExpanded;\n return result;\n }, [props.transactions, splitsExpanded]);\n\n useEffect(() => {\n // If it's anchored that means we've also disabled animations. To\n // reduce the chance for side effect collision, only do this if\n // we've actually anchored it\n if (tableRef.current.isAnchored()) {\n tableRef.current.unanchor();\n tableRef.current.setRowAnimation(true);\n }\n }, [prevSplitsExpanded.current]);\n\n let newNavigator = useTableNavigator(newTransactions, getFields);\n let tableNavigator = useTableNavigator(transactions, getFields);\n let shouldAdd = useRef(false);\n let latestState = useRef({ newTransactions, newNavigator, tableNavigator });\n let savePending = useRef(false);\n let afterSaveFunc = useRef(false);\n // eslint-disable-next-line\n let [_, forceRerender] = useState({});\n\n let selectedItems = useSelectedItems();\n let dispatchSelected = useSelectedDispatch();\n\n useLayoutEffect(() => {\n latestState.current = {\n newTransactions,\n newNavigator,\n tableNavigator,\n transactions: props.transactions\n };\n });\n\n // Derive new transactions from the `isAdding` prop\n if (prevIsAdding !== props.isAdding) {\n if (!prevIsAdding && props.isAdding) {\n setNewTransactions(makeTemporaryTransactions(props.currentAccountId));\n }\n setPrevIsAdding(props.isAdding);\n }\n\n useEffect(() => {\n if (shouldAdd.current) {\n if (newTransactions[0].account == null) {\n props.addNotification({\n type: 'error',\n message: 'Account is a required field'\n });\n newNavigator.onEdit('temp', 'account');\n } else {\n let transactions = latestState.current.newTransactions;\n let lastDate = transactions.length > 0 ? transactions[0].date : null;\n setNewTransactions(\n makeTemporaryTransactions(props.currentAccountId, lastDate)\n );\n newNavigator.onEdit('temp', 'date');\n props.onAdd(transactions);\n }\n shouldAdd.current = false;\n }\n });\n\n useEffect(() => {\n if (savePending.current && afterSaveFunc.current) {\n afterSaveFunc.current(props);\n afterSaveFunc.current = null;\n }\n\n savePending.current = false;\n }, [newTransactions, props.transactions]);\n\n function getFields(item) {\n let fields = [\n 'select',\n 'date',\n 'account',\n 'payee',\n 'notes',\n 'category',\n 'debit',\n 'credit',\n 'cleared'\n ];\n\n fields = item.is_child\n ? ['select', 'payee', 'notes', 'category', 'debit', 'credit']\n : fields.filter(\n f =>\n (props.showAccount || f !== 'account') &&\n (props.showCategory || f !== 'category')\n );\n\n if (isPreviewId(item.id)) {\n fields = ['select', 'cleared'];\n }\n if (isTemporaryId(item.id)) {\n // You can't focus the select/delete button of temporary\n // transactions\n fields = fields.slice(1);\n }\n\n return fields;\n }\n\n function afterSave(func) {\n if (savePending.current) {\n afterSaveFunc.current = func;\n } else {\n func(props);\n }\n }\n\n function onCheckNewEnter(e) {\n const ENTER = 13;\n\n if (e.keyCode === ENTER) {\n if (e.metaKey) {\n e.stopPropagation();\n onAddTemporary();\n } else if (!e.shiftKey) {\n function getLastTransaction(state) {\n let { newTransactions } = state.current;\n return newTransactions[newTransactions.length - 1];\n }\n\n // Right now, the table navigator does some funky stuff with\n // focus, so we want to stop it from handling this event. We\n // still want enter to move up/down normally, so we only stop\n // it if we are on the last transaction (where we are about to\n // do some logic). I don't like this.\n if (newNavigator.editingId === getLastTransaction(latestState).id) {\n e.stopPropagation();\n }\n\n afterSave(() => {\n let lastTransaction = getLastTransaction(latestState);\n let isSplit = lastTransaction.parent_id || lastTransaction.is_parent;\n\n if (\n latestState.current.newTransactions[0].error &&\n newNavigator.editingId === lastTransaction.id\n ) {\n // add split\n onAddSplit(lastTransaction.id);\n } else if (\n (newNavigator.focusedField === 'debit' ||\n newNavigator.focusedField === 'credit') &&\n newNavigator.editingId === lastTransaction.id &&\n (!isSplit || !lastTransaction.error)\n ) {\n onAddTemporary();\n }\n });\n }\n }\n }\n\n function onCheckEnter(e) {\n const ENTER = 13;\n\n if (e.keyCode === ENTER && !e.shiftKey) {\n let { editingId: id, focusedField } = tableNavigator;\n\n afterSave(props => {\n let transactions = latestState.current.transactions;\n let idx = transactions.findIndex(t => t.id === id);\n let parent = getParentTransaction(transactions, idx);\n\n if (\n isLastChild(transactions, idx) &&\n parent &&\n parent.error &&\n focusedField !== 'select'\n ) {\n e.stopPropagation();\n onAddSplit(id);\n }\n });\n }\n }\n\n let onAddTemporary = useCallback(() => {\n shouldAdd.current = true;\n // A little hacky - this forces a rerender which will cause the\n // effect we want to run. We have to wait for all updates to be\n // committed (the input could still be saving a value).\n forceRerender({});\n }, [props.onAdd, newNavigator.onEdit]);\n\n let onSave = useCallback(\n async transaction => {\n savePending.current = true;\n\n if (isTemporaryId(transaction.id)) {\n if (props.onApplyRules) {\n transaction = await props.onApplyRules(transaction);\n }\n\n let newTrans = latestState.current.newTransactions;\n setNewTransactions(updateTransaction(newTrans, transaction).data);\n } else {\n props.onSave(transaction);\n }\n },\n [props.onSave]\n );\n\n let onHover = useCallback(id => {\n setHoveredTransaction(id);\n }, []);\n\n let onDelete = useCallback(id => {\n let temporary = isTemporaryId(id);\n\n if (temporary) {\n let newTrans = latestState.current.newTransactions;\n\n if (id === newTrans[0].id) {\n // You can never delete the parent new transaction\n return;\n }\n\n setNewTransactions(deleteTransaction(newTrans, id).data);\n }\n }, []);\n\n let onSplit = useMemo(() => {\n return id => {\n if (isTemporaryId(id)) {\n let { newNavigator } = latestState.current;\n let newTrans = latestState.current.newTransactions;\n let { data, diff } = splitTransaction(newTrans, id);\n setNewTransactions(data);\n\n // TODO: what is this for???\n // if (newTrans[0].amount == null) {\n // newNavigator.onEdit(newTrans[0].id, 'debit');\n // } else {\n newNavigator.onEdit(\n diff.added[0].id,\n latestState.current.newNavigator.focusedField\n );\n // }\n } else {\n let trans = latestState.current.transactions.find(t => t.id === id);\n let newId = props.onSplit(id);\n\n splitsExpanded.dispatch({ type: 'open-split', id: trans.id });\n\n let { tableNavigator } = latestState.current;\n if (trans.amount == null) {\n tableNavigator.onEdit(trans.id, 'debit');\n } else {\n tableNavigator.onEdit(newId, tableNavigator.focusedField);\n }\n }\n };\n }, [props.onSplit, splitsExpanded.dispatch]);\n\n let onAddSplit = useCallback(\n id => {\n if (isTemporaryId(id)) {\n let newTrans = latestState.current.newTransactions;\n let { data, diff } = addSplitTransaction(newTrans, id);\n setNewTransactions(data);\n newNavigator.onEdit(\n diff.added[0].id,\n latestState.current.newNavigator.focusedField\n );\n } else {\n let newId = props.onAddSplit(id);\n tableNavigator.onEdit(\n newId,\n latestState.current.tableNavigator.focusedField\n );\n }\n },\n [props.onAddSplit]\n );\n\n function onCloseAddTransaction() {\n setNewTransactions(makeTemporaryTransactions(props.currentAccountId));\n props.onCloseAddTransaction();\n }\n\n let onToggleSplit = useCallback(\n id => splitsExpanded.dispatch({ type: 'toggle-split', id }),\n [splitsExpanded.dispatch]\n );\n\n return (\n // eslint-disable-next-line\n <TransactionTable_\n tableRef={mergedRef}\n {...props}\n transactions={transactions}\n selectedItems={selectedItems}\n hoveredTransaction={hoveredTransaction}\n isExpanded={splitsExpanded.expanded}\n onHover={onHover}\n onSave={onSave}\n onDelete={onDelete}\n onSplit={onSplit}\n onCheckNewEnter={onCheckNewEnter}\n onCheckEnter={onCheckEnter}\n onAddTemporary={onAddTemporary}\n onAddSplit={onAddSplit}\n onCloseAddTransaction={onCloseAddTransaction}\n onToggleSplit={onToggleSplit}\n newTransactions={newTransactions}\n tableNavigator={tableNavigator}\n newNavigator={newNavigator}\n />\n );\n});\n","import { useMemo } from 'react';\n\nexport function useMergedRefs(ref1, ref2) {\n return useMemo(() => {\n function ref(value) {\n [ref1, ref2].forEach(ref => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n ref.current = value;\n }\n });\n }\n\n return ref;\n }, [ref1, ref2]);\n}\n","import React, {\n useRef,\n useEffect,\n useCallback,\n useLayoutEffect,\n useMemo\n} from 'react';\nimport { useDispatch } from 'react-redux';\nimport { TransactionTable } from './TransactionsTable';\nimport lively from '@jlongster/lively';\nimport {\n splitTransaction,\n updateTransaction,\n addSplitTransaction,\n realizeTempTransactions,\n applyTransactionDiff\n} from 'loot-core/src/shared/transactions';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { pushModal } from 'loot-core/src/client/actions/modals';\nimport { getChangedValues, applyChanges } from 'loot-core/src/shared/util';\nconst uuid = require('loot-core/src/platform/uuid');\n\n// When data changes, there are two ways to update the UI:\n//\n// * Optimistic updates: we apply the needed updates to local data\n// and rerender immediately, and send off the changes to the\n// server. Currently, it assumes the server request is successful.\n// If it fails the user will see a generic error which isn't\n// great, but since the server is local a failure is very\n// unlikely. Still, we should notify errors better.\n//\n// * A full refetch and rerender: this is needed when applying\n// updates locally is too complex. Usually this happens when\n// changing a field that data is sorted on: we're not going\n// to resort the data in memory, we want to rely on the database\n// for that. So we need to do a full refresh.\n//\n// When writing updates, it's up to you to decide which one to do.\n// Optimistic updates feel snappy, but they might show data\n// differently than a full refresh. It's up to you to decide which\n// one to use when doing updates.\n\nasync function saveDiff(diff) {\n let remoteUpdates = await send('transactions-batch-update', {\n ...diff,\n learnCategories: true\n });\n if (remoteUpdates.length > 0) {\n return { updates: remoteUpdates };\n }\n return {};\n}\n\nasync function saveDiffAndApply(diff, changes, onChange) {\n let remoteDiff = await saveDiff(diff);\n onChange(\n applyTransactionDiff(changes.newTransaction, remoteDiff),\n applyChanges(remoteDiff, changes.data)\n );\n}\n\nexport default function TransactionList({\n tableRef,\n transactions,\n allTransactions,\n loadMoreTransactions,\n account,\n accounts,\n categoryGroups,\n payees,\n balances,\n showAccount,\n headerContent,\n animated,\n isAdding,\n isNew,\n isMatched,\n isFiltered,\n dateFormat,\n addNotification,\n renderEmpty,\n onChange,\n onRefetch,\n onRefetchUpToRow,\n onCloseAddTransaction,\n onManagePayees,\n onCreatePayee\n}) {\n let dispatch = useDispatch();\n let table = useRef();\n let transactionsLatest = useRef();\n let scrollTo = useRef();\n\n // useEffect(() => {\n // if (scrollTo.current) {\n // // table.current.scrollTo(scrollTo.current);\n // }\n // }, [transactions]);\n\n useEffect(clearScrollTo);\n\n useLayoutEffect(() => {\n transactionsLatest.current = transactions;\n }, [transactions]);\n\n function clearScrollTo() {\n scrollTo.current = null;\n }\n\n let onAdd = useCallback(async newTransactions => {\n newTransactions = realizeTempTransactions(newTransactions);\n\n await saveDiff({ added: newTransactions });\n onRefetch();\n }, []);\n\n let onSave = useCallback(async transaction => {\n let changes = updateTransaction(transactionsLatest.current, transaction);\n\n if (changes.diff.updated.length > 0) {\n let dateChanged = !!changes.diff.updated[0].date;\n if (dateChanged) {\n // Make sure it stays at the top of the list of transactions\n // for that date\n changes.diff.updated[0].sort_order = Date.now();\n await saveDiff(changes.diff);\n onRefetch();\n } else {\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n }\n }\n }, []);\n\n let onAddSplit = useCallback(id => {\n const changes = addSplitTransaction(transactionsLatest.current, id);\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n return changes.diff.added[0].id;\n }, []);\n\n let onSplit = useCallback(id => {\n const changes = splitTransaction(transactionsLatest.current, id);\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n return changes.diff.added[0].id;\n }, []);\n\n let onApplyRules = useCallback(async transaction => {\n let afterRules = await send('rules-run', { transaction });\n let diff = getChangedValues(transaction, afterRules);\n\n let newTransaction = { ...transaction };\n if (diff) {\n Object.keys(diff).forEach(field => {\n if (\n newTransaction[field] == null ||\n newTransaction[field] === '' ||\n newTransaction[field] === 0\n ) {\n newTransaction[field] = diff[field];\n }\n });\n }\n return newTransaction;\n }, []);\n\n return (\n <TransactionTable\n ref={tableRef}\n transactions={allTransactions}\n loadMoreTransactions={loadMoreTransactions}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n balances={balances}\n showAccount={showAccount}\n showCategory={true}\n animated={animated}\n currentAccountId={account && account.id}\n isAdding={isAdding}\n isNew={isNew}\n isMatched={isMatched}\n isFiltered={isFiltered}\n dateFormat={dateFormat}\n addNotification={addNotification}\n headerContent={headerContent}\n renderEmpty={renderEmpty}\n onSave={onSave}\n onApplyRules={onApplyRules}\n onSplit={onSplit}\n onCloseAddTransaction={onCloseAddTransaction}\n onAdd={onAdd}\n onAddSplit={onAddSplit}\n onManagePayees={onManagePayees}\n onCreatePayee={onCreatePayee}\n onScroll={clearScrollTo}\n style={{ backgroundColor: 'white' }}\n />\n );\n}\n","import { integerToAmount, amountToInteger, currencyToAmount } from './util';\n\n// For now, this info is duplicated from the backend. Figure out how\n// to share it later.\nexport const TYPE_INFO = {\n date: {\n ops: ['is', 'isapprox', 'gt', 'gte', 'lt', 'lte'],\n nullable: false\n },\n id: {\n ops: ['is', 'contains', 'oneOf'],\n nullable: true\n },\n string: {\n ops: ['is', 'contains', 'oneOf'],\n nullable: false\n },\n number: {\n ops: ['is', 'isapprox', 'isbetween', 'gt', 'gte', 'lt', 'lte'],\n nullable: false\n },\n boolean: {\n ops: ['is'],\n nullable: false\n }\n};\n\nexport const FIELD_TYPES = new Map(\n Object.entries({\n imported_payee: 'string',\n payee: 'id',\n date: 'date',\n notes: 'string',\n amount: 'number',\n amountInflow: 'number',\n amountOutfow: 'number',\n category: 'id',\n account: 'id',\n cleared: 'boolean'\n })\n);\n\nexport function mapField(field, opts) {\n opts = opts || {};\n\n switch (field) {\n case 'imported_payee':\n return 'imported payee';\n case 'amount':\n if (opts.inflow) {\n return 'amount (inflow)';\n } else if (opts.outflow) {\n return 'amount (outflow)';\n }\n return 'amount';\n case 'amount-inflow':\n return 'amount (inflow)';\n case 'amount-outflow':\n return 'amount (outflow)';\n default:\n return field;\n }\n}\n\nexport function friendlyOp(op, type) {\n switch (op) {\n case 'oneOf':\n return 'one of';\n case 'is':\n return 'is';\n case 'isapprox':\n return 'is approx';\n case 'isbetween':\n return 'is between';\n case 'contains':\n return 'contains';\n case 'gt':\n if (type === 'date') {\n return 'is after';\n }\n return 'is greater than';\n case 'gte':\n if (type === 'date') {\n return 'is after or equals';\n }\n return 'is greater than or equals';\n case 'lt':\n if (type === 'date') {\n return 'is before';\n }\n return 'is less than';\n case 'lte':\n if (type === 'date') {\n return 'is before or equals';\n }\n return 'is less than or equals';\n case 'true':\n return 'is true';\n case 'false':\n return 'is false';\n case 'set':\n return 'set';\n case 'link-schedule':\n return 'link schedule';\n default:\n return '';\n }\n}\n\nexport function deserializeField(field) {\n if (field === 'amount-inflow') {\n return { field: 'amount', options: { inflow: true } };\n } else if (field === 'amount-outflow') {\n return { field: 'amount', options: { outflow: true } };\n } else {\n return { field };\n }\n}\n\nexport function getFieldError(type) {\n switch (type) {\n case 'date-format':\n return 'Invalid date format';\n case 'no-null':\n case 'no-empty-array':\n case 'no-empty-string':\n return 'Value cannot be empty';\n case 'not-number':\n return 'Value must be a number';\n case 'invalid-field':\n return 'Please choose a valid field for this type of rule';\n default:\n return 'Internal error, sorry! Contact help@actualbudget.com';\n }\n}\n\nexport function sortNumbers(num1, num2) {\n if (num1 < num2) {\n return [num1, num2];\n }\n return [num2, num1];\n}\n\nexport function parse(item) {\n switch (item.type) {\n case 'number': {\n let parsed = item.value;\n if (item.field === 'amount' && item.op !== 'isbetween') {\n parsed = integerToAmount(parsed);\n }\n return { ...item, value: parsed };\n }\n case 'string': {\n let parsed = item.value == null ? '' : item.value;\n return { ...item, value: parsed };\n }\n default:\n }\n\n return { ...item, error: null };\n}\n\nexport function unparse({ error, inputKey, ...item }) {\n switch (item.type) {\n case 'number': {\n let unparsed = item.value;\n if (item.field === 'amount' && item.op !== 'isbetween') {\n unparsed = amountToInteger(unparsed);\n }\n\n return { ...item, value: unparsed };\n }\n case 'string': {\n let unparsed = item.value == null ? '' : item.value;\n return { ...item, value: unparsed };\n }\n default:\n }\n\n return item;\n}\n\nexport function makeValue(value, cond) {\n switch (cond.type) {\n case 'number': {\n if (cond.op !== 'isbetween') {\n return {\n ...cond,\n error: null,\n value: value ? currencyToAmount(value) || 0 : 0\n };\n }\n break;\n }\n default:\n }\n\n return { ...cond, error: null, value };\n}\n\nexport function getApproxNumberThreshold(number) {\n return (Math.abs(number) * 0.075) | 0;\n}\n","import React from 'react';\n\nconst SvgSettingsSliderAlternate = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M4.5 17.5h6.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 0 0 0-2h-1.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2zm10-2.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zM19.5 6.5h-6.646a3.5 3.5 0 0 0-6.708 0H4.5a1 1 0 0 0 0 2h1.646a3.5 3.5 0 0 0 6.708 0H19.5a1 1 0 1 0 0-2zM9.5 9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgSettingsSliderAlternate;\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from 'react';\nimport { css } from 'glamor';\n\nfunction Subtract({ width, height, style, color = 'black', ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 24 24\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill={color}\n className=\"path\"\n className=\"path\"\n d=\"M23,11.5 L23,11.5 L23,11.5 C23,12.3284271 22.3284271,13 21.5,13 L1.5,13 L1.5,13 C0.671572875,13 1.01453063e-16,12.3284271 0,11.5 L0,11.5 L0,11.5 C-1.01453063e-16,10.6715729 0.671572875,10 1.5,10 L21.5,10 L21.5,10 C22.3284271,10 23,10.6715729 23,11.5 Z\"\n />\n </svg>\n );\n}\n\nexport default Subtract;\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction Add({ width, height, style, color = \"black\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 24 24\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill={color}\n className=\"path\"\n className=\"path\"\n d=\"M23,11.5 L23,11.5 L23,11.5 C23,12.3284271 22.3284271,13 21.5,13 L1.5,13 L1.5,13 C0.671572875,13 1.01453063e-16,12.3284271 0,11.5 L0,11.5 L0,11.5 C-1.01453063e-16,10.6715729 0.671572875,10 1.5,10 L21.5,10 L21.5,10 C22.3284271,10 23,10.6715729 23,11.5 Z\"\n />\n <path\n fill={color}\n className=\"path\"\n className=\"path\"\n d=\"M11.5,23 C10.6715729,23 10,22.3284271 10,21.5 L10,1.5 C10,0.671572875 10.6715729,1.52179594e-16 11.5,0 C12.3284271,-1.52179594e-16 13,0.671572875 13,1.5 L13,21.5 C13,22.3284271 12.3284271,23 11.5,23 Z\"\n />\n </svg>\n );\n}\n\nexport default Add;\n","import PropTypes from 'prop-types';\nimport React, { useEffect, useReducer, useState } from 'react';\nimport * as d from 'date-fns';\nimport { useSelector } from 'react-redux';\nimport { parse as parseDate } from 'date-fns';\nimport { sendCatch } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { getRecurringDescription } from 'loot-core/src/shared/schedules';\nimport DateSelect from './DateSelect';\nimport {\n Button,\n Select,\n Input,\n Tooltip,\n View,\n Text,\n Stack\n} from '../components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { useTooltip } from 'loot-design/src/components/tooltips';\nimport SubtractIcon from 'loot-design/src/svg/Subtract';\nimport AddIcon from 'loot-design/src/svg/Add';\n\nconst DATE_FORMAT = 'yyyy-MM-dd';\n\n// ex: There is no 6th Friday of the Month\nconst MAX_DAY_OF_WEEK_INTERVAL = 5;\n\nconst FREQUENCY_OPTIONS = [\n { id: 'weekly', name: 'Weeks' },\n { id: 'monthly', name: 'Months' },\n { id: 'yearly', name: 'Years' }\n];\n\nconst DAY_OF_MONTH_OPTIONS = [...Array(31).keys()].map(day => day + 1);\n\nconst DAY_OF_WEEK_OPTIONS = [\n { id: 'SU', name: 'Sunday' },\n { id: 'MO', name: 'Monday' },\n { id: 'TU', name: 'Tuesday' },\n { id: 'WE', name: 'Wednesday' },\n { id: 'TH', name: 'Thursday' },\n { id: 'FR', name: 'Friday' },\n { id: 'SA', name: 'Saturday' }\n];\n\nfunction parsePatternValue(value) {\n if (value === 'last') {\n return -1;\n }\n return Number(value);\n}\n\nfunction parseConfig(config) {\n return (\n config || {\n start: monthUtils.currentDay(),\n interval: 1,\n frequency: 'monthly',\n patterns: [createMonthlyRecurrence(monthUtils.currentDay())]\n }\n );\n}\n\nfunction unparseConfig(parsed) {\n return {\n ...parsed,\n interval: validInterval(parsed.interval)\n };\n}\n\nfunction createMonthlyRecurrence(startDate) {\n return {\n value: parseInt(monthUtils.format(startDate, 'd')),\n type: 'day'\n };\n}\n\nfunction boundedRecurrence({ field, value, recurrence }) {\n if (\n (field === 'value' &&\n recurrence.type !== 'day' &&\n value > MAX_DAY_OF_WEEK_INTERVAL) ||\n (field === 'type' &&\n value !== 'day' &&\n recurrence.value > MAX_DAY_OF_WEEK_INTERVAL)\n ) {\n return { [field]: value, value: MAX_DAY_OF_WEEK_INTERVAL };\n }\n return { [field]: value };\n}\n\nfunction reducer(state, action) {\n switch (action.type) {\n case 'replace-config':\n return { ...state, config: action.config };\n case 'change-field':\n return {\n ...state,\n config: {\n ...state.config,\n [action.field]: action.value,\n patterns:\n state.config.frequency !== 'monthly' ? [] : state.config.patterns\n }\n };\n case 'update-recurrence':\n const index = state.config.patterns.indexOf(action.recurrence);\n return {\n ...state,\n config: {\n ...state.config,\n patterns: state.config.patterns.map(p =>\n p === action.recurrence\n ? { ...action.recurrence, ...boundedRecurrence(action) }\n : p\n )\n }\n };\n case 'add-recurrence':\n return {\n ...state,\n config: {\n ...state.config,\n patterns: [\n ...(state.config.patterns || []),\n createMonthlyRecurrence(state.config.start)\n ]\n }\n };\n case 'remove-recurrence':\n return {\n ...state,\n config: {\n ...state.config,\n patterns: state.config.patterns.filter(p => p !== action.recurrence)\n }\n };\n default:\n return state;\n }\n}\n\nfunction SchedulePreview({ previewDates }) {\n if (!previewDates) {\n return null;\n }\n\n let dateFormat = useSelector(\n state => state.prefs.local.dateFormat || 'MM/dd/yyyy'\n );\n dateFormat = dateFormat.replace('MM', 'M').replace('dd', 'd');\n\n let content = null;\n if (typeof previewDates === 'string') {\n content = <Text>{previewDates}</Text>;\n } else {\n content = (\n <View>\n <Text style={{ fontWeight: 600 }}>Upcoming dates</Text>\n <Stack direction=\"row\" spacing={4} style={{ marginTop: 10 }}>\n {previewDates.map(d => (\n <View>\n <Text>{monthUtils.format(d, dateFormat)}</Text>\n <Text>{monthUtils.format(d, 'EEEE')}</Text>\n </View>\n ))}\n </Stack>\n </View>\n );\n }\n\n return (\n <>\n <Stack\n direction=\"column\"\n spacing={1}\n style={{ marginTop: 15, color: colors.n4 }}\n >\n {content}\n </Stack>\n </>\n );\n}\n\nfunction validInterval(interval) {\n const intInterval = parseInt(interval);\n return Number.isInteger(intInterval) && intInterval > 0 ? intInterval : 1;\n}\n\nfunction MonthlyPatterns({ config, dispatch }) {\n let updateRecurrence = (recurrence, field, value) =>\n dispatch({ type: 'update-recurrence', recurrence, field, value });\n\n return (\n <Stack spacing={2} style={{ marginTop: 10 }}>\n {config.patterns.map((recurrence, idx) => (\n <View\n key={idx}\n style={{\n display: 'flex',\n flexDirection: 'row'\n }}\n >\n <Select\n style={{ marginRight: 10 }}\n value={recurrence.value}\n onChange={e =>\n updateRecurrence(\n recurrence,\n 'value',\n parsePatternValue(e.target.value)\n )\n }\n >\n <option value={-1}>Last</option>\n <option disabled>---</option>\n {DAY_OF_MONTH_OPTIONS.map(opt => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </Select>\n <Select\n style={{ marginRight: 10 }}\n value={recurrence.type}\n onChange={e => updateRecurrence(recurrence, 'type', e.target.value)}\n >\n <option value=\"day\">Day</option>\n <option disabled>---</option>\n {DAY_OF_WEEK_OPTIONS.map(opt => (\n <option key={opt.id} value={opt.id}>\n {opt.name}\n </option>\n ))}\n </Select>\n <Button\n bare\n style={{ padding: 7 }}\n onClick={() =>\n dispatch({\n type: 'remove-recurrence',\n recurrence: recurrence\n })\n }\n >\n <SubtractIcon style={{ width: 8, height: 8 }} />\n </Button>\n <Button\n bare\n style={{ padding: 7, marginLeft: 5 }}\n onClick={() => dispatch({ type: 'add-recurrence' })}\n >\n <AddIcon style={{ width: 10, height: 10 }} />\n </Button>\n </View>\n ))}\n </Stack>\n );\n}\n\nfunction RecurringScheduleTooltip({ config: currentConfig, onClose, onSave }) {\n let [previewDates, setPreviewDates] = useState(null);\n\n let [state, dispatch] = useReducer(reducer, {\n config: parseConfig(currentConfig)\n });\n\n let dateFormat = useSelector(\n state => state.prefs.local.dateFormat || 'MM/dd/yyyy'\n );\n\n useEffect(() => {\n dispatch({\n type: 'replace-config',\n config: parseConfig(currentConfig)\n });\n }, [currentConfig]);\n\n let { config } = state;\n\n let updateField = (field, value) =>\n dispatch({ type: 'change-field', field, value });\n\n useEffect(() => {\n async function run() {\n let { data, error } = await sendCatch('schedule/get-upcoming-dates', {\n config: unparseConfig(config),\n count: 4\n });\n setPreviewDates(error ? 'Invalid rule' : data);\n }\n run();\n }, [config]);\n\n if (previewDates == null) {\n return null;\n }\n\n return (\n <Tooltip\n style={{ padding: 10, width: 380 }}\n offset={1}\n position=\"bottom-left\"\n onClose={onClose}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <label htmlFor=\"start\" style={{ marginRight: 5 }}>\n Starts:\n </label>\n <DateSelect\n id=\"start\"\n inputProps={{ placeholder: 'Start Date' }}\n value={config.start}\n onSelect={value => updateField('start', value)}\n containerProps={{ style: { width: 100 } }}\n dateFormat={dateFormat}\n />\n </div>\n <Stack\n direction=\"row\"\n align=\"center\"\n justify=\"flex-start\"\n style={{ marginTop: 10 }}\n spacing={2}\n >\n <Text style={{ whiteSpace: 'nowrap' }}>Repeat every</Text>\n <Input\n id=\"interval\"\n style={{ width: 40 }}\n type=\"text\"\n onBlur={e => updateField('interval', e.target.value)}\n onEnter={e => updateField('interval', e.target.value)}\n defaultValue={config.interval || 1}\n ></Input>\n <Select\n onChange={e => updateField('frequency', e.target.value)}\n value={config.frequency}\n style={{ flex: 0 }}\n >\n {FREQUENCY_OPTIONS.map(opt => (\n <option key={opt.id} value={opt.id}>\n {opt.name}\n </option>\n ))}\n </Select>\n {config.frequency === 'monthly' &&\n (config.patterns == null || config.patterns.length === 0) ? (\n <Button onClick={() => dispatch({ type: 'add-recurrence' })}>\n Add specific days\n </Button>\n ) : null}\n </Stack>\n {config.frequency === 'monthly' &&\n config.patterns &&\n config.patterns.length > 0 && (\n <MonthlyPatterns config={config} dispatch={dispatch} />\n )}\n <SchedulePreview previewDates={previewDates} />\n <div\n style={{ display: 'flex', marginTop: 15, justifyContent: 'flex-end' }}\n >\n <Button onClick={onClose}>Cancel</Button>\n <Button\n onClick={() => onSave(unparseConfig(config))}\n primary\n style={{ marginLeft: 10 }}\n >\n Apply\n </Button>\n </div>\n </Tooltip>\n );\n}\n\nexport default function RecurringSchedulePicker({\n value,\n buttonStyle,\n onChange\n}) {\n let { isOpen, close, getOpenEvents } = useTooltip();\n\n function onSave(config) {\n onChange(config);\n close();\n }\n\n return (\n <View>\n <Button {...getOpenEvents()} style={[{ textAlign: 'left' }, buttonStyle]}>\n {value ? getRecurringDescription(value) : 'No recurring date'}\n </Button>\n {isOpen && (\n <RecurringScheduleTooltip\n config={value}\n onClose={close}\n onSave={onSave}\n />\n )}\n </View>\n );\n}\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { format as formatDate, parse as parseDate, parseISO } from 'date-fns';\nimport { dayFromDate, getMonthYearFormat } from 'loot-core/src/shared/months';\nimport { View, Input } from 'loot-design/src/components/common';\nimport PayeeAutocomplete from 'loot-design/src/components/PayeeAutocomplete';\nimport AccountAutocomplete from 'loot-design/src/components/AccountAutocomplete';\nimport Autocomplete from 'loot-design/src/components/Autocomplete';\nimport CategoryAutocomplete from 'loot-design/src/components/CategorySelect';\nimport DateSelect from 'loot-design/src/components/DateSelect';\nimport RecurringSchedulePicker from 'loot-design/src/components/RecurringSchedulePicker';\n\nexport default function GenericInput({\n field,\n subfield,\n type,\n multi,\n value,\n inputRef,\n style,\n onChange\n}) {\n let { payees, accounts, categoryGroups, dateFormat } = useSelector(state => {\n return {\n payees: state.queries.payees,\n accounts: state.queries.accounts,\n categoryGroups: state.queries.categories.grouped,\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy'\n };\n });\n\n // This makes the UI more resilient in case of faulty data\n if (multi && !Array.isArray(value)) {\n value = [];\n } else if (!multi && Array.isArray(value)) {\n return null;\n }\n\n let showPlaceholder = multi ? value.length === 0 : true;\n\n let content;\n switch (type) {\n case 'id':\n switch (field) {\n case 'payee':\n if (payees.length > 0) {\n content = (\n <PayeeAutocomplete\n payees={payees}\n accounts={accounts}\n multi={multi}\n showMakeTransfer={false}\n openOnFocus={false}\n value={value}\n onSelect={onChange}\n inputProps={{\n inputRef,\n ...(showPlaceholder ? { placeholder: 'nothing' } : null)\n }}\n />\n );\n }\n break;\n\n case 'account':\n content = (\n <AccountAutocomplete\n accounts={accounts}\n value={value}\n multi={multi}\n openOnFocus={false}\n onSelect={onChange}\n inputProps={{\n inputRef,\n ...(showPlaceholder ? { placeholder: 'nothing' } : null)\n }}\n />\n );\n break;\n\n case 'category':\n content = (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={value}\n multi={multi}\n openOnFocus={false}\n onSelect={onChange}\n inputProps={{\n inputRef,\n ...(showPlaceholder ? { placeholder: 'nothing' } : null)\n }}\n />\n );\n break;\n\n default:\n }\n break;\n\n case 'date':\n switch (subfield) {\n case 'month':\n content = (\n <Input\n inputRef={inputRef}\n defaultValue={value || ''}\n placeholder={getMonthYearFormat(dateFormat).toLowerCase()}\n onEnter={e => onChange(e.target.value)}\n onBlur={e => onChange(e.target.value)}\n />\n );\n break;\n\n case 'year':\n content = (\n <Input\n inputRef={inputRef}\n defaultValue={value || ''}\n placeholder={'yyyy'}\n onEnter={e => onChange(e.target.value)}\n onBlur={e => onChange(e.target.value)}\n />\n );\n break;\n\n default:\n if (value && value.frequency) {\n content = (\n <RecurringSchedulePicker\n value={value}\n buttonStyle={{ justifyContent: 'flex-start' }}\n onChange={onChange}\n />\n );\n } else {\n content = (\n <DateSelect\n value={value}\n dateFormat={dateFormat}\n openOnFocus={false}\n inputRef={inputRef}\n inputProps={{ placeholder: dateFormat.toLowerCase() }}\n onSelect={onChange}\n />\n );\n }\n break;\n }\n break;\n\n default:\n if (multi) {\n content = (\n <Autocomplete\n multi={true}\n suggestions={[]}\n value={value}\n inputProps={{ inputRef }}\n onSelect={onChange}\n />\n );\n } else {\n content = (\n <Input\n inputRef={inputRef}\n defaultValue={value || ''}\n placeholder=\"nothing\"\n onEnter={e => onChange(e.target.value)}\n onBlur={e => onChange(e.target.value)}\n />\n );\n }\n break;\n }\n\n return <View style={[{ flex: 1 }, style]}>{content}</View>;\n}\n","import React from 'react';\n\nconst SvgInformationOutline = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm12.73-1.41A8 8 0 1 0 4.34 4.34a8 8 0 0 0 11.32 11.32zM9 11V9h2v6H9v-4zm0-6h2v2H9V5z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgInformationOutline;\n","import React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n useImperativeHandle\n} from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { css } from 'glamor';\nimport { format as formatDate, parseISO } from 'date-fns';\nimport * as undo from 'loot-core/src/platform/client/undo';\nimport * as actions from 'loot-core/src/client/actions';\nimport { initiallyLoadPayees } from 'loot-core/src/client/actions/queries';\nimport q from 'loot-core/src/client/query-helpers';\nimport { liveQueryContext } from 'loot-core/src/client/query-hooks';\nimport {\n View,\n Text,\n Modal,\n Button,\n Stack,\n ExternalLink\n} from 'loot-design/src/components/common';\nimport {\n SelectCell,\n Row,\n Field,\n Cell,\n CellButton,\n TableHeader,\n useTableNavigator\n} from 'loot-design/src/components/table';\nimport useSelected, {\n useSelectedDispatch,\n useSelectedItems,\n SelectedProvider\n} from 'loot-design/src/components/useSelected';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { send, listen, unlisten } from 'loot-core/src/platform/client/fetch';\nimport { pushModal } from 'loot-core/src/client/actions/modals';\nimport { mapField, friendlyOp } from 'loot-core/src/shared/rules';\nimport ArrowRight from 'loot-design/src/svg/RightArrow2';\nimport InformationOutline from 'loot-design/src/svg/v1/InformationOutline';\nimport ExpandArrow from 'loot-design/src/svg/ExpandArrow';\nimport { colors, styles } from 'loot-design/src/style';\nimport { dayFromDate, getMonthYearFormat } from 'loot-core/src/shared/months';\nimport {\n extractScheduleConds,\n getRecurringDescription\n} from 'loot-core/src/shared/schedules';\nimport { getPayeesById } from 'loot-core/src/client/reducers/queries';\n\nlet SchedulesQuery = liveQueryContext(q('schedules').select('*'));\n\nexport function Value({\n value,\n field,\n inline = false,\n data: dataProp,\n describe = x => x.name\n}) {\n let { data, dateFormat } = useSelector(state => {\n let data;\n if (dataProp) {\n data = dataProp;\n } else {\n switch (field) {\n case 'payee':\n data = state.queries.payees;\n break;\n case 'category':\n data = state.queries.categories.list;\n break;\n case 'account':\n data = state.queries.accounts;\n break;\n default:\n data = [];\n }\n }\n\n return {\n data,\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy'\n };\n });\n let [expanded, setExpanded] = useState(false);\n\n function onExpand(e) {\n e.preventDefault();\n setExpanded(true);\n }\n\n function formatValue(value) {\n if (value == null || value === '') {\n return '(nothing)';\n } else if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n } else {\n if (field === 'amount') {\n return integerToCurrency(value);\n } else if (field === 'date') {\n if (value) {\n if (value.frequency) {\n return getRecurringDescription(value);\n }\n return formatDate(parseISO(value), dateFormat);\n }\n return null;\n } else if (field === 'month') {\n return value\n ? formatDate(parseISO(value), getMonthYearFormat(dateFormat))\n : null;\n } else if (field === 'year') {\n return value ? formatDate(parseISO(value), 'yyyy') : null;\n } else {\n let name = value;\n if (data) {\n let item = data.find(item => item.id === value);\n if (item) {\n name = describe(item);\n }\n }\n return name;\n }\n }\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return <Text style={{ color: colors.p4 }}>(empty)</Text>;\n } else if (value.length === 1) {\n return (\n <Text>\n [<Text style={{ color: colors.p4 }}>{formatValue(value[0])}</Text>]\n </Text>\n );\n }\n\n let displayed = value;\n if (!expanded && value.length > 4) {\n displayed = value.slice(0, 3);\n }\n let numHidden = value.length - displayed.length;\n return (\n <Text style={{ color: colors.n3 }}>\n [\n {displayed.map((v, i) => {\n let text = <Text style={{ color: colors.p4 }}>{formatValue(v)}</Text>;\n let spacing;\n if (inline) {\n spacing = i !== 0 ? ' ' : '';\n } else {\n spacing = (\n <>\n {i === 0 && <br />}\n &nbsp;&nbsp;\n </>\n );\n }\n\n return (\n <Text key={i}>\n {spacing}\n {text}\n {i === value.length - 1 ? '' : ','}\n {!inline && <br />}\n </Text>\n );\n })}\n {// prettier-ignore\n numHidden > 0 && (\n <Text style={{ color: colors.p4 }}>\n &nbsp;&nbsp;\n { // eslint-disable-next-line\n }<a\n href=\"#\"\n onClick={onExpand}\n {...css({\n color: colors.p4,\n textDecoration: 'none',\n ':hover': { textDecoration: 'underline' }\n })}\n >\n {numHidden} more items...\n </a>\n {!inline && <br />}\n </Text>\n )}\n ]\n </Text>\n );\n } else if (value && value.num1 != null && value.num2 != null) {\n // An \"in between\" type\n return (\n <Text>\n <Text style={{ color: colors.p4 }}>{formatValue(value.num1)}</Text> and{' '}\n <Text style={{ color: colors.p4 }}>{formatValue(value.num2)}</Text>\n </Text>\n );\n } else {\n return <Text style={{ color: colors.p4 }}>{formatValue(value)}</Text>;\n }\n}\n\nexport function ConditionExpression({\n field,\n op,\n value,\n options,\n stage,\n style\n}) {\n return (\n <View\n style={[\n {\n display: 'block',\n maxWidth: '100%',\n backgroundColor: colors.n10,\n borderRadius: 4,\n padding: '3px 5px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n style\n ]}\n >\n <Text style={{ color: colors.p4 }}>{mapField(field, options)}</Text>{' '}\n <Text style={{ color: colors.n3 }}>{friendlyOp(op)}</Text>{' '}\n <Value value={value} field={field} />\n </View>\n );\n}\n\nfunction ScheduleValue({ value }) {\n let payees = useSelector(state => state.queries.payees);\n let byId = getPayeesById(payees);\n let { data: schedules } = SchedulesQuery.useQuery();\n\n return (\n <Value\n value={value}\n field=\"rule\"\n data={schedules}\n describe={s => {\n let { payee } = extractScheduleConds(s._conditions);\n return payee\n ? `${byId[payee.value].name} (${s.next_date})`\n : `Next: ${s.next_date}`;\n }}\n />\n );\n}\n\nexport function ActionExpression({ field, op, value, options, style }) {\n return (\n <View\n style={[\n {\n display: 'block',\n maxWidth: '100%',\n backgroundColor: colors.n10,\n borderRadius: 4,\n padding: '3px 5px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n style\n ]}\n >\n {op === 'set' ? (\n <>\n <Text style={{ color: colors.n3 }}>{friendlyOp(op)}</Text>{' '}\n <Text style={{ color: colors.p4 }}>{mapField(field, options)}</Text>{' '}\n <Text style={{ color: colors.n3 }}>to </Text>\n <Value value={value} field={field} />\n </>\n ) : op === 'link-schedule' ? (\n <>\n <Text style={{ color: colors.n3 }}>{friendlyOp(op)}</Text>{' '}\n <ScheduleValue value={value} />\n </>\n ) : null}\n </View>\n );\n}\n\nlet Rule = React.memo(\n ({\n rule,\n hovered,\n selected,\n editing,\n focusedField,\n onHover,\n onEdit,\n onEditRule\n }) => {\n let dispatch = useDispatch();\n let dispatchSelected = useSelectedDispatch();\n let borderColor = selected ? colors.b8 : colors.border;\n let backgroundFocus = hovered || focusedField === 'select';\n\n return (\n <Row\n height=\"auto\"\n borderColor={borderColor}\n backgroundColor={\n selected ? colors.selected : backgroundFocus ? colors.hover : 'white'\n }\n style={{ fontSize: 13, zIndex: editing || selected ? 101 : 'auto' }}\n collapsed=\"true\"\n onMouseEnter={() => onHover && onHover(rule.id)}\n onMouseLeave={() => onHover && onHover(null)}\n >\n <SelectCell\n exposed={hovered || selected || editing}\n focused={focusedField === 'select'}\n onSelect={() => {\n dispatchSelected({ type: 'select', id: rule.id });\n }}\n onEdit={() => onEdit(rule.id, 'select')}\n selected={selected}\n />\n\n <Cell name=\"stage\" width={50} plain style={{ color: colors.n5 }}>\n {rule.stage && (\n <View\n style={{\n alignSelf: 'flex-start',\n margin: 5,\n backgroundColor: colors.b10,\n color: colors.b1,\n borderRadius: 4,\n padding: '3px 5px'\n }}\n >\n {rule.stage}\n </View>\n )}\n </Cell>\n\n <Field width=\"flex\" style={{ padding: '15px 0' }} truncate={false}>\n <Stack direction=\"row\" align=\"center\">\n <View style={{ flex: 1, alignItems: 'flex-start' }}>\n {rule.conditions.map((cond, i) => (\n <ConditionExpression\n key={i}\n field={cond.field}\n op={cond.op}\n value={cond.value}\n options={cond.options}\n stage={rule.stage}\n style={i !== 0 && { marginTop: 3 }}\n />\n ))}\n </View>\n\n <Text>\n <ArrowRight color={colors.n4} style={{ width: 12, height: 12 }} />\n </Text>\n\n <View style={{ flex: 1, alignItems: 'flex-start' }}>\n {rule.actions.map((action, i) => (\n <ActionExpression\n key={i}\n field={action.field}\n op={action.op}\n value={action.value}\n options={action.options}\n style={i !== 0 && { marginTop: 3 }}\n />\n ))}\n </View>\n </Stack>\n </Field>\n\n <Cell\n name=\"edit\"\n focused={focusedField === 'edit'}\n plain\n style={{ padding: '0 15px', paddingLeft: 5 }}\n >\n <Button\n as={CellButton}\n onSelect={() => onEditRule(rule)}\n onEdit={() => onEdit(rule.id, 'edit')}\n >\n Edit\n </Button>\n </Cell>\n </Row>\n );\n }\n);\n\nlet SimpleTable = React.forwardRef(\n (\n { data, navigator, loadMore, style, onHoverLeave, children, ...props },\n ref\n ) => {\n let contentRef = useRef();\n let contentHeight = useRef();\n let scrollRef = useRef();\n let { getNavigatorProps } = navigator;\n\n function onScroll(e) {\n if (contentHeight.current != null) {\n if (loadMore && e.target.scrollTop > contentHeight.current - 750) {\n loadMore();\n }\n }\n }\n\n useEffect(() => {\n if (contentRef.current) {\n contentHeight.current = contentRef.current.getBoundingClientRect().height;\n } else {\n contentHeight.current = null;\n }\n }, [contentRef.current, data]);\n\n return (\n <View\n style={[\n {\n flex: 1,\n outline: 'none',\n '& .animated .animated-row': { transition: '.25s transform' }\n },\n style\n ]}\n tabIndex=\"1\"\n {...getNavigatorProps(props)}\n >\n <View\n innerRef={scrollRef}\n style={{ maxWidth: '100%', overflow: 'auto' }}\n onScroll={onScroll}\n >\n <div ref={contentRef} onMouseLeave={onHoverLeave}>\n {children}\n </div>\n </View>\n </View>\n );\n }\n);\n\nfunction RulesHeader() {\n let selectedItems = useSelectedItems();\n let dispatchSelected = useSelectedDispatch();\n\n return (\n <TableHeader>\n <SelectCell\n exposed={true}\n focused={false}\n selected={selectedItems.size > 0}\n onSelect={() => dispatchSelected({ type: 'select-all' })}\n />\n <Cell value=\"Stage\" width={50} />\n <Cell value=\"Rule\" width=\"flex\" />\n </TableHeader>\n );\n}\n\nfunction RulesList({\n rules,\n selectedItems,\n navigator,\n hoveredRule,\n collapsed: borderCollapsed,\n onHover,\n onCollapse,\n onEditRule\n}) {\n if (rules.length === 0) {\n return null;\n }\n\n return (\n <View>\n {rules.map(rule => {\n let hovered = hoveredRule === rule.id;\n let selected = selectedItems.has(rule.id);\n let editing = navigator.editingId === rule.id;\n\n return (\n <Rule\n key={rule.id}\n rule={rule}\n hovered={hovered}\n selected={selected}\n editing={editing}\n focusedField={editing && navigator.focusedField}\n onHover={onHover}\n onEdit={navigator.onEdit}\n onEditRule={onEditRule}\n />\n );\n })}\n </View>\n );\n}\n\nexport default function ManageRules({ history, modalProps, payeeId }) {\n let [allRules, setAllRules] = useState(null);\n let [rules, setRules] = useState(null);\n let dispatch = useDispatch();\n let navigator = useTableNavigator(rules, ['select', 'edit']);\n let selectedInst = useSelected('manage-rules', allRules, []);\n let [hoveredRule, setHoveredRule] = useState(null);\n let [loading, setLoading] = useState(true);\n let tableRef = useRef(null);\n\n async function loadRules() {\n setLoading(true);\n\n let loadedRules = null;\n if (payeeId) {\n loadedRules = await send('payees-get-rules', { id: payeeId });\n } else {\n loadedRules = await send('rules-get');\n }\n\n setAllRules(loadedRules);\n return loadedRules;\n }\n\n useEffect(() => {\n async function loadData() {\n let loadedRules = await loadRules();\n setRules(loadedRules.slice(0, 100));\n setLoading(false);\n\n await dispatch(initiallyLoadPayees());\n }\n\n undo.setUndoState('openModal', 'manage-rules');\n\n loadData();\n\n return () => {\n undo.setUndoState('openModal', null);\n };\n }, []);\n\n function loadMore() {\n setRules(rules.concat(allRules.slice(rules.length, rules.length + 50)));\n }\n\n async function onDeleteSelected() {\n setLoading(true);\n let { someDeletionsFailed } = await send('rule-delete-all', [\n ...selectedInst.items\n ]);\n\n if (someDeletionsFailed) {\n alert('Some rules were not deleted because they are linked to schedules');\n }\n\n let newRules = await loadRules();\n setRules(rules => {\n return newRules.slice(0, rules.length);\n });\n selectedInst.dispatch({ type: 'select-none' });\n setLoading(false);\n }\n\n let onEditRule = useCallback(rule => {\n dispatch(\n pushModal('edit-rule', {\n rule,\n onSave: async newRule => {\n let newRules = await loadRules();\n\n setRules(rules => {\n let newIdx = newRules.findIndex(rule => rule.id === newRule.id);\n let oldIdx = rules.findIndex(rule => rule.id === newRule.id);\n\n if (newIdx > rules.length) {\n return newRules.slice(0, newIdx + 75);\n } else {\n return newRules.slice(0, rules.length);\n }\n });\n\n setLoading(false);\n }\n })\n );\n }, []);\n\n function onCreateRule() {\n dispatch(\n pushModal('edit-rule', {\n rule: {\n stage: null,\n conditions: [{ op: 'is', field: 'payee', value: null, type: 'id' }],\n actions: [{ op: 'set', field: 'category', value: null, type: 'id' }]\n },\n onSave: async newRule => {\n let newRules = await loadRules();\n\n navigator.onEdit(newRule.id, 'edit');\n\n setRules(rules => {\n let newIdx = newRules.findIndex(rule => rule.id === newRule.id);\n return newRules.slice(0, newIdx + 75);\n });\n\n setLoading(false);\n }\n })\n );\n }\n\n let onHover = useCallback(id => {\n setHoveredRule(id);\n }, []);\n\n if (rules === null) {\n return null;\n }\n\n return (\n <Modal\n title=\"Rules\"\n padding={0}\n loading={loading}\n {...modalProps}\n style={[modalProps.style, { flex: 1, maxWidth: '90%' }]}\n >\n {() => (\n <SchedulesQuery.Provider>\n <SelectedProvider instance={selectedInst}>\n <View style={{ height: '70vh' }}>\n <View style={{ flex: 1 }}>\n <RulesHeader />\n <SimpleTable\n ref={tableRef}\n data={rules}\n navigator={navigator}\n loadMore={loadMore}\n // Hide the last border of the item in the table\n style={{ marginBottom: -1 }}\n >\n <RulesList\n rules={rules}\n selectedItems={selectedInst.items}\n navigator={navigator}\n hoveredRule={hoveredRule}\n onHover={onHover}\n onEditRule={onEditRule}\n />\n </SimpleTable>\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: '13px 15px',\n borderTop: '1px solid ' + colors.border\n }}\n >\n <View\n style={{\n color: colors.n4,\n flexDirection: 'row',\n alignItems: 'center',\n width: '50%'\n }}\n >\n <Text>\n Rules are always run in the order that you see them.{' '}\n <ExternalLink\n asAnchor={true}\n href=\"https://actualbudget.com/docs/other/rules/\"\n style={{ color: colors.n4 }}\n >\n Learn more\n </ExternalLink>\n </Text>\n </View>\n\n <View style={{ flex: 1 }} />\n\n <Stack\n direction=\"row\"\n align=\"center\"\n justify=\"flex-end\"\n spacing={2}\n >\n {selectedInst.items.size > 0 && (\n <Button onClick={onDeleteSelected}>\n Delete {selectedInst.items.size} rules\n </Button>\n )}\n <Button primary onClick={onCreateRule}>\n Create new rule\n </Button>\n </Stack>\n </View>\n </View>\n </SelectedProvider>\n </SchedulesQuery.Provider>\n )}\n </Modal>\n );\n}\n","import React, { useState, useRef, useEffect, useReducer } from 'react';\nimport { useSelector } from 'react-redux';\nimport scopeTab from 'react-modal/lib/helpers/scopeTab';\nimport {\n parse as parseDate,\n format as formatDate,\n isValid as isDateValid\n} from 'date-fns';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { getMonthYearFormat } from 'loot-core/src/shared/months';\nimport { titleFirst } from 'loot-core/src/shared/util';\nimport {\n View,\n Text,\n Tooltip,\n Stack,\n Button,\n InitialFocus,\n Menu,\n CustomSelect\n} from 'loot-design/src/components/common';\nimport {\n mapField,\n friendlyOp,\n deserializeField,\n getFieldError,\n unparse,\n makeValue,\n FIELD_TYPES,\n TYPE_INFO\n} from 'loot-core/src/shared/rules';\nimport DeleteIcon from 'loot-design/src/svg/Delete';\nimport SettingsSliderAlternate from 'loot-design/src/svg/v2/SettingsSliderAlternate';\nimport GenericInput from '../util/GenericInput';\nimport { Value } from '../modals/ManageRules';\nimport { styles, colors } from 'loot-design/src/style';\n\nlet filterFields = [\n 'date',\n 'account',\n 'payee',\n 'notes',\n 'category',\n 'amount',\n 'cleared'\n].map(field => [field, mapField(field)]);\n\nfunction subfieldToOptions(field, subfield) {\n switch (field) {\n case 'amount':\n switch (subfield) {\n case 'amount-inflow':\n return { inflow: true };\n case 'amount-outflow':\n return { outflow: true };\n default:\n return null;\n }\n case 'date':\n switch (subfield) {\n case 'month':\n return { month: true };\n case 'year':\n return { year: true };\n default:\n return null;\n }\n default:\n return null;\n }\n}\n\nfunction ScopeTab({ children }) {\n let contentRef = useRef();\n\n function onKeyDown(e) {\n if (e.keyCode === 9) {\n scopeTab(contentRef.current, e);\n }\n }\n\n useEffect(() => {\n contentRef.current.focus();\n }, []);\n\n return (\n <div ref={contentRef} tabIndex={-1} onKeyDown={onKeyDown}>\n {children}\n </div>\n );\n}\n\nfunction OpButton({ op, selected, style, onClick }) {\n return (\n <Button\n bare\n style={[\n { backgroundColor: colors.n10, marginBottom: 5 },\n style,\n selected && {\n color: 'white',\n '&,:hover,:active': { backgroundColor: colors.b4 }\n }\n ]}\n onClick={onClick}\n >\n {friendlyOp(op)}\n </Button>\n );\n}\n\nfunction ConfigureField({ field, op, value, dispatch, onApply }) {\n let [subfield, setSubfield] = useState(field);\n let inputRef = useRef();\n let prevOp = useRef(null);\n\n useEffect(() => {\n if (prevOp.current !== op && inputRef.current) {\n inputRef.current.focus();\n }\n prevOp.current = op;\n }, [op]);\n\n let type = FIELD_TYPES.get(field);\n let ops = TYPE_INFO[type].ops;\n\n // Month and year fields are quite hacky right now! Figure out how\n // to clean this up later\n if (subfield === 'month' || subfield === 'year') {\n ops = ['is'];\n }\n\n return (\n <Tooltip\n position=\"bottom-left\"\n style={{ padding: 15 }}\n width={300}\n onClose={() => dispatch({ type: 'close' })}\n >\n <ScopeTab>\n <View style={{ marginBottom: 10 }}>\n {field === 'amount' || field === 'date' ? (\n <CustomSelect\n options={\n field === 'amount'\n ? [\n ['amount', 'Amount'],\n ['amount-inflow', 'Amount (inflow)'],\n ['amount-outflow', 'Amount (outflow)']\n ]\n : field === 'date'\n ? [['date', 'Date'], ['month', 'Month'], ['year', 'Year']]\n : null\n }\n value={subfield}\n onChange={sub => {\n setSubfield(sub);\n\n if (sub === 'month' || sub === 'year') {\n dispatch({ type: 'set-op', op: 'is' });\n }\n }}\n style={{ borderWidth: 1 }}\n />\n ) : (\n titleFirst(mapField(field))\n )}\n </View>\n\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ flexWrap: 'wrap' }}\n >\n {type === 'boolean'\n ? [\n <OpButton\n op=\"true\"\n selected={value === true}\n onClick={() => {\n dispatch({ type: 'set-op', op: 'is' });\n dispatch({ type: 'set-value', value: true });\n }}\n />,\n <OpButton\n op=\"false\"\n selected={value === false}\n onClick={() => {\n dispatch({ type: 'set-op', op: 'is' });\n dispatch({ type: 'set-value', value: false });\n }}\n />\n ]\n : ops.map(currOp => (\n <OpButton\n op={currOp}\n selected={currOp === op}\n onClick={() => dispatch({ type: 'set-op', op: currOp })}\n />\n ))}\n </Stack>\n\n <form action=\"#\">\n {type !== 'boolean' && (\n <GenericInput\n inputRef={inputRef}\n field={field}\n subfield={subfield}\n type={type === 'id' && op === 'contains' ? 'string' : type}\n value={value}\n multi={op === 'oneOf'}\n style={{ marginTop: 10 }}\n onChange={v => dispatch({ type: 'set-value', value: v })}\n />\n )}\n\n <View>\n <Button\n primary\n style={{ marginTop: 15 }}\n onClick={e => {\n e.preventDefault();\n onApply({\n field,\n op,\n value,\n options: subfieldToOptions(field, subfield)\n });\n }}\n >\n Apply\n </Button>\n </View>\n </form>\n </ScopeTab>\n </Tooltip>\n );\n}\n\nexport function FilterButton({ onApply }) {\n let { dateFormat } = useSelector(state => {\n return {\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy'\n };\n });\n\n let [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'select-field':\n return { ...state, fieldsOpen: true, condOpen: false };\n case 'configure': {\n let { field } = deserializeField(action.field);\n let type = FIELD_TYPES.get(field);\n let ops = TYPE_INFO[type].ops;\n return {\n ...state,\n fieldsOpen: false,\n condOpen: true,\n field: action.field,\n op: ops[0],\n value: type === 'boolean' ? true : null\n };\n }\n case 'set-op': {\n let type = FIELD_TYPES.get(state.field);\n let value = state.value;\n if (type === 'id' && action.op === 'contains') {\n // Clear out the value if switching between contains for\n // the id type\n value = null;\n }\n return { ...state, op: action.op, value };\n }\n case 'set-value':\n let { value } = makeValue(action.value, {\n type: FIELD_TYPES.get(state.field)\n });\n return { ...state, value: value };\n case 'close':\n return { fieldsOpen: false, condOpen: false, value: null };\n default:\n throw new Error('Unknown action: ' + action.type);\n }\n },\n { fieldsOpen: false, condOpen: false, field: null, value: null }\n );\n\n async function onValidateAndApply(cond) {\n cond = unparse({ ...cond, type: FIELD_TYPES.get(cond.field) });\n\n if (cond.type === 'date' && cond.options) {\n if (cond.options.month) {\n let date = parseDate(\n cond.value,\n getMonthYearFormat(dateFormat),\n new Date()\n );\n if (isDateValid(date)) {\n cond.value = formatDate(date, 'yyyy-MM');\n } else {\n alert('Invalid date format');\n return;\n }\n } else if (cond.options.year) {\n let date = parseDate(cond.value, 'yyyy', new Date());\n if (isDateValid(date)) {\n cond.value = formatDate(date, 'yyyy');\n } else {\n alert('Invalid date format');\n return;\n }\n }\n }\n\n let { error } = await send('rule-validate', {\n conditions: [cond],\n actions: []\n });\n\n if (error && error.conditionErrors.length > 0) {\n let field = titleFirst(mapField(cond.field));\n alert(field + ': ' + getFieldError(error.conditionErrors[0]));\n } else {\n onApply(cond);\n dispatch({ type: 'close' });\n }\n }\n\n return (\n <View>\n <Button bare onClick={() => dispatch({ type: 'select-field' })}>\n <SettingsSliderAlternate\n style={{\n width: 16,\n height: 16,\n color: 'inherit',\n marginRight: 5\n }}\n />{' '}\n Filter\n </Button>\n {state.fieldsOpen && (\n <Tooltip\n position=\"bottom-left\"\n style={{ padding: 0 }}\n onClose={() => dispatch({ type: 'close' })}\n >\n <Menu\n onMenuSelect={name => {\n dispatch({ type: 'configure', field: name });\n }}\n items={filterFields.map(([name, text]) => ({\n name: name,\n text: titleFirst(text)\n }))}\n />\n </Tooltip>\n )}\n {state.condOpen && (\n <ConfigureField\n field={state.field}\n op={state.op}\n value={state.value}\n dispatch={dispatch}\n onApply={onValidateAndApply}\n />\n )}\n </View>\n );\n}\n\nfunction FilterExpression({\n field: originalField,\n customName,\n op,\n value,\n options,\n stage,\n style,\n onDelete\n}) {\n let type = FIELD_TYPES.get(originalField);\n\n let field = originalField;\n if (type === 'date') {\n if (value.length === 7) {\n field = 'month';\n } else if (value.length === 4) {\n field = 'year';\n }\n }\n\n return (\n <View\n style={[\n {\n backgroundColor: colors.n10,\n borderRadius: 4,\n flexDirection: 'row',\n alignItems: 'center',\n padding: 5,\n paddingLeft: 10,\n marginBottom: 10,\n marginRight: 10\n },\n style\n ]}\n >\n <div>\n {customName ? (\n <Text style={{ color: colors.p4 }}>{customName}</Text>\n ) : (\n <>\n <Text style={{ color: colors.p4 }}>{mapField(field, options)}</Text>{' '}\n <Text style={{ color: colors.n3 }}>{friendlyOp(op)}</Text>{' '}\n <Value value={value} field={field} inline={true} />\n </>\n )}\n </div>\n <Button bare style={{ marginLeft: 3 }} onClick={onDelete}>\n <DeleteIcon style={{ width: 8, height: 8, color: colors.n4 }} />\n </Button>\n </View>\n );\n}\n\nexport function AppliedFilters({ filters, editingFilter, onDelete }) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n flexWrap: 'wrap',\n marginTop: 10,\n marginBottom: -5\n }}\n >\n {filters.map((filter, i) => (\n <FilterExpression\n customName={filter.customName}\n field={filter.field}\n op={filter.op}\n value={filter.value}\n options={filter.options}\n editing={editingFilter === filter}\n onDelete={() => onDelete(filter)}\n />\n ))}\n </View>\n );\n}\n","import React, {\n useState,\n useLayoutEffect,\n useEffect,\n useRef,\n useMemo,\n useReducer,\n useCallback\n} from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { useSelector, useDispatch } from 'react-redux';\nimport {\n Redirect,\n withRouter,\n useParams,\n useHistory,\n useLocation\n} from 'react-router-dom';\nimport { css } from 'glamor';\nimport Modal from 'react-modal';\nimport Component from '@reactions/component';\nimport { debounce } from 'debounce';\nimport SpreadsheetContext from 'loot-design/src/components/spreadsheet/SpreadsheetContext';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Button,\n Input,\n InputWithContent,\n InitialFocus,\n Tooltip,\n Menu,\n Block,\n Stack\n} from 'loot-design/src/components/common';\nimport {\n currencyToInteger,\n applyChanges,\n groupById\n} from 'loot-core/src/shared/util';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport TutorialPoint from 'loot-design/src/components/TutorialPoint';\nimport DotsHorizontalTriple from 'loot-design/src/svg/v1/DotsHorizontalTriple';\nimport Pencil1 from 'loot-design/src/svg/v2/Pencil1';\nimport SearchAlternate from 'loot-design/src/svg/v2/SearchAlternate';\nimport DownloadThickBottom from 'loot-design/src/svg/v2/DownloadThickBottom';\nimport AnimatedRefresh from '../AnimatedRefresh';\nimport Add from 'loot-design/src/svg/v1/Add';\nimport format from 'loot-design/src/components/spreadsheet/format';\nimport useSheetValue from 'loot-design/src/components/spreadsheet/useSheetValue';\nimport CellValue from 'loot-design/src/components/spreadsheet/CellValue';\nimport ArrowButtonRight1 from 'loot-design/src/svg/v2/ArrowButtonRight1';\nimport CheveronDown from 'loot-design/src/svg/v1/CheveronDown';\nimport CheckCircle1 from 'loot-design/src/svg/v2/CheckCircle1';\nimport Loading from 'loot-design/src/svg/v1/AnimatedLoading';\nimport ArrowsExpand3 from 'loot-design/src/svg/v2/ArrowsExpand3';\nimport ArrowsShrink3 from 'loot-design/src/svg/v2/ArrowsShrink3';\nimport * as queries from 'loot-core/src/client/queries';\nimport q, { runQuery, pagedQuery } from 'loot-core/src/client/query-helpers';\nimport { queryContext } from 'loot-core/src/client/query-hooks';\nimport { SelectedItemsButton } from 'loot-design/src/components/table';\nimport { Query } from 'loot-core/src/shared/query';\nimport * as aql from 'loot-core/src/client/query-helpers';\nimport {\n deleteTransaction,\n updateTransaction,\n ungroupTransactions\n} from 'loot-core/src/shared/transactions';\nimport {\n SplitsExpandedProvider,\n useSplitsExpanded,\n isPreviewId\n} from './TransactionsTable';\nimport { styles, colors } from 'loot-design/src/style';\nimport TransactionList from './TransactionList';\nimport { authorizeBank } from '../../plaid';\nimport {\n SelectedProviderWithItems,\n useSelectedItems\n} from 'loot-design/src/components/useSelected';\nimport { keys } from 'loot-design/src/util/keys';\nimport { KeyHandlers } from 'loot-design/src/components/KeyHandlers';\nimport { FilterButton, AppliedFilters } from './Filters';\nimport {\n SchedulesProvider,\n useCachedSchedules\n} from 'loot-core/src/client/data-hooks/schedules';\nimport { getPayeesById } from 'loot-core/src/client/reducers/queries';\nimport { useActiveLocation } from '../ActiveLocation';\n\nfunction EmptyMessage({ onAdd }) {\n return (\n <View\n style={{\n backgroundColor: 'white',\n flex: 1,\n alignItems: 'center',\n borderTopWidth: 1,\n borderColor: colors.n9\n }}\n >\n <View\n style={{\n width: 550,\n marginTop: 75,\n fontSize: 15,\n alignItems: 'center'\n }}\n >\n <Text style={{ textAlign: 'center', lineHeight: '1.4em' }}>\n For Actual to be useful, you need to <strong>add an account</strong>.\n You can link an account to automatically download transactions, or\n manage it locally yourself.\n </Text>\n\n <Button primary style={{ marginTop: 20 }} onClick={onAdd}>\n Add account\n </Button>\n\n <View style={{ marginTop: 20, fontSize: 13, color: colors.n5 }}>\n In the future, you can add accounts from the sidebar.\n </View>\n </View>\n </View>\n );\n}\n\nfunction ReconcilingMessage({ balanceQuery, targetBalance, onDone }) {\n let cleared = useSheetValue({\n name: balanceQuery.name + '-cleared',\n query: balanceQuery.query.filter({ cleared: true })\n });\n let targetDiff = targetBalance - cleared;\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignSelf: 'center',\n backgroundColor: 'white',\n boxShadow: styles.shadow,\n borderRadius: 4,\n marginTop: 5,\n marginBottom: 15,\n padding: 10\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {targetDiff === 0 ? (\n <View\n style={{\n color: colors.g4,\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n <CheckCircle1\n style={{\n width: 13,\n height: 13,\n color: colors.g5,\n marginRight: 3\n }}\n />\n All reconciled!\n </View>\n ) : (\n <View style={{ color: colors.n3 }}>\n <Text style={{ fontStyle: 'italic', textAlign: 'center' }}>\n Your cleared balance{' '}\n <strong>{format(cleared, 'financial')}</strong> needs{' '}\n <strong>\n {(targetDiff > 0 ? '+' : '') + format(targetDiff, 'financial')}\n </strong>{' '}\n to match\n <br /> your bank{\"'\"}s balance of{' '}\n <Text style={{ fontWeight: 700 }}>\n {format(targetBalance, 'financial')}\n </Text>\n </Text>\n </View>\n )}\n <View style={{ marginLeft: 15 }}>\n <Button primary onClick={onDone}>\n Done Reconciling\n </Button>\n </View>\n </View>\n </View>\n );\n}\n\nfunction ReconcileTooltip({ account, onReconcile, onClose }) {\n let balance = useSheetValue(queries.accountBalance(account));\n\n function onSubmit(e) {\n let input = e.target.elements[0];\n let amount = currencyToInteger(input.value);\n onReconcile(amount == null ? balance : amount);\n onClose();\n }\n\n return (\n <Tooltip position=\"bottom-right\" width={275} onClose={onClose}>\n <View style={{ padding: '5px 8px' }}>\n <Text>\n Enter the current balance of your bank account that you want to\n reconcile with:\n </Text>\n <form onSubmit={onSubmit}>\n {balance != null && (\n <InitialFocus>\n <Input\n defaultValue={format(balance, 'financial')}\n style={{ margin: '7px 0' }}\n />\n </InitialFocus>\n )}\n <Button primary>Reconcile</Button>\n </form>\n </View>\n </Tooltip>\n );\n}\n\nfunction MenuButton({ onClick }) {\n return (\n <Button bare onClick={onClick}>\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: 'inherit', transform: 'rotateZ(90deg)' }}\n />\n </Button>\n );\n}\n\nfunction MenuTooltip({ onClose, children }) {\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onClose}\n >\n {children}\n </Tooltip>\n );\n}\n\nfunction AccountMenu({\n account,\n canSync,\n syncEnabled,\n showBalances,\n canShowBalances,\n onClose,\n onReconcile,\n onMenuSelect\n}) {\n let [tooltip, setTooltip] = useState('default');\n\n return tooltip === 'reconcile' ? (\n <ReconcileTooltip\n account={account}\n onClose={onClose}\n onReconcile={onReconcile}\n />\n ) : (\n <MenuTooltip onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n if (item === 'reconcile') {\n setTooltip('reconcile');\n } else {\n onMenuSelect(item);\n }\n }}\n items={[\n canShowBalances && {\n name: 'toggle-balance',\n text: (showBalances ? 'Hide' : 'Show') + ' Running Balance'\n },\n { name: 'export', text: 'Export' },\n { name: 'reconcile', text: 'Reconcile' },\n syncEnabled &&\n account &&\n !account.closed &&\n (canSync\n ? { name: 'unlink', text: 'Unlink Account' }\n : { name: 'link', text: 'Link Account' }),\n account.closed\n ? { name: 'reopen', text: 'Reopen Account' }\n : { name: 'close', text: 'Close Account' }\n ].filter(x => x)}\n />\n </MenuTooltip>\n );\n}\n\nfunction CategoryMenu({ onClose, onMenuSelect }) {\n return (\n <MenuTooltip onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n onMenuSelect(item);\n }}\n items={[{ name: 'export', text: 'Export' }]}\n />\n </MenuTooltip>\n );\n}\n\nfunction DetailedBalance({ name, balance }) {\n return (\n <Text\n style={{\n marginLeft: 15,\n backgroundColor: colors.n10,\n borderRadius: 4,\n padding: '4px 6px',\n color: colors.n5\n }}\n >\n {name}{' '}\n <Text style={{ fontWeight: 600 }}>{format(balance, 'financial')}</Text>\n </Text>\n );\n}\n\nfunction SelectedBalance({ selectedItems }) {\n let [balance, setBalance] = useState(null);\n\n useEffect(() => {\n async function run() {\n let { data: rows } = await runQuery(\n q('transactions')\n .filter({\n id: { $oneof: [...selectedItems] },\n parent_id: { $oneof: [...selectedItems] }\n })\n .select('id')\n );\n let ids = new Set(rows.map(r => r.id));\n\n let finalIds = [...selectedItems].filter(id => !ids.has(id));\n let { data: balance } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: finalIds } })\n .options({ splits: 'all' })\n .calculate({ $sum: '$amount' })\n );\n setBalance(balance);\n }\n run();\n }, [selectedItems]);\n\n if (balance == null) {\n return null;\n }\n return <DetailedBalance name=\"Selected balance:\" balance={balance} />;\n}\n\nfunction MoreBalances({ balanceQuery }) {\n let cleared = useSheetValue({\n name: balanceQuery.name + '-cleared',\n query: balanceQuery.query.filter({ cleared: true })\n });\n let uncleared = useSheetValue({\n name: balanceQuery.name + '-uncleared',\n query: balanceQuery.query.filter({ cleared: false })\n });\n\n return (\n <View style={{ flexDirection: 'row' }}>\n <DetailedBalance name=\"Cleared total:\" balance={cleared} />\n <DetailedBalance name=\"Uncleared total:\" balance={uncleared} />\n </View>\n );\n}\n\nfunction Balances({ balanceQuery, showExtraBalances, onToggleExtraBalances }) {\n let selectedItems = useSelectedItems();\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginTop: -5,\n marginLeft: -5\n }}\n >\n <Button\n bare\n onClick={onToggleExtraBalances}\n style={{\n '& svg': {\n opacity: selectedItems.size > 0 || showExtraBalances ? 1 : 0\n },\n '&:hover svg': { opacity: 1 }\n }}\n >\n <CellValue\n binding={{ ...balanceQuery, value: 0 }}\n type=\"financial\"\n style={{ fontSize: 22, fontWeight: 400 }}\n getStyle={value => ({\n color: value < 0 ? colors.r5 : value > 0 ? colors.g5 : colors.n8\n })}\n />\n\n <ArrowButtonRight1\n style={{\n width: 10,\n height: 10,\n marginLeft: 10,\n color: colors.n5,\n transform: showExtraBalances ? 'rotateZ(180deg)' : 'rotateZ(0)'\n }}\n />\n </Button>\n {showExtraBalances && <MoreBalances balanceQuery={balanceQuery} />}\n\n {selectedItems.size > 0 && (\n <SelectedBalance selectedItems={selectedItems} />\n )}\n </View>\n );\n}\n\n// function ScheduleMenu({ onSelect, onClose }) {\n// let params = useParams();\n// let scheduleData = useCachedSchedules();\n// let payees = useSelector(state => state.queries.payees);\n// let byId = getPayeesById(payees);\n\n// if (scheduleData == null) {\n// return null;\n// }\n\n// return (\n// <Tooltip\n// position=\"bottom-right\"\n// width={200}\n// style={{ padding: 0 }}\n// onClose={onClose}\n// >\n// <Menu\n// onMenuSelect={name => {\n// onSelect(name);\n// onClose();\n// }}\n// items={scheduleData.schedules.map(s => {\n// let desc = s._payee\n// ? `${byId[s._payee].name} (${s.next_date})`\n// : `No payee (${s.next_date})`;\n\n// return { name: s.id, text: desc };\n// })}\n// />\n// </Tooltip>\n// );\n// }\n\nfunction SelectedTransactionsButton({\n style,\n getTransaction,\n onShow,\n onDelete,\n onEdit,\n onUnlink,\n onScheduleAction\n}) {\n let selectedItems = useSelectedItems();\n let history = useHistory();\n\n let types = useMemo(() => {\n let items = [...selectedItems];\n return {\n preview: !!items.find(id => isPreviewId(id)),\n trans: !!items.find(id => !isPreviewId(id))\n };\n }, [selectedItems]);\n\n let linked = useMemo(() => {\n return (\n !types.preview &&\n [...selectedItems].every(id => {\n let t = getTransaction(id);\n return t && t.schedule;\n })\n );\n }, [types.preview, selectedItems, getTransaction]);\n\n function getRealTransactions() {\n return [...selectedItems].filter(id => !isPreviewId(id));\n }\n\n return (\n <SelectedItemsButton\n name=\"transactions\"\n keyHandlers={\n types.trans && {\n f: () => onShow([...selectedItems]),\n d: () => onDelete([...selectedItems]),\n a: () => onEdit('account', [...selectedItems]),\n p: () => onEdit('payee', [...selectedItems]),\n n: () => onEdit('notes', [...selectedItems]),\n c: () => onEdit('category', [...selectedItems]),\n l: () => onEdit('cleared', [...selectedItems])\n }\n }\n items={[\n ...(!types.trans\n ? [\n { name: 'view-schedule', text: 'View schedule' },\n { name: 'post-transaction', text: 'Post transaction' },\n { name: 'skip', text: 'Skip scheduled date' }\n ]\n : [\n { name: 'show', text: 'Show', key: 'F' },\n { name: 'delete', text: 'Delete', key: 'D' },\n ...(linked\n ? [\n {\n name: 'view-schedule',\n text: 'View schedule',\n disabled: selectedItems.size > 1\n },\n { name: 'unlink-schedule', text: 'Unlink schedule' }\n ]\n : [\n {\n name: 'link-schedule',\n text: 'Link schedule'\n }\n ]),\n Menu.line,\n { type: Menu.label, name: 'Edit field' },\n { name: 'date', text: 'Date' },\n { name: 'account', text: 'Account', key: 'A' },\n { name: 'payee', text: 'Payee', key: 'P' },\n { name: 'notes', text: 'Notes', key: 'N' },\n { name: 'category', text: 'Category', key: 'C' },\n { name: 'amount', text: 'Amount' },\n { name: 'cleared', text: 'Cleared', key: 'L' }\n ])\n ]}\n onSelect={name => {\n switch (name) {\n case 'show':\n onShow([...selectedItems]);\n break;\n case 'delete':\n onDelete([...selectedItems]);\n break;\n case 'post-transaction':\n case 'skip':\n onScheduleAction(name, selectedItems);\n break;\n case 'view-schedule':\n let firstId = [...selectedItems][0];\n let scheduleId;\n if (isPreviewId(firstId)) {\n let parts = firstId.split('/');\n scheduleId = parts[1];\n } else {\n let trans = getTransaction(firstId);\n scheduleId = trans && trans.schedule;\n }\n\n if (scheduleId) {\n history.push(`/schedule/edit/${scheduleId}`, {\n locationPtr: history.location\n });\n }\n break;\n case 'link-schedule':\n history.push(`/schedule/link`, {\n locationPtr: history.location,\n transactionIds: [...selectedItems]\n });\n break;\n case 'unlink-schedule':\n onUnlink([...selectedItems]);\n break;\n default:\n let field = name;\n onEdit(name, [...selectedItems]);\n }\n }}\n ></SelectedItemsButton>\n );\n}\n\nconst AccountHeader = React.memo(\n ({\n tableRef,\n editingName,\n isNameEditable,\n workingHard,\n accountName,\n account,\n accountsSyncing,\n accounts,\n transactions,\n syncEnabled,\n showBalances,\n showExtraBalances,\n showEmptyMessage,\n balanceQuery,\n reconcileAmount,\n canCalculateBalance,\n search,\n filters,\n savePrefs,\n onSearch,\n onAddTransaction,\n onShowTransactions,\n onDoneReconciling,\n onToggleExtraBalances,\n onSaveName,\n onExposeName,\n onSync,\n onImport,\n onMenuSelect,\n onReconcile,\n onBatchDelete,\n onBatchEdit,\n onBatchUnlink,\n onApplyFilter,\n onDeleteFilter,\n onScheduleAction\n }) => {\n let [menuOpen, setMenuOpen] = useState(false);\n let searchInput = useRef(null);\n let splitsExpanded = useSplitsExpanded();\n\n let canSync = syncEnabled && (account && account.account_id);\n if (!account) {\n // All accounts - check for any syncable account\n canSync = !!accounts.find(account => !!account.account_id);\n }\n\n function onToggleSplits() {\n if (tableRef.current) {\n splitsExpanded.dispatch({\n type: 'switch-mode',\n id: tableRef.current.getScrolledItem()\n });\n\n savePrefs({\n 'expand-splits': !(splitsExpanded.state.mode === 'expand')\n });\n }\n }\n\n return (\n <>\n <KeyHandlers\n keys={{\n 'mod+f': () => {\n if (searchInput.current) {\n searchInput.current.focus();\n }\n }\n }}\n />\n\n <View\n style={[styles.pageContent, { paddingBottom: 10, flexShrink: 0 }]}\n >\n <View style={{ marginTop: 2, alignItems: 'flex-start' }}>\n <View>\n {editingName ? (\n <InitialFocus>\n <Input\n defaultValue={accountName}\n onEnter={e => onSaveName(e.target.value)}\n onBlur={() => onExposeName(false)}\n style={{\n fontSize: 25,\n fontWeight: 500,\n marginTop: -5,\n marginBottom: -2,\n marginLeft: -5\n }}\n />\n </InitialFocus>\n ) : isNameEditable ? (\n <Button\n bare\n style={{\n fontSize: 25,\n fontWeight: 500,\n marginLeft: -5,\n marginTop: -5,\n backgroundColor: 'transparent',\n '& svg': { display: 'none' },\n '&:hover svg': { display: 'unset' }\n }}\n onClick={() => onExposeName(true)}\n >\n {accountName}\n\n <Pencil1\n style={{\n width: 11,\n height: 11,\n marginLeft: 5,\n color: colors.n4\n }}\n />\n </Button>\n ) : (\n <View\n style={{ fontSize: 25, fontWeight: 500, marginBottom: 5 }}\n >\n {accountName}\n </View>\n )}\n </View>\n </View>\n\n <Balances\n balanceQuery={balanceQuery}\n showExtraBalances={showExtraBalances}\n onToggleExtraBalances={onToggleExtraBalances}\n />\n\n <Stack\n spacing={2}\n direction=\"row\"\n align=\"center\"\n style={{ marginTop: 12 }}\n >\n {((account && !account.closed) || canSync) && (\n <Button bare onClick={canSync ? onSync : onImport}>\n {canSync ? (\n <>\n <AnimatedRefresh\n width={13}\n height={13}\n animating={\n (account && accountsSyncing === account.name) ||\n accountsSyncing === '__all'\n }\n style={{ color: 'currentColor', marginRight: 4 }}\n />{' '}\n Sync\n </>\n ) : (\n <>\n <DownloadThickBottom\n width={13}\n height={13}\n style={{ color: 'currentColor', marginRight: 4 }}\n />{' '}\n Import\n </>\n )}\n </Button>\n )}\n {!showEmptyMessage && (\n <Button bare onClick={onAddTransaction}>\n <Add\n width={10}\n height={10}\n style={{ color: 'inherit', marginRight: 3 }}\n />{' '}\n Add New\n </Button>\n )}\n <View>\n <FilterButton onApply={onApplyFilter} />\n </View>\n <InputWithContent\n leftContent={\n <SearchAlternate\n style={{\n width: 13,\n height: 13,\n flexShrink: 0,\n color: 'inherit',\n margin: 5,\n marginRight: 0\n }}\n />\n }\n inputRef={searchInput}\n value={search}\n placeholder=\"Search\"\n getStyle={focused => [\n {\n backgroundColor: 'transparent',\n borderWidth: 0,\n boxShadow: 'none',\n transition: 'color .15s',\n '& input::placeholder': {\n color: colors.n1,\n transition: 'color .25s'\n }\n },\n focused && { boxShadow: '0 0 0 2px ' + colors.b5 },\n !focused && search !== '' && { color: colors.p4 }\n ]}\n onChange={e => onSearch(e.target.value)}\n />\n {workingHard ? (\n <View>\n <Loading color={colors.n1} style={{ width: 16, height: 16 }} />\n </View>\n ) : (\n <SelectedTransactionsButton\n getTransaction={id => transactions.find(t => t.id === id)}\n onShow={onShowTransactions}\n onDelete={onBatchDelete}\n onEdit={onBatchEdit}\n onUnlink={onBatchUnlink}\n onScheduleAction={onScheduleAction}\n />\n )}\n <Button\n bare\n disabled={search !== '' || filters.length > 0}\n style={{ padding: 6 }}\n onClick={onToggleSplits}\n title={\n splitsExpanded.state.mode === 'collapse'\n ? 'Collapse split transactions'\n : 'Expand split transactions'\n }\n >\n {splitsExpanded.state.mode === 'collapse' ? (\n <ArrowsShrink3\n style={{\n width: 14,\n height: 14,\n color: 'inherit'\n }}\n />\n ) : (\n <ArrowsExpand3\n style={{\n width: 14,\n height: 14,\n color: 'inherit'\n }}\n />\n )}\n </Button>\n {account ? (\n <View>\n <MenuButton onClick={() => setMenuOpen(true)} />\n\n {menuOpen && (\n <AccountMenu\n account={account}\n canSync={canSync}\n syncEnabled={syncEnabled}\n canShowBalances={canCalculateBalance()}\n showBalances={showBalances}\n onMenuSelect={item => {\n setMenuOpen(false);\n onMenuSelect(item);\n }}\n onReconcile={onReconcile}\n onClose={() => setMenuOpen(false)}\n />\n )}\n </View>\n ) : (\n <View>\n <MenuButton onClick={() => setMenuOpen(true)} />\n\n {menuOpen && (\n <CategoryMenu\n onMenuSelect={item => {\n setMenuOpen(false);\n onMenuSelect(item);\n }}\n onClose={() => setMenuOpen(false)}\n />\n )}\n </View>\n )}\n </Stack>\n\n {filters && filters.length > 0 && (\n <AppliedFilters filters={filters} onDelete={onDeleteFilter} />\n )}\n </View>\n {reconcileAmount != null && (\n <ReconcilingMessage\n targetBalance={reconcileAmount}\n balanceQuery={balanceQuery}\n onDone={onDoneReconciling}\n />\n )}\n </>\n );\n }\n);\n\nfunction AllTransactions({ transactions, filtered, children }) {\n let scheduleData = useCachedSchedules();\n\n let schedules = useMemo(\n () =>\n scheduleData\n ? scheduleData.schedules.filter(\n s =>\n !s.completed &&\n ['due', 'upcoming', 'missed'].includes(\n scheduleData.statuses.get(s.id)\n )\n )\n : [],\n [scheduleData]\n );\n\n let prependTransactions = useMemo(() => {\n return schedules.map(schedule => ({\n id: 'preview/' + schedule.id,\n payee: schedule._payee,\n account: schedule._account,\n amount: schedule._amount,\n date: schedule.next_date,\n notes: scheduleData.statuses.get(schedule.id),\n schedule: schedule.id\n }));\n }, [schedules]);\n\n let allTransactions = useMemo(() => {\n // Don't prepend scheduled transactions if we are filtering\n if (!filtered && prependTransactions.length > 0) {\n return prependTransactions.concat(transactions);\n }\n return transactions;\n }, [filtered, prependTransactions, transactions]);\n\n if (scheduleData == null) {\n return children(null);\n }\n return children(allTransactions);\n}\n\nclass AccountInternal extends React.PureComponent {\n constructor(props) {\n super(props);\n this.paged = null;\n this.table = React.createRef();\n this.animated = true;\n\n this.state = {\n search: '',\n filters: [],\n loading: true,\n workingHard: false,\n reconcileAmount: null,\n transactions: [],\n transactionsCount: 0,\n showBalances: props.showBalances,\n balances: [],\n editingName: false,\n isAdding: false,\n latestDate: null\n };\n }\n\n async componentDidMount() {\n let maybeRefetch = tables => {\n if (\n tables.includes('transactions') ||\n tables.includes('category_mapping') ||\n tables.includes('payee_mapping')\n ) {\n return this.refetchTransactions();\n }\n };\n\n let onUndo = async ({ tables, messages, undoTag }) => {\n await maybeRefetch(tables);\n\n // If all the messages are dealing with transactions, find the\n // first message referencing a non-deleted row so that we can\n // highlight the row\n //\n let focusId;\n if (\n messages.every(msg => msg.dataset === 'transactions') &&\n !messages.find(msg => msg.column === 'tombstone')\n ) {\n let focusableMsgs = messages.filter(\n msg => msg.dataset === 'transactions' && !(msg.column === 'tombstone')\n );\n\n focusId = focusableMsgs.length === 1 ? focusableMsgs[0].row : null;\n\n // Highlight the transactions\n // this.table && this.table.highlight(focusableMsgs.map(msg => msg.row));\n }\n\n if (this.table.current) {\n this.table.current.edit(null);\n\n // Focus a transaction if applicable. There is a chance if the\n // user navigated away that focusId is a transaction that has\n // been \"paged off\" and we won't focus it. That's ok, we just\n // do our best.\n if (focusId) {\n this.table.current.scrollTo(focusId);\n }\n }\n\n this.props.setLastUndoState(null);\n };\n\n let unlistens = [listen('undo-event', onUndo)];\n\n this.unlisten = () => {\n unlistens.forEach(unlisten => unlisten());\n };\n\n // Important that any async work happens last so that the\n // listeners are set up synchronously\n if (this.props.categoryGroups.length === 0) {\n await this.props.getCategories();\n }\n await this.props.initiallyLoadPayees();\n await this.fetchTransactions();\n\n // If there is a pending undo, apply it immediately (this happens\n // when an undo changes the location to this page)\n if (this.props.lastUndoState && this.props.lastUndoState.current) {\n onUndo(this.props.lastUndoState.current);\n }\n }\n\n componentDidUpdate(prevProps) {\n // If the user was on a different screen and is now coming back to\n // the transactions, automatically refresh the transaction to make\n // sure we have updated state\n if (prevProps.modalShowing && !this.props.modalShowing) {\n // This is clearly a hack. Need a better way to track which\n // things are listening to transactions and refetch\n // automatically (use ActualQL?)\n setTimeout(() => {\n this.refetchTransactions();\n }, 100);\n }\n }\n\n componentWillUnmount() {\n if (this.unlisten) {\n this.unlisten();\n }\n if (this.paged) {\n this.paged.unsubscribe();\n }\n }\n\n fetchAllIds = async () => {\n let { data } = await runQuery(this.paged.getQuery().select('id'));\n // Remember, this is the `grouped` split type so we need to deal\n // with the `subtransactions` property\n return data.reduce((arr, t) => {\n arr.push(t.id);\n t.subtransactions.forEach(sub => arr.push(sub.id));\n return arr;\n }, []);\n };\n\n refetchTransactions = async () => {\n this.paged && this.paged.run();\n };\n\n fetchTransactions = () => {\n let query = this.makeRootQuery();\n this.rootQuery = this.currentQuery = query;\n this.updateQuery(query);\n\n if (this.props.accountId) {\n this.props.markAccountRead(this.props.accountId);\n }\n };\n\n makeRootQuery = () => {\n let { transactions } = this.state;\n let locationState = this.props.location.state;\n let accountId = this.props.accountId;\n\n if (locationState && locationState.filter) {\n return q('transactions')\n .options({ splits: 'grouped' })\n .filter({\n 'account.offbudget': false,\n ...locationState.filter\n });\n }\n\n return queries.makeTransactionsQuery(accountId);\n };\n\n updateQuery(query, isFiltered) {\n if (this.paged) {\n this.paged.unsubscribe();\n }\n\n this.paged = pagedQuery(\n query.select('*'),\n async (data, prevData) => {\n const firstLoad = prevData == null;\n\n if (firstLoad) {\n this.table.current && this.table.current.setRowAnimation(false);\n\n if (isFiltered) {\n this.props.splitsExpandedDispatch({\n type: 'set-mode',\n mode: 'collapse'\n });\n } else {\n this.props.splitsExpandedDispatch({\n type: 'set-mode',\n mode: this.props.expandSplits ? 'expand' : 'collapse'\n });\n }\n }\n\n this.setState(\n {\n transactions: data,\n transactionCount: this.paged.getTotalCount(),\n transactionsFiltered: isFiltered,\n loading: false,\n workingHard: false\n },\n () => {\n if (this.state.showBalances) {\n this.calculateBalances();\n }\n\n if (firstLoad) {\n this.table.current && this.table.current.scrollToTop();\n }\n\n setTimeout(() => {\n this.table.current && this.table.current.setRowAnimation(true);\n }, 0);\n }\n );\n },\n {\n pageCount: 150,\n onlySync: true,\n mapper: ungroupTransactions\n }\n );\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.match !== nextProps.match) {\n this.setState(\n {\n editingName: false,\n loading: true,\n search: '',\n showBalances: nextProps.showBalances,\n balances: []\n },\n () => {\n this.fetchTransactions();\n }\n );\n }\n }\n\n onSearch = value => {\n this.paged.unsubscribe();\n this.setState({ search: value }, this.onSearchDone);\n };\n\n onSearchDone = debounce(() => {\n if (this.state.search === '') {\n this.updateQuery(this.currentQuery, this.state.filters.length > 0);\n } else {\n this.updateQuery(\n queries.makeTransactionSearchQuery(\n this.currentQuery,\n this.state.search,\n this.props.dateFormat\n ),\n true\n );\n }\n }, 150);\n\n onSync = async () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(acct => acct.id === accountId);\n\n await this.props.syncAndDownload(account ? account.id : null);\n };\n\n onImport = async () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(acct => acct.id === accountId);\n\n if (account) {\n const res = await window.Actual.openFileDialog({\n filters: [\n { name: 'Financial Files', extensions: ['qif', 'ofx', 'qfx', 'csv'] }\n ]\n });\n\n if (res) {\n this.props.pushModal('import-transactions', {\n accountId,\n filename: res[0],\n onImported: didChange => {\n if (didChange) {\n this.fetchTransactions();\n }\n }\n });\n }\n }\n };\n\n onExport = async accountName => {\n let exportedTransactions = await send('transactions-export-query', {\n query: this.currentQuery.serialize()\n });\n let normalizedName =\n accountName && accountName.replace(/[()]/g, '').replace(/\\s+/g, '-');\n let filename = `${normalizedName || 'transactions'}.csv`;\n\n window.Actual.saveFile(\n exportedTransactions,\n filename,\n 'Export Transactions'\n );\n };\n\n onTransactionsChange = (newTransaction, data) => {\n // Apply changes to pagedQuery data\n this.paged.optimisticUpdate(\n data => {\n if (newTransaction._deleted) {\n return data.filter(t => t.id !== newTransaction.id);\n } else {\n return data.map(t => {\n return t.id === newTransaction.id ? newTransaction : t;\n });\n }\n },\n mappedData => {\n return data;\n }\n );\n\n this.props.updateNewTransactions(newTransaction.id);\n };\n\n canCalculateBalance = () => {\n let accountId = this.props.accountId;\n let account = this.props.accounts.find(account => account.id === accountId);\n return (\n account && this.state.search === '' && this.state.filters.length === 0\n );\n };\n\n async calculateBalances() {\n if (!this.canCalculateBalance()) {\n return;\n }\n\n let { data } = await runQuery(\n this.paged\n .getQuery()\n .options({ splits: 'none' })\n .select([{ balance: { $sumOver: '$amount' } }])\n );\n\n this.setState({ balances: groupById(data) });\n }\n\n onAddTransaction = () => {\n this.setState({ isAdding: true });\n };\n\n onExposeName = flag => {\n this.setState({ editingName: flag });\n };\n\n onSaveName = name => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId\n );\n this.props.updateAccount({ ...account, name });\n this.setState({ editingName: false });\n };\n\n onToggleExtraBalances = () => {\n let { accountId, showExtraBalances } = this.props;\n let key = 'show-extra-balances-' + accountId;\n\n this.props.savePrefs({ [key]: !showExtraBalances });\n };\n\n onMenuSelect = async item => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId\n );\n\n switch (item) {\n case 'link':\n authorizeBank(this.props.pushModal, { upgradingId: accountId });\n break;\n case 'unlink':\n this.props.unlinkAccount(accountId);\n break;\n case 'close':\n this.props.openAccountCloseModal(accountId);\n break;\n case 'reopen':\n this.props.reopenAccount(accountId);\n break;\n case 'export':\n const accountName = this.getAccountTitle(account, accountId);\n this.onExport(accountName);\n break;\n case 'toggle-balance':\n if (this.state.showBalances) {\n this.props.savePrefs({ ['show-balances-' + accountId]: false });\n this.setState({ showBalances: false, balances: [] });\n } else {\n this.props.savePrefs({ ['show-balances-' + accountId]: true });\n this.setState({ showBalances: true });\n this.calculateBalances();\n }\n break;\n default:\n }\n };\n\n getAccountTitle(account, id) {\n let { filterName } = this.props.location.state || {};\n\n if (filterName) {\n return filterName;\n }\n\n if (!account) {\n if (id === 'budgeted') {\n return 'Budgeted Accounts';\n } else if (id === 'offbudget') {\n return 'Off Budget Accounts';\n } else if (id === 'uncategorized') {\n return 'Uncategorized';\n } else if (!id) {\n return 'All Accounts';\n }\n return null;\n }\n\n return (account.closed ? 'Closed: ' : '') + account.name;\n }\n\n getBalanceQuery(account, id) {\n return {\n name: `balance-query-${id}`,\n query: this.makeRootQuery().calculate({ $sum: '$amount' })\n };\n }\n\n isNew = id => {\n return this.props.newTransactions.includes(id);\n };\n\n isMatched = id => {\n return this.props.matchedTransactions.includes(id);\n };\n\n onManagePayees = id => {\n this.props.pushModal('manage-payees', { selectedPayee: id });\n };\n\n onCreatePayee = name => {\n let trimmed = name.trim();\n if (trimmed !== '') {\n return this.props.createPayee(name);\n }\n return null;\n };\n\n onReconcile = balance => {\n this.setState({ reconcileAmount: balance });\n };\n\n onDoneReconciling = () => {\n this.setState({ reconcileAmount: null });\n };\n\n onShowTransactions = async ids => {\n this.onApplyFilter({\n customName: 'Selected transactions',\n filter: { id: { $oneof: ids } }\n });\n };\n\n onBatchEdit = async (name, ids) => {\n let onChange = async (name, value) => {\n this.setState({ workingHard: true });\n\n let { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' })\n );\n let transactions = ungroupTransactions(data);\n\n let changes = { deleted: [], updated: [] };\n\n // Cleared is a special case right now\n if (name === 'cleared') {\n // Clear them if any are uncleared, otherwise unclear them\n value = !!transactions.find(t => !t.cleared);\n }\n\n transactions.forEach(trans => {\n let { diff } = updateTransaction(transactions, {\n ...trans,\n [name]: value\n });\n\n // TODO: We need to keep an updated list of transactions so\n // the logic in `updateTransaction`, particularly about\n // updating split transactions, works. This isn't ideal and we\n // should figure something else out\n transactions = applyChanges(diff, transactions);\n\n changes.deleted = changes.deleted\n ? changes.deleted.concat(diff.deleted)\n : diff.deleted;\n changes.updated = changes.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n changes.added = changes.added\n ? changes.added.concat(diff.added)\n : diff.added;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n\n if (this.table.current) {\n this.table.current.edit(transactions[0].id, 'select', false);\n }\n };\n\n if (name === 'cleared') {\n // Cleared just toggles it on/off and it depends on the data\n // loaded. Need to clean this up in the future.\n onChange('cleared', null);\n } else {\n this.props.pushModal('edit-field', { name, onSubmit: onChange });\n }\n };\n\n onBatchDelete = async ids => {\n this.setState({ workingHard: true });\n\n let { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' })\n );\n let transactions = ungroupTransactions(data);\n\n let idSet = new Set(ids);\n let changes = { deleted: [], updated: [] };\n\n transactions.forEach(trans => {\n let parentId = trans.parent_id;\n\n // First, check if we're actually deleting this transaction by\n // checking `idSet`. Then, we don't need to do anything if it's\n // a child transaction and the parent is already being deleted\n if (!idSet.has(trans.id) || (parentId && idSet.has(parentId))) {\n return;\n }\n\n let { diff } = deleteTransaction(transactions, trans.id);\n\n // TODO: We need to keep an updated list of transactions so\n // the logic in `updateTransaction`, particularly about\n // updating split transactions, works. This isn't ideal and we\n // should figure something else out\n transactions = applyChanges(diff, transactions);\n\n changes.deleted = diff.deleted\n ? changes.deleted.concat(diff.deleted)\n : diff.deleted;\n changes.updated = diff.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n };\n\n onBatchUnlink = async ids => {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: null }))\n });\n\n await this.refetchTransactions();\n };\n\n onDeleteFilter = filter => {\n this.applyFilters(this.state.filters.filter(f => f !== filter));\n };\n\n onApplyFilter = async cond => {\n let filters = this.state.filters;\n if (cond.customName) {\n filters = filters.filter(f => f.customName !== cond.customName);\n }\n this.applyFilters([...filters, cond]);\n };\n\n onScheduleAction = async (name, ids) => {\n switch (name) {\n case 'post-transaction':\n for (let id of ids) {\n let parts = id.split('/');\n await send('schedule/post-transaction', { id: parts[1] });\n }\n this.refetchTransactions();\n break;\n case 'skip':\n for (let id of ids) {\n let parts = id.split('/');\n await send('schedule/skip-next-date', { id: parts[1] });\n }\n break;\n default:\n }\n };\n\n applyFilters = async conditions => {\n if (conditions.length > 0) {\n let customFilters = conditions\n .filter(cond => !!cond.customName)\n .map(f => f.filter);\n let { filters } = await send('make-filters-from-conditions', {\n conditions: conditions.filter(cond => !cond.customName)\n });\n\n this.currentQuery = this.rootQuery.filter({\n $and: [...filters, ...customFilters]\n });\n this.updateQuery(this.currentQuery, true);\n this.setState({ filters: conditions, search: '' });\n } else {\n this.setState({ transactions: [], transactionCount: 0 });\n this.fetchTransactions();\n this.setState({ filters: conditions, search: '' });\n }\n };\n\n render() {\n let {\n accounts,\n categoryGroups,\n payees,\n match,\n syncEnabled,\n dateFormat,\n addNotification,\n accountsSyncing,\n replaceModal,\n showExtraBalances,\n expandSplits,\n accountId\n } = this.props;\n let {\n transactions,\n loading,\n workingHard,\n reconcileAmount,\n transactionCount,\n transactionsFiltered,\n editingName,\n showBalances,\n balances\n } = this.state;\n\n let account = accounts.find(account => account.id === accountId);\n const accountName = this.getAccountTitle(account, accountId);\n\n if (!accountName && !loading) {\n // This is probably an account that was deleted, so redirect to\n // all accounts\n return <Redirect to=\"/accounts\" />;\n }\n\n let showEmptyMessage = !loading && !accountId && accounts.length === 0;\n\n let isNameEditable =\n accountId &&\n accountId !== 'budgeted' &&\n accountId !== 'offbudget' &&\n accountId !== 'uncategorized';\n\n let balanceQuery = this.getBalanceQuery(account, accountId);\n\n return (\n <AllTransactions\n transactions={transactions}\n filtered={transactionsFiltered}\n >\n {allTransactions =>\n allTransactions == null ? null : (\n <SelectedProviderWithItems\n name=\"transactions\"\n items={allTransactions}\n fetchAllIds={this.fetchAllIds}\n registerDispatch={dispatch => (this.dispatchSelected = dispatch)}\n >\n <View style={[styles.page, { backgroundColor: colors.n11 }]}>\n <AccountHeader\n tableRef={this.table}\n editingName={editingName}\n isNameEditable={isNameEditable}\n workingHard={workingHard}\n account={account}\n accountName={accountName}\n accountsSyncing={accountsSyncing}\n accounts={accounts}\n transactions={transactions}\n showBalances={showBalances}\n showExtraBalances={showExtraBalances}\n showEmptyMessage={showEmptyMessage}\n balanceQuery={balanceQuery}\n syncEnabled={syncEnabled}\n canCalculateBalance={this.canCalculateBalance}\n reconcileAmount={reconcileAmount}\n search={this.state.search}\n filters={this.state.filters}\n savePrefs={this.props.savePrefs}\n onSearch={this.onSearch}\n onShowTransactions={this.onShowTransactions}\n onMenuSelect={this.onMenuSelect}\n onAddTransaction={this.onAddTransaction}\n onToggleExtraBalances={this.onToggleExtraBalances}\n onSaveName={this.onSaveName}\n onExposeName={this.onExposeName}\n onReconcile={this.onReconcile}\n onDoneReconciling={this.onDoneReconciling}\n onSync={this.onSync}\n onImport={this.onImport}\n onBatchDelete={this.onBatchDelete}\n onBatchEdit={this.onBatchEdit}\n onBatchUnlink={this.onBatchUnlink}\n onDeleteFilter={this.onDeleteFilter}\n onApplyFilter={this.onApplyFilter}\n onScheduleAction={this.onScheduleAction}\n />\n\n <View style={{ flex: 1 }}>\n <TransactionList\n tableRef={this.table}\n account={account}\n transactions={transactions}\n allTransactions={allTransactions}\n animated={this.animated}\n loadMoreTransactions={() =>\n this.paged && this.paged.fetchNext()\n }\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n balances={\n showBalances && this.canCalculateBalance()\n ? balances\n : null\n }\n showAccount={\n !accountId ||\n (accountId === 'offbudget' ||\n accountId === 'budgeted' ||\n accountId === 'uncategorized')\n }\n isAdding={this.state.isAdding}\n isNew={this.isNew}\n isMatched={this.isMatched}\n isFiltered={\n this.state.search !== '' || this.state.filters.length > 0\n }\n dateFormat={dateFormat}\n addNotification={addNotification}\n renderEmpty={() =>\n showEmptyMessage ? (\n <EmptyMessage\n onAdd={() =>\n replaceModal(\n syncEnabled ? 'add-account' : 'add-local-account'\n )\n }\n />\n ) : !loading ? (\n <View\n style={{\n marginTop: 20,\n textAlign: 'center',\n fontStyle: 'italic'\n }}\n >\n No transactions\n </View>\n ) : null\n }\n onChange={this.onTransactionsChange}\n onRefetch={this.refetchTransactions}\n onRefetchUpToRow={row =>\n this.paged.refetchUpToRow(row, {\n field: 'date',\n order: 'desc'\n })\n }\n onCloseAddTransaction={() =>\n this.setState({ isAdding: false })\n }\n onManagePayees={this.onManagePayees}\n onCreatePayee={this.onCreatePayee}\n />\n </View>\n </View>\n </SelectedProviderWithItems>\n )\n }\n </AllTransactions>\n );\n }\n}\n\nfunction AccountHack(props) {\n let { dispatch: splitsExpandedDispatch } = useSplitsExpanded();\n return (\n <AccountInternal\n {...props}\n splitsExpandedDispatch={splitsExpandedDispatch}\n />\n );\n}\n\nexport default function Account(props) {\n let state = useSelector(state => ({\n newTransactions: state.queries.newTransactions,\n matchedTransactions: state.queries.matchedTransactions,\n accounts: state.queries.accounts,\n failedAccounts: state.account.failedAccounts,\n categoryGroups: state.queries.categories.grouped,\n syncEnabled: state.prefs.local['flags.syncAccount'],\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n expandSplits: props.match && state.prefs.local['expand-splits'],\n showBalances:\n props.match &&\n state.prefs.local['show-balances-' + props.match.params.id],\n showExtraBalances:\n props.match &&\n state.prefs.local['show-extra-balances-' + props.match.params.id],\n payees: state.queries.payees,\n modalShowing: state.modals.modalStack.length > 0,\n accountsSyncing: state.account.accountsSyncing,\n lastUndoState: state.app.lastUndoState,\n tutorialStage: state.tutorial.stage\n }));\n\n let dispatch = useDispatch();\n let actionCreators = useMemo(() => bindActionCreators(actions, dispatch), [\n dispatch\n ]);\n\n let params = useParams();\n let location = useLocation();\n let activeLocation = useActiveLocation();\n\n let transform = useMemo(() => {\n let filter = queries.getAccountFilter(params.id, '_account');\n\n // Never show schedules on these pages\n if (\n (location.state && location.state.filter) ||\n params.id === 'uncategorized'\n ) {\n filter = { id: null };\n }\n\n return q => {\n q = q.filter({ $and: [filter, { '_account.closed': false }] });\n return q.orderBy({ next_date: 'desc' });\n };\n }, [params.id]);\n\n return (\n <SchedulesProvider transform={transform}>\n <SplitsExpandedProvider\n initialMode={state.expandSplits ? 'collapse' : 'expand'}\n >\n <AccountHack\n {...state}\n {...actionCreators}\n modalShowing={\n state.modalShowing ||\n !!(activeLocation.state && activeLocation.state.locationPtr)\n }\n accountId={params.id}\n location={props.location}\n />\n </SplitsExpandedProvider>\n </SchedulesProvider>\n );\n}\n","import React from 'react';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nexport function getValidMonthBounds(bounds, startMonth, endMonth) {\n return {\n start: startMonth < bounds.start ? bounds.start : startMonth,\n end: endMonth > bounds.end ? bounds.end : endMonth\n };\n}\n\nexport let MonthsContext = React.createContext();\n\nexport function MonthsProvider({\n startMonth,\n numMonths,\n monthBounds,\n type,\n children\n}) {\n let endMonth = monthUtils.addMonths(startMonth, numMonths - 1);\n let bounds = getValidMonthBounds(monthBounds, startMonth, endMonth);\n let months = monthUtils.rangeInclusive(bounds.start, bounds.end);\n\n return (\n <MonthsContext.Provider value={{ months, type }}>\n {children}\n </MonthsContext.Provider>\n );\n}\n","import React from 'react';\nimport { colors } from '../../style';\n\nexport let CategoryGroupsContext = React.createContext([]);\n\nexport function addToBeBudgetedGroup(groups) {\n return [\n {\n id: 'to-be-budgeted',\n name: 'To Be Budgeted',\n categories: [{ id: 'to-be-budgeted', name: 'To Be Budgeted' }]\n },\n ...groups\n ];\n}\n\nexport function separateGroups(categoryGroups) {\n return [\n categoryGroups.filter(g => !g.is_income),\n categoryGroups.find(g => g.is_income)\n ];\n}\n\nexport function makeAmountGrey(value) {\n return value === 0 || value === '0' || value === ''\n ? { color: colors.n10 }\n : null;\n}\n\nexport function makeAmountStyle(value) {\n const greyed = makeAmountGrey(value);\n if (greyed) {\n return greyed;\n }\n\n if (value < 0) {\n return { color: colors.r4 };\n }\n}\n\nexport function makeAmountFullStyle(value) {\n return {\n color: value < 0 ? colors.r4 : value === 0 ? colors.n10 : colors.g4\n };\n}\n\nexport function findSortDown(arr, pos, targetId) {\n if (pos === 'top') {\n return { targetId };\n } else {\n let idx = arr.findIndex(item => item.id === targetId);\n\n if (idx === -1) {\n throw new Error('findSort: item not found: ' + targetId);\n }\n\n let newIdx = idx + 1;\n if (newIdx < arr.length - 1) {\n return { targetId: arr[newIdx].id };\n } else {\n // Move to the end\n return { targetId: null };\n }\n }\n}\n\nexport function findSortUp(arr, pos, targetId) {\n if (pos === 'bottom') {\n return { targetId };\n } else {\n let idx = arr.findIndex(item => item.id === targetId);\n\n if (idx === -1) {\n throw new Error('findSort: item not found: ' + targetId);\n }\n\n let newIdx = idx - 1;\n if (newIdx >= 0) {\n return { targetId: arr[newIdx].id };\n } else {\n // Move to the beginning\n return { targetId: null };\n }\n }\n}\n","export const INCOME_HEADER_HEIGHT = 70;\nexport const MONTH_BOX_SHADOW =\n '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)';\nexport const MONTH_RIGHT_PADDING = 5;\n","import React, { useState, useContext, useEffect } from 'react';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { View, Button, Tooltip, InitialFocus, Input } from '../../common';\nimport SpreadsheetContext from '../../spreadsheet/SpreadsheetContext';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\nimport { addToBeBudgetedGroup } from '../util';\nimport CategoryAutocomplete from '../../CategorySelect';\nimport { CategoryGroupsContext } from '../util';\n\nexport default function TransferTooltip({\n initialAmount,\n initialAmountName,\n showToBeBudgeted,\n tooltipProps,\n onSubmit,\n onClose\n}) {\n let spreadsheet = useContext(SpreadsheetContext);\n let sheetName = useContext(NamespaceContext);\n let categoryGroups = useContext(CategoryGroupsContext);\n\n categoryGroups = categoryGroups.filter(g => !g.is_income);\n if (showToBeBudgeted) {\n categoryGroups = addToBeBudgetedGroup(categoryGroups);\n }\n\n let [amount, setAmount] = useState(null);\n let [category, setCategory] = useState(null);\n\n useEffect(() => {\n (async () => {\n if (initialAmountName) {\n const node = await spreadsheet.get(sheetName, initialAmountName);\n setAmount(integerToCurrency(Math.max(node.value, 0)));\n } else {\n setAmount(integerToCurrency(Math.max(initialAmount, 0)));\n }\n })();\n }, []);\n\n function submit() {\n let parsedAmount = evalArithmetic(amount, null);\n if (parsedAmount && category) {\n onSubmit(amountToInteger(parsedAmount), category);\n onClose();\n }\n }\n\n if (amount === null) {\n // Don't render anything until we have the amount to show. This\n // ensures that the amount field is focused and fully selected\n // when it's initially rendered (instead of being updated\n // afterwards and losing selection)\n return null;\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n {...tooltipProps}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Transfer this amount:</View>\n <View>\n <InitialFocus>\n <Input\n value={amount}\n onChange={e => setAmount(e.target.value)}\n onEnter={submit}\n />\n </InitialFocus>\n </View>\n <View style={{ margin: '10px 0 5px 0' }}>To:</View>\n\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={null}\n openOnFocus={false}\n onUpdate={id => {}}\n onSelect={id => setCategory(id)}\n inputProps={{\n onKeyDown: e => {\n if (e.keyCode === 13) {\n submit();\n }\n }\n }}\n />\n\n <View\n style={{\n alignItems: 'flex-end',\n marginTop: 10\n }}\n >\n <Button\n primary\n style={{\n fontSize: 12,\n paddingTop: 3,\n paddingBottom: 3\n }}\n onClick={submit}\n >\n Transfer\n </Button>\n </View>\n </Tooltip>\n );\n}\n","import React from 'react';\n\nconst SvgArrowThinRight = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M16.172 9l-6.071-6.071 1.414-1.414L20 10l-.707.707-7.778 7.778-1.414-1.414L16.172 11H0V9z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowThinRight;\n","import React from 'react';\nimport useSheetValue from '../spreadsheet/useSheetValue';\nimport { makeAmountStyle } from './util';\nimport { View } from '../common';\nimport ArrowThinRight from '../../svg/v1/ArrowThinRight';\nimport CellValue from '../spreadsheet/CellValue';\n\nexport default function BalanceWithCarryover({\n carryover,\n balance,\n category,\n disabled\n}) {\n let carryoverValue = useSheetValue(carryover);\n let balanceValue = useSheetValue(balance);\n\n return (\n <>\n <CellValue\n binding={balance}\n type=\"financial\"\n getStyle={makeAmountStyle}\n style={[\n { textAlign: 'right' },\n !disabled && {\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' }\n }\n ]}\n />\n {carryoverValue === true && (\n <View\n style={{\n alignSelf: 'center',\n marginLeft: 2,\n position: 'absolute',\n right: -4,\n top: 0,\n bottom: 0,\n justifyContent: 'center'\n }}\n >\n <ArrowThinRight\n width={7}\n height={7}\n style={{\n ...makeAmountStyle(balanceValue)\n }}\n />\n </View>\n )}\n </>\n );\n}\n","import React from 'react';\n\nconst SvgArrowButtonDown1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M12 13.584a2.643 2.643 0 0 1-1.875-.775L.584 3.268a1.768 1.768 0 0 1 2.5-2.5l8.739 8.739a.25.25 0 0 0 .354 0L20.916.768a1.768 1.768 0 0 1 2.5 2.5l-9.541 9.541a2.643 2.643 0 0 1-1.875.775z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23.75a2.643 2.643 0 0 1-1.875-.775L.584 13.434a1.768 1.768 0 0 1 2.5-2.5l8.739 8.739a.25.25 0 0 0 .354 0l8.739-8.739a1.768 1.768 0 0 1 2.5 2.5l-9.541 9.541A2.643 2.643 0 0 1 12 23.75z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowButtonDown1;\n","import React from 'react';\n\nconst SvgArrowButtonUp1 = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M12 10.416a2.643 2.643 0 0 1 1.875.775l9.541 9.541a1.768 1.768 0 0 1-2.5 2.5l-8.739-8.739a.25.25 0 0 0-.354 0l-8.739 8.739a1.768 1.768 0 0 1-2.5-2.5l9.541-9.541A2.643 2.643 0 0 1 12 10.416z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 .25a2.643 2.643 0 0 1 1.875.775l9.541 9.541a1.768 1.768 0 0 1-2.5 2.5l-8.739-8.739a.25.25 0 0 0-.354 0l-8.739 8.739a1.768 1.768 0 0 1-2.5-2.5l9.541-9.541A2.643 2.643 0 0 1 12 .25z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowButtonUp1;\n","import React, { useContext } from 'react';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nlet Context = React.createContext(null);\n\nexport function RolloverContext({\n categoryGroups,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n children\n}) {\n let currentMonth = monthUtils.currentMonth();\n\n return (\n <Context.Provider\n value={{\n currentMonth,\n categoryGroups,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse\n }}\n children={children}\n />\n );\n}\n\nexport function useRollover() {\n return useContext(Context);\n}\n","import React, { useState, useContext, useEffect } from 'react';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { View, Button, Tooltip, InitialFocus, Input } from '../../common';\nimport SpreadsheetContext from '../../spreadsheet/SpreadsheetContext';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\n\nexport default function HoldTooltip({ onSubmit, onClose }) {\n const spreadsheet = useContext(SpreadsheetContext);\n const sheetName = useContext(NamespaceContext);\n\n const [amount, setAmount] = useState(null);\n\n useEffect(() => {\n (async () => {\n const node = await spreadsheet.get(sheetName, 'to-budget');\n setAmount(integerToCurrency(Math.max(node.value, 0)));\n })();\n }, []);\n\n function submit() {\n const parsedAmount = evalArithmetic(amount, null);\n if (parsedAmount) {\n onSubmit(amountToInteger(parsedAmount));\n }\n onClose();\n }\n\n if (amount === null) {\n // See `TransferTooltip` for more info about this\n return null;\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Hold this amount:</View>\n <View>\n <InitialFocus>\n <Input\n value={amount}\n onChange={e => setAmount(e.target.value)}\n onEnter={submit}\n />\n </InitialFocus>\n </View>\n <View\n style={{\n alignItems: 'flex-end',\n marginTop: 10\n }}\n >\n <Button\n primary\n style={{\n fontSize: 12,\n paddingTop: 3,\n paddingBottom: 3\n }}\n onClick={submit}\n >\n Hold\n </Button>\n </View>\n </Tooltip>\n );\n}\n","import React from 'react';\n\nconst SvgCustomNotesPaper = props => (\n <svg\n {...props}\n viewBox=\"0 0 19 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M17 24H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h9a1 1 0 0 1 .707.293l7 7A1 1 0 0 1 19 8v14a2 2 0 0 1-2 2zM2 21.5a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5V9a.5.5 0 0 0-.5-.5h-4a2 2 0 0 1-2-2v-4A.5.5 0 0 0 10 2H2.5a.5.5 0 0 0-.5.5v19z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCustomNotesPaper;\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { css } from 'glamor';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { useLiveQuery } from 'loot-core/src/client/query-hooks';\nimport q from 'loot-core/src/client/query-helpers';\nimport { View, Button, Tooltip, useTooltip } from './common';\nimport CustomNotesPaper from '../svg/v2/CustomNotesPaper';\nimport { colors } from '../style';\n\nexport function NotesTooltip({\n defaultNotes,\n position = 'bottom-left',\n onClose\n}) {\n let [notes, setNotes] = useState(defaultNotes);\n let inputRef = React.createRef();\n\n useEffect(() => {\n inputRef.current.focus();\n }, []);\n\n return (\n <Tooltip position={position} onClose={() => onClose(notes)}>\n <textarea\n ref={inputRef}\n {...css({\n border: '1px solid ' + colors.border,\n minWidth: 300,\n minHeight: 120,\n outline: 'none'\n })}\n value={notes || ''}\n onChange={e => setNotes(e.target.value)}\n ></textarea>\n </Tooltip>\n );\n}\n\nexport default function NotesButton({\n id,\n width = 12,\n height = 12,\n defaultColor = colors.n8,\n tooltipPosition,\n style\n}) {\n let tooltip = useTooltip();\n let { data } = useLiveQuery(\n useMemo(\n () =>\n q('notes')\n .filter({ id })\n .select('*'),\n [id]\n )\n );\n let note = data && data.length > 0 ? data[0].note : null;\n let hasNotes = note && note !== '';\n\n function onClose(notes) {\n send('notes-save', { id, note: notes });\n tooltip.close();\n }\n\n return (\n <View\n style={[\n { flexShrink: 0 },\n tooltip.isOpen && {\n '& button, & .hover-visible': {\n display: 'flex',\n opacity: 1,\n color: colors.n1\n }\n },\n hasNotes && {\n '& button, & .hover-visible': { display: 'flex', opacity: 1 }\n }\n ]}\n >\n <Button\n bare\n className=\"hover-visible\"\n style={[{ color: defaultColor }, style]}\n {...tooltip.getOpenEvents()}\n >\n <CustomNotesPaper style={{ width, height, color: 'currentColor' }} />\n </Button>\n {tooltip.isOpen && (\n <NotesTooltip\n defaultNotes={note}\n position={tooltipPosition}\n onClose={onClose}\n />\n )}\n </View>\n );\n}\n","import React, { useState } from 'react';\nimport { css } from 'glamor';\nimport Component from '@reactions/component';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { rolloverBudget } from 'loot-core/src/client/queries';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\nimport format from '../../spreadsheet/format';\nimport SheetValue from '../../spreadsheet/SheetValue';\nimport CellValue from '../../spreadsheet/CellValue';\nimport {\n View,\n Block,\n Button,\n Tooltip,\n Menu,\n HoverTarget,\n AlignedText\n} from '../../common';\nimport { MONTH_BOX_SHADOW } from '../constants';\nimport ArrowButtonDown1 from '../../../svg/v2/ArrowButtonDown1';\nimport ArrowButtonUp1 from '../../../svg/v2/ArrowButtonUp1';\nimport DotsHorizontalTriple from '../../../svg/v1/DotsHorizontalTriple';\nimport { colors, styles } from '../../../style';\nimport { useRollover } from './RolloverContext';\nimport TransferTooltip from './TransferTooltip';\nimport HoldTooltip from './HoldTooltip';\nimport NotesButton from '../../NotesButton';\n\nfunction TotalsList({ prevMonthName, collapsed }) {\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n lineHeight: 1.5,\n justifyContent: 'center'\n },\n !collapsed && {\n padding: '5px 0',\n marginTop: 17,\n backgroundColor: colors.n11,\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor: colors.n9\n },\n collapsed && {\n padding: 7\n },\n styles.smallText\n ]}\n >\n <View\n style={{\n textAlign: 'right',\n marginRight: 10,\n minWidth: 50\n }}\n >\n <HoverTarget\n style={{ flexShrink: 0 }}\n renderContent={() => (\n <Tooltip\n width={200}\n style={{ lineHeight: 1.5, padding: '6px 10px' }}\n >\n <AlignedText\n left=\"Income:\"\n right={\n <CellValue\n binding={rolloverBudget.totalIncome}\n type=\"financial\"\n />\n }\n />\n <AlignedText\n left=\"From Last Month:\"\n right={\n <CellValue\n binding={rolloverBudget.fromLastMonth}\n type=\"financial\"\n />\n }\n />\n </Tooltip>\n )}\n >\n <CellValue\n binding={rolloverBudget.incomeAvailable}\n type=\"financial\"\n style={{ fontWeight: 600 }}\n />\n </HoverTarget>\n\n <CellValue\n binding={rolloverBudget.lastMonthOverspent}\n formatter={value => {\n let v = format(value, 'financial');\n return value > 0 ? '+' + v : value === 0 ? '-' + v : v;\n }}\n style={[{ fontWeight: 600 }, styles.tnum]}\n />\n\n <CellValue\n binding={rolloverBudget.totalBudgeted}\n formatter={value => {\n let v = format(value, 'financial');\n return value > 0 ? '+' + v : value === 0 ? '-' + v : v;\n }}\n style={[{ fontWeight: 600 }, styles.tnum]}\n />\n\n <CellValue\n binding={rolloverBudget.forNextMonth}\n formatter={value => {\n let n = parseInt(value);\n n = isNaN(n) ? 0 : -n;\n let v = format(n, 'financial');\n\n return n > 0 ? '+' + v : n === 0 ? '-' + v : v;\n }}\n style={[{ fontWeight: 600 }, styles.tnum]}\n />\n </View>\n\n <View>\n <Block>Available Funds</Block>\n <Block>Overspent in {prevMonthName}</Block>\n <Block>Budgeted</Block>\n <Block>For Next Month</Block>\n </View>\n </View>\n );\n}\n\nfunction ToBudget({ month, prevMonthName, collapsed, onBudgetAction }) {\n return (\n <SheetValue binding={rolloverBudget.toBudget} initialValue={0}>\n {node => {\n const availableValue = parseInt(node.value);\n const num = isNaN(availableValue) ? 0 : availableValue;\n const isNegative = num < 0;\n\n return (\n <View style={{ alignItems: 'center' }}>\n <Block>{isNegative ? 'Overbudgeted:' : 'To Budget:'}</Block>\n <Component initialState={{ menuOpen: null }}>\n {({ state, setState }) => (\n <View>\n <HoverTarget\n disabled={!collapsed || state.menuOpen}\n renderContent={() => (\n <Tooltip position=\"bottom-center\">\n <TotalsList\n collapsed={true}\n prevMonthName={prevMonthName}\n />\n </Tooltip>\n )}\n >\n <Block\n onClick={() => setState({ menuOpen: 'actions' })}\n data-cellname={node.name}\n {...css([\n styles.veryLargeText,\n {\n fontWeight: 400,\n userSelect: 'none',\n cursor: 'pointer',\n color: isNegative ? colors.r4 : colors.p5,\n marginBottom: -1,\n borderBottom: '1px solid transparent',\n ':hover': {\n borderColor: isNegative ? colors.r4 : colors.p5\n }\n }\n ])}\n >\n {format(num, 'financial')}\n </Block>\n </HoverTarget>\n {state.menuOpen === 'actions' && (\n <Tooltip\n position=\"bottom-center\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setState({ menuOpen: null })}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'reset-buffer') {\n onBudgetAction(month, 'reset-hold');\n setState({ menuOpen: null });\n } else {\n setState({ menuOpen: type });\n }\n }}\n items={[\n {\n name: 'transfer',\n text: 'Move to a category'\n },\n {\n name: 'buffer',\n text: 'Hold for next month'\n },\n {\n name: 'buffer-future',\n text: 'Hold for all future months'\n },\n {\n name: 'reset-buffer',\n text: \"Reset next month's buffer\"\n }\n ]}\n />\n </Tooltip>\n )}\n {state.menuOpen === 'buffer' && (\n <HoldTooltip\n onClose={() => setState({ menuOpen: null })}\n onSubmit={amount => {\n onBudgetAction(month, 'hold', { amount });\n }}\n />\n )}\n {state.menuOpen === 'buffer-future' && (\n <HoldTooltip\n onClose={() => setState({ menuOpen: null })}\n onSubmit={amount => {\n onBudgetAction(month, 'hold-all-future', { amount });\n }}\n />\n )}\n {state.menuOpen === 'transfer' && (\n <TransferTooltip\n initialAmountName=\"leftover\"\n onClose={() => setState({ menuOpen: null })}\n onSubmit={(amount, category) => {\n onBudgetAction(month, 'transfer-available', {\n amount,\n category\n });\n }}\n />\n )}\n </View>\n )}\n </Component>\n </View>\n );\n }}\n </SheetValue>\n );\n}\n\nexport default React.memo(function BudgetSummary({ month }) {\n let {\n currentMonth,\n summaryCollapsed: collapsed,\n onBudgetAction,\n onToggleSummaryCollapse\n } = useRollover();\n\n let [menuOpen, setMenuOpen] = useState(false);\n function onMenuOpen(e) {\n setMenuOpen(true);\n }\n\n function onMenuClose(bag) {\n setMenuOpen(false);\n }\n\n let prevMonthName = monthUtils.format(monthUtils.prevMonth(month), 'MMM');\n\n let ExpandOrCollapseIcon = collapsed ? ArrowButtonDown1 : ArrowButtonUp1;\n\n return (\n <View\n style={{\n backgroundColor: 'white',\n boxShadow: MONTH_BOX_SHADOW,\n borderRadius: 6,\n marginLeft: 0,\n marginRight: 0,\n marginTop: 5,\n flex: 1,\n cursor: 'default',\n marginBottom: 5,\n overflow: 'hidden',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s'\n },\n '&:hover .hover-visible': {\n opacity: 1\n }\n }}\n >\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month)}>\n <View\n style={[\n { padding: '0 13px' },\n collapsed ? { margin: '10px 0' } : { marginTop: 16 }\n ]}\n >\n <View\n style={{\n position: 'absolute',\n left: 10,\n top: 0\n }}\n >\n <Button\n className=\"hover-visible\"\n bare\n onClick={onToggleSummaryCollapse}\n >\n <ExpandOrCollapseIcon\n width={13}\n height={13}\n // The margin is to make it the exact same size as the dots button\n style={{ color: colors.n6, margin: 1 }}\n />\n </Button>\n </View>\n\n <div\n {...css([\n {\n textAlign: 'center',\n marginTop: 3,\n fontSize: 18,\n fontWeight: 500,\n textDecorationSkip: 'ink'\n },\n currentMonth === month && { textDecoration: 'underline' }\n ])}\n >\n {monthUtils.format(month, 'MMMM')}\n </div>\n\n <View\n style={{\n position: 'absolute',\n right: 10,\n top: 0,\n flexDirection: 'row',\n alignItems: 'center'\n }}\n >\n <View>\n <NotesButton\n id={`budget-${month}`}\n width={15}\n height={15}\n tooltipPosition=\"bottom-right\"\n defaultColor={colors.n6}\n />\n </View>\n <View style={{ userSelect: 'none', marginLeft: 2 }}>\n <Button bare onClick={onMenuOpen}>\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: colors.n5 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onMenuClose}\n >\n <Menu\n onMenuSelect={type => {\n onMenuClose();\n onBudgetAction(month, type);\n }}\n items={[\n { name: 'copy-last', text: \"Copy last month's budget\" },\n { name: 'set-zero', text: 'Set budgets to zero' },\n {\n name: 'set-3-avg',\n text: 'Set budgets to 3 month avg'\n }\n ]}\n />\n </Tooltip>\n )}\n </View>\n </View>\n </View>\n\n {collapsed ? (\n <View\n style={{\n alignItems: 'center',\n padding: '10px 20px',\n justifyContent: 'space-between',\n backgroundColor: colors.n11,\n borderTop: '1px solid ' + colors.n10\n }}\n >\n <ToBudget\n collapsed={collapsed}\n prevMonthName={prevMonthName}\n month={month}\n onBudgetAction={onBudgetAction}\n />\n </View>\n ) : (\n <>\n <TotalsList prevMonthName={prevMonthName} />\n <View style={{ margin: '23px 0' }}>\n <ToBudget month={month} onBudgetAction={onBudgetAction} />\n </View>\n </>\n )}\n </NamespaceContext.Provider>\n </View>\n );\n});\n","import React, { useContext, useState } from 'react';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { rolloverBudget } from 'loot-core/src/client/queries';\nimport { styles, colors } from '../../../style';\nimport {\n View,\n Text,\n useTooltip,\n InitialFocus,\n Tooltip,\n Button,\n Menu\n} from '../../common';\nimport { Row, Field, SheetCell } from '../../table';\nimport {\n makeAmountGrey,\n addToBeBudgetedGroup,\n CategoryGroupsContext\n} from '../util';\nimport { MONTH_RIGHT_PADDING } from '../constants';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport format from '../../spreadsheet/format';\nimport CellValue from '../../spreadsheet/CellValue';\nimport CategoryAutocomplete from '../../CategorySelect';\nimport TransferTooltip from './TransferTooltip';\nimport BalanceWithCarryover from '../BalanceWithCarryover';\n\nexport BudgetSummary from './BudgetSummary';\n\nfunction CoverTooltip({\n showToBeBudgeted,\n inline,\n tooltipProps,\n onSubmit,\n onClose\n}) {\n let categoryGroups = useContext(CategoryGroupsContext);\n categoryGroups = addToBeBudgetedGroup(\n categoryGroups.filter(g => !g.is_income)\n );\n let [category, setCategory] = useState(null);\n\n function submit() {\n if (category) {\n onSubmit(category);\n onClose();\n }\n }\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 10 }}\n {...tooltipProps}\n onClose={onClose}\n >\n <View style={{ marginBottom: 5 }}>Cover from category:</View>\n\n <InitialFocus>\n {node => (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={null}\n openOnFocus={false}\n onUpdate={id => {}}\n onSelect={id => setCategory(id)}\n inputProps={{\n inputRef: node,\n onKeyDown: e => {\n if (e.keyCode === 13) {\n submit();\n }\n }\n }}\n />\n )}\n </InitialFocus>\n\n <View\n style={{\n alignItems: 'flex-end',\n marginTop: 10\n }}\n >\n <Button\n primary\n style={{\n fontSize: 12,\n paddingTop: 3\n }}\n onClick={submit}\n >\n Transfer\n </Button>\n </View>\n </Tooltip>\n );\n}\n\nfunction BalanceTooltip({ categoryId, tooltip, monthIndex, onBudgetAction }) {\n let carryover = useSheetValue(rolloverBudget.catCarryover(categoryId));\n let balance = useSheetValue(rolloverBudget.catBalance(categoryId));\n let [menu, setMenu] = useState('menu');\n\n return (\n <>\n {menu === 'menu' && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={tooltip.close}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'carryover') {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover\n });\n tooltip.close();\n } else {\n setMenu(type);\n }\n }}\n items={[\n {\n name: 'transfer',\n text: 'Transfer to another category'\n },\n {\n name: 'carryover',\n text: carryover\n ? 'Remove overspending rollover'\n : 'Rollover overspending'\n },\n balance < 0 && {\n name: 'cover',\n text: 'Cover overspending'\n }\n ].filter(x => x)}\n />\n </Tooltip>\n )}\n\n {menu === 'transfer' && (\n <TransferTooltip\n initialAmountName={rolloverBudget.catBalance(categoryId)}\n showToBeBudgeted={true}\n onClose={tooltip.close}\n onSubmit={(amount, toCategory) => {\n onBudgetAction(monthIndex, 'transfer-category', {\n amount,\n from: categoryId,\n to: toCategory\n });\n }}\n />\n )}\n\n {menu === 'cover' && (\n <CoverTooltip\n showToBeBudgeted={true}\n onClose={tooltip.close}\n onSubmit={fromCategory => {\n onBudgetAction(monthIndex, 'cover', {\n to: categoryId,\n from: fromCategory\n });\n }}\n />\n )}\n </>\n );\n}\n\nlet headerLabelStyle = { flex: 1, padding: '0 5px', textAlign: 'right' };\n\nexport const BudgetTotalsMonth = React.memo(function BudgetTotalsMonth() {\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n marginRight: MONTH_RIGHT_PADDING,\n paddingTop: 10,\n paddingBottom: 10\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Budgeted</Text>\n <CellValue\n binding={rolloverBudget.totalBudgeted}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n formatter={value => {\n return format(-parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Spent</Text>\n <CellValue\n binding={rolloverBudget.totalSpent}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Balance</Text>\n <CellValue\n binding={rolloverBudget.totalBalance}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n </View>\n );\n});\n\nexport function IncomeHeaderMonth() {\n return (\n <Row\n style={{\n color: colors.n4,\n alignItems: 'center',\n paddingRight: 10\n }}\n >\n <View style={{ flex: 1, textAlign: 'right' }}>Received</View>\n </Row>\n );\n}\n\nexport const ExpenseGroupMonth = React.memo(function ExpenseGroupMonth({\n group\n}) {\n let borderColor = colors.border;\n let { id } = group;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budgeted\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: rolloverBudget.groupBudgeted(id),\n type: 'financial'\n }}\n />\n <SheetCell\n name=\"spent\"\n width=\"flex\"\n textAlign=\"right\"\n borderColor={borderColor}\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: rolloverBudget.groupSumAmount(id),\n type: 'financial'\n }}\n />\n <SheetCell\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[\n { fontWeight: 600, paddingRight: MONTH_RIGHT_PADDING },\n styles.tnum\n ]}\n valueProps={{\n binding: rolloverBudget.groupBalance(id),\n type: 'financial'\n }}\n />\n </View>\n );\n});\n\nexport const ExpenseCategoryMonth = React.memo(function ExpenseCategoryMonth({\n monthIndex,\n category,\n editing,\n onEdit,\n onBudgetAction,\n onShowActivity\n}) {\n let borderColor = colors.border;\n let balanceTooltip = useTooltip();\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budget\"\n sync={true}\n exposed={editing}\n width=\"flex\"\n borderColor={borderColor}\n onExpose={() => onEdit(category.id, monthIndex)}\n style={[editing && { zIndex: 100 }, styles.tnum]}\n textAlign=\"right\"\n valueStyle={[\n {\n cursor: 'default',\n margin: 1,\n padding: '0 4px',\n borderRadius: 4\n },\n {\n ':hover': {\n boxShadow: 'inset 0 0 0 1px ' + colors.n7,\n backgroundColor: 'white'\n }\n }\n ]}\n valueProps={{\n binding: rolloverBudget.catBudgeted(category.id),\n type: 'financial',\n getValueStyle: makeAmountGrey,\n formatExpr: expr => {\n return integerToCurrency(expr);\n },\n unformatExpr: expr => {\n return amountToInteger(evalArithmetic(expr, 0));\n }\n }}\n inputProps={{\n onBlur: () => {\n onEdit(null);\n }\n }}\n onSave={amount => {\n onBudgetAction(monthIndex, 'budget-amount', {\n category: category.id,\n amount\n });\n }}\n />\n\n <Field\n name=\"spent\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ textAlign: 'right' }}\n >\n <span\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={rolloverBudget.catSumAmount(category.id)}\n type=\"financial\"\n getStyle={makeAmountGrey}\n style={{\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' }\n }}\n />\n </span>\n </Field>\n\n <Field\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ paddingRight: MONTH_RIGHT_PADDING, textAlign: 'right' }}\n >\n <span {...balanceTooltip.getOpenEvents()}>\n <BalanceWithCarryover\n category={category}\n carryover={rolloverBudget.catCarryover(category.id)}\n balance={rolloverBudget.catBalance(category.id)}\n />\n </span>\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthIndex}\n onBudgetAction={onBudgetAction}\n />\n )}\n </Field>\n </View>\n );\n});\n\nexport function IncomeGroupMonth({ group }) {\n // let { id } = group;\n\n return (\n <View style={{ flex: 1 }}>\n <SheetCell\n name=\"received\"\n width=\"flex\"\n borderColor={colors.border}\n textAlign=\"right\"\n style={[\n { fontWeight: 600, paddingRight: MONTH_RIGHT_PADDING },\n styles.tnum\n ]}\n valueProps={{\n binding: rolloverBudget.groupIncomeReceived,\n type: 'financial'\n }}\n />\n </View>\n );\n}\n\nexport function IncomeCategoryMonth({\n category,\n isLast,\n monthIndex,\n onShowActivity\n}) {\n return (\n <View style={{ flex: 1 }}>\n <Field\n name=\"received\"\n width=\"flex\"\n borderColor={colors.border}\n textAlign=\"right\"\n style={[\n { paddingRight: MONTH_RIGHT_PADDING, textAlign: 'right' },\n isLast && { borderBottomWidth: 0 }\n ]}\n >\n <span\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={rolloverBudget.catSumAmount(category.id)}\n type=\"financial\"\n style={{\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' }\n }}\n />\n </span>\n </Field>\n </View>\n );\n}\n","import React, { useContext } from 'react';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nlet Context = React.createContext(null);\n\nexport function ReportProvider({\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n children\n}) {\n let currentMonth = monthUtils.currentMonth();\n\n return (\n <Context.Provider\n value={{\n currentMonth,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse\n }}\n children={children}\n />\n );\n}\n\nexport function useReport() {\n return useContext(Context);\n}\n","import React, { useState } from 'react';\nimport { css } from 'glamor';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { reportBudget } from 'loot-core/src/client/queries';\nimport NamespaceContext from '../../spreadsheet/NamespaceContext';\nimport CellValue from '../../spreadsheet/CellValue';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport format from '../../spreadsheet/format';\nimport {\n View,\n Text,\n Button,\n Tooltip,\n Menu,\n Stack,\n HoverTarget,\n AlignedText\n} from '../../common';\nimport { MONTH_BOX_SHADOW } from '../constants';\nimport { makeAmountFullStyle } from '../util';\nimport ArrowButtonDown1 from '../../../svg/v2/ArrowButtonDown1';\nimport ArrowButtonUp1 from '../../../svg/v2/ArrowButtonUp1';\nimport DotsHorizontalTriple from '../../../svg/v1/DotsHorizontalTriple';\nimport { useReport } from './ReportContext';\nimport NotesButton from '../../NotesButton';\nimport { colors, styles } from '../../../style';\n\nfunction PieProgress({ style, progress, color, backgroundColor }) {\n let radius = 4;\n let circum = 2 * Math.PI * radius;\n let dash = progress * circum;\n let gap = circum;\n\n return (\n <svg viewBox=\"0 0 20 20\" style={style}>\n <circle r=\"10\" cx=\"10\" cy=\"10\" fill={backgroundColor} />\n <circle\n r={radius}\n cx=\"10\"\n cy=\"10\"\n fill=\"none\"\n stroke={color}\n strokeWidth={radius * 2}\n strokeDasharray={`${dash} ${gap}`}\n transform=\"rotate(-90) translate(-20)\"\n />{' '}\n </svg>\n );\n}\n\nfunction fraction(num, denom) {\n if (denom === 0) {\n if (num > 0) {\n return 1;\n }\n return 0;\n }\n\n return num / denom;\n}\n\nfunction IncomeProgress({ current, target }) {\n let totalIncome = useSheetValue(current) || 0;\n let totalBudgeted = useSheetValue(target) || 0;\n\n let over = false;\n\n if (totalIncome < 0) {\n over = true;\n totalIncome = -totalIncome;\n }\n\n let frac = fraction(totalIncome, totalBudgeted);\n\n return (\n <PieProgress\n progress={frac}\n color={over ? colors.r7 : colors.g5}\n backgroundColor={over ? colors.r10 : colors.n10}\n style={{ width: 20, height: 20 }}\n />\n );\n}\n\nfunction ExpenseProgress({ current, target }) {\n let totalSpent = useSheetValue(current) || 0;\n let totalBudgeted = useSheetValue(target) || 0;\n\n // Reverse total spent, and also set a bottom boundary of 0 (in case\n // income goes into an expense category and it's \"positive\", don't\n // show that in the graph)\n totalSpent = Math.max(-totalSpent, 0);\n\n let frac;\n let over = false;\n\n if (totalSpent > totalBudgeted) {\n frac = (totalSpent - totalBudgeted) / totalBudgeted;\n over = true;\n } else {\n frac = fraction(totalSpent, totalBudgeted);\n }\n\n return (\n <PieProgress\n progress={frac}\n color={over ? colors.r7 : colors.g5}\n backgroundColor={over ? colors.r10 : colors.n10}\n style={{ width: 20, height: 20 }}\n />\n );\n}\n\nfunction BudgetTotal({ title, current, target, ProgressComponent, style }) {\n return (\n <View\n style={[\n {\n lineHeight: 1.5,\n flexDirection: 'row',\n alignItems: 'center',\n fontSize: 14\n },\n style\n ]}\n >\n <ProgressComponent current={current} target={target} />\n\n <View style={{ marginLeft: 10 }}>\n <View>\n <Text style={{ color: colors.n4 }}>{title}</Text>\n </View>\n\n <Text>\n <CellValue binding={current} type=\"financial\" />\n <Text style={{ color: colors.n6, fontStyle: 'italic' }}>\n {' of '}\n <CellValue\n binding={target}\n type=\"financial\"\n style={styles.notFixed}\n />\n </Text>\n </Text>\n </View>\n </View>\n );\n}\n\nfunction IncomeTotal({ projected, style }) {\n return (\n <BudgetTotal\n title=\"Income\"\n current={reportBudget.totalIncome}\n target={reportBudget.totalBudgetedIncome}\n ProgressComponent={IncomeProgress}\n style={style}\n />\n );\n}\n\nfunction ExpenseTotal({ style }) {\n return (\n <BudgetTotal\n title=\"Expenses\"\n current={reportBudget.totalSpent}\n target={reportBudget.totalBudgetedExpense}\n ProgressComponent={ExpenseProgress}\n style={style}\n />\n );\n}\n\nfunction Saved({ projected, style }) {\n let budgetedSaved = useSheetValue(reportBudget.totalBudgetedSaved) || 0;\n let totalSaved = useSheetValue(reportBudget.totalSaved) || 0;\n let saved = projected ? budgetedSaved : totalSaved;\n let isNegative = saved < 0;\n\n return (\n <View style={[{ alignItems: 'center', fontSize: 14 }, style]}>\n {projected ? (\n <Text style={{ color: colors.n4 }}>Projected Savings:</Text>\n ) : (\n <View style={{ color: colors.n4 }}>\n {isNegative ? 'Overspent:' : 'Saved:'}\n </View>\n )}\n\n <HoverTarget\n renderContent={() => {\n if (!projected) {\n let diff = totalSaved - budgetedSaved;\n return (\n <Tooltip\n position=\"bottom-center\"\n style={{ padding: 10, fontSize: 14 }}\n >\n <AlignedText\n left=\"Projected Savings:\"\n right={\n <Text\n style={[makeAmountFullStyle(budgetedSaved), styles.tnum]}\n >\n {format(budgetedSaved, 'financial-with-sign')}\n </Text>\n }\n />\n <AlignedText\n left=\"Difference:\"\n right={\n <Text style={[makeAmountFullStyle(diff), styles.tnum]}>\n {format(diff, 'financial-with-sign')}\n </Text>\n }\n />\n </Tooltip>\n );\n }\n return null;\n }}\n >\n <View\n {...css([\n {\n fontSize: 25,\n color: projected ? colors.y3 : isNegative ? colors.r4 : colors.p5\n }\n ])}\n >\n {format(saved, 'financial')}\n </View>\n </HoverTarget>\n </View>\n );\n}\n\nexport default React.memo(function BudgetSummary({ month }) {\n let {\n currentMonth,\n summaryCollapsed: collapsed,\n onBudgetAction,\n onToggleSummaryCollapse\n } = useReport();\n\n let [menuOpen, setMenuOpen] = useState(false);\n function onMenuOpen(e) {\n setMenuOpen(true);\n }\n\n function onMenuClose(bag) {\n setMenuOpen(false);\n }\n\n let ExpandOrCollapseIcon = collapsed ? ArrowButtonDown1 : ArrowButtonUp1;\n\n return (\n <View\n style={{\n backgroundColor: 'white',\n boxShadow: MONTH_BOX_SHADOW,\n borderRadius: 6,\n marginLeft: 0,\n marginRight: 0,\n marginTop: 5,\n flex: 1,\n cursor: 'default',\n marginBottom: 5,\n overflow: 'hidden',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s'\n },\n '&:hover .hover-visible': {\n opacity: 1\n }\n }}\n >\n <NamespaceContext.Provider\n value={monthUtils.sheetForMonth(month, 'report')}\n >\n <View\n style={[\n { padding: '0 13px' },\n collapsed ? { margin: '10px 0' } : { marginTop: 16 }\n ]}\n >\n <View\n style={{\n position: 'absolute',\n left: 10,\n top: 0\n }}\n >\n <Button\n className=\"hover-visible\"\n bare\n onClick={onToggleSummaryCollapse}\n >\n <ExpandOrCollapseIcon\n width={13}\n height={13}\n // The margin is to make it the exact same size as the dots button\n style={{ color: colors.n6, margin: 1 }}\n />\n </Button>\n </View>\n\n <div\n {...css([\n {\n textAlign: 'center',\n marginTop: 3,\n fontSize: 18,\n fontWeight: 500,\n textDecorationSkip: 'ink'\n },\n currentMonth === month && { textDecoration: 'underline' }\n ])}\n >\n {monthUtils.format(month, 'MMMM')}\n </div>\n\n <View\n style={{\n position: 'absolute',\n right: 10,\n top: 0,\n flexDirection: 'row',\n alignItems: 'center'\n }}\n >\n <View>\n <NotesButton\n id={`budget-${month}`}\n width={15}\n height={15}\n tooltipPosition=\"bottom-right\"\n defaultColor={colors.n6}\n />\n </View>\n <View style={{ userSelect: 'none' }}>\n <Button bare onClick={onMenuOpen}>\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: colors.n5 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onMenuClose}\n >\n <Menu\n onMenuSelect={type => {\n onMenuClose();\n onBudgetAction(month, type);\n }}\n items={[\n { name: 'copy-last', text: \"Copy last month's budget\" },\n { name: 'set-zero', text: 'Set budgets to zero' },\n {\n name: 'set-3-avg',\n text: 'Set budgets to 3 month avg'\n },\n {\n name: 'set-all-future',\n text: 'Apply to all future budgets'\n }\n ]}\n />\n </Tooltip>\n )}\n </View>\n </View>\n </View>\n\n {!collapsed && (\n <Stack\n spacing={2}\n style={{\n alignSelf: 'center',\n backgroundColor: colors.n11,\n borderRadius: 4,\n padding: '10px 15px',\n marginTop: 13\n }}\n >\n <IncomeTotal />\n <ExpenseTotal />\n </Stack>\n )}\n\n {collapsed ? (\n <View\n style={{\n alignItems: 'center',\n padding: '10px 20px',\n justifyContent: 'space-between',\n backgroundColor: colors.n11,\n borderTop: '1px solid ' + colors.n10\n }}\n >\n <Saved projected={month >= currentMonth} />\n </View>\n ) : (\n <Saved\n projected={month >= currentMonth}\n style={{ marginTop: 13, marginBottom: 20 }}\n />\n )}\n </NamespaceContext.Provider>\n </View>\n );\n});\n","import React from 'react';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\nimport evalArithmetic from 'loot-core/src/shared/arithmetic';\nimport { reportBudget } from 'loot-core/src/client/queries';\nimport { styles, colors } from '../../../style';\nimport { View, Text, Tooltip, Menu, useTooltip } from '../../common';\nimport { Field, SheetCell } from '../../table';\nimport useSheetValue from '../../spreadsheet/useSheetValue';\nimport { makeAmountGrey } from '../util';\nimport { MONTH_RIGHT_PADDING } from '../constants';\nimport format from '../../spreadsheet/format';\nimport CellValue from '../../spreadsheet/CellValue';\nimport BalanceWithCarryover from '../BalanceWithCarryover';\n\nexport BudgetSummary from './BudgetSummary';\n\nlet headerLabelStyle = { flex: 1, padding: '0 5px', textAlign: 'right' };\n\nexport const BudgetTotalsMonth = React.memo(function BudgetTotalsMonth() {\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n marginRight: MONTH_RIGHT_PADDING,\n paddingTop: 10,\n paddingBottom: 10\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Budgeted</Text>\n <CellValue\n binding={reportBudget.totalBudgetedExpense}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n formatter={(value) => {\n return format(parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Spent</Text>\n <CellValue\n binding={reportBudget.totalSpent}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Balance</Text>\n <CellValue\n binding={reportBudget.totalLeftover}\n type=\"financial\"\n style={{ color: colors.n4, fontWeight: 600 }}\n />\n </View>\n </View>\n );\n});\n\nexport function IncomeHeaderMonth() {\n return (\n <View\n style={{\n flexDirection: 'row',\n marginRight: MONTH_RIGHT_PADDING,\n paddingBottom: 5\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Budgeted</Text>\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: colors.n4 }}>Received</Text>\n </View>\n </View>\n );\n}\n\nexport const GroupMonth = React.memo(function ExpenseGroupMonth({ group }) {\n let borderColor = colors.border;\n let { id } = group;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budgeted\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: reportBudget.groupBudgeted(id),\n type: 'financial'\n }}\n />\n <SheetCell\n name=\"spent\"\n width=\"flex\"\n textAlign=\"right\"\n borderColor={borderColor}\n style={[{ fontWeight: 600 }, styles.tnum]}\n valueProps={{\n binding: reportBudget.groupSumAmount(id),\n type: 'financial'\n }}\n />\n {!group.is_income && (\n <SheetCell\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n textAlign=\"right\"\n style={[\n { fontWeight: 600, paddingRight: MONTH_RIGHT_PADDING },\n styles.tnum\n ]}\n valueProps={{\n binding: reportBudget.groupBalance(id),\n type: 'financial'\n }}\n />\n )}\n </View>\n );\n});\n\nfunction BalanceTooltip({ categoryId, tooltip, monthIndex, onBudgetAction }) {\n let carryover = useSheetValue(reportBudget.catCarryover(categoryId));\n\n return (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={tooltip.close}\n >\n <Menu\n onMenuSelect={(type) => {\n onBudgetAction(monthIndex, 'carryover', {\n category: categoryId,\n flag: !carryover\n });\n tooltip.close();\n }}\n items={[\n {\n name: 'carryover',\n text: carryover\n ? 'Remove overspending rollover'\n : 'Rollover overspending'\n }\n ]}\n />\n </Tooltip>\n );\n}\n\nexport const CategoryMonth = React.memo(function CategoryMonth({\n monthIndex,\n category,\n budgeted,\n currentSum,\n balance,\n editing,\n onEdit,\n onBudgetAction,\n onShowActivity\n}) {\n let borderColor = colors.border;\n let balanceTooltip = useTooltip();\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budget\"\n sync={true}\n exposed={editing}\n width=\"flex\"\n borderColor={borderColor}\n onExpose={() => onEdit(category.id, monthIndex)}\n style={[editing && { zIndex: 100 }, styles.tnum]}\n textAlign=\"right\"\n valueStyle={[\n {\n cursor: 'default',\n margin: 1,\n padding: '0 4px',\n borderRadius: 4\n },\n {\n ':hover': {\n boxShadow: 'inset 0 0 0 1px ' + colors.n7,\n backgroundColor: 'white'\n }\n }\n ]}\n valueProps={{\n binding: reportBudget.catBudgeted(category.id),\n type: 'financial',\n getValueStyle: makeAmountGrey,\n formatExpr: (expr) => {\n return integerToCurrency(expr);\n },\n unformatExpr: (expr) => {\n return amountToInteger(evalArithmetic(expr, 0));\n }\n }}\n inputProps={{\n onBlur: () => {\n onEdit(null);\n }\n }}\n onSave={(amount) => {\n onBudgetAction(monthIndex, 'budget-amount', {\n category: category.id,\n amount\n });\n }}\n />\n\n <Field\n name=\"spent\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ textAlign: 'right' }}\n >\n <span\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={reportBudget.catSumAmount(category.id)}\n type=\"financial\"\n getStyle={makeAmountGrey}\n style={{\n cursor: 'pointer',\n ':hover': {\n textDecoration: 'underline'\n }\n }}\n />\n </span>\n </Field>\n\n {!category.is_income && (\n <Field\n name=\"balance\"\n width=\"flex\"\n borderColor={borderColor}\n style={{ paddingRight: MONTH_RIGHT_PADDING, textAlign: 'right' }}\n >\n <span {...(category.is_income ? {} : balanceTooltip.getOpenEvents())}>\n <BalanceWithCarryover\n category={category}\n disabled={category.is_income}\n carryover={reportBudget.catCarryover(category.id)}\n balance={reportBudget.catBalance(category.id)}\n />\n </span>\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthIndex}\n onBudgetAction={onBudgetAction}\n />\n )}\n </Field>\n )}\n </View>\n );\n});\n\nexport const ExpenseGroupMonth = GroupMonth;\nexport const ExpenseCategoryMonth = CategoryMonth;\n\nexport const IncomeGroupMonth = GroupMonth;\nexport const IncomeCategoryMonth = CategoryMonth;\n","import lively from '@jlongster/lively';\n\nfunction findMatch(element, sizes) {\n const rect = element.getBoundingClientRect();\n const matched = sizes.find(size => {\n return (\n (size.width != null && rect.width < size.width) ||\n (size.height != null && rect.height < size.height)\n );\n });\n\n return matched || sizes[sizes.length - 1];\n}\n\n// Component\n\nfunction ElementQuery({ props: { children }, state: { matched }, inst }) {\n return children(matched, el => (inst.element = el));\n}\n\nexport default lively(ElementQuery, {\n getInitialState() {\n return { matched: null };\n },\n componentDidMount({ inst, props, setState }) {\n inst.observer = new ResizeObserver(entries => {\n entries.forEach(entry => {\n setState({ matched: findMatch(inst.element, props.sizes) });\n });\n });\n\n inst.observer.observe(inst.element);\n },\n componentWillUnmount({ inst }) {\n inst.observer.disconnect();\n }\n});\n","import React from 'react';\n\nconst SvgArrowThinLeft = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M3.828 9l6.071-6.071-1.414-1.414L0 10l.707.707 7.778 7.778 1.414-1.414L3.828 11H20V9H3.828z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgArrowThinLeft;\n","import React, {\n useContext,\n useState,\n useRef,\n useCallback,\n useLayoutEffect\n} from 'react';\nimport { Spring } from 'wobble';\nimport { css } from 'glamor';\nimport { MonthsContext } from './MonthsContext';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { View } from '../common';\nimport useResizeObserver from '../useResizeObserver';\n\nexport default function BudgetSummaries({ SummaryComponent }) {\n let { months } = useContext(MonthsContext);\n\n let [widthState, setWidthState] = useState(0);\n let spring = useRef(null);\n\n let containerRef = useResizeObserver(\n useCallback(rect => {\n setWidthState(rect.width);\n }, [])\n );\n let scrollerRef = useRef();\n\n let prevMonth0 = useRef(months[0]);\n\n let allMonths = [...months];\n allMonths.unshift(monthUtils.subMonths(months[0], 1));\n allMonths.push(monthUtils.addMonths(months[months.length - 1], 1));\n let monthWidth = widthState / months.length;\n\n useLayoutEffect(() => {\n if (!scrollerRef.current) {\n return;\n }\n\n if (!spring.current) {\n spring.current = new Spring({\n stiffness: 600,\n damping: 80,\n mass: 3,\n fromValue: -monthWidth\n });\n\n spring.current.onUpdate(s => {\n if (scrollerRef.current) {\n scrollerRef.current.style.transform =\n 'translateX(' + s.currentValue + 'px)';\n }\n });\n }\n\n let prevMonth = prevMonth0.current;\n let reversed = prevMonth > months[0];\n let offsetX = monthWidth;\n\n let from = reversed ? -offsetX * 2 : 0;\n if (prevMonth !== allMonths[0] && prevMonth !== allMonths[2]) {\n from = -offsetX;\n }\n\n let to = -offsetX;\n spring.current.updateConfig({ fromValue: from, toValue: to }).start();\n }, [months[0]]);\n\n useLayoutEffect(() => {\n prevMonth0.current = months[0];\n }, [months[0]]);\n\n useLayoutEffect(() => {\n scrollerRef.current.style.transform = `translateX(${-monthWidth}px)`;\n }, [monthWidth]);\n\n return (\n <div\n {...css([\n { flex: 1, overflow: 'hidden' },\n months.length === 1 && {\n marginLeft: -4,\n marginRight: -4\n }\n ])}\n ref={containerRef}\n >\n <View\n style={{\n flexDirection: 'row',\n width: widthState,\n willChange: 'transform'\n }}\n innerRef={scrollerRef}\n >\n {allMonths.map((month, idx) => {\n return (\n <View\n key={month}\n style={[\n { flex: `0 0 ${monthWidth}px` },\n { paddingLeft: 4, paddingRight: 4 }\n ]}\n >\n <SummaryComponent month={month} />\n </View>\n );\n })}\n </View>\n </div>\n );\n}\n","import React, { useContext, useState, useMemo, useEffect } from 'react';\nimport ElementQuery from '../ElementQuery';\nimport {\n View,\n Text,\n Button,\n Tooltip,\n Menu,\n IntersectionBoundary\n} from '../common';\nimport { Row, InputCell, ROW_HEIGHT } from '../table';\nimport {\n useDraggable,\n useDroppable,\n DropHighlight,\n DropHighlightPosContext\n} from '../sort.js';\nimport NamespaceContext from '../spreadsheet/NamespaceContext';\nimport { scope } from '@jlongster/lively';\nimport { styles, colors } from '../../style';\nimport ArrowThinLeft from '../../svg/v1/ArrowThinLeft';\nimport ArrowThinRight from '../../svg/v1/ArrowThinRight';\nimport ExpandArrow from '../../svg/ExpandArrow';\nimport CheveronDown from '../../svg/v1/CheveronDown';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { separateGroups, findSortDown, findSortUp } from './util';\nimport { MonthsProvider, MonthsContext } from './MonthsContext';\nimport NotesButton from '../NotesButton';\n\nimport BudgetSummaries from './BudgetSummaries';\n\nimport { INCOME_HEADER_HEIGHT, MONTH_BOX_SHADOW } from './constants';\n\nfunction getScrollbarWidth() {\n return Math.max(styles.scrollbarWidth - 2, 0);\n}\n\nexport class BudgetTable extends React.Component {\n constructor(props) {\n super(props);\n this.budgetCategoriesRef = React.createRef();\n\n this.state = {\n editing: null,\n draggingState: null\n };\n }\n\n onEditMonth = (id, monthIndex) => {\n this.setState({ editing: id ? { id, cell: monthIndex } : null });\n };\n\n onEditName = id => {\n this.setState({ editing: id ? { id, cell: 'name' } : null });\n };\n\n onReorderCategory = (id, dropPos, targetId) => {\n let { categoryGroups } = this.props;\n\n let isGroup = !!categoryGroups.find(g => g.id === targetId);\n\n if (isGroup) {\n let { targetId: groupId } = findSortUp(categoryGroups, dropPos, targetId);\n let group = categoryGroups.find(g => g.id === groupId);\n\n if (group) {\n let { categories } = group;\n this.props.onReorderCategory({\n id,\n groupId: group.id,\n targetId:\n categories.length === 0 || dropPos === 'top'\n ? null\n : categories[0].id\n });\n }\n } else {\n let targetGroup;\n\n for (let group of categoryGroups) {\n if (group.categories.find(cat => cat.id === targetId)) {\n targetGroup = group;\n break;\n }\n }\n\n this.props.onReorderCategory({\n id,\n groupId: targetGroup.id,\n ...findSortDown(targetGroup.categories, dropPos, targetId)\n });\n }\n };\n\n onReorderGroup = (id, dropPos, targetId) => {\n let { categoryGroups } = this.props;\n\n this.props.onReorderGroup({\n id,\n ...findSortDown(categoryGroups, dropPos, targetId)\n });\n };\n\n moveVertically = dir => {\n let { editing } = this.state;\n let { type, categoryGroups, collapsed } = this.props;\n\n const flattened = categoryGroups.reduce((all, group) => {\n if (collapsed.includes(group.id)) {\n return all.concat({ id: group.id, isGroup: true });\n }\n return all.concat([{ id: group.id, isGroup: true }, ...group.categories]);\n }, []);\n\n if (editing) {\n const idx = flattened.findIndex(item => item.id === editing.id);\n let nextIdx = idx + dir;\n\n while (nextIdx >= 0 && nextIdx < flattened.length) {\n const next = flattened[nextIdx];\n\n if (next.isGroup) {\n nextIdx += dir;\n continue;\n } else if (type === 'report' || !next.is_income) {\n this.onEditMonth(next.id, editing.cell);\n return;\n } else {\n break;\n }\n }\n }\n };\n\n onKeyDown = e => {\n const TAB = 9;\n const ENTER = 13;\n\n if (!this.state.editing) {\n return null;\n }\n\n if (e.keyCode === ENTER || e.keyCode === TAB) {\n e.preventDefault();\n this.moveVertically(e.shiftKey ? -1 : 1);\n }\n };\n\n onShowActivity = (catName, catId, monthIndex) => {\n this.props.onShowActivity(catName, catId, this.resolveMonth(monthIndex));\n };\n\n onBudgetAction = (monthIndex, type, args) => {\n this.props.onBudgetAction(this.resolveMonth(monthIndex), type, args);\n };\n\n resolveMonth = monthIndex => {\n return monthUtils.addMonths(this.props.startMonth, monthIndex);\n };\n\n clearEditing() {\n this.setState({ editing: null });\n }\n\n render() {\n let {\n type,\n categoryGroups,\n prewarmStartMonth,\n startMonth,\n numMonths,\n monthBounds,\n collapsed,\n setCollapsed,\n newCategoryForGroup,\n dataComponents,\n isAddingGroup,\n onSaveCategory,\n onSaveGroup,\n onDeleteCategory,\n onDeleteGroup,\n onShowNewCategory,\n onHideNewCategory,\n onShowNewGroup,\n onHideNewGroup\n } = this.props;\n let { editing, draggingState } = this.state;\n\n return (\n <View\n style={[\n { flex: 1 },\n styles.lightScrollbar && {\n '& ::-webkit-scrollbar': {\n backgroundColor: 'transparent'\n },\n '& ::-webkit-scrollbar-thumb:vertical': {\n backgroundColor: 'white'\n }\n }\n ]}\n >\n <View\n style={{\n flexDirection: 'row',\n overflow: 'hidden',\n flexShrink: 0,\n // This is necessary to align with the table because the\n // table has this padding to allow the shadow to show\n paddingLeft: 5,\n paddingRight: 5 + getScrollbarWidth()\n }}\n >\n <View style={{ width: 200 }} />\n <MonthsProvider\n startMonth={prewarmStartMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n type={type}\n >\n <BudgetSummaries\n SummaryComponent={dataComponents.SummaryComponent}\n />\n </MonthsProvider>\n </View>\n\n <MonthsProvider\n startMonth={startMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n type={type}\n >\n <BudgetTotals MonthComponent={dataComponents.BudgetTotalsComponent} />\n <IntersectionBoundary.Provider value={this.budgetCategoriesRef}>\n <View\n style={{\n overflowY: 'scroll',\n overflowAnchor: 'none',\n flex: 1,\n paddingLeft: 5,\n paddingRight: 5\n }}\n innerRef={this.budgetCategoriesRef}\n >\n <View\n style={{\n opacity: draggingState ? 0.5 : 1,\n flexShrink: 0\n }}\n onKeyDown={this.onKeyDown}\n innerRef={el => (this.budgetDataNode = el)}\n >\n <BudgetCategories\n categoryGroups={categoryGroups}\n newCategoryForGroup={newCategoryForGroup}\n isAddingGroup={isAddingGroup}\n editingCell={editing}\n collapsed={collapsed}\n setCollapsed={setCollapsed}\n dataComponents={dataComponents}\n onEditMonth={this.onEditMonth}\n onEditName={this.onEditName}\n onSaveCategory={onSaveCategory}\n onSaveGroup={onSaveGroup}\n onDeleteCategory={onDeleteCategory}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n onShowNewCategory={onShowNewCategory}\n onHideNewCategory={onHideNewCategory}\n onShowNewGroup={onShowNewGroup}\n onHideNewGroup={onHideNewGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n />\n </View>\n </View>\n </IntersectionBoundary.Provider>\n </MonthsProvider>\n </View>\n );\n }\n}\n\nexport function SidebarCategory({\n innerRef,\n category,\n dragPreview,\n dragging,\n editing,\n style,\n borderColor = colors.border,\n isLast,\n onDragChange,\n onEditMonth,\n onEditName,\n onSave,\n onDelete,\n onHideNewCategory\n}) {\n const temporary = category.id === 'new';\n const [menuOpen, setMenuOpen] = useState(false);\n\n const displayed = (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none'\n }}\n >\n <div\n style={{\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: 0\n }}\n >\n {category.name}\n </div>\n <View style={{ flexShrink: 0, marginLeft: 5 }}>\n <Button\n bare\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{ color: 'currentColor', padding: 3 }}\n >\n <CheveronDown\n width={14}\n height={14}\n style={{ color: 'currentColor' }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'rename') {\n onEditName(category.id);\n } else {\n onDelete(category.id);\n }\n setMenuOpen(false);\n }}\n items={[\n { name: 'rename', text: 'Rename' },\n { name: 'delete', text: 'Delete' }\n ]}\n />\n </Tooltip>\n )}\n </View>\n <View style={{ flex: 1 }} />\n <NotesButton\n id={category.id}\n style={dragging && { color: 'currentColor' }}\n />\n </View>\n );\n\n return (\n <View\n innerRef={innerRef}\n style={[\n {\n width: 200,\n '& button': { display: 'none' }\n },\n !dragging &&\n !dragPreview && {\n '&:hover button': { display: 'flex', color: colors.n1 }\n },\n dragging && { color: colors.n8 },\n\n // The zIndex here forces the the view on top of a row below\n // it that may be \"collapsed\" and show a border on top\n dragPreview && {\n backgroundColor: 'white',\n zIndex: 10000,\n borderRadius: 6,\n overflow: 'hidden'\n },\n style\n ]}\n onKeyDown={e => {\n const ENTER = 13;\n if (e.keyCode === ENTER) {\n onEditName(null);\n e.stopPropagation();\n }\n }}\n >\n <InputCell\n value={category.name}\n formatter={value => displayed}\n width=\"flex\"\n exposed={editing || temporary}\n borderColor={dragPreview ? 'transparent' : borderColor}\n onUpdate={value => {\n if (temporary) {\n if (value === '') {\n onHideNewCategory();\n } else if (value !== '') {\n onSave({ ...category, name: value });\n }\n } else {\n if (value !== category.name) {\n onSave({ ...category, name: value });\n }\n }\n }}\n onBlur={() => onEditName(null)}\n style={[{ paddingLeft: 13 }, isLast && { borderBottomWidth: 0 }]}\n inputProps={{\n placeholder: temporary ? 'New Category Name' : ''\n }}\n />\n </View>\n );\n}\n\nexport function SidebarGroup({\n group,\n editing,\n collapsed,\n dragPreview,\n innerRef,\n style,\n borderColor = colors.border,\n onEdit,\n onSave,\n onDelete,\n onShowNewCategory,\n onHideNewGroup,\n onToggleCollapse\n}) {\n const temporary = group.id === 'new';\n const [menuOpen, setMenuOpen] = useState(false);\n\n const displayed = (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none'\n }}\n onClick={e => {\n onToggleCollapse(group.id);\n }}\n >\n {!dragPreview && (\n <ExpandArrow\n width={8}\n height={8}\n style={{\n marginRight: 5,\n marginLeft: 5,\n flexShrink: 0,\n transition: 'transform .1s',\n transform: collapsed ? 'rotate(-90deg)' : ''\n }}\n />\n )}\n <div\n style={{\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: 0\n }}\n >\n {dragPreview && <Text style={{ fontWeight: 500 }}>Group: </Text>}\n {group.name}\n </div>\n {!dragPreview && (\n <>\n <View style={{ marginLeft: 5, flexShrink: 0 }}>\n <Button\n bare\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{ padding: 3 }}\n >\n <CheveronDown width={14} height={14} />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'rename') {\n onEdit(group.id);\n } else if (type === 'add-category') {\n onShowNewCategory(group.id);\n } else {\n onDelete(group.id);\n }\n setMenuOpen(false);\n }}\n items={[\n { name: 'add-category', text: 'Add category' },\n { name: 'rename', text: 'Rename' },\n onDelete && { name: 'delete', text: 'Delete' }\n ]}\n />\n </Tooltip>\n )}\n </View>\n <View style={{ flex: 1 }} />\n <NotesButton id={group.id} />\n </>\n )}\n </View>\n );\n\n return (\n <View\n innerRef={innerRef}\n style={[\n style,\n {\n width: 200,\n backgroundColor: colors.n11,\n '& button': { display: 'none' },\n '&:hover button': { display: 'flex', color: colors.n1 }\n },\n dragPreview && {\n paddingLeft: 10,\n zIndex: 10000,\n borderRadius: 6,\n overflow: 'hidden'\n }\n ]}\n onKeyDown={e => {\n const ENTER = 13;\n if (e.keyCode === ENTER) {\n onEdit(null);\n e.stopPropagation();\n }\n }}\n >\n <InputCell\n value={group.name}\n formatter={value => displayed}\n width=\"flex\"\n exposed={editing}\n borderColor={colors.border}\n onUpdate={value => {\n if (temporary) {\n if (value === '') {\n onHideNewGroup();\n } else if (value !== '') {\n onSave({ id: group.id, name: value });\n }\n } else {\n onSave({ id: group.id, name: value });\n }\n }}\n onBlur={() => onEdit(null)}\n style={{ fontWeight: 600 }}\n inputProps={{\n style: { marginLeft: 20 },\n placeholder: temporary ? 'New Group Name' : ''\n }}\n />\n </View>\n );\n}\n\nfunction RenderMonths({ component: Component, editingIndex, args, style }) {\n let { months, type } = useContext(MonthsContext);\n\n return months.map((month, index) => {\n let editing = editingIndex === index;\n\n return (\n <NamespaceContext.Provider\n key={index}\n value={monthUtils.sheetForMonth(month, type)}\n >\n <View\n style={[\n { flex: 1 },\n { borderLeft: '1px solid ' + colors.border },\n style\n ]}\n >\n <Component monthIndex={index} editing={editing} {...args} />\n </View>\n </NamespaceContext.Provider>\n );\n });\n}\n\nconst BudgetTotals = React.memo(function BudgetTotals({ MonthComponent }) {\n return (\n <View\n style={{\n backgroundColor: 'white',\n flexDirection: 'row',\n flexShrink: 0,\n boxShadow: MONTH_BOX_SHADOW,\n marginLeft: 5,\n marginRight: 5 + getScrollbarWidth(),\n borderRadius: '4px 4px 0 0',\n borderBottom: '1px solid ' + colors.border\n }}\n >\n <View\n style={{\n width: 200,\n color: colors.n4,\n justifyContent: 'center',\n paddingLeft: 18\n }}\n >\n Category\n </View>\n <RenderMonths component={MonthComponent} />\n </View>\n );\n});\n\nfunction ExpenseGroup({\n group,\n collapsed,\n editingCell,\n dragState,\n itemPos,\n MonthComponent,\n onEditName,\n onSave,\n onDelete,\n onDragChange,\n onReorderGroup,\n onReorderCategory,\n onToggleCollapse,\n onShowNewCategory\n}) {\n let dragging = dragState && dragState.item === group;\n\n let { dragRef } = useDraggable({\n type: 'group',\n onDragChange,\n item: group,\n canDrag: editingCell === null\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: 'group',\n id: group.id,\n onDrop: onReorderGroup\n });\n\n let { dropRef: catDropRef, dropPos: catDropPos } = useDroppable({\n types: 'category',\n id: group.id,\n onDrop: onReorderCategory,\n onLongHover: () => {\n if (collapsed) {\n onToggleCollapse(group.id);\n }\n }\n });\n\n return (\n <Row\n collapsed={true}\n backgroundColor={colors.n11}\n style={{ fontWeight: 600 }}\n >\n {dragState && !dragState.preview && dragState.type === 'group' && (\n <View\n innerRef={dropRef}\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n height: collapsed\n ? ROW_HEIGHT - 1\n : (1 + group.categories.length) * (ROW_HEIGHT - 1) + 1,\n zIndex: 10000\n }}\n >\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n </View>\n )}\n\n <DropHighlight pos={catDropPos} offset={{ top: 1 }} />\n\n <View\n innerRef={catDropRef}\n style={{\n flex: 1,\n flexDirection: 'row',\n opacity: dragging && !dragState.preview ? 0.3 : 1\n }}\n >\n <SidebarGroup\n innerRef={dragRef}\n group={group}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === group.id\n }\n dragPreview={dragging && dragState.preview}\n collapsed={collapsed}\n onToggleCollapse={onToggleCollapse}\n onEdit={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n onShowNewCategory={onShowNewCategory}\n />\n <RenderMonths component={MonthComponent} args={{ group }} />\n </View>\n </Row>\n );\n}\n\nfunction ExpenseCategory({\n cat,\n budgetArray,\n editingCell,\n dragState,\n MonthComponent,\n onEditName,\n onEditMonth,\n onSave,\n onDelete,\n onBudgetAction,\n onShowActivity,\n onDragChange,\n onReorder\n}) {\n let dragging = dragState && dragState.item === cat;\n\n if (dragState && dragState.item.id === cat.cat_group) {\n dragging = true;\n }\n\n let { dragRef } = useDraggable({\n type: 'category',\n onDragChange,\n item: cat,\n canDrag: editingCell === null\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: 'category',\n id: cat.id,\n onDrop: onReorder\n });\n\n return (\n <Row innerRef={dropRef} collapsed={true} backgroundColor=\"transparent\">\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n\n <View\n style={[\n {\n flex: 1,\n flexDirection: 'row'\n }\n ]}\n >\n <SidebarCategory\n innerRef={dragRef}\n category={cat}\n dragPreview={dragging && dragState.preview}\n dragging={dragging && !dragState.preview}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === cat.id\n }\n onEditName={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n onDragChange={onDragChange}\n />\n\n <RenderMonths\n component={MonthComponent}\n editingIndex={\n editingCell && editingCell.id === cat.id && editingCell.cell\n }\n args={{\n category: cat,\n onEdit: onEditMonth,\n onBudgetAction,\n onShowActivity\n }}\n />\n </View>\n </Row>\n );\n}\n\nfunction IncomeGroup({\n group,\n editingCell,\n collapsed,\n MonthComponent,\n onEditName,\n onSave,\n onToggleCollapse,\n onShowNewCategory\n}) {\n return (\n <Row\n collapsed={true}\n backgroundColor={colors.n11}\n style={{ fontWeight: 600 }}\n >\n <SidebarGroup\n group={group}\n collapsed={collapsed}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === group.id\n }\n onEdit={onEditName}\n onSave={onSave}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n <RenderMonths component={MonthComponent} args={{ group }} />\n </Row>\n );\n}\n\nfunction IncomeCategory({\n cat,\n isLast,\n editingCell,\n MonthComponent,\n onEditName,\n onEditMonth,\n onSave,\n onDelete,\n onDragChange,\n onBudgetAction,\n onReorder,\n onShowActivity\n}) {\n let { dragRef } = useDraggable({\n type: 'income-category',\n onDragChange,\n item: cat,\n canDrag: editingCell === null\n });\n\n let { dropRef, dropPos } = useDroppable({\n types: 'income-category',\n id: cat.id,\n onDrop: onReorder\n });\n\n return (\n <Row innerRef={dropRef} collapsed={true} backgroundColor=\"transparent\">\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n\n <SidebarCategory\n innerRef={dragRef}\n category={cat}\n isLast={isLast}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === cat.id\n }\n onEditName={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n />\n <RenderMonths\n component={MonthComponent}\n editingIndex={\n editingCell && editingCell.id === cat.id && editingCell.cell\n }\n args={{\n category: cat,\n onEdit: onEditMonth,\n isLast,\n onShowActivity,\n onBudgetAction\n }}\n />\n </Row>\n );\n}\n\nconst BudgetCategories = React.memo(\n ({\n categoryGroups,\n newCategoryForGroup,\n isAddingGroup,\n editingCell,\n collapsed,\n setCollapsed,\n dataComponents,\n onBudgetAction,\n onShowActivity,\n onEditName,\n onEditMonth,\n onSaveCategory,\n onSaveGroup,\n onDeleteCategory,\n onDeleteGroup,\n onReorderCategory,\n onReorderGroup,\n onShowNewCategory,\n onHideNewCategory,\n onShowNewGroup,\n onHideNewGroup\n }) => {\n let items = useMemo(() => {\n let [expenseGroups, incomeGroup] = separateGroups(categoryGroups);\n\n let items = Array.prototype.concat.apply(\n [],\n expenseGroups.map(group => {\n let items = [{ type: 'expense-group', value: group }];\n\n if (newCategoryForGroup === group.id) {\n items.push({ type: 'new-category' });\n }\n\n return [\n ...items,\n ...(collapsed.includes(group.id) ? [] : group.categories).map(\n cat => ({\n type: 'expense-category',\n value: cat\n })\n )\n ];\n })\n );\n\n if (isAddingGroup) {\n items.push({ type: 'new-group' });\n }\n\n if (incomeGroup) {\n items = items.concat(\n [\n { type: 'income-separator' },\n { type: 'income-group', value: incomeGroup },\n newCategoryForGroup === incomeGroup.id && { type: 'new-category' },\n ...(collapsed.includes(incomeGroup.id)\n ? []\n : incomeGroup.categories\n ).map(cat => ({\n type: 'income-category',\n value: cat\n }))\n ].filter(x => x)\n );\n }\n\n return items;\n }, [categoryGroups, collapsed, newCategoryForGroup, isAddingGroup]);\n\n let [dragState, setDragState] = useState(null);\n let [savedCollapsed, setSavedCollapsed] = useState(null);\n\n // TODO: If we turn this into a reducer, we could probably memoize\n // each item in the list for better perf\n function onDragChange(newDragState) {\n let { state } = newDragState;\n\n if (state === 'start-preview') {\n setDragState({\n type: newDragState.type,\n item: newDragState.item,\n preview: true\n });\n } else if (state === 'start') {\n if (dragState) {\n setDragState({\n ...dragState,\n preview: false\n });\n setSavedCollapsed(collapsed);\n }\n } else if (state === 'hover') {\n setDragState({\n ...dragState,\n hoveredId: newDragState.id,\n hoveredPos: newDragState.pos\n });\n } else if (state === 'end') {\n setDragState(null);\n setCollapsed(savedCollapsed);\n }\n }\n\n function onToggleCollapse(id) {\n if (collapsed.includes(id)) {\n setCollapsed(collapsed.filter(id_ => id_ !== id));\n } else {\n setCollapsed([...collapsed, id]);\n }\n }\n\n return (\n <View\n style={{\n marginBottom: 10,\n backgroundColor: 'white',\n overflow: 'hidden',\n boxShadow: MONTH_BOX_SHADOW,\n borderRadius: '0 0 4px 4px',\n flex: 1\n }}\n >\n {items.map((item, idx) => {\n let content;\n switch (item.type) {\n case 'new-group':\n content = (\n <Row style={{ backgroundColor: colors.n11 }}>\n <SidebarGroup\n group={{ id: 'new', name: '' }}\n editing={true}\n onSave={onSaveGroup}\n onHideNewGroup={onHideNewGroup}\n onEdit={onEditName}\n />\n </Row>\n );\n break;\n case 'new-category':\n content = (\n <Row>\n <SidebarCategory\n category={{\n name: '',\n cat_group: newCategoryForGroup,\n is_income:\n newCategoryForGroup ===\n categoryGroups.find(g => g.is_income).id,\n id: 'new'\n }}\n editing={true}\n onSave={onSaveCategory}\n onHideNewCategory={onHideNewCategory}\n onEditName={onEditName}\n />\n </Row>\n );\n break;\n\n case 'expense-group':\n content = (\n <ExpenseGroup\n group={item.value}\n editingCell={editingCell}\n collapsed={collapsed.includes(item.value.id)}\n MonthComponent={dataComponents.ExpenseGroupComponent}\n dragState={dragState}\n onEditName={onEditName}\n onSave={onSaveGroup}\n onDelete={onDeleteGroup}\n onDragChange={onDragChange}\n onReorderGroup={onReorderGroup}\n onReorderCategory={onReorderCategory}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n );\n break;\n case 'expense-category':\n content = (\n <ExpenseCategory\n cat={item.value}\n editingCell={editingCell}\n MonthComponent={dataComponents.ExpenseCategoryComponent}\n dragState={dragState}\n onEditName={onEditName}\n onEditMonth={onEditMonth}\n onSave={onSaveCategory}\n onDelete={onDeleteCategory}\n onDragChange={onDragChange}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n />\n );\n break;\n case 'income-separator':\n content = (\n <View\n style={{\n height: INCOME_HEADER_HEIGHT,\n backgroundColor: 'white'\n }}\n >\n <IncomeHeader\n MonthComponent={dataComponents.IncomeHeaderComponent}\n onShowNewGroup={onShowNewGroup}\n />\n </View>\n );\n break;\n case 'income-group':\n content = (\n <IncomeGroup\n group={item.value}\n editingCell={editingCell}\n MonthComponent={dataComponents.IncomeGroupComponent}\n collapsed={collapsed.includes(item.value.id)}\n onEditName={onEditName}\n onSave={onSaveGroup}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n );\n break;\n case 'income-category':\n content = (\n <IncomeCategory\n cat={item.value}\n editingCell={editingCell}\n isLast={idx === items.length - 1}\n MonthComponent={dataComponents.IncomeCategoryComponent}\n onEditName={onEditName}\n onEditMonth={onEditMonth}\n onSave={onSaveCategory}\n onDelete={onDeleteCategory}\n onDragChange={onDragChange}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n />\n );\n break;\n default:\n throw new Error('Unknown item type: ' + item.type);\n }\n\n let pos =\n idx === 0 ? 'first' : idx === items.length - 1 ? 'last' : null;\n\n return (\n <DropHighlightPosContext.Provider\n key={\n item.value\n ? item.value.id\n : item.type === 'income-separator'\n ? 'separator'\n : idx\n }\n value={pos}\n >\n <View\n style={\n !dragState && {\n ':hover': { backgroundColor: '#fcfcfc' }\n }\n }\n >\n {content}\n </View>\n </DropHighlightPosContext.Provider>\n );\n })}\n </View>\n );\n }\n);\n\nfunction IncomeHeader({ MonthComponent, onShowNewGroup }) {\n return (\n <View style={{ flexDirection: 'row', flex: 1 }}>\n <View\n style={{\n width: 200,\n alignItems: 'flex-start',\n justifyContent: 'flex-start'\n }}\n >\n <Button onClick={onShowNewGroup} style={{ fontSize: 12, margin: 10 }}>\n Add Group\n </Button>\n </View>\n <RenderMonths\n component={MonthComponent}\n style={{ border: 0, justifyContent: 'flex-end' }}\n />\n </View>\n );\n}\n\nexport const BudgetPageHeader = React.memo(\n ({ startMonth, onMonthSelect, numMonths, monthBounds, style }) => {\n function getValidMonth(month) {\n let start = monthBounds.start;\n let end = monthUtils.subMonths(monthBounds.end, numMonths - 1);\n\n if (month < start) {\n return start;\n } else if (month > end) {\n return end;\n }\n return month;\n }\n\n return (\n <View style={{ marginLeft: 200 + 5, flexShrink: 0 }}>\n <View style={{ marginRight: 5 + getScrollbarWidth() }}>\n <MonthPicker\n startMonth={startMonth}\n numDisplayed={numMonths}\n monthBounds={monthBounds}\n style={{ paddingTop: 5 }}\n onSelect={month => onMonthSelect(getValidMonth(month))}\n />\n </View>\n </View>\n );\n }\n);\n\nexport const MonthPicker = scope(lively => {\n function getRangeForYear(year) {\n return monthUtils.rangeInclusive(\n monthUtils.getYearStart(year),\n monthUtils.getYearEnd(year)\n );\n }\n\n function getMonth(year, idx) {\n return monthUtils.addMonths(year, idx);\n }\n\n function getCurrentMonthName(startMonth, currentMonth) {\n return monthUtils.getYear(startMonth) === monthUtils.getYear(currentMonth)\n ? monthUtils.format(currentMonth, 'MMM')\n : null;\n }\n\n function getInitialState({ props: { startMonth, monthBounds } }) {\n const currentMonth = monthUtils.currentMonth();\n const range = getRangeForYear(currentMonth);\n const monthNames = range.map(month => {\n return monthUtils.format(month, 'MMM');\n });\n\n return {\n monthNames,\n currentMonthName: getCurrentMonthName(startMonth, currentMonth)\n };\n }\n\n function componentWillReceiveProps({ props }, nextProps) {\n if (\n monthUtils.getYear(props.startMonth) !==\n monthUtils.getYear(nextProps.startMonth)\n ) {\n return {\n currentMonthName: getCurrentMonthName(\n nextProps.startMonth,\n monthUtils.currentMonth()\n )\n };\n }\n }\n\n function MonthPicker({\n state: { monthNames, currentMonthName },\n props: { startMonth, numDisplayed, monthBounds, style, onSelect }\n }) {\n const year = monthUtils.getYear(startMonth);\n const selectedIndex = monthUtils.getMonthIndex(startMonth);\n\n return (\n <View\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between'\n },\n style\n ]}\n >\n <View\n style={{\n padding: '3px 0px',\n margin: '3px 0',\n fontWeight: 'bold',\n fontSize: 14,\n flex: '0 0 40px'\n }}\n >\n {monthUtils.format(year, 'yyyy')}\n </View>\n <ElementQuery\n sizes={[\n { width: 320, size: 'small' },\n { width: 400, size: 'medium' },\n { size: 'big' }\n ]}\n >\n {(matched, ref) => (\n <View\n innerRef={ref}\n style={{\n flexDirection: 'row',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n {monthNames.map((monthName, idx) => {\n const lastSelectedIndex = selectedIndex + numDisplayed;\n const selected =\n idx >= selectedIndex && idx < lastSelectedIndex;\n const current = monthName === currentMonthName;\n const month = getMonth(year, idx);\n const isMonthBudgeted =\n month >= monthBounds.start && month <= monthBounds.end;\n\n return (\n <View\n key={monthName}\n style={[\n {\n marginRight: 1,\n padding:\n matched && matched.size === 'big'\n ? '3px 5px'\n : '3px 3px',\n textAlign: 'center',\n cursor: 'default',\n borderRadius: 2,\n ':hover': isMonthBudgeted && {\n backgroundColor: colors.p6,\n color: 'white'\n }\n },\n !isMonthBudgeted && { color: colors.n7 },\n styles.smallText,\n selected && {\n backgroundColor: colors.p6,\n color: 'white',\n borderRadius: 0\n },\n idx === selectedIndex && {\n borderTopLeftRadius: 2,\n borderBottomLeftRadius: 2\n },\n idx === lastSelectedIndex - 1 && {\n borderTopRightRadius: 2,\n borderBottomRightRadius: 2\n },\n idx >= selectedIndex &&\n idx < lastSelectedIndex - 1 && {\n marginRight: 0,\n borderRight: 'solid 1px',\n borderColor: colors.p6\n },\n current && { textDecoration: 'underline' }\n ]}\n onClick={() => onSelect(month)}\n >\n {matched && matched.size === 'small'\n ? monthName[0]\n : monthName}\n </View>\n );\n })}\n </View>\n )}\n </ElementQuery>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n flex: '0 0 50px',\n justifyContent: 'flex-end'\n }}\n >\n <Button\n onClick={() => onSelect(monthUtils.subMonths(startMonth, 1))}\n bare\n >\n <ArrowThinLeft width={12} height={12} />\n </Button>\n <Button\n onClick={() => onSelect(monthUtils.addMonths(startMonth, 1))}\n bare\n >\n <ArrowThinRight width={12} height={12} />\n </Button>\n </View>\n </View>\n );\n }\n\n return lively(MonthPicker, { getInitialState, componentWillReceiveProps });\n});\n","import React, { useEffect } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { View } from '../common';\nimport { BudgetPageHeader, BudgetTable } from './index';\nimport { CategoryGroupsContext } from './util';\nimport { useBudgetMonthCount } from './BudgetMonthCountContext';\n\nfunction getNumPossibleMonths(width) {\n let estimatedTableWidth = width - 200;\n\n if (estimatedTableWidth < 500) {\n return 1;\n } else if (estimatedTableWidth < 750) {\n return 2;\n } else if (estimatedTableWidth < 1000) {\n return 3;\n } else if (estimatedTableWidth < 1250) {\n return 4;\n } else if (estimatedTableWidth < 1500) {\n return 5;\n }\n\n return 6;\n}\n\nconst DynamicBudgetTableInner = React.forwardRef(\n (\n {\n width,\n height,\n categoryGroups,\n prewarmStartMonth,\n startMonth,\n maxMonths = 3,\n monthBounds,\n onMonthSelect: onMonthSelect_,\n onPreload,\n ...props\n },\n ref\n ) => {\n let { setDisplayMax } = useBudgetMonthCount();\n\n let numPossible = getNumPossibleMonths(width);\n let numMonths = Math.min(numPossible, maxMonths);\n let maxWidth = 200 + 500 * numMonths;\n\n useEffect(() => {\n setDisplayMax(numPossible);\n }, [numPossible]);\n\n function onMonthSelect(month) {\n onMonthSelect_(month, numMonths);\n }\n\n return (\n <CategoryGroupsContext.Provider value={categoryGroups}>\n <View\n style={{\n width,\n height,\n alignItems: 'center',\n opacity: width <= 0 || height <= 0 ? 0 : 1\n }}\n >\n <View style={{ width: '100%', maxWidth }}>\n <BudgetPageHeader\n startMonth={prewarmStartMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n onMonthSelect={onMonthSelect}\n />\n <BudgetTable\n ref={ref}\n categoryGroups={categoryGroups}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n {...props}\n />\n </View>\n </View>\n </CategoryGroupsContext.Provider>\n );\n }\n);\n\nexport default React.forwardRef((props, ref) => {\n return (\n <AutoSizer>\n {({ width, height }) => (\n <DynamicBudgetTableInner\n ref={ref}\n width={width}\n height={height}\n {...props}\n />\n )}\n </AutoSizer>\n );\n});\n","export function addCategory(categoryGroups, cat) {\n return categoryGroups.map(group => {\n if (group.id === cat.cat_group) {\n group.categories = [cat, ...group.categories];\n }\n return { ...group };\n });\n}\n\nexport function updateCategory(categoryGroups, category) {\n return categoryGroups.map(group => {\n if (group.id === category.cat_group) {\n group.categories = group.categories.map(c => {\n if (c.id === category.id) {\n return { ...c, ...category };\n }\n return c;\n });\n }\n return group;\n });\n}\n\nexport function moveCategory(categoryGroups, id, groupId, targetId) {\n if (id === targetId) {\n return categoryGroups;\n }\n\n let moveCat = categoryGroups.reduce((value, group) => {\n return value || group.categories.find(cat => cat.id === id);\n }, null);\n\n // Update the group id on the category\n moveCat = { ...moveCat, cat_group: groupId };\n\n return categoryGroups.map(group => {\n if (group.id === groupId) {\n group.categories = group.categories.reduce((cats, cat) => {\n if (cat.id === targetId) {\n cats.push(moveCat);\n cats.push(cat);\n } else if (cat.id !== id) {\n cats.push(cat);\n }\n return cats;\n }, []);\n\n if (!targetId) {\n group.categories.push(moveCat);\n }\n } else {\n group.categories = group.categories.filter(cat => cat.id !== id);\n }\n\n return { ...group };\n });\n}\n\nexport function moveCategoryGroup(categoryGroups, id, targetId) {\n if (id === targetId) {\n return categoryGroups;\n }\n\n let moveGroup = categoryGroups.find(g => g.id === id);\n\n categoryGroups = categoryGroups.reduce((groups, group) => {\n if (group.id === targetId) {\n groups.push(moveGroup);\n groups.push(group);\n } else if (group.id !== id) {\n groups.push(group);\n }\n return groups;\n }, []);\n\n if (!targetId) {\n categoryGroups.push(moveGroup);\n }\n\n return categoryGroups;\n}\n\nexport function deleteCategory(categoryGroups, id) {\n return categoryGroups.map(group => {\n group.categories = group.categories.filter(c => c.id !== id);\n return group;\n });\n}\n\nexport function addGroup(categoryGroups, group) {\n return [...categoryGroups, group];\n}\n\nexport function updateGroup(categoryGroups, group) {\n return categoryGroups.map(g => {\n if (g.id === group.id) {\n return { ...g, ...group };\n }\n return g;\n });\n}\n\nexport function deleteGroup(categoryGroups, id) {\n return categoryGroups.filter(g => g.id !== id);\n}\n","import React, { useEffect, useContext, useMemo } from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport { bindActionCreators } from 'redux';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport memoizeOne from 'memoize-one';\nimport * as actions from 'loot-core/src/client/actions';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { getValidMonthBounds } from 'loot-design/src/components/budget/MonthsContext';\nimport { TitlebarContext } from '../Titlebar';\n\nimport * as rollover from 'loot-design/src/components/budget/rollover/rollover-components';\nimport { RolloverContext } from 'loot-design/src/components/budget/rollover/RolloverContext';\n\nimport * as report from 'loot-design/src/components/budget/report/components';\nimport { ReportProvider } from 'loot-design/src/components/budget/report/ReportContext';\n\nimport DynamicBudgetTable from 'loot-design/src/components/budget/DynamicBudgetTable';\nimport SpreadsheetContext from 'loot-design/src/components/spreadsheet/SpreadsheetContext';\nimport { View } from 'loot-design/src/components/common';\nimport { styles, colors } from 'loot-design/src/style';\nimport {\n addCategory,\n updateCategory,\n moveCategory,\n moveCategoryGroup,\n deleteCategory,\n addGroup,\n updateGroup,\n deleteGroup\n} from 'loot-core/src/shared/categories.js';\n\nlet _initialBudgetMonth = null;\n\nclass Budget extends React.PureComponent {\n constructor(props) {\n super(props);\n\n const currentMonth = _initialBudgetMonth || monthUtils.currentMonth();\n this.state = {\n initialized: false,\n prewarmStartMonth: currentMonth,\n startMonth: currentMonth,\n newCategoryForGroup: null,\n isAddingGroup: false,\n collapsed: props.collapsedPrefs || [],\n bounds: { start: currentMonth, end: currentMonth },\n categoryGroups: null,\n summaryCollapsed: props.summaryCollapsed\n };\n }\n\n async loadCategories() {\n let result = await this.props.getCategories();\n this.setState({ categoryGroups: result.grouped });\n }\n\n async componentDidMount() {\n let { titlebar, budgetType } = this.props;\n this.loadCategories();\n\n let { start, end } = await send('get-budget-bounds');\n this.setState({ bounds: { start, end } });\n\n this.prewarmAllMonths({ start, end }, budgetType);\n\n let unlistens = [\n listen('sync-event', ({ type, tables }) => {\n if (\n type === 'success' &&\n (tables.includes('categories') ||\n tables.includes('category_mapping') ||\n tables.includes('category_groups'))\n ) {\n this.loadCategories();\n }\n }),\n\n listen('undo-event', ({ tables }) => {\n if (this.table) {\n // g dammit\n // We need to clear the editing cell, otherwise when\n // the user navigates away from the page they will\n // accidentally clear the undo stack if they have pressed\n // undo, since the cell will save itself on blur (worst case:\n // undo takes you to another screen and then you can't redo\n // any of the budget changes)\n this.table.clearEditing();\n }\n\n if (tables.includes('categories')) {\n this.loadCategories();\n }\n }),\n\n titlebar.subscribe(this.onTitlebarEvent)\n ];\n\n this.cleanup = () => {\n unlistens.forEach(unlisten => unlisten());\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.collapsed !== this.state.collapsed) {\n this.props.savePrefs({ 'budget.collapsed': this.state.collapsed });\n }\n\n if (prevState.startMonth !== this.state.startMonth) {\n // Save it off into a global state so if the component re-mounts\n // we keep this state (but don't need to subscribe to it)\n _initialBudgetMonth = this.state.startMonth;\n }\n\n if (this.props.match && !prevProps.match) {\n // Make to sure to check if the budget bounds have changed, and\n // if so reload the budget data\n send('get-budget-bounds').then(({ start, end }) => {\n let { bounds } = this.state;\n if (bounds.start !== start || bounds.end !== end) {\n this.setState({ bounds: { start, end } });\n }\n });\n }\n }\n\n componentWillUnmount() {\n if (this.cleanup) {\n this.cleanup();\n }\n }\n\n prewarmMonth = async (month, type = null) => {\n type = type || this.props.budgetType;\n\n let method =\n type === 'report' ? 'report-budget-month' : 'rollover-budget-month';\n\n let values = await send(method, { month });\n\n for (let value of values) {\n this.props.spreadsheet.prewarmCache(value.name, value);\n }\n };\n\n async prewarmAllMonths(bounds, type = null) {\n let { startMonth } = this.state;\n let numMonths = 3;\n\n bounds = getValidMonthBounds(\n bounds,\n monthUtils.subMonths(startMonth, 1),\n monthUtils.addMonths(startMonth, numMonths + 1)\n );\n let months = monthUtils.rangeInclusive(bounds.start, bounds.end);\n\n await Promise.all(months.map(month => this.prewarmMonth(month, type)));\n\n this.setState({ initialized: true });\n }\n\n onMonthSelect = async (month, numDisplayed) => {\n let { startMonth } = this.state;\n\n this.setState({ prewarmStartMonth: month });\n\n this.warmingMonth = month;\n\n // We could be smarter about this, but this is a good start. We\n // optimize for the case where users press the left/right button\n // to move between months. This loads the month data all at once\n // and \"prewarms\" the spreadsheet cache. This uses a simple\n // heuristic that will fail if the user clicks an arbitrary month,\n // but it will just load in some unnecessary data.\n if (month < startMonth) {\n // pre-warm prev month\n await this.prewarmMonth(monthUtils.subMonths(month, 1));\n } else if (month > startMonth) {\n // pre-warm next month\n await this.prewarmMonth(monthUtils.addMonths(month, numDisplayed));\n }\n\n if (this.warmingMonth === month) {\n this.setState({ startMonth: month });\n }\n };\n\n onShowNewCategory = groupId => {\n this.setState({\n newCategoryForGroup: groupId,\n collapsed: this.state.collapsed.filter(c => c !== groupId)\n });\n };\n\n onHideNewCategory = () => {\n this.setState({ newCategoryForGroup: null });\n };\n\n onShowNewGroup = () => {\n this.setState({ isAddingGroup: true });\n };\n\n onHideNewGroup = () => {\n this.setState({ isAddingGroup: false });\n };\n\n setCollapsed = collapsed => {\n this.setState({ collapsed });\n };\n\n onCopy(month) {\n this.props.copyPreviousMonthInto(month, this.props.categories);\n }\n\n onSaveCategory = async category => {\n let { categoryGroups } = this.state;\n\n if (category.id === 'new') {\n let id = await this.props.createCategory(\n category.name,\n category.cat_group,\n category.is_income\n );\n\n this.setState({\n newCategoryForGroup: null,\n categoryGroups: addCategory(categoryGroups, {\n ...category,\n is_income: category.is_income ? 1 : 0,\n id\n })\n });\n } else {\n this.props.updateCategory(category);\n\n this.setState({\n categoryGroups: updateCategory(categoryGroups, category)\n });\n }\n };\n\n onDeleteCategory = async id => {\n const mustTransfer = await send('must-category-transfer', { id });\n let { categoryGroups } = this.state;\n\n if (mustTransfer) {\n this.props.pushModal('confirm-category-delete', {\n category: id,\n onDelete: transferCategory => {\n if (id !== transferCategory) {\n this.props.deleteCategory(id, transferCategory);\n\n this.setState({\n categoryGroups: deleteCategory(categoryGroups, id)\n });\n }\n }\n });\n } else {\n this.props.deleteCategory(id);\n\n this.setState({\n categoryGroups: deleteCategory(categoryGroups, id)\n });\n }\n };\n\n onSaveGroup = async group => {\n let { categoryGroups } = this.state;\n\n if (group.id === 'new') {\n let id = await this.props.createGroup(group.name);\n this.setState({\n isAddingGroup: false,\n categoryGroups: addGroup(categoryGroups, {\n ...group,\n is_income: 0,\n categories: group.categories || [],\n id\n })\n });\n } else {\n this.props.updateGroup(group);\n this.setState({\n categoryGroups: updateGroup(categoryGroups, group)\n });\n }\n };\n\n onDeleteGroup = async id => {\n let { categoryGroups } = this.state;\n let group = categoryGroups.find(g => g.id === id);\n\n let mustTransfer = false;\n for (let category of group.categories) {\n if (await send('must-category-transfer', { id: category.id })) {\n mustTransfer = true;\n break;\n }\n }\n\n if (mustTransfer) {\n this.props.pushModal('confirm-category-delete', {\n group: id,\n onDelete: transferCategory => {\n this.props.deleteGroup(id, transferCategory);\n\n this.setState({\n categoryGroups: deleteGroup(categoryGroups, id)\n });\n }\n });\n } else {\n this.props.deleteGroup(id);\n\n this.setState({\n categoryGroups: deleteGroup(categoryGroups, id)\n });\n }\n };\n\n onBudgetAction = (month, type, args) => {\n this.props.applyBudgetAction(month, type, args);\n };\n\n onShowActivity = (categoryName, categoryId, month) => {\n const after = `${month}-01`;\n const before = `${month}-31`;\n\n this.props.history.push({\n pathname: '/accounts',\n state: {\n goBack: true,\n filterName: `${categoryName} (${monthUtils.format(\n month,\n 'MMMM yyyy'\n )})`,\n filter: {\n category: categoryId,\n date: { $transform: '$month', $eq: month }\n }\n }\n });\n };\n\n onReorderCategory = async sortInfo => {\n let { categoryGroups } = this.state;\n\n this.props.moveCategory(sortInfo.id, sortInfo.groupId, sortInfo.targetId);\n this.setState({\n categoryGroups: moveCategory(\n categoryGroups,\n sortInfo.id,\n sortInfo.groupId,\n sortInfo.targetId\n )\n });\n };\n\n onReorderGroup = async sortInfo => {\n let { categoryGroups } = this.state;\n\n this.props.moveCategoryGroup(sortInfo.id, sortInfo.targetId);\n this.setState({\n categoryGroups: moveCategoryGroup(\n categoryGroups,\n sortInfo.id,\n sortInfo.targetId\n )\n });\n };\n\n onToggleCollapse = () => {\n let collapsed = !this.state.summaryCollapsed;\n this.setState({ summaryCollapsed: collapsed });\n this.props.savePrefs({ 'budget.summaryCollapsed': collapsed });\n };\n\n onTitlebarEvent = async msg => {\n switch (msg) {\n case 'budget/switch-type': {\n let type = this.props.budgetType;\n let newType = type === 'rollover' ? 'report' : 'rollover';\n\n this.props.spreadsheet.disableObservers();\n await send('budget-set-type', { type: newType });\n await this.prewarmAllMonths(this.state.bounds, newType);\n this.props.spreadsheet.enableObservers();\n this.props.loadPrefs();\n break;\n }\n default:\n }\n };\n\n render() {\n let {\n maxMonths,\n budgetType: type,\n reportComponents,\n rolloverComponents\n } = this.props;\n let {\n initialized,\n categoryGroups,\n prewarmStartMonth,\n startMonth,\n newCategoryForGroup,\n isAddingGroup,\n collapsed,\n summaryCollapsed,\n bounds\n } = this.state;\n\n maxMonths = maxMonths || 1;\n\n if (!initialized || !categoryGroups) {\n return null;\n }\n\n let table;\n if (type === 'report') {\n table = (\n <ReportProvider\n summaryCollapsed={summaryCollapsed}\n onBudgetAction={this.onBudgetAction}\n onToggleSummaryCollapse={this.onToggleCollapse}\n >\n <DynamicBudgetTable\n ref={el => (this.table = el)}\n type={type}\n categoryGroups={categoryGroups}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n monthBounds={bounds}\n maxMonths={maxMonths}\n collapsed={collapsed}\n setCollapsed={this.setCollapsed}\n newCategoryForGroup={newCategoryForGroup}\n isAddingGroup={isAddingGroup}\n dataComponents={reportComponents}\n onMonthSelect={this.onMonthSelect}\n onShowNewCategory={this.onShowNewCategory}\n onHideNewCategory={this.onHideNewCategory}\n onShowNewGroup={this.onShowNewGroup}\n onHideNewGroup={this.onHideNewGroup}\n onDeleteCategory={this.onDeleteCategory}\n onDeleteGroup={this.onDeleteGroup}\n onSaveCategory={this.onSaveCategory}\n onSaveGroup={this.onSaveGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n />\n </ReportProvider>\n );\n } else {\n table = (\n <RolloverContext\n categoryGroups={categoryGroups}\n summaryCollapsed={summaryCollapsed}\n onBudgetAction={this.onBudgetAction}\n onToggleSummaryCollapse={this.onToggleCollapse}\n >\n <DynamicBudgetTable\n ref={el => (this.table = el)}\n type={type}\n categoryGroups={categoryGroups}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n monthBounds={bounds}\n maxMonths={maxMonths}\n collapsed={collapsed}\n setCollapsed={this.setCollapsed}\n newCategoryForGroup={newCategoryForGroup}\n isAddingGroup={isAddingGroup}\n dataComponents={rolloverComponents}\n onMonthSelect={this.onMonthSelect}\n onShowNewCategory={this.onShowNewCategory}\n onHideNewCategory={this.onHideNewCategory}\n onShowNewGroup={this.onShowNewGroup}\n onHideNewGroup={this.onHideNewGroup}\n onDeleteCategory={this.onDeleteCategory}\n onDeleteGroup={this.onDeleteGroup}\n onSaveCategory={this.onSaveCategory}\n onSaveGroup={this.onSaveGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n />\n </RolloverContext>\n );\n }\n\n return (\n <View style={{ flex: 1 }} innerRef={el => (this.page = el)}>\n {table}\n </View>\n );\n }\n}\n\nfunction BudgetWrapper(props) {\n let spreadsheet = useContext(SpreadsheetContext);\n let titlebar = useContext(TitlebarContext);\n\n let reportComponents = useMemo(\n () => ({\n SummaryComponent: report.BudgetSummary,\n ExpenseCategoryComponent: report.ExpenseCategoryMonth,\n ExpenseGroupComponent: report.ExpenseGroupMonth,\n IncomeCategoryComponent: report.IncomeCategoryMonth,\n IncomeGroupComponent: report.IncomeGroupMonth,\n BudgetTotalsComponent: report.BudgetTotalsMonth,\n IncomeHeaderComponent: report.IncomeHeaderMonth\n }),\n [report]\n );\n\n let rolloverComponents = useMemo(\n () => ({\n SummaryComponent: rollover.BudgetSummary,\n ExpenseCategoryComponent: rollover.ExpenseCategoryMonth,\n ExpenseGroupComponent: rollover.ExpenseGroupMonth,\n IncomeCategoryComponent: rollover.IncomeCategoryMonth,\n IncomeGroupComponent: rollover.IncomeGroupMonth,\n BudgetTotalsComponent: rollover.BudgetTotalsMonth,\n IncomeHeaderComponent: rollover.IncomeHeaderMonth\n }),\n [rollover]\n );\n\n // In a previous iteration, the wrapper needs `overflow: hidden` for\n // some reason. Without it at certain dimensions the width/height\n // that autosizer gives us is slightly wrong, causing scrollbars to\n // appear. We might not need it anymore?\n return (\n <View\n style={[\n styles.page,\n { paddingLeft: 8, paddingRight: 8, overflow: 'hidden' }\n ]}\n >\n <Budget\n {...props}\n reportComponents={reportComponents}\n rolloverComponents={rolloverComponents}\n spreadsheet={spreadsheet}\n titlebar={titlebar}\n />\n </View>\n );\n}\n\nexport default connect(\n state => ({\n collapsedPrefs: state.prefs.local['budget.collapsed'],\n summaryCollapsed: state.prefs.local['budget.summaryCollapsed'],\n budgetType: state.prefs.local.budgetType || 'rollover',\n maxMonths: state.prefs.global.maxMonths,\n categoryGroups: state.queries.categories.grouped\n }),\n actions\n)(BudgetWrapper);\n","import { useMemo } from 'react';\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\n\nexport function useArgsMemo(func) {\n return (...args) => {\n return useMemo(() => func(...args), args);\n };\n}\n\nexport function fromDateRepr(date) {\n return date.slice(0, 7);\n}\n\nexport function fromDateReprToDay(date) {\n return date;\n}\n\nexport function toDateRepr(str) {\n return parseInt(str.replace(/-/g, ''), 10);\n}\n\nexport async function runAll(queries, cb) {\n let data = await Promise.all(\n queries.map(q => {\n return runQuery(q).then(({ data }) => data);\n })\n );\n cb(data);\n}\n\nexport function index(data, field, mapper) {\n const result = {};\n data.forEach(item => {\n result[mapper ? mapper(item[field]) : item[field]] = item;\n });\n return result;\n}\n","import { colors } from 'loot-design/src/style';\n\nlet colorFades = {\n blueFadeStart: 'rgba(229, 245, 255, 1)',\n blueFadeEnd: 'rgba(229, 245, 255, 0)',\n redFadeStart: 'rgba(255, 243, 242, 1)',\n redFadeEnd: 'rgba(255, 243, 242, 0)'\n};\n\n// Typography\nconst sansSerif =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif';\nconst letterSpacing = 'normal';\nconst fontSize = 13;\n\n// Labels\nconst baseLabelStyles = {\n fontFamily: sansSerif,\n fontSize,\n letterSpacing,\n fill: colors.n1,\n stroke: 'transparent'\n};\n\nexport default {\n colors: {\n ...colorFades,\n red: colors.r7,\n blue: colors.b6\n },\n area: {\n style: {\n data: {\n stroke: colors.b6,\n strokeWidth: 2,\n strokeLinejoin: 'round',\n strokeLinecap: 'round'\n }\n }\n },\n axis: {\n style: {\n axis: {\n fill: 'transparent',\n stroke: 'none'\n },\n grid: {\n fill: 'none',\n stroke: 'none',\n pointerEvents: 'none'\n },\n ticks: {\n fill: 'transparent',\n size: 1,\n stroke: 'none'\n },\n tickLabels: baseLabelStyles\n }\n },\n dependentAxis: {\n style: {\n grid: { stroke: 'rgba(0,0,0,.2)', strokeDasharray: '1,1' },\n tickLabels: { padding: 5 }\n }\n },\n independentAxis: {\n style: {\n axis: { stroke: 'rgba(0,0,0,.2)' },\n tickLabels: { padding: 10 }\n }\n },\n bar: {\n style: {\n data: { fill: colors.b6, stroke: 'none' }\n }\n },\n line: {\n style: {\n data: {\n fill: 'none',\n stroke: colors.b6,\n strokeWidth: 2,\n strokeLinejoin: 'round',\n strokeLinecap: 'round'\n }\n }\n },\n chart: {\n padding: {\n top: 20,\n left: 65,\n right: 20,\n bottom: 50\n }\n }\n};\n","import React from 'react';\nimport { View } from 'loot-design/src/components/common';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nclass Container extends React.Component {\n render() {\n const { style, children } = this.props;\n\n return (\n <View\n style={[{ height: 300, position: 'relative', flexShrink: 0 }, style]}\n >\n <div ref={el => (this.portalHost = el)} />\n <AutoSizer>\n {({ width, height }) => (\n <div style={{ width, height }}>\n {children(width, height, this.portalHost)}\n </div>\n )}\n </AutoSizer>\n </View>\n );\n }\n}\n\nexport default Container;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { VictoryTooltip } from 'victory';\nimport { css, before } from 'glamor';\nimport { colors } from 'loot-design/src/style';\n\nclass Tooltip extends React.Component {\n static defaultEvents = VictoryTooltip.defaultEvents;\n\n render() {\n let {\n active,\n x,\n y,\n scale,\n datum,\n portalHost,\n offsetX = 0,\n offsetY,\n position,\n light,\n forceActive,\n style\n } = this.props;\n const xRange = scale.x.range();\n const xPos = x - xRange[0];\n\n if (!position) {\n if (datum.labelPosition) {\n position = datum.labelPosition;\n } else {\n position = xPos < 150 ? 'right' : 'left';\n }\n }\n\n if (!portalHost || (!active && !forceActive)) {\n return null;\n }\n\n y = offsetY ? offsetY(y) : y;\n\n return ReactDOM.createPortal(\n <div\n {...css(\n {\n position: 'absolute',\n top: 0,\n left: offsetX,\n // prettier-ignore\n transform: position === 'right' ?\n `translate(calc(${x}px + 15px), calc(${y}px ${light ? '' : '- 50%'}))` :\n `translate(calc(${x}px - 100% - 15px), calc(${y}px ${light ? '' : '- 50%'}))`,\n zIndex: 1000,\n pointerEvents: 'none',\n borderRadius: 2,\n boxShadow: light ? 'none' : '0 1px 6px rgba(0, 0, 0, .20)',\n // TODO: Transparent background\n backgroundColor: light ? 'transparent' : colors.n1,\n color: light ? 'inherit' : 'white',\n padding: 10\n },\n !light &&\n before({\n position: 'absolute',\n display: 'inline-block',\n borderTop: '7px solid transparent',\n borderBottom: '7px solid transparent',\n [position === 'right' ? 'borderRight' : 'borderLeft']:\n '7px solid ' + colors.n1,\n [position === 'right' ? 'left' : 'right']: -6,\n top: 'calc(50% - 7px)',\n content: '\" \"'\n }),\n style\n )}\n >\n {datum.premadeLabel}\n </div>,\n portalHost\n );\n }\n}\n\nexport default Tooltip;\n","import { useContext, useState, useEffect } from 'react';\n\nimport SpreadsheetContext from 'loot-design/src/components/spreadsheet/SpreadsheetContext';\n\nfunction useReport(sheetName, getData) {\n const spreadsheet = useContext(SpreadsheetContext);\n const [results, setResults] = useState(null);\n\n useEffect(() => {\n let cleanup;\n getData(spreadsheet, results => setResults(results)).then(c => {\n cleanup = c;\n });\n return () => {\n cleanup && cleanup();\n };\n }, [getData]);\n\n return results;\n}\n\nexport default useReport;\n","import React from 'react';\nimport { mergeObjects, flattenArray } from 'loot-core/src/shared/util';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport * as d from 'date-fns';\nimport { AlignedText } from 'loot-design/src/components/common';\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport {\n integerToCurrency,\n integerToAmount,\n amountToInteger\n} from 'loot-core/src/shared/util';\nimport { fromDateRepr, runAll, index } from '../util';\n\nexport default function createSpreadsheet(start, end, accounts) {\n return async (spreadsheet, setData) => {\n if (accounts.length === 0) {\n return null;\n }\n\n const data = await Promise.all(\n accounts.map(async acct => {\n let [starting, balances] = await Promise.all([\n runQuery(\n q('transactions')\n .filter({ account: acct.id, date: { $lt: start + '-01' } })\n .calculate({ $sum: '$amount' })\n ).then(({ data }) => data),\n\n runQuery(\n q('transactions')\n .filter({\n account: acct.id,\n $and: [\n { date: { $gte: start + '-01' } },\n { date: { $lte: end + '-31' } }\n ]\n })\n .groupBy({ $month: '$date' })\n .select([\n { date: { $month: '$date' } },\n { amount: { $sum: '$amount' } }\n ])\n ).then(({ data }) => data)\n ]);\n\n return {\n id: acct.id,\n balances: index(balances, 'date'),\n starting\n };\n })\n );\n\n setData(recalculate(data, start, end));\n };\n}\n\nfunction recalculate(data, start, end) {\n const months = monthUtils.rangeInclusive(start, end);\n\n const accountBalances = data.map(account => {\n // Start off with the balance at that point in time\n let balance = account.starting;\n return months.map(month => {\n if (account.balances[month]) {\n balance += account.balances[month].amount;\n }\n return balance;\n });\n });\n\n let hasNegative = false;\n let startNetWorth = 0;\n let endNetWorth = 0;\n\n const graphData = months.reduce((arr, month, idx) => {\n let debt = 0;\n let assets = 0;\n let total = 0;\n const last = arr.length === 0 ? null : arr[arr.length - 1];\n\n accountBalances.forEach(balances => {\n const balance = balances[idx];\n if (balance < 0) {\n debt += -balance;\n } else {\n assets += balance;\n }\n total += balance;\n });\n\n if (total < 0) {\n hasNegative = true;\n }\n\n const x = d.parseISO(month + '-01');\n const change = last ? total - amountToInteger(last.y) : 0;\n\n const label = (\n <div>\n <div style={{ marginBottom: 10 }}>\n <strong>{d.format(x, 'MMMM yyyy')}</strong>\n </div>\n <div style={{ lineHeight: 1.5 }}>\n <AlignedText left=\"Assets:\" right={integerToCurrency(assets)} />\n <AlignedText left=\"Debt:\" right={`-${integerToCurrency(debt)}`} />\n <AlignedText\n left=\"Net worth:\"\n right={<strong>{integerToCurrency(total)}</strong>}\n />\n <AlignedText left=\"Change:\" right={integerToCurrency(change)} />\n </div>\n </div>\n );\n\n if (arr.length === 0) {\n startNetWorth = total;\n }\n endNetWorth = total;\n\n arr.push({ x, y: integerToAmount(total), premadeLabel: label });\n return arr;\n }, []);\n\n return {\n graphData: {\n data: graphData,\n hasNegative,\n start,\n end\n },\n netWorth: endNetWorth,\n totalChange: endNetWorth - startNetWorth\n };\n}\n","import React from 'react';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport * as d from 'date-fns';\nimport { AlignedText } from 'loot-design/src/components/common';\nimport { integerToCurrency, integerToAmount } from 'loot-core/src/shared/util';\nimport q from 'loot-core/src/client/query-helpers';\nimport { fromDateRepr, fromDateReprToDay, runAll, index } from '../util';\n\nexport function simpleCashFlow(start, end) {\n return async (spreadsheet, setData) => {\n function makeQuery() {\n return q('transactions')\n .filter({\n $and: [{ date: { $gte: start } }, { date: { $lte: end } }],\n 'account.offbudget': false,\n $or: [\n {\n 'payee.transfer_acct.offbudget': true,\n 'payee.transfer_acct': null\n }\n ]\n })\n .calculate({ $sum: '$amount' });\n }\n\n return runAll(\n [\n makeQuery().filter({ amount: { $gt: 0 } }),\n makeQuery().filter({ amount: { $lt: 0 } })\n ],\n data => {\n setData({\n graphData: {\n income: data[0],\n expense: data[1]\n }\n });\n }\n );\n };\n}\n\nexport function cashFlowByDate(start, end, isConcise) {\n return async (spreadsheet, setData) => {\n function makeQuery(where) {\n let query = q('transactions').filter({\n $and: [\n { date: { $transform: '$month', $gte: start } },\n { date: { $transform: '$month', $lte: end } }\n ],\n 'account.offbudget': false,\n $or: [\n {\n 'payee.transfer_acct.offbudget': true,\n 'payee.transfer_acct': null\n }\n ]\n });\n\n if (isConcise) {\n return query\n .groupBy({ $month: '$date' })\n .select([\n { date: { $month: '$date' } },\n { amount: { $sum: '$amount' } }\n ]);\n }\n\n return query\n .groupBy('date')\n .select(['date', { amount: { $sum: '$amount' } }]);\n }\n\n return runAll(\n [\n q('transactions')\n .filter({\n date: { $transform: '$month', $lt: start },\n 'account.offbudget': false\n })\n .calculate({ $sum: '$amount' }),\n makeQuery('amount > 0').filter({ amount: { $gt: 0 } }),\n makeQuery('amount < 0').filter({ amount: { $lt: 0 } })\n ],\n data => {\n setData(recalculate(data, start, end, isConcise));\n }\n );\n };\n}\n\nfunction recalculate(data, start, end, isConcise) {\n let [startingBalance, income, expense] = data;\n const dates = isConcise\n ? monthUtils.rangeInclusive(\n monthUtils.getMonth(start),\n monthUtils.getMonth(end)\n )\n : monthUtils.dayRangeInclusive(start, end);\n const incomes = index(\n income,\n 'date',\n isConcise ? fromDateRepr : fromDateReprToDay\n );\n const expenses = index(\n expense,\n 'date',\n isConcise ? fromDateRepr : fromDateReprToDay\n );\n\n let balance = startingBalance;\n let totalExpenses = 0;\n let totalIncome = 0;\n const graphData = dates.reduce(\n (res, date) => {\n let income = 0;\n let expense = 0;\n\n if (incomes[date]) {\n income = incomes[date].amount;\n }\n if (expenses[date]) {\n expense = expenses[date].amount;\n }\n\n totalExpenses += expense;\n totalIncome += income;\n balance += income + expense;\n const x = d.parseISO(date);\n\n const label = (\n <div>\n <div style={{ marginBottom: 10 }}>\n <strong>\n {d.format(x, isConcise ? 'MMMM yyyy' : 'MMMM d, yyyy')}\n </strong>\n </div>\n <div style={{ lineHeight: 1.5 }}>\n <AlignedText left=\"Income:\" right={integerToCurrency(income)} />\n <AlignedText left=\"Expenses:\" right={integerToCurrency(expense)} />\n <AlignedText\n left=\"Change:\"\n right={<strong>{integerToCurrency(income + expense)}</strong>}\n />\n <AlignedText left=\"Balance:\" right={integerToCurrency(balance)} />\n </div>\n </div>\n );\n\n res.income.push({ x, y: integerToAmount(income) });\n res.expenses.push({ x, y: integerToAmount(expense) });\n res.balances.push({\n x,\n y: integerToAmount(balance),\n premadeLabel: label,\n amount: balance\n });\n return res;\n },\n { expenses: [], income: [], balances: [] }\n );\n\n const { balances } = graphData;\n\n return {\n graphData,\n balance: balances[balances.length - 1].amount,\n totalExpenses,\n totalIncome,\n totalChange: balances[balances.length - 1].amount - balances[0].amount\n };\n}\n","import React from 'react';\nimport {\n VictoryChart,\n VictoryBar,\n VictoryArea,\n VictoryAxis,\n VictoryVoronoiContainer,\n VictoryGroup\n} from 'victory';\nimport * as d from 'date-fns';\nimport Container from '../Container';\nimport Tooltip from '../Tooltip';\nimport theme from '../chart-theme';\n\nfunction Area({ start, end, data, style, scale, range }) {\n const zero = scale.y(0);\n\n const startX = scale.x(d.parseISO(start + '-01'));\n const endX = scale.x(d.parseISO(end + '-01'));\n\n if (startX < 0 || endX < 0) {\n return null;\n }\n\n return (\n <svg>\n <defs>\n <clipPath id=\"positive\">\n <rect\n x={startX}\n y={range.y[1]}\n width={endX - startX}\n height={zero - range.y[1] + 1}\n fill=\"#ffffff\"\n />\n </clipPath>\n <clipPath id=\"negative\">\n <rect\n x={startX}\n y={zero + 1}\n width={endX - startX}\n height={range.y[0] - zero - 1}\n fill=\"#ffffff\"\n />\n </clipPath>\n <linearGradient\n id=\"positive-gradient\"\n gradientUnits=\"userSpaceOnUse\"\n x1={0}\n y1={range.y[1]}\n x2={0}\n y2={zero}\n >\n <stop offset=\"0%\" stopColor={theme.colors.blueFadeStart} />\n <stop offset=\"100%\" stopColor={theme.colors.blueFadeEnd} />\n </linearGradient>\n <linearGradient\n id=\"negative-gradient\"\n gradientUnits=\"userSpaceOnUse\"\n x1={0}\n y1={zero}\n x2={0}\n y2={range.y[0]}\n >\n <stop offset=\"0%\" stopColor={theme.colors.redFadeEnd} />\n <stop offset=\"100%\" stopColor={theme.colors.redFadeStart} />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n\nfunction NetWorthGraph({ style, start, end, graphData, compact }) {\n const Chart = compact ? VictoryGroup : VictoryChart;\n\n return (\n <Container style={[style, compact && { height: 'auto' }]}>\n {(width, height, portalHost) =>\n graphData && (\n <Chart\n scale={{ x: 'time' }}\n theme={theme}\n domainPadding={{ x: 0, y: 10 }}\n width={width}\n height={height}\n containerComponent={\n <VictoryVoronoiContainer voronoiDimension=\"x\" />\n }\n padding={\n compact && {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n }\n }\n >\n <Area\n start={graphData.start}\n end={graphData.end}\n data={graphData.data}\n />\n {React.createElement(\n graphData.data.length === 1 ? VictoryBar : VictoryArea,\n {\n data: graphData.data,\n labelComponent: <Tooltip portalHost={portalHost} />,\n labels: x => x.premadeLabel,\n style: {\n data:\n graphData.data.length === 1\n ? { width: 50 }\n : {\n clipPath: 'url(#positive)',\n fill: 'url(#positive-gradient)'\n }\n }\n }\n )}\n {graphData.data.length > 1 && (\n <VictoryArea\n data={graphData.data}\n style={{\n data: {\n clipPath: 'url(#negative)',\n fill: 'url(#negative-gradient)',\n stroke: theme.colors.red,\n strokeLinejoin: 'round'\n }\n }}\n />\n )}\n {!compact && (\n <VictoryAxis\n tickFormat={x => d.format(x, \"MMM ''yy\")}\n tickValues={graphData.data.map(item => item.x)}\n tickCount={Math.min(5, graphData.data.length)}\n offsetY={50}\n />\n )}\n {!compact && (\n <VictoryAxis dependentAxis crossAxis={!graphData.hasNegative} />\n )}\n </Chart>\n )\n }\n </Container>\n );\n}\n\nexport default NetWorthGraph;\n","import React from 'react';\nimport { styles } from 'loot-design/src/style';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { Block } from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style'\n\nfunction Change({ amount, style }) {\n return (\n <Block\n style={[styles.smallText, { color: amount < 0 ? colors.r5 : colors.g5 }]}\n >\n {amount >= 0 ? '+' : ''}\n {integerToCurrency(amount)}\n </Block>\n );\n}\n\nexport default Change;\n","import React from 'react';\nimport * as d from 'date-fns';\nimport { colors } from 'loot-design/src/style';\nimport { Block } from 'loot-design/src/components/common';\n\nfunction DateRange({ start, end }) {\n start = d.parseISO(start);\n end = d.parseISO(end);\n\n let content;\n if (start.getYear() !== end.getYear()) {\n content = (\n <div>\n {d.format(start, 'MMM yyyy')} - {d.format(end, 'MMM yyyy')}\n </div>\n );\n } else if (start.getMonth() !== end.getMonth()) {\n content = (\n <div>\n {d.format(start, 'MMM')} - {d.format(end, 'MMM yyyy')}\n </div>\n );\n } else {\n content = d.format(end, 'MMMM yyyy');\n }\n\n return <Block style={{ color: colors.n6 }}>{content}</Block>;\n}\n\nexport default DateRange;\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { VictoryBar, VictoryGroup, VictoryVoronoiContainer } from 'victory';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View, Block, AnchorLink } from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { useArgsMemo } from './util';\nimport theme from './chart-theme';\nimport Container from './Container';\nimport Tooltip from './Tooltip';\nimport useReport from './useReport';\nimport netWorthSpreadsheet from './graphs/net-worth-spreadsheet';\nimport { simpleCashFlow } from './graphs/cash-flow-spreadsheet';\nimport NetWorthGraph from './graphs/NetWorthGraph';\nimport Change from './Change';\nimport DateRange from './DateRange';\n\nfunction Card({ flex, to, style, children }) {\n const containerProps = { flex, margin: 15 };\n\n const content = (\n <View\n style={[\n {\n backgroundColor: 'white',\n borderRadius: 2,\n height: 200,\n boxShadow: '0 2px 6px rgba(0, 0, 0, .15)',\n transition: 'box-shadow .25s',\n ':hover': to && {\n boxShadow: '0 4px 6px rgba(0, 0, 0, .15)'\n }\n },\n to ? null : containerProps,\n style\n ]}\n >\n {children}\n </View>\n );\n\n if (to) {\n return (\n <AnchorLink\n to={to}\n exact\n style={[{ textDecoration: 'none', flex }, containerProps]}\n >\n {content}\n </AnchorLink>\n );\n }\n return content;\n}\n\nfunction NetWorthCard({ accounts }) {\n const end = monthUtils.currentMonth();\n const start = monthUtils.subMonths(end, 5);\n\n const data = useReport(\n 'net_worth',\n useArgsMemo(netWorthSpreadsheet)(start, end, accounts)\n );\n\n if (!data) {\n return null;\n }\n\n return (\n <Card flex={2} to=\"/reports/net-worth\">\n <View style={{ flex: 1 }}>\n <View style={{ flexDirection: 'row', padding: 20 }}>\n <View style={{ flex: 1 }}>\n <Block\n style={[styles.mediumText, { fontWeight: 500, marginBottom: 5 }]}\n >\n Net Worth\n </Block>\n <DateRange start={start} end={end} />\n </View>\n <View style={{ textAlign: 'right' }}>\n <Block\n style={[styles.mediumText, { fontWeight: 500, marginBottom: 5 }]}\n >\n {integerToCurrency(data.netWorth)}\n </Block>\n <Change\n amount={data.totalChange}\n style={{ color: colors.n6, fontWeight: 300 }}\n />\n </View>\n </View>\n\n <NetWorthGraph\n start={start}\n end={end}\n graphData={data.graphData}\n compact={true}\n style={{ height: 'auto', flex: 1 }}\n />\n </View>\n </Card>\n );\n}\n\nfunction CashFlowCard() {\n const end = monthUtils.currentDay();\n const start = monthUtils.currentMonth() + '-01';\n\n const data = useReport('cash_flow_simple', useArgsMemo(simpleCashFlow)(start, end));\n if (!data) {\n return null;\n }\n\n const { graphData } = data;\n const expense = -(graphData.expense || 0);\n const income = graphData.income || 0;\n\n return (\n <Card flex={1} to=\"/reports/cash-flow\">\n <View style={{ flex: 1 }}>\n <View style={{ flexDirection: 'row', padding: 20 }}>\n <View style={{ flex: 1 }}>\n <Block\n style={[styles.mediumText, { fontWeight: 500, marginBottom: 5 }]}\n >\n Cash Flow\n </Block>\n <DateRange start={start} end={end} />\n </View>\n <View style={{ textAlign: 'right' }}>\n <Change\n amount={income - expense}\n style={{ color: colors.n6, fontWeight: 300 }}\n />\n </View>\n </View>\n\n <Container style={{ height: 'auto', flex: 1 }}>\n {(width, height, portalHost) => (\n <VictoryGroup\n colorScale={[theme.colors.blue, theme.colors.red]}\n width={100}\n height={height}\n theme={theme}\n domain={{\n x: [0, 100],\n y: [0, Math.max(income, expense, 100)]\n }}\n containerComponent={\n <VictoryVoronoiContainer voronoiDimension=\"x\" />\n }\n labelComponent={\n <Tooltip\n portalHost={portalHost}\n offsetX={(width - 100) / 2}\n offsetY={y => (y + 40 > height ? height - 40 : y)}\n light={true}\n forceActive={true}\n style={{\n padding: 0\n }}\n />\n }\n padding={{\n top: 0,\n bottom: 0,\n left: 0,\n right: 0\n }}\n >\n <VictoryBar\n data={[\n {\n x: 30,\n y: Math.max(income, 5),\n width: 20,\n premadeLabel: (\n <div style={{ textAlign: 'right' }}>\n <div>Income</div>\n <div>{integerToCurrency(income)}</div>\n </div>\n ),\n labelPosition: 'left'\n }\n ]}\n labels={d => d.premadeLabel}\n />\n <VictoryBar\n data={[\n {\n x: 60,\n y: Math.max(expense, 5),\n width: 20,\n premadeLabel: (\n <div>\n <div>Expenses</div>\n <div>{integerToCurrency(expense)}</div>\n </div>\n ),\n labelPosition: 'right',\n fill: theme.colors.red\n }\n ]}\n labels={d => d.premadeLabel}\n />\n </VictoryGroup>\n )}\n </Container>\n </View>\n </Card>\n );\n}\n\nfunction Overview({ accounts }) {\n return (\n <View\n style={[\n styles.page,\n { paddingLeft: 40, paddingRight: 40, minWidth: 700 }\n ]}\n >\n <View\n style={{\n flexDirection: 'row',\n flex: '0 0 auto'\n }}\n >\n <NetWorthCard accounts={accounts} />\n <CashFlowCard />\n </View>\n\n <View\n style={{\n flex: '0 0 auto',\n flexDirection: 'row'\n }}\n >\n <Card\n style={[\n {\n color: '#a0a0a0',\n justifyContent: 'center',\n alignItems: 'center',\n width: 200\n },\n styles.mediumText\n ]}\n >\n More reports\n <br /> coming soon!\n </Card>\n </View>\n </View>\n );\n}\n\nexport default connect(\n state => ({ accounts: state.queries.accounts }),\n dispatch => bindActionCreators(actions, dispatch)\n)(Overview);\n","import React from 'react';\nimport { colors, styles } from 'loot-design/src/style';\nimport {\n View,\n Select,\n Link,\n Button,\n ButtonLink\n} from 'loot-design/src/components/common';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport ArrowLeft from 'loot-design/src/svg/v1/ArrowLeft';\n\nfunction validateStart(allMonths, start, end) {\n const earliest = allMonths[allMonths.length - 1].name;\n if (end < start) {\n end = monthUtils.addMonths(start, 6);\n }\n return boundedRange(earliest, start, end);\n}\n\nfunction validateEnd(allMonths, start, end) {\n const earliest = allMonths[allMonths.length - 1].name;\n if (start > end) {\n start = monthUtils.subMonths(end, 6);\n }\n return boundedRange(earliest, start, end);\n}\n\nfunction boundedRange(earliest, start, end) {\n const latest = monthUtils.currentMonth();\n if (end > latest) {\n end = latest;\n }\n if (start < earliest) {\n start = earliest;\n }\n return [start, end];\n}\n\nfunction getLatestRange(offset) {\n const end = monthUtils.currentMonth();\n const start = monthUtils.subMonths(end, offset);\n return [start, end];\n}\n\nfunction getFullRange(allMonths) {\n const start = allMonths[allMonths.length - 1].name;\n const end = monthUtils.currentMonth();\n return [start, end];\n}\n\nfunction Header({ title, start, end, show1Month, allMonths, onChangeDates }) {\n return (\n <View\n style={{\n padding: 20,\n paddingTop: 0,\n flexShrink: 0\n }}\n >\n <ButtonLink\n to=\"/reports\"\n bare\n style={{ marginBottom: '15', alignSelf: 'flex-start' }}\n >\n <ArrowLeft width={10} height={10} style={{ marginRight: 5 }} /> Back\n </ButtonLink>\n <View style={styles.veryLargeText}>{title}</View>\n\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginTop: 15\n }}\n >\n <div>\n <Select\n style={{ flex: 0, backgroundColor: 'white' }}\n onChange={e =>\n onChangeDates(...validateStart(allMonths, e.target.value, end))\n }\n value={start}\n >\n {allMonths.map(month => (\n <option key={month.name} value={month.name}>\n {month.pretty}\n </option>\n ))}\n </Select>{' '}\n to{' '}\n <Select\n style={{ flex: 0, backgroundColor: 'white' }}\n onChange={e =>\n onChangeDates(...validateEnd(allMonths, start, e.target.value))\n }\n value={end}\n >\n {allMonths.map(month => (\n <option key={month.name} value={month.name}>\n {month.pretty}\n </option>\n ))}\n </Select>\n </div>\n {show1Month && (\n <Button\n bare\n style={{ marginLeft: 15 }}\n onClick={() => onChangeDates(...getLatestRange(1))}\n >\n 1 month\n </Button>\n )}\n <Button\n bare\n style={{ marginLeft: 15 }}\n onClick={() => onChangeDates(...getLatestRange(2))}\n >\n 3 months\n </Button>\n <Button\n bare\n style={{ marginLeft: 15 }}\n onClick={() => onChangeDates(...getLatestRange(5))}\n >\n 6 months\n </Button>\n <Button\n bare\n style={{ marginLeft: 15 }}\n onClick={() => onChangeDates(...getLatestRange(12))}\n >\n 1 Year\n </Button>\n <Button\n bare\n style={{ marginLeft: 15 }}\n onClick={() => onChangeDates(...getFullRange(allMonths))}\n >\n All Time\n </Button>\n </View>\n </View>\n );\n}\n\nexport default Header;\n","import React, { useState, useEffect } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport * as d from 'date-fns';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View, P } from 'loot-design/src/components/common';\nimport { styles } from 'loot-design/src/style';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport Header from './Header';\nimport { fromDateRepr } from './util';\nimport useReport from './useReport';\nimport netWorthSpreadsheet from './graphs/net-worth-spreadsheet';\nimport NetWorthGraph from './graphs/NetWorthGraph';\nimport Change from './Change';\nimport { useArgsMemo } from './util';\n\nfunction NetWorth({ accounts }) {\n const [earliestMonth, setEarliestMonth] = useState(null);\n const [allMonths, setAllMonths] = useState(null);\n const [start, setStart] = useState(\n monthUtils.subMonths(monthUtils.currentMonth(), 5)\n );\n const [end, setEnd] = useState(monthUtils.currentMonth());\n\n const data = useReport(\n 'net_worth',\n useArgsMemo(netWorthSpreadsheet)(start, end, accounts)\n );\n\n useEffect(() => {\n async function run() {\n const trans = await send('get-earliest-transaction');\n const currentMonth = monthUtils.currentMonth();\n let earliestMonth = trans\n ? monthUtils.monthFromDate(d.parseISO(fromDateRepr(trans.date)))\n : currentMonth;\n\n // Make sure the month selects are at least populates with a\n // year's worth of months. We can undo this when we have fancier\n // date selects.\n const yearAgo = monthUtils.subMonths(monthUtils.currentMonth(), 12);\n if (earliestMonth > yearAgo) {\n earliestMonth = yearAgo;\n }\n\n const allMonths = monthUtils\n .rangeInclusive(earliestMonth, monthUtils.currentMonth())\n .map(month => ({\n name: month,\n pretty: monthUtils.format(month, 'MMMM, yyyy')\n }))\n .reverse();\n\n setEarliestMonth(earliestMonth);\n setAllMonths(allMonths);\n }\n run();\n }, []);\n\n function onChangeDates(start, end) {\n setStart(start);\n setEnd(end);\n }\n\n if (!allMonths || !data) {\n return null;\n }\n\n return (\n <View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}>\n <Header\n title=\"Net Worth\"\n allMonths={allMonths}\n start={start}\n end={end}\n onChangeDates={onChangeDates}\n />\n <View\n style={{\n backgroundColor: 'white',\n padding: '30px',\n overflow: 'auto'\n }}\n >\n <View style={{ textAlign: 'right', paddingRight: 20, flexShrink: 0 }}>\n <View\n style={[styles.largeText, { fontWeight: 400, marginBottom: 5 }]}\n >\n {integerToCurrency(data.netWorth)}\n </View>\n <Change amount={data.totalChange} />\n </View>\n\n <NetWorthGraph start={start} end={end} graphData={data.graphData} />\n\n <View style={{ marginTop: 30 }}>\n <P>\n <strong>How is net worth calculated?</strong>\n </P>\n <P>\n Net worth shows the balance of all accounts over time, including all\n of your investments. Your \"net worth\" is considered to be the amount\n you'd have if you sold all your assets and paid off as much debt as\n possible. If you hover over the graph, you can also see the amount\n of assets and debt individually.\n </P>\n </View>\n </View>\n </View>\n );\n}\n\nexport default connect(\n state => ({ accounts: state.queries.accounts }),\n dispatch => bindActionCreators(actions, dispatch)\n)(NetWorth);\n","import React from 'react';\nimport {\n VictoryChart,\n VictoryBar,\n VictoryLine,\n VictoryAxis,\n VictoryVoronoiContainer,\n VictoryGroup\n} from 'victory';\nimport * as d from 'date-fns';\nimport Container from '../Container';\nimport Tooltip from '../Tooltip';\nimport theme from '../chart-theme';\nimport { colors } from 'loot-design/src/style';\n\nfunction CashFlowGraph({ style, start, end, graphData, isConcise, compact }) {\n return (\n <Container>\n {(width, height, portalHost) =>\n graphData && (\n <VictoryChart\n scale={{ x: 'time' }}\n theme={theme}\n domainPadding={10}\n width={width}\n height={height}\n containerComponent={\n <VictoryVoronoiContainer voronoiDimension=\"x\" />\n }\n >\n <VictoryGroup>\n <VictoryBar\n data={graphData.expenses}\n style={{ data: { fill: theme.colors.red } }}\n />\n <VictoryBar data={graphData.income} />\n </VictoryGroup>\n <VictoryLine\n data={graphData.balances}\n labelComponent={<Tooltip portalHost={portalHost} />}\n labels={x => x.premadeLabel}\n style={{\n data: { stroke: colors.n5 }\n }}\n />\n <VictoryAxis\n tickFormat={x => d.format(x, isConcise ? \"MMM ''yy\" : 'MMM d')}\n tickValues={graphData.balances.map(item => item.x)}\n tickCount={Math.min(5, graphData.balances.length)}\n offsetY={50}\n />\n <VictoryAxis dependentAxis crossAxis={false} />\n </VictoryChart>\n )\n }\n </Container>\n );\n}\n\nexport default CashFlowGraph;\n","import React, { useState, useEffect } from 'react';\nimport * as d from 'date-fns';\nimport {\n View,\n Text,\n Block,\n P,\n AlignedText\n} from 'loot-design/src/components/common';\nimport { styles } from 'loot-design/src/style';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { fromDateRepr } from './util';\nimport Header from './Header';\nimport Change from './Change';\nimport CashFlowGraph from './graphs/CashFlowGraph';\nimport { cashFlowByDate } from './graphs/cash-flow-spreadsheet';\nimport useReport from './useReport';\nimport { useArgsMemo } from './util';\nimport { colors } from 'loot-design/src/style';\n\nfunction CashFlow() {\n const [earliestMonth, setEarliestMonth] = useState(null);\n const [allMonths, setAllMonths] = useState(null);\n const [start, setStart] = useState(\n monthUtils.subMonths(monthUtils.currentMonth(), 30)\n );\n const [end, setEnd] = useState(monthUtils.currentDay());\n\n const [isConcise, setIsConcise] = useState(() => {\n const numDays = d.differenceInCalendarDays(\n d.parseISO(end),\n d.parseISO(start)\n );\n return numDays > 31 * 3;\n });\n\n const data = useReport(\n 'cash_flow',\n useArgsMemo(cashFlowByDate)(start, end, isConcise)\n );\n\n useEffect(() => {\n async function run() {\n const trans = await send('get-earliest-transaction');\n const earliestMonth = trans\n ? monthUtils.monthFromDate(d.parseISO(trans.date))\n : monthUtils.currentMonth();\n\n const allMonths = monthUtils\n .rangeInclusive(earliestMonth, monthUtils.currentMonth())\n .map(month => ({\n name: month,\n pretty: monthUtils.format(month, 'MMMM, yyyy')\n }))\n .reverse();\n\n setEarliestMonth(earliestMonth);\n setAllMonths(allMonths);\n }\n run();\n }, []);\n\n function onChangeDates(start, end) {\n const numDays = d.differenceInCalendarDays(\n d.parseISO(end),\n d.parseISO(start)\n );\n const isConcise = numDays > 31 * 3;\n\n let endDay = end + '-31';\n if (endDay > monthUtils.currentDay()) {\n endDay = monthUtils.currentDay();\n }\n\n setStart(start + '-01');\n setEnd(endDay);\n setIsConcise(isConcise);\n }\n\n if (!allMonths || !data) {\n return null;\n }\n\n const { graphData, balance, totalChange, totalExpenses, totalIncome } = data;\n\n return (\n <View style={[styles.page, { minWidth: 650, overflow: 'hidden' }]}>\n <Header\n title=\"Cash Flow\"\n allMonths={allMonths}\n start={monthUtils.getMonth(start)}\n end={monthUtils.getMonth(end)}\n show1Month={true}\n onChangeDates={onChangeDates}\n />\n <View\n style={{\n backgroundColor: 'white',\n paddingLeft: 30,\n paddingRight: 30,\n overflow: 'auto'\n }}\n >\n <View\n style={{\n paddingTop: 20,\n paddingRight: 20,\n flexShrink: 0,\n alignItems: 'flex-end',\n color: colors.n3\n }}\n >\n <AlignedText\n style={{ marginBottom: 5, minWidth: 160 }}\n left={<Block>Income:</Block>}\n right={\n <Text style={{ fontWeight: 600 }}>\n {integerToCurrency(totalIncome)}\n </Text>\n }\n />\n\n <AlignedText\n style={{ marginBottom: 5, minWidth: 160 }}\n left={<Block>Expenses:</Block>}\n right={\n <Text style={{ fontWeight: 600 }}>\n {integerToCurrency(totalExpenses)}\n </Text>\n }\n />\n <Text style={{ fontWeight: 600 }}>\n <Change amount={totalIncome + totalExpenses} />\n </Text>\n </View>\n\n <CashFlowGraph\n start={start}\n end={end}\n graphData={graphData}\n isConcise={isConcise}\n />\n\n <View style={{ marginTop: 30 }}>\n <P>\n <strong>How is cash flow calculated?</strong>\n </P>\n <P>\n Cash flow shows the balance of your budgeted accounts over time, and\n the amount of expenses/income each day or month. Your budgeted\n accounts are considered to be \"cash on hand\", so this gives you a\n picture of how available money fluctuates.\n </P>\n </View>\n </View>\n </View>\n );\n}\n\nexport default CashFlow;\n","import React from 'react';\nimport { Route } from 'react-router-dom';\nimport { View } from 'loot-design/src/components/common';\nimport Overview from './Overview';\nimport NetWorth from './NetWorth';\nimport CashFlow from './CashFlow';\n\nclass Reports extends React.Component {\n render() {\n return (\n <View style={{ flex: 1 }}>\n <Route path=\"/reports\" exact component={Overview} />\n <Route path=\"/reports/net-worth\" exact component={NetWorth} />\n <Route path=\"/reports/cash-flow\" exact component={CashFlow} />\n </View>\n );\n }\n}\n\nexport default Reports;\n","import React from 'react';\n\nconst SvgCheck = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M6.847 21.429a3.408 3.408 0 0 1-2.662-1.34l-3.76-4.273a1.714 1.714 0 0 1 2.572-2.263l3.522 4.01a.429.429 0 0 0 .631.014L21.036 3.105a1.715 1.715 0 1 1 2.486 2.362l-14.06 14.8a3.327 3.327 0 0 1-2.615 1.162z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCheck;\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { CachedPayees } from 'loot-core/src/client/data-hooks/payees';\nimport { CachedAccounts } from 'loot-core/src/client/data-hooks/accounts';\nimport { getPayeesById } from 'loot-core/src/client/reducers/queries';\nimport { groupById } from 'loot-core/src/shared/util';\nimport { Text } from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\n\nexport default function DisplayId({ type, id, noneColor = colors.n8 }) {\n let DataComponent;\n\n switch (type) {\n case 'payees':\n DataComponent = CachedPayees;\n break;\n case 'accounts':\n DataComponent = CachedAccounts;\n break;\n default:\n throw new Error('DisplayId: unknown object type: ' + type);\n }\n\n return (\n <DataComponent idKey={true}>\n {data => {\n let item = data[id];\n\n return (\n <Text\n style={item == null ? { color: noneColor } : null}\n title={item ? item.name : 'None'}\n >\n {item ? item.name : 'None'}\n </Text>\n );\n }}\n </DataComponent>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { colors, styles } from 'loot-design/src/style';\nimport {\n View,\n Text,\n Button,\n Tooltip,\n Menu\n} from 'loot-design/src/components/common';\nimport {\n Table,\n TableHeader,\n Row,\n Field,\n Cell,\n SelectCell\n} from 'loot-design/src/components/table';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\nimport DotsHorizontalTriple from 'loot-design/src/svg/v1/DotsHorizontalTriple';\nimport Check from 'loot-design/src/svg/v2/Check';\nimport DisplayId from '../util/DisplayId';\nimport { StatusBadge } from './StatusBadge';\n\nexport let ROW_HEIGHT = 43;\n\nfunction OverflowMenu({ schedule, status, onAction }) {\n let [open, setOpen] = useState(false);\n\n return (\n <View>\n <Button\n bare\n onClick={e => {\n e.stopPropagation();\n setOpen(true);\n }}\n >\n <DotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: 'inherit', transform: 'rotateZ(90deg)' }}\n />\n </Button>\n {open && (\n <Tooltip\n position=\"bottom-right\"\n width={150}\n style={{ padding: 0 }}\n onClose={() => setOpen(false)}\n >\n <Menu\n onMenuSelect={name => {\n onAction(name, schedule.id);\n setOpen(false);\n }}\n items={[\n status === 'due' && {\n name: 'post-transaction',\n text: 'Post transaction'\n },\n ...(schedule.completed\n ? [{ name: 'restart', text: 'Restart' }]\n : [\n { name: 'skip', text: 'Skip next date' },\n { name: 'complete', text: 'Complete' }\n ]),\n { name: 'delete', text: 'Delete' }\n ]}\n />\n </Tooltip>\n )}\n </View>\n );\n}\n\nexport function ScheduleAmountCell({ amount, op }) {\n let num = getScheduledAmount(amount);\n let str = integerToCurrency(Math.abs(num || 0));\n let isApprox = op === 'isapprox' || op === 'isbetween';\n\n return (\n <Cell\n width={100}\n plain\n style={{\n textAlign: 'right',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 5px'\n }}\n >\n {isApprox && (\n <View\n style={{\n textAlign: 'left',\n color: colors.n7,\n lineHeight: '1em',\n marginRight: 10\n }}\n title={(isApprox ? 'Approximately ' : '') + str}\n >\n ~\n </View>\n )}\n <Text\n style={{\n flex: 1,\n color: num > 0 ? colors.g5 : null,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n title={(isApprox ? 'Approximately ' : '') + str}\n >\n {num > 0 ? `+${str}` : `${str}`}\n </Text>\n </Cell>\n );\n}\n\nexport function SchedulesTable({\n schedules,\n statuses,\n minimal,\n allowCompleted,\n style,\n onSelect,\n onAction\n}) {\n let dateFormat = useSelector(state => {\n return state.prefs.local.dateFormat || 'MM/dd/yyyy';\n });\n\n let [showCompleted, setShowCompleted] = useState(false);\n\n let items = useMemo(() => {\n if (!allowCompleted) {\n return schedules.filter(s => !s.completed);\n }\n if (showCompleted) {\n return schedules;\n }\n let arr = schedules.filter(s => !s.completed);\n if (schedules.find(s => s.completed)) {\n arr.push({ type: 'show-completed' });\n }\n return arr;\n }, [schedules, showCompleted, allowCompleted]);\n\n function renderSchedule({ item }) {\n return (\n <Row\n height={ROW_HEIGHT}\n inset={15}\n backgroundColor=\"transparent\"\n onClick={() => onSelect(item.id)}\n style={{\n cursor: 'pointer',\n backgroundColor: 'white',\n ':hover': { backgroundColor: colors.hover }\n }}\n >\n <Field width=\"flex\">\n <DisplayId type=\"payees\" id={item._payee} />\n </Field>\n <Field width=\"flex\">\n <DisplayId type=\"accounts\" id={item._account} />\n </Field>\n <Field width={110}>\n {item.next_date\n ? monthUtils.format(item.next_date, dateFormat)\n : null}\n </Field>\n <Field width={120} style={{ alignItems: 'flex-start' }}>\n <StatusBadge status={statuses.get(item.id)} />\n </Field>\n <ScheduleAmountCell amount={item._amount} op={item._amountOp} />\n {!minimal && (\n <Field width={80} style={{ textAlign: 'center' }}>\n {item._date && item._date.frequency && (\n <Check style={{ width: 13, height: 13 }} />\n )}\n </Field>\n )}\n {!minimal && (\n <Field width={40}>\n <OverflowMenu\n schedule={item}\n status={statuses.get(item.id)}\n onAction={onAction}\n />\n </Field>\n )}\n </Row>\n );\n }\n\n function renderItem({ item }) {\n if (item.type === 'show-completed') {\n return (\n <Row\n height={ROW_HEIGHT}\n inset={15}\n backgroundColor=\"transparent\"\n style={{\n cursor: 'pointer',\n backgroundColor: 'white',\n ':hover': { backgroundColor: colors.hover }\n }}\n onClick={() => setShowCompleted(true)}\n >\n <Field\n width=\"flex\"\n style={{\n fontStyle: 'italic',\n textAlign: 'center',\n color: colors.n6\n }}\n >\n Show completed schedules\n </Field>\n </Row>\n );\n }\n return renderSchedule({ item });\n }\n\n return (\n <>\n <TableHeader height={ROW_HEIGHT} inset={15} version=\"v2\">\n <Field width=\"flex\">Payee</Field>\n <Field width=\"flex\">Account</Field>\n <Field width={110}>Next date</Field>\n <Field width={120}>Status</Field>\n <Field width={100} style={{ textAlign: 'right' }}>\n Amount\n </Field>\n {!minimal && (\n <Field width={80} style={{ textAlign: 'center' }}>\n Recurring\n </Field>\n )}\n {!minimal && <Field width={40}></Field>}\n </TableHeader>\n <Table\n rowHeight={ROW_HEIGHT}\n backgroundColor=\"transparent\"\n version=\"v2\"\n style={[{ flex: 1, backgroundColor: 'transparent' }, style]}\n items={items}\n renderItem={renderItem}\n renderEmpty=\"No schedules\"\n allowPopupsEscape={items.length < 6}\n />\n </>\n );\n}\n","import React, { useMemo, useEffect, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport {\n View,\n Text,\n Button,\n Tooltip,\n Menu\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { Page } from '../Page';\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { SchedulesTable, ROW_HEIGHT } from './SchedulesTable';\n\nexport default function Schedules() {\n let history = useHistory();\n\n let scheduleData = useSchedules();\n\n if (scheduleData == null) {\n return null;\n }\n\n let { schedules, statuses } = scheduleData;\n\n function onEdit(id) {\n history.push(`/schedule/edit/${id}`, { locationPtr: history.location });\n }\n\n function onAdd() {\n history.push(`/schedule/edit`, { locationPtr: history.location });\n }\n\n async function onAction(name, id) {\n switch (name) {\n case 'post-transaction':\n await send('schedule/post-transaction', { id });\n break;\n case 'skip':\n await send('schedule/skip-next-date', { id });\n break;\n case 'complete':\n await send('schedule/update', { schedule: { id, completed: true } });\n break;\n case 'restart':\n await send('schedule/update', {\n schedule: { id, completed: false },\n resetNextDate: true\n });\n break;\n case 'delete':\n await send('schedule/delete', { id });\n break;\n default:\n }\n }\n\n return (\n <Page title=\"Schedules\">\n <View\n style={{\n marginTop: 20,\n flexBasis: (ROW_HEIGHT - 1) * (Math.max(schedules.length, 1) + 1),\n overflow: 'hidden'\n }}\n >\n <SchedulesTable\n schedules={schedules}\n statuses={statuses}\n allowCompleted={true}\n onSelect={onEdit}\n onAction={onAction}\n style={{ backgroundColor: 'white' }}\n />\n </View>\n\n <View style={{ alignItems: 'flex-end', margin: '20px 0', flexShrink: 0 }}>\n <Button primary onClick={onAdd}>\n Add new schedule\n </Button>\n </View>\n </Page>\n );\n}\n","import React from 'react';\nimport { css } from 'glamor';\nimport { View, Text } from './common';\nimport { colors } from '../style';\n\nexport function SectionLabel({ title, style }) {\n return (\n <View\n style={[\n {\n fontWeight: 500,\n textTransform: 'uppercase',\n color: colors.b3,\n marginBottom: 5,\n lineHeight: '1em'\n },\n style\n ]}\n >\n {title}\n </View>\n );\n}\n\nexport function FormLabel({ style, title }) {\n return (\n <Text style={[{ fontSize: 13, marginBottom: 3, color: colors.n3 }, style]}>\n {title}\n </Text>\n );\n}\n\nexport function FormField({ style, children }) {\n return <View style={style}>{children}</View>;\n}\n\n// Custom inputs\n\nexport function Checkbox(props) {\n return (\n <input\n type=\"checkbox\"\n {...props}\n {...css(\n [\n {\n position: 'relative',\n margin: 0,\n marginRight: 6,\n width: 15,\n height: 15,\n appearance: 'none',\n outline: 0,\n border: '1px solid #d0d0d0',\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n backgroundColor: 'white',\n ':checked': {\n border: '1px solid ' + colors.b6,\n backgroundColor: colors.b6,\n '::after': {\n display: 'block',\n background:\n colors.b6 +\n ' url(\\'data:image/svg+xml; utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path fill=\"white\" d=\"M0 11l2-2 5 5L18 3l2 2L7 18z\"/></svg>\\') 9px 9px',\n width: 9,\n height: 9,\n content: ' '\n }\n },\n '&.focus-visible:focus': {\n '::before': {\n position: 'absolute',\n top: -5,\n bottom: -5,\n left: -5,\n right: -5,\n border: '2px solid ' + colors.b5,\n borderRadius: 6,\n content: ' '\n }\n }\n }\n ],\n props.style\n )}\n />\n );\n}\n","import React, { useMemo, useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport {\n format as formatDate,\n parse as parseDate,\n parseISO,\n isValid as isDateValid\n} from 'date-fns';\nimport {\n Table,\n Row,\n Field,\n Cell,\n SelectCell\n} from 'loot-design/src/components/table';\nimport {\n useSelectedItems,\n useSelectedDispatch\n} from 'loot-design/src/components/useSelected';\nimport {\n integerToAmount,\n amountToInteger,\n integerToCurrency\n} from 'loot-core/src/shared/util';\nimport {\n getAccountsById,\n getPayeesById,\n getCategoriesById\n} from 'loot-core/src/client/reducers/queries';\nimport ArrowsSynchronize from 'loot-design/src/svg/v2/ArrowsSynchronize';\nimport { styles } from 'loot-design/src/style';\nimport DisplayId from '../util/DisplayId';\n\nfunction serializeTransaction(transaction, dateFormat) {\n let { date } = transaction;\n\n if (!isDateValid(parseISO(date))) {\n date = null;\n }\n\n return {\n ...transaction,\n date: date ? formatDate(parseISO(date), dateFormat) : null\n };\n}\n\nconst TransactionRow = React.memo(function TransactionRow({\n transaction,\n fields,\n payees,\n categories,\n accounts,\n selected\n}) {\n // TODO: Convert these to use fetched queries\n let c = getCategoriesById(categories)[transaction.category];\n let a = getAccountsById(accounts)[transaction.account];\n\n let dispatchSelected = useSelectedDispatch();\n let schedule = transaction.schedule;\n\n return (\n <Row>\n <SelectCell\n exposed={true}\n focused={false}\n onSelect={() => {\n dispatchSelected({ type: 'select', id: transaction.id });\n }}\n selected={selected}\n />\n {fields.map((field, i) => {\n switch (field) {\n case 'date':\n return (\n <Field key={i} width={100}>\n {transaction.date}\n </Field>\n );\n case 'imported_payee':\n return (\n <Field key={i} width=\"flex\">\n {transaction.imported_payee}\n </Field>\n );\n case 'payee':\n return (\n <Cell\n key={i}\n width=\"flex\"\n exposed={true}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-start'\n }}\n >\n {() => (\n <>\n {transaction.schedule && (\n <ArrowsSynchronize\n style={{\n width: 13,\n height: 13,\n margin: '0 5px'\n }}\n />\n )}\n <DisplayId type=\"payees\" id={transaction.payee} />\n </>\n )}\n </Cell>\n );\n case 'category':\n return (\n <Field key={i} width=\"flex\" title={c && c.name}>\n {c ? c.name : ''}\n </Field>\n );\n case 'account':\n return (\n <Field key={i} width=\"flex\" title={a.name}>\n {a.name}\n </Field>\n );\n case 'notes':\n return (\n <Field key={i} width=\"flex\" title={transaction.notes}>\n {transaction.notes}\n </Field>\n );\n case 'amount':\n return (\n <Field\n key={i}\n width={75}\n style={[{ textAlign: 'right' }, styles.tnum]}\n >\n {integerToCurrency(transaction.amount)}\n </Field>\n );\n default:\n return null;\n }\n })}\n </Row>\n );\n});\n\nexport default function SimpleTransactionsTable({\n transactions,\n schedules,\n fields = ['date', 'payee', 'amount'],\n style\n}) {\n let { payees, categories, accounts, dateFormat } = useSelector(state => {\n return {\n payees: state.queries.payees,\n accounts: state.queries.accounts,\n categories: state.queries.categories.grouped,\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy'\n };\n });\n let selectedItems = useSelectedItems();\n let dispatchSelected = useSelectedDispatch();\n let memoFields = useMemo(() => fields, [JSON.stringify(fields)]);\n\n let serializedTransactions = useMemo(() => {\n return transactions.map(trans => serializeTransaction(trans, dateFormat));\n }, [transactions]);\n\n let renderItem = useCallback(\n ({ item }) => {\n return (\n <TransactionRow\n transaction={item}\n payees={payees}\n categories={categories}\n accounts={accounts}\n fields={memoFields}\n selected={selectedItems && selectedItems.has(item.id)}\n />\n );\n },\n [payees, categories, memoFields, selectedItems]\n );\n\n return (\n <Table\n style={style}\n items={serializedTransactions}\n headers={\n <>\n <SelectCell\n exposed={true}\n focused={false}\n selected={selectedItems.size > 0}\n width={20}\n onSelect={() => dispatchSelected({ type: 'select-all' })}\n />\n {fields.map((field, i) => {\n switch (field) {\n case 'date':\n return (\n <Field key={i} width={100}>\n Date\n </Field>\n );\n case 'imported_payee':\n return (\n <Field key={i} width=\"flex\">\n Imported payee\n </Field>\n );\n case 'payee':\n return (\n <Field key={i} width=\"flex\">\n Payee\n </Field>\n );\n case 'category':\n return (\n <Field key={i} width=\"flex\">\n Category\n </Field>\n );\n case 'account':\n return (\n <Field key={i} width=\"flex\">\n Account\n </Field>\n );\n case 'notes':\n return (\n <Field key={i} width=\"flex\">\n Notes\n </Field>\n );\n case 'amount':\n return (\n <Field key={i} width={75} style={{ textAlign: 'right' }}>\n Amount\n </Field>\n );\n default:\n return null;\n }\n })}\n </>\n }\n renderItem={renderItem}\n />\n );\n}\n","import React from 'react';\n\nconst SvgSubtract = props => (\n <svg\n {...props}\n viewBox=\"0 0 23 3\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M23 1.5A1.5 1.5 0 0 1 21.5 3h-20a1.5 1.5 0 0 1 0-3h20A1.5 1.5 0 0 1 23 1.5z\"\n fillRule=\"nonzero\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgSubtract;\n","import React, { useState } from 'react';\nimport {\n integerToCurrency,\n currencyToInteger\n} from 'loot-core/src/shared/util';\nimport {\n View,\n Button,\n InputWithContent\n} from 'loot-design/src/components/common';\nimport Add from 'loot-design/src/svg/v1/Add';\nimport Subtract from 'loot-design/src/svg/v1/Subtract';\n\nexport function AmountInput({ defaultValue, onChange }) {\n let [negative, setNegative] = useState(defaultValue <= 0);\n let [value, setValue] = useState(integerToCurrency(Math.abs(defaultValue)));\n\n function onSwitch() {\n setNegative(!negative);\n fireChange(!negative);\n }\n\n function fireChange(neg = negative) {\n let v = currencyToInteger(value);\n let amount = neg ? (v < 0 ? v : -v) : v > 0 ? v : -v;\n\n onChange(amount);\n }\n\n return (\n <InputWithContent\n leftContent={\n <Button bare style={{ padding: '0 7px' }} onClick={onSwitch}>\n {negative ? (\n <Subtract style={{ width: 8, height: 8 }} />\n ) : (\n <Add style={{ width: 8, height: 8 }} />\n )}\n </Button>\n }\n value={value}\n style={{ flex: 1, alignItems: 'stretch' }}\n inputStyle={{ paddingLeft: 0 }}\n onChange={e => setValue(e.target.value)}\n onBlur={e => fireChange()}\n />\n );\n}\n\nexport function BetweenAmountInput({ defaultValue, onChange }) {\n let [num1, setNum1] = useState(defaultValue.num1);\n let [num2, setNum2] = useState(defaultValue.num2);\n\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <AmountInput\n defaultValue={num1}\n onChange={value => {\n setNum1(value);\n onChange({ num1: value, num2 });\n }}\n />\n <View style={{ margin: '0 5px' }}>and</View>\n <AmountInput\n defaultValue={num2}\n onChange={value => {\n setNum2(value);\n onChange({ num1, num2: value });\n }}\n />\n </View>\n );\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n initiallyLoadPayees,\n setUndoEnabled\n} from 'loot-core/src/client/actions/queries';\nimport * as undo from 'loot-core/src/platform/client/undo';\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport {\n View,\n Text,\n Modal,\n Button,\n Select,\n Stack,\n Input,\n CustomSelect,\n Tooltip\n} from 'loot-design/src/components/common';\nimport GenericInput from '../util/GenericInput';\nimport { keys } from 'loot-design/src/util/keys';\nimport { send, listen, unlisten } from 'loot-core/src/platform/client/fetch';\nimport { getStatus } from 'loot-core/src/shared/schedules';\nimport { colors, styles } from 'loot-design/src/style';\nimport SubtractIcon from 'loot-design/src/svg/Subtract';\nimport AddIcon from 'loot-design/src/svg/Add';\nimport InformationOutline from 'loot-design/src/svg/v1/InformationOutline';\nimport {\n mapField,\n friendlyOp,\n getFieldError,\n parse,\n unparse,\n makeValue,\n FIELD_TYPES,\n TYPE_INFO\n} from 'loot-core/src/shared/rules';\nimport useSelected, {\n SelectedProvider\n} from 'loot-design/src/components/useSelected';\nimport SimpleTransactionsTable from '../accounts/SimpleTransactionsTable';\nimport { StatusBadge } from '../schedules/StatusBadge';\nimport DisplayId from '../util/DisplayId';\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport {\n integerToCurrency,\n integerToAmount,\n amountToInteger\n} from 'loot-core/src/shared/util';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { BetweenAmountInput } from '../util/AmountInput';\n\nfunction updateValue(array, value, update) {\n return array.map(v => (v === value ? update() : v));\n}\n\nfunction applyErrors(array, errorsArray) {\n return array.map((item, i) => {\n return { ...item, error: errorsArray[i] };\n });\n}\n\nfunction getTransactionFields(conditions, actions) {\n let fields = ['date'];\n\n if (conditions.find(c => c.field === 'imported_payee')) {\n fields.push('imported_payee');\n }\n\n fields.push('payee');\n\n if (actions.find(a => a.field === 'category')) {\n fields.push('category');\n } else if (\n actions.length > 0 &&\n !['payee', 'date', 'amount'].includes(actions[0].field)\n ) {\n fields.push(actions[0].field);\n }\n\n fields.push('amount');\n\n return fields;\n}\n\nexport function FieldSelect({ fields, style, value, onChange }) {\n return (\n <View style={style}>\n <CustomSelect\n options={fields}\n value={value}\n onChange={value => onChange('field', value)}\n style={{ color: colors.p4 }}\n />\n </View>\n );\n}\n\nexport function OpSelect({\n ops,\n type,\n style,\n value,\n formatOp = friendlyOp,\n onChange\n}) {\n // We don't support the `contains` operator for the id type for\n // rules yet\n if (type === 'id') {\n ops = ops.filter(op => op !== 'contains');\n }\n\n return (\n <CustomSelect\n options={ops.map(op => [op, formatOp(op, type)])}\n value={value}\n onChange={value => onChange('op', value)}\n style={style}\n />\n );\n}\n\nfunction EditorButtons({ onAdd, onDelete, style }) {\n return (\n <>\n {onDelete && (\n <Button bare onClick={onDelete} style={{ padding: 7 }}>\n <SubtractIcon style={{ width: 8, height: 8 }} />\n </Button>\n )}\n {onAdd && (\n <Button bare onClick={onAdd} style={{ padding: 7 }}>\n <AddIcon style={{ width: 10, height: 10 }} />\n </Button>\n )}\n </>\n );\n}\n\nfunction FieldError({ type }) {\n return (\n <Text\n style={{\n fontSize: 12,\n textAlign: 'center',\n color: colors.r5,\n marginBottom: 5\n }}\n >\n {getFieldError(type)}\n </Text>\n );\n}\n\nfunction Editor({ error, style, children }) {\n return (\n <View style={style}>\n <Stack\n direction=\"row\"\n align=\"center\"\n spacing={1}\n style={{\n padding: '3px 5px'\n }}\n >\n {children}\n </Stack>\n {error && <FieldError type={error} />}\n </View>\n );\n}\n\nexport function ConditionEditor({\n conditionFields,\n ops,\n condition,\n editorStyle,\n onChange,\n onDelete,\n onAdd\n}) {\n let { field, op, value, type, options, error, inputKey } = condition;\n\n if (field === 'amount' && options) {\n if (options.inflow) {\n field = 'amount-inflow';\n } else if (options.outflow) {\n field = 'amount-outflow';\n }\n }\n\n let valueEditor;\n if (type === 'number' && op === 'isbetween') {\n valueEditor = (\n <BetweenAmountInput\n defaultValue={value}\n onChange={v => onChange('value', v)}\n />\n );\n } else {\n valueEditor = (\n <GenericInput\n field={field}\n type={type}\n value={value}\n multi={op === 'oneOf'}\n onChange={v => onChange('value', v)}\n />\n );\n }\n\n return (\n <Editor style={editorStyle} error={error}>\n <FieldSelect fields={conditionFields} value={field} onChange={onChange} />\n <OpSelect ops={ops} value={op} type={type} onChange={onChange} />\n\n <View style={{ flex: 1 }}>{valueEditor}</View>\n\n <Stack direction=\"row\">\n <EditorButtons onAdd={onAdd} onDelete={onDelete} />\n </Stack>\n </Editor>\n );\n}\n\nfunction ScheduleDescription({ id }) {\n let dateFormat = useSelector(state => {\n return state.prefs.local.dateFormat || 'MM/dd/yyyy';\n });\n let scheduleData = useSchedules({\n transform: useCallback(q => q.filter({ id }), [])\n });\n\n if (scheduleData == null) {\n return null;\n }\n\n if (scheduleData.schedules.length === 0) {\n return <View style={{ flex: 1 }}>{id}</View>;\n }\n\n let [schedule] = scheduleData.schedules;\n let status = schedule && scheduleData.statuses.get(schedule.id);\n\n return (\n <View style={{ flex: 1, flexDirection: 'row', alignItems: 'center' }}>\n <View style={{ marginRight: 15, flexDirection: 'row' }}>\n <Text\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n Payee:{' '}\n <DisplayId type=\"payees\" id={schedule._payee} noneColor={colors.n5} />\n </Text>\n <Text style={{ margin: '0 5px' }}> — </Text>\n <Text style={{ flexShrink: 0 }}>\n Amount: {integerToCurrency(schedule._amount || 0)}\n </Text>\n <Text style={{ margin: '0 5px' }}> — </Text>\n <Text style={{ flexShrink: 0 }}>\n Next: {monthUtils.format(schedule.next_date, dateFormat)}\n </Text>\n </View>\n <StatusBadge status={status} />\n </View>\n );\n}\n\nlet actionFields = [\n 'payee',\n 'notes',\n 'date',\n 'amount',\n 'category',\n 'account'\n].map(field => [field, mapField(field)]);\nfunction ActionEditor({ ops, action, editorStyle, onChange, onDelete, onAdd }) {\n let { field, op, value, type, error, inputKey = 'initial' } = action;\n\n return (\n <Editor style={editorStyle} error={error}>\n {/*<OpSelect ops={ops} value={op} onChange={onChange} />*/}\n\n {op === 'set' ? (\n <>\n <View style={{ padding: '5px 10px', lineHeight: '1em' }}>\n {friendlyOp(op)}\n </View>\n\n <FieldSelect\n fields={actionFields}\n value={field}\n onChange={onChange}\n />\n\n <View style={{ flex: 1 }}>\n <GenericInput\n key={inputKey}\n field={field}\n type={type}\n op={op}\n value={value}\n onChange={v => onChange('value', v)}\n />\n </View>\n </>\n ) : op === 'link-schedule' ? (\n <>\n <View style={{ padding: '5px 10px', color: colors.p4 }}>\n {friendlyOp(op)}\n </View>\n <ScheduleDescription id={value || null} />\n </>\n ) : null}\n\n <Stack direction=\"row\">\n <EditorButtons\n onAdd={onAdd}\n onDelete={op !== 'link-schedule' && onDelete}\n />\n </Stack>\n </Editor>\n );\n}\n\nfunction StageInfo() {\n let [open, setOpen] = useState();\n\n return (\n <View style={{ position: 'relative', marginLeft: 5 }}>\n <View\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <InformationOutline\n style={{ width: 11, height: 11, color: colors.n4 }}\n />\n </View>\n {open && (\n <Tooltip\n position=\"bottom-left\"\n style={{\n padding: 10,\n color: colors.n4,\n maxWidth: 450,\n lineHeight: 1.5\n }}\n >\n The stage of a rule allows you to force a specific order. Pre rules\n always run first, and post rules always run last. Within each stage\n rules are automatically ordered from least to most specific.\n </Tooltip>\n )}\n </View>\n );\n}\n\nfunction StageButton({ selected, children, style, onSelect }) {\n return (\n <Button\n bare\n style={[\n { fontSize: 'inherit' },\n selected && {\n backgroundColor: colors.b9,\n ':hover': { backgroundColor: colors.b9 }\n },\n style\n ]}\n onClick={onSelect}\n >\n {children}\n </Button>\n );\n}\n\nfunction newInput(item) {\n return { ...item, inputKey: '' + Math.random() };\n}\n\nexport function ConditionsList({\n conditions,\n conditionFields,\n editorStyle,\n onChangeConditions\n}) {\n function addCondition(index) {\n let field = 'payee';\n let copy = [...conditions];\n copy.splice(index + 1, 0, {\n type: FIELD_TYPES.get(field),\n field,\n op: 'is',\n value: null\n });\n onChangeConditions(copy);\n }\n\n function addInitialCondition() {\n addCondition(-1);\n }\n\n function removeCondition(cond) {\n onChangeConditions(conditions.filter(c => c !== cond));\n }\n\n function updateCondition(cond, field, value) {\n onChangeConditions(\n updateValue(conditions, cond, () => {\n if (field === 'field') {\n let newCond = { field: value };\n\n if (value === 'amount-inflow') {\n newCond.field = 'amount';\n newCond.options = { inflow: true };\n } else if (value === 'amount-outflow') {\n newCond.field = 'amount';\n newCond.options = { outflow: true };\n }\n\n newCond.type = FIELD_TYPES.get(newCond.field);\n\n let prevType = FIELD_TYPES.get(cond.field);\n if (\n (prevType === 'string' || prevType === 'number') &&\n prevType === newCond.type &&\n cond.op !== 'isbetween'\n ) {\n // Don't clear the value & op if the type is string/number and\n // the type hasn't changed\n newCond.op = cond.op;\n return newInput(makeValue(cond.value, newCond));\n } else {\n newCond.op = TYPE_INFO[newCond.type].ops[0];\n return newInput(makeValue(null, newCond));\n }\n } else if (field === 'op') {\n let op = value;\n\n // Switching between oneOf and other operators is a\n // special-case. It changes the input type, so we need to\n // clear the value\n if (cond.op !== 'oneOf' && op === 'oneOf') {\n return newInput(\n makeValue(cond.value != null ? [cond.value] : [], {\n ...cond,\n op: value\n })\n );\n } else if (cond.op === 'oneOf' && op !== 'oneOf') {\n return newInput(\n makeValue(cond.value.length > 0 ? cond.value[0] : null, {\n ...cond,\n op: value\n })\n );\n } else if (cond.op !== 'isbetween' && op === 'isbetween') {\n // TODO: I don't think we need `makeValue` anymore. It\n // tries to parse the value as a float and we had to\n // special-case isbetween. I don't know why we need that\n // behavior and we can probably get rid of `makeValue`\n return makeValue(\n {\n num1: amountToInteger(cond.value),\n num2: amountToInteger(cond.value)\n },\n { ...cond, op: value }\n );\n } else if (cond.op === 'isbetween' && op !== 'isbetween') {\n return makeValue(integerToAmount(cond.value.num1 || 0), {\n ...cond,\n op: value\n });\n } else {\n return { ...cond, op: value };\n }\n } else if (field === 'value') {\n return makeValue(value, cond);\n }\n\n return cond;\n })\n );\n }\n\n return conditions.length === 0 ? (\n <Button style={{ alignSelf: 'flex-start' }} onClick={addInitialCondition}>\n Add condition\n </Button>\n ) : (\n <Stack spacing={2}>\n {conditions.map((cond, i) => {\n let ops = TYPE_INFO[cond.type].ops;\n\n // Hack for now, these ops should be the only ones available\n // for recurring dates\n if (cond.type === 'date' && cond.value && cond.value.frequency) {\n ops = ['is', 'isapprox'];\n } else if (\n cond.options &&\n (cond.options.inflow || cond.options.outflow)\n ) {\n ops = ops.filter(op => op !== 'isbetween');\n }\n\n return (\n <View>\n <ConditionEditor\n key={i}\n conditionFields={conditionFields}\n editorStyle={editorStyle}\n ops={ops}\n condition={cond}\n onChange={(name, value) => {\n updateCondition(cond, name, value);\n }}\n onDelete={() => removeCondition(cond)}\n onAdd={() => addCondition(i)}\n />\n </View>\n );\n })}\n </Stack>\n );\n}\n\n// TODO:\n// * Dont touch child transactions?\n\nlet conditionFields = [\n 'account',\n 'imported_payee',\n 'payee',\n 'category',\n 'date',\n 'notes',\n 'amount'\n]\n .map(field => [field, mapField(field)])\n .concat([\n ['amount-inflow', mapField('amount', { inflow: true })],\n ['amount-outflow', mapField('amount', { outflow: true })]\n ]);\n\nexport default function EditRule({\n history,\n modalProps,\n defaultRule,\n onSave: originalOnSave\n}) {\n let [conditions, setConditions] = useState(defaultRule.conditions.map(parse));\n let [actions, setActions] = useState(defaultRule.actions.map(parse));\n let [stage, setStage] = useState(defaultRule.stage);\n let [transactions, setTransactions] = useState([]);\n let dispatch = useDispatch();\n let scrollableEl = useRef();\n\n useEffect(() => {\n dispatch(initiallyLoadPayees());\n\n // Disable undo while this modal is open\n setUndoEnabled(false);\n return () => setUndoEnabled(true);\n }, []);\n\n useEffect(() => {\n // Flash the scrollbar\n if (scrollableEl.current) {\n let el = scrollableEl.current;\n let top = el.scrollTop;\n el.scrollTop = top + 1;\n el.scrollTop = top;\n }\n\n // Run it here\n async function run() {\n let { filters } = await send('make-filters-from-conditions', {\n conditions: conditions.map(unparse)\n });\n\n if (filters.length > 0) {\n let { data: transactions } = await runQuery(\n q('transactions')\n .filter({ $and: filters })\n .select('*')\n );\n setTransactions(transactions);\n } else {\n setTransactions([]);\n }\n }\n run();\n }, [actions, conditions]);\n\n let selectedInst = useSelected('transactions', transactions, []);\n\n function addInitialAction() {\n addAction(-1);\n }\n\n function addAction(index) {\n let field = 'category';\n\n let copy = [...actions];\n copy.splice(index + 1, 0, {\n type: FIELD_TYPES.get(field),\n field,\n op: 'set',\n value: null\n });\n setActions(copy);\n }\n\n function onChangeAction(action, field, value) {\n setActions(\n updateValue(actions, action, () => {\n let a = { ...action };\n a[field] = value;\n\n if (field === 'field') {\n a.type = FIELD_TYPES.get(a.field);\n a.value = null;\n return newInput(a);\n } else if (field === 'op') {\n a.value = null;\n a.inputKey = '' + Math.random();\n return newInput(a);\n }\n\n return a;\n })\n );\n }\n\n function onChangeStage(stage) {\n setStage(stage);\n }\n\n function onRemoveAction(action) {\n setActions(actions.filter(a => a !== action));\n }\n\n function onApply() {\n send('rule-apply-actions', {\n transactionIds: [...selectedInst.items],\n actions\n }).then(() => {\n // This makes it refetch the transactions\n setActions([...actions]);\n });\n }\n\n async function onSave() {\n let rule = {\n ...defaultRule,\n stage,\n conditions: conditions.map(unparse),\n actions: actions.map(unparse)\n };\n\n let method = rule.id ? 'rule-update' : 'rule-add';\n let { error, id: newId } = await send(method, rule);\n\n if (error) {\n if (error.conditionErrors) {\n setConditions(applyErrors(conditions, error.conditionErrors));\n }\n\n if (error.actionErrors) {\n setActions(applyErrors(actions, error.actionErrors));\n }\n } else {\n // If adding a rule, we got back an id\n if (newId) {\n rule.id = newId;\n }\n\n originalOnSave && originalOnSave(rule);\n modalProps.onClose();\n }\n }\n\n let editorStyle = {\n backgroundColor: colors.n10,\n borderRadius: 4\n };\n\n return (\n <Modal\n title=\"Rule\"\n padding={0}\n {...modalProps}\n style={[modalProps.style, { flex: 'inherit', maxWidth: '90%' }]}\n >\n {() => (\n <View\n style={{\n maxWidth: '100%',\n width: 900,\n height: '80vh',\n flexGrow: 0,\n flexShrink: 0,\n flexBasis: 'auto',\n overflow: 'hidden'\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 15,\n padding: '0 20px'\n }}\n >\n <Text style={{ color: colors.n4, marginRight: 15 }}>\n Stage of rule:\n </Text>\n\n <Stack direction=\"row\" align=\"center\" spacing={1}>\n <StageButton\n selected={stage === 'pre'}\n onSelect={() => onChangeStage('pre')}\n >\n Pre\n </StageButton>\n <StageButton\n selected={stage === null}\n onSelect={() => onChangeStage(null)}\n >\n Default\n </StageButton>\n <StageButton\n selected={stage === 'post'}\n onSelect={() => onChangeStage('post')}\n >\n Post\n </StageButton>\n\n <StageInfo />\n </Stack>\n </View>\n\n <View\n innerRef={scrollableEl}\n style={{\n borderBottom: '1px solid ' + colors.border,\n padding: 20,\n overflow: 'auto',\n maxHeight: 'calc(100% - 300px)'\n }}\n >\n <View style={{ flexShrink: 0 }}>\n <View style={{ marginBottom: 30 }}>\n <Text style={{ color: colors.n4, marginBottom: 15 }}>\n If all these conditions match:\n </Text>\n\n <ConditionsList\n conditions={conditions}\n conditionFields={conditionFields}\n editorStyle={editorStyle}\n onChangeConditions={conds => setConditions(conds)}\n />\n </View>\n\n <Text style={{ color: colors.n4, marginBottom: 15 }}>\n Then apply these actions:\n </Text>\n <View style={{ flex: 1 }}>\n {actions.length === 0 ? (\n <Button\n style={{ alignSelf: 'flex-start' }}\n onClick={addInitialAction}\n >\n Add action\n </Button>\n ) : (\n <Stack spacing={2}>\n {actions.map((action, i) => (\n <View>\n <ActionEditor\n key={i}\n ops={['set', 'link-schedule']}\n action={action}\n editorStyle={editorStyle}\n onChange={(name, value) => {\n onChangeAction(action, name, value);\n }}\n onDelete={() => onRemoveAction(action)}\n onAdd={() => addAction(i)}\n />\n </View>\n ))}\n </Stack>\n )}\n </View>\n </View>\n </View>\n\n <SelectedProvider instance={selectedInst}>\n <View style={{ padding: '20px', flex: 1 }}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginBottom: 12\n }}\n >\n <Text style={{ color: colors.n4, marginBottom: 0 }}>\n This rule applies to these transactions:\n </Text>\n\n <View style={{ flex: 1 }} />\n <Button\n disabled={selectedInst.items.size === 0}\n onClick={onApply}\n >\n Apply actions ({selectedInst.items.size})\n </Button>\n </View>\n\n <SimpleTransactionsTable\n transactions={transactions}\n fields={getTransactionFields(conditions, actions)}\n style={{ border: '1px solid ' + colors.border }}\n />\n\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n style={{ marginTop: 20 }}\n >\n <Button onClick={() => modalProps.onClose()}>Cancel</Button>\n <Button primary onClick={() => onSave()}>\n Save\n </Button>\n </Stack>\n </View>\n </SelectedProvider>\n </View>\n )}\n </Modal>\n );\n}\n","import React, { useEffect, useState, useReducer } from 'react';\nimport { useParams, useHistory } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { pushModal } from 'loot-core/src/client/actions/modals';\nimport { css } from 'glamor';\nimport { send, sendCatch } from 'loot-core/src/platform/client/fetch';\nimport q, { runQuery, liveQuery } from 'loot-core/src/client/query-helpers';\nimport { extractScheduleConds } from 'loot-core/src/shared/schedules';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { useCachedPayees } from 'loot-core/src/client/data-hooks/payees';\nimport {\n FormField,\n FormLabel,\n Checkbox\n} from 'loot-design/src/components/forms';\nimport { colors, styles } from 'loot-design/src/style';\nimport PayeeAutocomplete from 'loot-design/src/components/PayeeAutocomplete';\nimport AccountAutocomplete from 'loot-design/src/components/AccountAutocomplete';\nimport {\n Stack,\n Input,\n InputWithContent,\n View,\n Text,\n Button,\n ModalButtons\n} from 'loot-design/src/components/common';\nimport DateSelect from 'loot-design/src/components/DateSelect';\nimport { SelectedItemsButton } from 'loot-design/src/components/table';\nimport SimpleTransactionsTable from '../accounts/SimpleTransactionsTable';\nimport { usePageType } from '../Page';\nimport { Page } from '../Page';\nimport useSelected, {\n SelectedProvider\n} from 'loot-design/src/components/useSelected';\nimport { OpSelect } from '../modals/EditRule';\nimport { AmountInput, BetweenAmountInput } from '../util/AmountInput';\nimport { SchedulesProviderRaw } from 'loot-core/src/client/data-hooks/schedules';\n\nimport RecurringSchedulePicker from 'loot-design/src/components/RecurringSchedulePicker';\n\nfunction mergeFields(defaults, initial) {\n let res = { ...defaults };\n if (initial) {\n // Only merge in fields from `initial` that exist in `defaults`\n Object.keys(initial).forEach(key => {\n if (key in defaults) {\n res[key] = initial[key];\n }\n });\n }\n return res;\n}\n\nfunction updateScheduleConditions(schedule, fields) {\n let conds = extractScheduleConds(schedule._conditions);\n\n let updateCond = (cond, op, field, value) => {\n if (cond) {\n return { ...cond, value };\n }\n\n if (value != null) {\n return { op, field, value };\n }\n\n return null;\n };\n\n // Validate\n if (fields.date == null) {\n return { error: 'Date is required' };\n }\n\n if (fields.amount == null) {\n return { error: 'A valid amount is required' };\n }\n\n return {\n conditions: [\n updateCond(conds.payee, 'is', 'payee', fields.payee),\n updateCond(conds.account, 'is', 'account', fields.account),\n updateCond(conds.date, 'isapprox', 'date', fields.date),\n // We don't use `updateCond` for amount because we want to\n // overwrite it completely\n {\n op: fields.amountOp,\n field: 'amount',\n value: fields.amount\n }\n ].filter(Boolean)\n };\n}\n\nexport default function ScheduleDetails() {\n let { id, initialFields } = useParams();\n let adding = id == null;\n let payees = useCachedPayees({ idKey: true });\n let history = useHistory();\n let globalDispatch = useDispatch();\n let dateFormat = useSelector(state => {\n return state.prefs.local.dateFormat || 'MM/dd/yyyy';\n });\n\n let pageType = usePageType();\n\n let [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'set-schedule': {\n let schedule = action.schedule;\n\n // See if there are custom rules\n let conds = extractScheduleConds(schedule._conditions);\n let condsSet = new Set(Object.values(conds));\n let isCustom =\n schedule._conditions.find(c => !condsSet.has(c)) ||\n schedule._actions.find(a => a.op !== 'link-schedule');\n\n return {\n ...state,\n schedule: action.schedule,\n isCustom,\n fields: {\n payee: schedule._payee,\n account: schedule._account,\n amount: schedule._amount || 0,\n amountOp: schedule._amountOp || 'isapprox',\n date: schedule._date,\n posts_transaction: action.schedule.posts_transaction\n }\n };\n }\n case 'set-field':\n if (!(action.field in state.fields)) {\n throw new Error('Unknown field: ' + action.field);\n }\n\n let fields = { [action.field]: action.value };\n\n // If we are changing the amount operator either to or\n // away from the `isbetween` operator, the amount value is\n // different and we need to convert it\n if (\n action.field === 'amountOp' &&\n action.value !== state.fields.amountOp\n ) {\n if (action.value === 'isbetween') {\n // We need a range if switching to `isbetween`. The\n // amount field should be a number since we are\n // switching away from the other ops, but check just in\n // case\n fields.amount =\n typeof state.fields.amount === 'number'\n ? { num1: state.fields.amount, num2: state.fields.amount }\n : { num1: 0, num2: 0 };\n } else if (state.fields.amountOp === 'isbetween') {\n // We need just a number if switching away from\n // `isbetween`. The amount field should be a range, but\n // also check just in case. We grab just the first\n // number and use it\n fields.amount =\n typeof state.fields.amount === 'number'\n ? state.fields.amount\n : state.fields.amount.num1;\n }\n }\n\n return {\n ...state,\n fields: { ...state.fields, ...fields }\n };\n case 'set-transactions':\n return { ...state, transactions: action.transactions };\n case 'set-repeats':\n return {\n ...state,\n fields: {\n ...state.fields,\n date: action.repeats\n ? {\n frequency: 'monthly',\n start: monthUtils.currentDay(),\n patterns: []\n }\n : monthUtils.currentDay()\n }\n };\n case 'set-upcoming-dates':\n return {\n ...state,\n upcomingDates: action.dates\n };\n\n case 'form-error':\n return { ...state, error: action.error };\n\n case 'switch-transactions':\n return { ...state, transactionsMode: action.mode };\n\n default:\n throw new Error('Unknown action: ' + action.type);\n }\n },\n {\n schedule: null,\n upcomingDates: null,\n error: null,\n fields: mergeFields(\n {\n payee: null,\n account: null,\n amount: null,\n amountOp: null,\n date: null,\n posts_transaction: false\n },\n initialFields\n ),\n transactions: [],\n transactionsMode: adding ? 'matched' : 'linked'\n }\n );\n\n async function loadSchedule() {\n let { data } = await runQuery(\n q('schedules')\n .filter({ id })\n .select('*')\n );\n return data[0];\n }\n\n useEffect(() => {\n async function run() {\n if (adding) {\n let date = {\n start: monthUtils.currentDay(),\n frequency: 'monthly',\n patterns: []\n };\n let schedule = {\n posts_transaction: false,\n _date: date,\n _conditions: [{ op: 'isapprox', field: 'date', value: date }],\n _actions: []\n };\n\n dispatch({ type: 'set-schedule', schedule });\n } else {\n let schedule = await loadSchedule();\n\n if (schedule && state.schedule == null) {\n dispatch({ type: 'set-schedule', schedule });\n }\n }\n }\n run();\n }, []);\n\n useEffect(() => {\n async function run() {\n let date = state.fields.date;\n let dates = null;\n\n if (date == null) {\n dispatch({ type: 'set-upcoming-dates', dates: null });\n } else {\n if (date.frequency) {\n let { data } = await sendCatch('schedule/get-upcoming-dates', {\n config: date,\n count: 3\n });\n dispatch({ type: 'set-upcoming-dates', dates: data });\n } else {\n let today = monthUtils.currentDay();\n if (date === today || monthUtils.isAfter(date, today)) {\n dispatch({ type: 'set-upcoming-dates', dates: [date] });\n } else {\n dispatch({ type: 'set-upcoming-dates', dates: null });\n }\n }\n }\n }\n run();\n }, [state.fields.date]);\n\n useEffect(() => {\n if (\n state.schedule &&\n state.schedule.id &&\n state.transactionsMode === 'linked'\n ) {\n let live = liveQuery(\n q('transactions')\n .filter({ schedule: state.schedule.id })\n .select('*')\n .options({ splits: 'none' }),\n data => dispatch({ type: 'set-transactions', transactions: data })\n );\n return live.unsubscribe;\n }\n }, [state.schedule, state.transactionsMode]);\n\n useEffect(() => {\n let current = true;\n let unsubscribe;\n\n if (state.schedule && state.transactionsMode === 'matched') {\n let { error, conditions } = updateScheduleConditions(\n state.schedule,\n state.fields\n );\n\n dispatch({ type: 'set-transactions', transactions: [] });\n\n // *Extremely* gross hack because the rules are not mapped to\n // public names automatically. We really should be doing that\n // at the database layer\n conditions = conditions.map(cond => {\n if (cond.field === 'description') {\n return { ...cond, field: 'payee' };\n } else if (cond.field === 'acct') {\n return { ...cond, field: 'account' };\n }\n return cond;\n });\n\n send('make-filters-from-conditions', {\n conditions: conditions\n }).then(({ filters }) => {\n if (current) {\n let live = liveQuery(\n q('transactions')\n .filter({ $and: filters })\n .select('*')\n .options({ splits: 'none' }),\n data => dispatch({ type: 'set-transactions', transactions: data })\n );\n unsubscribe = live.unsubscribe;\n }\n });\n }\n\n return () => {\n current = false;\n if (unsubscribe) {\n unsubscribe();\n }\n };\n }, [state.schedule, state.transactionsMode, state.fields]);\n\n let selectedInst = useSelected('transactions', state.transactions, []);\n\n async function onSave() {\n dispatch({ type: 'form-error', error: null });\n\n let { error, conditions } = updateScheduleConditions(\n state.schedule,\n state.fields\n );\n\n if (error) {\n dispatch({ type: 'form-error', error });\n return;\n }\n\n let res = await sendCatch(adding ? 'schedule/create' : 'schedule/update', {\n schedule: {\n id: state.schedule.id,\n posts_transaction: state.fields.posts_transaction\n },\n conditions\n });\n\n if (res.error) {\n dispatch({\n type: 'form-error',\n error:\n 'An error occurred while saving. Please contact help@actualbudget.com for support.'\n });\n } else {\n if (adding) {\n await onLinkTransactions([...selectedInst.items], res.data);\n }\n history.goBack();\n }\n }\n\n async function onEditRule(ruleId) {\n let rule = await send('rule-get', { id: ruleId || state.schedule.rule });\n\n globalDispatch(\n pushModal('edit-rule', {\n rule,\n onSave: async () => {\n let schedule = await loadSchedule();\n dispatch({ type: 'set-schedule', schedule });\n }\n })\n );\n }\n\n async function onLinkTransactions(ids, scheduleId) {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({\n id,\n schedule: scheduleId || state.schedule.id\n }))\n });\n selectedInst.dispatch({ type: 'select-none' });\n }\n\n async function onUnlinkTransactions(ids) {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: null }))\n });\n selectedInst.dispatch({ type: 'select-none' });\n }\n\n if (state.schedule == null) {\n return null;\n }\n\n function onSwitchTransactions(mode) {\n dispatch({ type: 'switch-transactions', mode });\n selectedInst.dispatch({ type: 'select-none' });\n }\n\n let payee = payees ? payees[state.fields.payee] : null;\n\n // This is derived from the date\n let repeats = state.fields.date ? !!state.fields.date.frequency : false;\n\n return (\n <Page\n title={payee ? `Schedule: ${payee.name}` : 'Schedule'}\n modalSize=\"medium\"\n >\n <Stack direction=\"row\" style={{ marginTop: 20 }}>\n <FormField style={{ flex: 1 }}>\n <FormLabel title=\"Payee\" />\n <PayeeAutocomplete\n value={state.fields.payee}\n inputProps={{ placeholder: '(none)' }}\n onSelect={id =>\n dispatch({ type: 'set-field', field: 'payee', value: id })\n }\n />\n </FormField>\n\n <FormField style={{ flex: 1 }}>\n <FormLabel title=\"Account\" />\n <AccountAutocomplete\n value={state.fields.account}\n inputProps={{ placeholder: '(none)' }}\n onSelect={id =>\n dispatch({ type: 'set-field', field: 'account', value: id })\n }\n />\n </FormField>\n\n <FormField style={{ flex: 1 }}>\n <Stack direction=\"row\" align=\"center\" style={{ marginBottom: 3 }}>\n <FormLabel title=\"Amount\" style={{ margin: 0, flex: 1 }} />\n <OpSelect\n ops={['is', 'isapprox', 'isbetween']}\n value={state.fields.amountOp}\n formatOp={op => {\n switch (op) {\n case 'is':\n return 'is exactly';\n case 'isapprox':\n return 'is approximately';\n case 'isbetween':\n return 'is between';\n default:\n throw new Error('Invalid op for select: ' + op);\n }\n }}\n style={{\n padding: '0 10px',\n color: colors.n5,\n fontSize: 12\n }}\n onChange={(_, op) =>\n dispatch({ type: 'set-field', field: 'amountOp', value: op })\n }\n />\n </Stack>\n {state.fields.amountOp === 'isbetween' ? (\n <BetweenAmountInput\n defaultValue={state.fields.amount}\n onChange={value =>\n dispatch({\n type: 'set-field',\n field: 'amount',\n value\n })\n }\n />\n ) : (\n <AmountInput\n defaultValue={state.fields.amount}\n onChange={value =>\n dispatch({\n type: 'set-field',\n field: 'amount',\n value\n })\n }\n />\n )}\n </FormField>\n </Stack>\n\n <View style={{ marginTop: 20 }}>\n <FormLabel title=\"Date\" />\n </View>\n\n <Stack direction=\"row\" align=\"flex-start\">\n <View style={{ flex: 1 }}>\n {repeats ? (\n <RecurringSchedulePicker\n value={state.fields.date}\n onChange={value =>\n dispatch({ type: 'set-field', field: 'date', value })\n }\n />\n ) : (\n <DateSelect\n value={state.fields.date}\n onSelect={date =>\n dispatch({ type: 'set-field', field: 'date', value: date })\n }\n dateFormat={dateFormat}\n />\n )}\n\n {state.upcomingDates && (\n <View style={{ fontSize: 13, marginTop: 20 }}>\n <Text style={{ color: colors.n4, fontWeight: 600 }}>\n Upcoming dates\n </Text>\n <Stack\n direction=\"column\"\n spacing={1}\n style={{ marginTop: 10, color: colors.n4 }}\n >\n {state.upcomingDates.map(date => (\n <View>{monthUtils.format(date, `${dateFormat} EEEE`)}</View>\n ))}\n </Stack>\n </View>\n )}\n </View>\n\n <View\n style={{\n marginTop: 5,\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none'\n }}\n >\n <Checkbox\n id=\"form_repeats\"\n checked={repeats}\n onChange={e => {\n dispatch({ type: 'set-repeats', repeats: e.target.checked });\n }}\n />\n <label for=\"form_repeats\" style={{ userSelect: 'none' }}>\n Repeats\n </label>\n </View>\n\n <View\n style={{\n alignItems: 'flex-end',\n flex: 1\n }}\n >\n <View\n style={{\n marginTop: 5,\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n justifyContent: 'flex-end'\n }}\n >\n <Checkbox\n id=\"form_posts_transaction\"\n checked={state.fields.posts_transaction}\n onChange={e => {\n dispatch({\n type: 'set-field',\n field: 'posts_transaction',\n value: e.target.checked\n });\n }}\n />\n <label for=\"form_posts_transaction\" style={{ userSelect: 'none' }}>\n Automatically add transaction\n </label>\n </View>\n\n <Text\n style={{\n width: 350,\n textAlign: 'right',\n color: colors.n4,\n marginTop: 10,\n fontSize: 13,\n lineHeight: '1.4em'\n }}\n >\n If checked, the schedule will automatically create transactions for\n you in the specified account\n </Text>\n\n {!adding && state.schedule.rule && (\n <Stack direction=\"row\" align=\"center\" style={{ marginTop: 30 }}>\n {state.isCustom && (\n <Text\n style={{\n color: colors.b5,\n fontSize: 13,\n textAlign: 'right',\n width: 350\n }}\n >\n This schedule has custom conditions and actions\n </Text>\n )}\n <Button onClick={() => onEditRule()} disabled={adding}>\n Edit as rule\n </Button>\n </Stack>\n )}\n </View>\n </Stack>\n\n <View style={{ marginTop: 30, flex: 1 }}>\n <SelectedProvider instance={selectedInst}>\n {adding ? (\n <View style={{ flexDirection: 'row', padding: '5px 0' }}>\n <Text style={{ color: colors.n4 }}>\n These transactions match this schedule:\n </Text>\n <View style={{ flex: 1 }} />\n <Text style={{ color: colors.n6 }}>\n Select transactions to link on save\n </Text>\n </View>\n ) : (\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <Button\n bare\n style={{\n color:\n state.transactionsMode === 'linked' ? colors.b4 : colors.n7,\n marginRight: 10,\n fontSize: 14\n }}\n onClick={() => onSwitchTransactions('linked')}\n >\n Linked transactions\n </Button>{' '}\n <Button\n bare\n style={{\n color:\n state.transactionsMode === 'matched'\n ? colors.b4\n : colors.n7,\n fontSize: 14\n }}\n onClick={() => onSwitchTransactions('matched')}\n >\n Find matching transactions\n </Button>\n <View style={{ flex: 1 }} />\n <SelectedItemsButton\n name=\"transactions\"\n items={\n state.transactionsMode === 'linked'\n ? [{ name: 'unlink', text: 'Unlink from schedule' }]\n : [{ name: 'link', text: 'Link to schedule' }]\n }\n onSelect={(name, ids) => {\n switch (name) {\n case 'link':\n onLinkTransactions(ids);\n break;\n case 'unlink':\n onUnlinkTransactions(ids);\n break;\n default:\n }\n }}\n />\n </View>\n )}\n\n <SimpleTransactionsTable\n transactions={state.transactions}\n fields={['date', 'payee', 'amount']}\n style={{\n border: '1px solid ' + colors.border,\n borderRadius: 4,\n overflow: 'hidden',\n marginTop: 5\n }}\n />\n </SelectedProvider>\n </View>\n\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n align=\"center\"\n style={{ marginTop: 20 }}\n >\n {state.error && <Text style={{ color: colors.r4 }}>{state.error}</Text>}\n <Button style={{ marginRight: 10 }} onClick={() => history.goBack()}>\n Cancel\n </Button>\n <Button primary onClick={onSave}>\n {adding ? 'Add' : 'Save'}\n </Button>\n </Stack>\n </Page>\n );\n}\n","import React, { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation, useHistory } from 'react-router-dom';\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { View, Text } from 'loot-design/src/components/common';\nimport { Page } from '../Page';\nimport { SchedulesTable } from './SchedulesTable';\n\nexport default function ScheduleLink() {\n let location = useLocation();\n let history = useHistory();\n let scheduleData = useSchedules(\n useCallback(query => query.filter({ completed: false }), [])\n );\n let dateFormat = useSelector(state => {\n return state.prefs.local.dateFormat || 'MM/dd/yyyy';\n });\n\n if (scheduleData == null) {\n return null;\n }\n\n let { schedules, statuses } = scheduleData;\n\n async function onSelect(scheduleId) {\n let { state } = location;\n let ids = state.transactionIds;\n if (ids && ids.length > 0) {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: scheduleId }))\n });\n }\n history.goBack();\n }\n\n return (\n <Page title=\"Link Schedule\" modalSize=\"medium\">\n <Text style={{ marginBottom: 20 }}>\n Choose a schedule to link these transactions to:\n </Text>\n\n <SchedulesTable\n schedules={schedules}\n statuses={statuses}\n minimal={true}\n onSelect={onSelect}\n />\n </Page>\n );\n}\n","import React, { useCallback, useState, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation, useHistory } from 'react-router-dom';\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport Platform from 'loot-core/src/client/platform';\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n View,\n Text,\n Stack,\n Button,\n ButtonWithLoading,\n P\n} from 'loot-design/src/components/common';\nimport {\n Table,\n TableHeader,\n Row,\n Field,\n Cell,\n SelectCell\n} from 'loot-design/src/components/table';\nimport { getRecurringDescription } from 'loot-core/src/shared/schedules';\nimport { colors, styles } from 'loot-design/src/style';\nimport useSelected, {\n useSelectedDispatch,\n useSelectedItems,\n SelectedProvider\n} from 'loot-design/src/components/useSelected';\nimport { Page } from '../Page';\nimport { ScheduleAmountCell } from './SchedulesTable';\nimport DisplayId from '../util/DisplayId';\n\nlet ROW_HEIGHT = 43;\n\nfunction DiscoverSchedulesTable({ schedules, loading }) {\n let selectedItems = useSelectedItems();\n let dispatchSelected = useSelectedDispatch();\n\n function renderItem({ item }) {\n let selected = selectedItems.has(item.id);\n let amountOp = item._conditions.find(c => c.field === 'amount').op;\n let recurDescription = getRecurringDescription(item.date);\n\n return (\n <Row\n height={ROW_HEIGHT}\n inset={15}\n backgroundColor=\"transparent\"\n onClick={() => {\n dispatchSelected({ type: 'select', id: item.id });\n }}\n borderColor={selected ? colors.b8 : colors.border}\n style={{\n cursor: 'pointer',\n backgroundColor: selected ? colors.selected : 'white',\n ':hover': {\n backgroundColor: selected ? colors.selected : colors.hover\n }\n }}\n >\n <SelectCell\n exposed={true}\n focused={false}\n selected={selected}\n onSelect={() => {\n dispatchSelected({ type: 'select', id: item.id });\n }}\n />\n <Field width=\"flex\">\n <DisplayId type=\"payees\" id={item.payee} />\n </Field>\n <Field width=\"flex\">\n <DisplayId type=\"accounts\" id={item.account} />\n </Field>\n <Field width=\"auto\" title={recurDescription} style={{ flex: 1.5 }}>\n {recurDescription}\n </Field>\n <ScheduleAmountCell amount={item.amount} op={amountOp} />\n </Row>\n );\n }\n\n return (\n <View style={{ flex: 1 }}>\n <TableHeader height={ROW_HEIGHT} inset={15} version=\"v2\">\n <SelectCell\n exposed={true}\n focused={false}\n selected={selectedItems.size > 0}\n onSelect={() => dispatchSelected({ type: 'select-all' })}\n />\n <Field width=\"flex\">Payee</Field>\n <Field width=\"flex\">Account</Field>\n <Field width=\"auto\" style={{ flex: 1.5 }}>\n When\n </Field>\n <Field width={100} style={{ textAlign: 'right' }}>\n Amount\n </Field>\n </TableHeader>\n <Table\n rowHeight={ROW_HEIGHT}\n backgroundColor=\"transparent\"\n version=\"v2\"\n style={{ flex: 1, backgroundColor: 'transparent' }}\n items={schedules}\n loading={loading}\n isSelected={id => selectedItems.has(id)}\n renderItem={renderItem}\n renderEmpty=\"No schedules found\"\n />\n </View>\n );\n}\n\nexport default function DiscoverSchedules() {\n let location = useLocation();\n let history = useHistory();\n let [schedules, setSchedules] = useState();\n let [creating, setCreating] = useState(false);\n\n let selectedInst = useSelected('discover-schedules', schedules, []);\n\n useEffect(() => {\n async function run() {\n setSchedules(await send('schedule/discover'));\n }\n run();\n }, []);\n\n async function onCreate() {\n let items = selectedInst.items;\n let selected = schedules.filter(s => selectedInst.items.has(s.id));\n setCreating(true);\n\n for (let schedule of selected) {\n let scheduleId = await send('schedule/create', {\n conditions: schedule._conditions\n });\n\n // Now query for matching transactions and link them automatically\n let { filters } = await send('make-filters-from-conditions', {\n conditions: schedule._conditions\n });\n\n if (filters.length > 0) {\n let { data: transactions } = await runQuery(\n q('transactions')\n .filter({ $and: filters })\n .select('id')\n );\n await send('transactions-batch-update', {\n updated: transactions.map(t => ({\n id: t.id,\n schedule: scheduleId\n }))\n });\n }\n }\n\n setCreating(false);\n history.goBack();\n }\n\n return (\n <Page title=\"Found schedules\" modalSize={{ width: 850, height: 650 }}>\n <P>\n We found some possible schedules in your current transactions. Select\n the ones you want to create.\n </P>\n <P>\n If you expected a schedule here and don't see it, it might be because\n the payees of the transactions don't match. Make sure you rename payees\n on all transactions for a schedule to be the same payee.\n </P>\n <P>\n You can always do this later\n {Platform.isBrowser\n ? ' from the \"Find schedules\" item in the sidebar menu'\n : ' from the \"Tools > Find schedules\" menu item'}\n .\n </P>\n\n <SelectedProvider instance={selectedInst}>\n <DiscoverSchedulesTable\n loading={schedules == null}\n schedules={schedules}\n />\n </SelectedProvider>\n\n <Stack\n direction=\"row\"\n align=\"center\"\n justify=\"flex-end\"\n style={{ paddingTop: 20 }}\n >\n <Button onClick={() => history.goBack()}>Do nothing</Button>\n <ButtonWithLoading\n primary\n loading={creating}\n disabled={selectedInst.items.size === 0}\n onClick={onCreate}\n >\n Create schedules\n </ButtonWithLoading>\n </Stack>\n </Page>\n );\n}\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation, useHistory } from 'react-router-dom';\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n View,\n Text,\n P,\n Button,\n Stack\n} from 'loot-design/src/components/common';\nimport { Page } from '../Page';\nimport { SchedulesTable } from './SchedulesTable';\nimport DisplayId from '../util/DisplayId';\nimport { colors, styles } from 'loot-design/src/style';\n\nexport default function PostsOfflineNotification() {\n let location = useLocation();\n let history = useHistory();\n\n let payees = (location.state && location.state.payees) || [];\n let plural = payees.length > 1;\n\n function onClose() {\n history.goBack();\n }\n\n async function onPost() {\n await send('schedule/force-run-service');\n history.goBack();\n }\n\n return (\n <Page title=\"Post transactions?\" modalSize=\"small\">\n <P>\n {payees.length > 0 ? (\n <Text>\n The {plural ? 'payees ' : 'payee '}\n {payees.map((id, idx) => (\n <Text>\n <Text style={{ color: colors.p4 }}>\n <DisplayId key={id} id={id} type=\"payees\" />\n </Text>\n {idx === payees.length - 1\n ? ' '\n : idx === payees.length - 2\n ? ', and '\n : ', '}\n </Text>\n ))}\n </Text>\n ) : (\n <Text>There {plural ? 'are payees ' : 'is a payee '} that </Text>\n )}\n\n <Text>\n {plural ? 'have ' : 'has '} schedules that are due today. Usually we\n automatically post transactions for these, but you are offline or\n syncing failed. In order to avoid duplicate transactions, we let you\n choose whether or not to create transactions for these schedules.\n </Text>\n </P>\n <P>\n Be aware that other devices may have already created these transactions.\n If you have multiple devices, make sure you only do this on one device\n or you will have duplicate transactions.\n </P>\n <P>\n You can always manually post a transaction later for a due schedule by\n selecting the schedule and clicking \"Post transaction\" in the action\n menu.\n </P>\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n style={{ marginTop: 20 }}\n spacing={2}\n >\n <Button onClick={onClose}>Decide later</Button>\n <Button primary onClick={onPost}>\n Post transactions\n </Button>\n </Stack>\n </Page>\n );\n}\n","import React, { useCallback, useState, useEffect } from 'react';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { colors } from 'loot-design/src/style';\nimport {\n View,\n Text,\n P,\n ButtonWithLoading\n} from 'loot-design/src/components/common';\nimport { Page } from '../Page';\n\nfunction renderResults(results) {\n let { numBlankPayees, numCleared, numDeleted } = results;\n if (numBlankPayees === 0 && numCleared === 0 && numDeleted === 0) {\n return (\n <P style={{ alignSelf: 'center', color: colors.g3 }}>\n No split transactions found needing repair.\n </P>\n );\n }\n\n let fixed = '';\n if (numBlankPayees > 0) {\n fixed += `${numBlankPayees} split transactions with a blank payee`;\n }\n if (numCleared > 0) {\n if (fixed !== '') {\n fixed += ', and ';\n }\n fixed += `${numCleared} split transactions with the wrong cleared flag`;\n }\n if (numDeleted > 0) {\n if (fixed !== '') {\n fixed += ', and ';\n }\n fixed += `${numDeleted} split transactions that weren't properly deleted`;\n }\n\n return (\n <P style={{ alignSelf: 'center', color: colors.g3 }}>Fixed {fixed}.</P>\n );\n}\n\nexport default function FixSplitsTool() {\n let [loading, setLoading] = useState(false);\n let [results, setResults] = useState(null);\n\n async function onFix() {\n setLoading(true);\n let res = await send('tools/fix-split-transactions');\n setResults(res);\n setLoading(false);\n }\n\n return (\n <Page title=\"Repair Split Transactions\" modalSize={{ width: 650 }}>\n <View style={{ alignItems: 'flex-start' }}>\n <P>This tool does two things:</P>\n <P>\n <ul style={{ margin: 0 }}>\n <li style={{ marginBottom: '1em' }}>\n Ensures that deleted split transactions are fully deleted. In\n previous versions of the app, certain split transactions may\n appear deleted but not all of them are actually deleted. This\n causes the transactions list to look correct, but certain balances\n may be incorrect when filtering.\n </li>\n <li>\n Sync the payee and cleared flag of a split transaction to the main\n or \"parent\" transaction, if appropriate. The payee will only be\n set if it currently doesn't have one.\n </li>\n </ul>\n </P>\n <P>\n If you see blank payees on splits or account balances (or any\n balances) are incorrect, this may fix it.\n </P>\n <ButtonWithLoading\n primary\n loading={loading}\n onClick={onFix}\n style={{ alignSelf: 'center', margin: '15px 0' }}\n >\n Repair split transactions\n </ButtonWithLoading>\n {results && renderResults(results)}\n </View>\n </Page>\n );\n}\n","import React from 'react';\nimport { View, Text } from './common';\nimport { styles, colors } from '../style';\nimport InformationOutline from '../svg/v1/InformationOutline';\nimport ExclamationOutline from '../svg/v1/ExclamationOutline';\n\nexport function Alert({ icon: Icon, color, backgroundColor, style, children }) {\n return (\n <View\n style={[\n {\n color,\n fontSize: 13,\n boxShadow: styles.shadow,\n borderRadius: 4,\n backgroundColor,\n padding: 10,\n flexDirection: 'row',\n '& a, & a:active, & a:visited': {\n color: colors.b3\n }\n },\n style\n ]}\n >\n <View\n style={{\n paddingLeft: 2,\n paddingTop: '.11em',\n alignSelf: 'stretch',\n flexShrink: 0,\n marginRight: 5\n }}\n >\n <Icon width={13} style={{ color, marginTop: 2 }} />\n </View>\n <Text style={{ zIndex: 1, lineHeight: 1.5 }}>{children}</Text>\n </View>\n );\n}\n\nexport function Information({ style, children }) {\n return (\n <Alert\n icon={InformationOutline}\n color={colors.n4}\n backgroundColor=\"transparent\"\n style={[style, { boxShadow: 'none', padding: 5 }]}\n >\n {children}\n </Alert>\n );\n}\n\nexport function Warning({ style, children }) {\n return (\n <Alert\n icon={ExclamationOutline}\n color={colors.y2}\n backgroundColor={colors.y10}\n style={style}\n >\n {children}\n </Alert>\n );\n}\n\nexport function Error({ style, children }) {\n return (\n <Alert\n icon={ExclamationOutline}\n color={colors.r2}\n backgroundColor={colors.r10}\n style={style}\n >\n {children}\n </Alert>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { css } from 'glamor';\nimport { Route, Switch, Redirect } from 'react-router-dom';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Button,\n ButtonLink,\n ButtonWithLoading,\n AnchorLink,\n Link,\n Input\n} from 'loot-design/src/components/common';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport { numberFormats } from 'loot-core/src/shared/util';\nimport { styles, colors } from 'loot-design/src/style';\nimport { Information, Warning, Error } from 'loot-design/src/components/alerts';\nimport Checkmark from 'loot-design/src/svg/v1/Checkmark';\nimport CheveronDown from 'loot-design/src/svg/v1/CheveronDown';\nimport ExpandArrow from 'loot-design/src/svg/ExpandArrow';\nimport ExclamationSolid from 'loot-design/src/svg/v1/ExclamationSolid';\nimport Platform from 'loot-core/src/client/platform';\n\nlet dateFormats = [\n { value: 'MM/dd/yyyy', label: 'MM/DD/YYYY' },\n { value: 'dd/MM/yyyy', label: 'DD/MM/YYYY' },\n { value: 'yyyy-MM-dd', label: 'YYYY-MM-DD' },\n { value: 'MM.dd.yyyy', label: 'MM.DD.YYYY' },\n { value: 'dd.MM.yyyy', label: 'DD.MM.YYYY' }\n];\n\nfunction Title({ name, style }) {\n return (\n <View\n style={[\n { fontSize: 20, fontWeight: 500, marginBottom: 20, flexShrink: 0 },\n style\n ]}\n >\n {name}\n </View>\n );\n}\n\nfunction Advanced({ prefs, userData, pushModal, resetSync }) {\n let [expanded, setExpanded] = useState(true);\n let [resetting, setResetting] = useState(false);\n let [resettingCache, setResettingCache] = useState(false);\n\n async function onResetSync() {\n setResetting(true);\n await resetSync();\n setResetting(false);\n }\n\n async function onResetCache() {\n setResettingCache(true);\n await send('reset-budget-cache');\n setResettingCache(false);\n }\n\n return (\n <View style={{ alignItems: 'flex-start', marginTop: 55 }}>\n <View\n style={[\n {\n fontSize: 15,\n marginBottom: 20,\n flexDirection: 'row',\n alignItems: 'center'\n },\n styles.staticText\n ]}\n onClick={() => setExpanded(!expanded)}\n >\n <ExpandArrow\n width={8}\n height={8}\n style={{\n marginRight: 5,\n transition: 'transform .2s',\n transform: !expanded && 'rotateZ(-90deg)'\n }}\n />\n Advanced\n </View>\n\n {expanded && (\n <View style={{ marginBottom: 20, alignItems: 'flex-start' }}>\n <Text>\n <strong>Budget ID</strong>: {prefs.id}\n </Text>\n\n <View\n style={{\n backgroundColor: colors.n9,\n alignItems: 'flex-start',\n padding: 15,\n borderRadius: 4,\n marginTop: 20,\n border: '1px solid ' + colors.n8\n }}\n >\n <Text style={{ marginBottom: 10, width: 500, lineHeight: 1.5 }}>\n <strong>Reset budget cache</strong> will clear all cached values\n for the budget and recalculate the entire budget. All values in\n the budget are cached for performance reasons, and if there is a\n bug in the cache you won't see correct values. There is no danger\n in resetting the cache. Hopefully you never have to do this.\n </Text>\n <ButtonWithLoading loading={resettingCache} onClick={onResetCache}>\n Reset budget cache\n </ButtonWithLoading>\n </View>\n\n <View\n style={{\n backgroundColor: colors.n9,\n alignItems: 'flex-start',\n padding: 15,\n borderRadius: 4,\n marginTop: 20,\n border: '1px solid ' + colors.n8\n }}\n >\n <Text style={{ marginBottom: 10, width: 500, lineHeight: 1.5 }}>\n <strong>Reset sync</strong> will remove all local data used to\n track changes for syncing, and create a fresh sync id on our\n server. This file on other devices will have to be re-downloaded\n to use the new sync id. Use this if there is a problem with\n syncing and you want to start fresh.\n </Text>\n\n <ButtonWithLoading loading={resetting} onClick={onResetSync}>\n Reset sync\n </ButtonWithLoading>\n <Text style={{ marginTop: 15, color: colors.n4, fontSize: 12 }}>\n Sync ID: {prefs.groupId || '(none)'}\n </Text>\n </View>\n </View>\n )}\n </View>\n );\n}\n\nfunction GlobalSettings({\n globalPrefs,\n userData,\n saveGlobalPrefs,\n pushModal,\n closeBudget\n}) {\n let [documentDirChanged, setDirChanged] = useState(false);\n let dirScrolled = useRef(null);\n\n useEffect(() => {\n if (dirScrolled.current) {\n dirScrolled.current.scrollTo(10000, 0);\n }\n }, []);\n\n async function onChooseDocumentDir() {\n let res = await window.Actual.openFileDialog({\n properties: ['openDirectory']\n });\n if (res) {\n saveGlobalPrefs({ documentDir: res[0] });\n setDirChanged(true);\n }\n }\n\n function onAutoUpdate(e) {\n saveGlobalPrefs({ autoUpdate: e.target.checked });\n }\n\n function onTrackUsage(e) {\n saveGlobalPrefs({ trackUsage: e.target.checked });\n }\n\n return (\n <View>\n <View>\n <Title name=\"General\" />\n\n {!Platform.isBrowser && (\n <View\n style={{\n flexDirection: 'row',\n maxWidth: 550,\n alignItems: 'center',\n overflow: 'hidden'\n }}\n >\n <Text style={{ flexShrink: 0 }}>Store files here: </Text>\n <Text\n innerRef={dirScrolled}\n style={{\n backgroundColor: 'white',\n padding: '7px 10px',\n borderRadius: 4,\n marginLeft: 5,\n overflow: 'auto',\n whiteSpace: 'nowrap',\n // TODO: When we update electron, we should be able to\n // remove this. In previous versions of Chrome, once the\n // scrollbar appears it never goes away\n '::-webkit-scrollbar': { display: 'none' }\n }}\n >\n {globalPrefs.documentDir}\n </Text>\n <Button\n primary\n onClick={onChooseDocumentDir}\n style={{\n fontSize: 14,\n marginLeft: 5,\n flexShrink: 0,\n alignSelf: 'flex-start'\n }}\n >\n Change location\n </Button>\n </View>\n )}\n\n {documentDirChanged && (\n <Information style={{ marginTop: 10 }}>\n A restart is required for this change to take effect\n </Information>\n )}\n\n <View\n style={{\n flexDirection: 'row',\n marginTop: 30,\n alignItems: 'flex-start'\n }}\n >\n <input\n type=\"checkbox\"\n checked={globalPrefs.autoUpdate}\n style={{ marginRight: 5 }}\n onChange={onAutoUpdate}\n />\n\n <View>\n <Text style={{ fontSize: 15 }}>\n Automatically check for updates\n </Text>\n <View\n style={{\n color: colors.n2,\n marginTop: 10,\n maxWidth: 600,\n lineHeight: '1.4em'\n }}\n >\n By default, Actual will automatically apply new updates as they\n are available. Disabling this will avoid updating Actual. You will\n need to go to the About menu to manually check for updates.\n </View>\n </View>\n </View>\n </View>\n\n <View style={{ marginTop: 30 }}>\n <Title name=\"Privacy\" />\n\n <View\n style={{\n flexDirection: 'row',\n marginTop: 30,\n alignItems: 'flex-start'\n }}\n >\n <input\n type=\"checkbox\"\n checked={globalPrefs.trackUsage}\n style={{ marginRight: 5 }}\n onChange={onTrackUsage}\n />\n\n <View>\n <Text style={{ fontSize: 15 }}>\n Send basic usage statistics back to Actual{\"'\"}s servers\n </Text>\n <View\n style={{\n color: colors.n2,\n marginTop: 10,\n maxWidth: 600,\n lineHeight: '1.4em'\n }}\n >\n We don{\"'\"}t track anything specific &mdash; only the fact that\n you{\"'\"}ve opened Actual. This helps by giving us important\n feedback about how popular new features are.\n </View>\n </View>\n </View>\n </View>\n </View>\n );\n}\n\nfunction FileSettings({\n savePrefs,\n prefs,\n userData,\n localServerURL,\n pushModal,\n resetSync,\n setAppState,\n signOut\n}) {\n function onDateFormat(e) {\n let format = e.target.value;\n savePrefs({ dateFormat: format });\n }\n\n function onNumberFormat(e) {\n let format = e.target.value;\n savePrefs({ numberFormat: format });\n }\n\n function onChangeKey() {\n pushModal('create-encryption-key', { recreate: true });\n }\n\n async function onExport() {\n let data = await send('export-budget');\n window.Actual.saveFile(data, 'budget.zip', 'Export budget');\n }\n\n let dateFormat = prefs.dateFormat || 'MM/dd/yyyy';\n let numberFormat = prefs.numberFormat || 'comma-dot';\n\n return (\n <View>\n <View style={{ marginTop: 30 }}>\n <Title name=\"Formatting\" />\n\n <Text>\n Date format:{' '}\n <select\n {...css({ marginLeft: 5, fontSize: 14 })}\n onChange={onDateFormat}\n >\n {dateFormats.map(f => (\n <option value={f.value} selected={f.value === dateFormat}>\n {f.label}\n </option>\n ))}\n </select>\n </Text>\n\n <Text style={{ marginTop: 20 }}>\n Number format:{' '}\n <select\n {...css({ marginLeft: 5, fontSize: 14 })}\n onChange={onNumberFormat}\n >\n {numberFormats.map(f => (\n <option value={f.value} selected={f.value === numberFormat}>\n {f.label}\n </option>\n ))}\n </select>\n </Text>\n </View>\n\n <View style={{ marginTop: 30 }}>\n <Title name=\"Encryption\" />\n <View style={{ flexDirection: 'row' }}>\n <View>\n <Text style={{ fontWeight: 700, fontSize: 15 }}>\n End-to-end encryption\n </Text>\n <View\n style={{\n color: colors.n2,\n marginTop: 10,\n maxWidth: 600,\n lineHeight: '1.4em'\n }}\n >\n {prefs.encryptKeyId ? (\n <Text>\n <Text style={{ color: colors.g4, fontWeight: 600 }}>\n Encryption is turned on.\n </Text>{' '}\n Your data is encrypted with a key that only you have before\n sending it out to the cloud . Local data remains unencrypted\n so if you forget your password you can re-encrypt it.\n <Button\n style={{ marginTop: 10 }}\n onClick={() => onChangeKey()}\n >\n Generate new key\n </Button>\n </Text>\n ) : (\n <View style={{ alignItems: 'flex-start' }}>\n <Text style={{ lineHeight: '1.4em' }}>\n Encryption is not enabled. Any data on our servers is still\n stored safely and securely, but it's not end-to-end\n encrypted which means we have the ability to read it (but we\n won't). If you want, you can use a password to encrypt your\n data on our servers.\n </Text>\n <Button\n style={{ marginTop: 10 }}\n onClick={() => {\n alert(\n 'End-to-end encryption is not supported on the self-hosted service yet'\n );\n // pushModal('create-encryption-key');\n }}\n >\n Enable encryption\n </Button>\n </View>\n )}\n </View>\n </View>\n </View>\n </View>\n\n {Platform.isBrowser && (\n <View style={{ marginTop: 30, alignItems: 'flex-start' }}>\n <Title name=\"Export\" />\n <Button onClick={onExport}>Export data</Button>\n </View>\n )}\n\n <Advanced\n prefs={prefs}\n userData={userData}\n pushModal={pushModal}\n resetSync={resetSync}\n />\n </View>\n );\n}\n\nfunction SettingsLink({ to, name, style, first, last }) {\n return (\n <AnchorLink\n to={to}\n style={[\n {\n fontSize: 14,\n padding: '6px 10px',\n borderBottom: '2px solid transparent',\n textDecoration: 'none',\n borderRadius: first ? '4px 0 0 4px' : last ? '0 4px 4px 0' : 4,\n border: '1px solid ' + colors.n4,\n color: colors.n3\n },\n style\n ]}\n activeStyle={{\n backgroundColor: colors.p6,\n borderColor: colors.p6,\n color: 'white'\n }}\n >\n {name}\n </AnchorLink>\n );\n}\n\nclass Settings extends React.Component {\n componentDidMount() {\n this.unlisten = listen('prefs-updated', () => {\n this.props.loadPrefs();\n });\n\n this.props.getUserData();\n this.props.loadPrefs();\n }\n\n componentWillUnmount() {\n this.unlisten();\n }\n\n render() {\n let { prefs, globalPrefs, localServerURL, userData, match } = this.props;\n\n return (\n <View style={[styles.page, { overflow: 'hidden', fontSize: 14 }]}>\n <View\n style={{\n flexDirection: 'row',\n alignSelf: 'center',\n margin: '15px 0'\n }}\n >\n <SettingsLink to={`${match.path}/file`} name=\"File\" first={true} />\n <SettingsLink to={`${match.path}/global`} name=\"Global\" last={true} />\n </View>\n\n <View\n style={[\n styles.pageContent,\n {\n alignItems: 'flex-start',\n flex: 1,\n overflow: 'auto',\n paddingBottom: 20\n }\n ]}\n >\n <View style={{ flexShrink: 0 }}>\n <Switch>\n <Route path={`${match.path}/`} exact>\n <Redirect to={`${match.path}/file`} />\n </Route>\n <Route path={`${match.path}/global`}>\n <GlobalSettings\n globalPrefs={globalPrefs}\n userData={userData}\n saveGlobalPrefs={this.props.saveGlobalPrefs}\n pushModal={this.props.pushModal}\n closeBudget={this.props.closeBudget}\n />\n </Route>\n <Route path={`${match.path}/file`}>\n <FileSettings\n prefs={prefs}\n localServerURL={localServerURL}\n userData={userData}\n pushModal={this.props.pushModal}\n savePrefs={this.props.savePrefs}\n setAppState={this.props.setAppState}\n signOut={this.props.signOut}\n resetSync={this.props.resetSync}\n />\n </Route>\n </Switch>\n </View>\n </View>\n </View>\n );\n }\n}\n\nexport default connect(\n state => ({\n prefs: state.prefs.local,\n globalPrefs: state.prefs.global,\n localServerURL: state.account.localServerURL,\n userData: state.user.data\n }),\n actions\n)(Settings);\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n View,\n Text,\n Modal,\n Button,\n Strong,\n P\n} from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\nimport { authorizeBank } from '../../plaid';\n\nclass CreateAccount extends React.Component {\n onConnect = async () => {\n authorizeBank(this.props.pushModal);\n };\n\n onCreateLocalAccount = () => {\n const { pushModal } = this.props;\n pushModal('add-local-account');\n };\n\n render() {\n const { modalProps } = this.props;\n\n return (\n <Modal title=\"Add Account\" {...modalProps}>\n {() => (\n <View style={{ maxWidth: 500 }}>\n <Text\n style={{ marginBottom: 10, lineHeight: '1.4em', fontSize: 15 }}\n >\n <strong>Link your bank accounts</strong> to automatically download\n transactions. We offer hundreds of banks to sync with, and our\n service will provide reliable, up-to-date information.\n </Text>\n\n <Button\n primary\n style={{\n padding: '10px 0',\n fontSize: 15,\n fontWeight: 600,\n marginTop: 10\n }}\n onClick={this.onConnect}\n >\n Link bank account\n </Button>\n\n <View\n style={{\n marginTop: 30,\n marginBottom: 10,\n lineHeight: '1.4em',\n fontSize: 15\n }}\n >\n You can also create a local account if you want to track\n transactions manually. You can add transactions manually or import\n QIF/OFX/QFX files.\n </View>\n\n <Button\n style={{\n padding: '10px 0',\n fontSize: 15,\n fontWeight: 600,\n marginTop: 10,\n color: colors.n3\n }}\n onClick={this.onCreateLocalAccount}\n >\n Create local account\n </Button>\n </View>\n )}\n </Modal>\n );\n }\n}\n\nexport default connect(\n state => ({\n currentModal: state.modals.currentModal\n }),\n dispatch => bindActionCreators(actions, dispatch)\n)(CreateAccount);\n","export function fromPlaidAccountType(type, subtype) {\n switch (type) {\n case 'brokerage':\n case 'investment':\n return 'investment';\n case 'credit':\n return 'credit';\n case 'loan':\n return 'debt';\n case 'other':\n return 'other';\n case 'depository':\n default:\n switch (subtype) {\n case 'money market':\n case 'savings':\n return 'savings';\n case 'cd':\n return 'cd';\n default:\n return 'checking';\n }\n }\n}\n\nexport function prettyAccountType(type) {\n switch (type) {\n case 'checking':\n return 'Checking';\n case 'savings':\n return 'Savings';\n case 'cd':\n return 'CD';\n case 'investment':\n return 'Investment';\n case 'credit':\n return 'Credit Card';\n case 'mortgage':\n return 'Mortgage';\n case 'debt':\n return 'Debt';\n case 'other':\n default:\n return 'Other';\n }\n}\n\nexport function determineOffBudget(type) {\n switch (type) {\n case 'investment':\n case 'mortgage':\n case 'debt':\n case 'other':\n return true;\n default:\n }\n return false;\n}\n","import React from 'react';\nimport { toRelaxedNumber } from 'loot-core/src/shared/util';\nimport { determineOffBudget } from 'loot-core/src/shared/accounts';\nimport { styles, colors } from '../../style';\nimport {\n View,\n Modal,\n ModalButtons,\n Button,\n Input,\n Select,\n P,\n InlineField,\n FormError,\n InitialFocus\n} from '../common';\nimport { Formik } from 'formik';\n\nfunction CreateLocalAccount({ modalProps, actions, history }) {\n return (\n <Modal title=\"Create Local Account\" {...modalProps} showBack={false}>\n {() => (\n <View>\n <Formik\n validateOnChange={false}\n initialValues={{\n name: '',\n type: 'checking',\n balance: '0'\n }}\n validate={() => ({})}\n onSubmit={async (values, { setErrors }) => {\n const errors = {};\n if (!values.type) {\n errors.type = 'required';\n }\n if (!values.name) {\n errors.name = 'required';\n }\n if (isNaN(parseFloat(values.balance))) {\n errors.balance = 'format';\n }\n setErrors(errors);\n\n if (Object.keys(errors).length === 0) {\n modalProps.onClose();\n let id = await actions.createAccount(\n values.name,\n values.type,\n toRelaxedNumber(values.balance),\n values.offbudget\n );\n history.push('/accounts/' + id);\n }\n }}\n render={({\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n handleSubmit,\n isSubmitting,\n setFieldValue\n }) => (\n <form onSubmit={handleSubmit}>\n <InlineField label=\"Name\" width=\"75%\">\n <InitialFocus>\n <Input\n name=\"name\"\n value={values.name}\n onChange={handleChange}\n onBlur={handleBlur}\n style={{ flex: 1 }}\n />\n </InitialFocus>\n </InlineField>\n {errors.name && (\n <FormError style={{ marginLeft: 75 }}>\n Name is required\n </FormError>\n )}\n\n <InlineField label=\"Type\" width=\"75%\">\n <Select\n name=\"type\"\n value={values.type}\n onChange={e => {\n setFieldValue(\n 'offbudget',\n determineOffBudget(e.target.value)\n );\n handleChange(e);\n }}\n onBlur={handleBlur}\n >\n <option value=\"checking\">Checking / Cash</option>\n <option value=\"savings\">Savings</option>\n <option value=\"credit\">Credit Card</option>\n <option value=\"investment\">Investment</option>\n <option value=\"mortgage\">Mortgage</option>\n <option value=\"debt\">Debt</option>\n <option value=\"other\">Other</option>\n </Select>\n </InlineField>\n {errors.type && (\n <FormError style={{ marginLeft: 75 }}>\n You must select a type\n </FormError>\n )}\n\n <View\n style={{\n width: '75%',\n flexDirection: 'row',\n justifyContent: 'flex-end'\n }}\n >\n <label style={{ userSelect: 'none' }}>\n <input\n name=\"offbudget\"\n type=\"checkbox\"\n checked={!!values.offbudget}\n onChange={handleChange}\n onBlur={handleBlur}\n />{' '}\n Off-budget\n </label>\n </View>\n\n <InlineField label=\"Balance\" width=\"75%\">\n <Input\n name=\"balance\"\n value={values.balance}\n onChange={handleChange}\n onBlur={handleBlur}\n style={{ flex: 1 }}\n />\n </InlineField>\n {errors.balance && (\n <FormError style={{ marginLeft: 75 }}>\n Balance must be a number\n </FormError>\n )}\n\n <ModalButtons>\n <Button onClick={() => modalProps.onBack()}>Back</Button>\n <Button primary style={{ marginLeft: 10 }}>\n Create\n </Button>\n </ModalButtons>\n </form>\n )}\n />\n </View>\n )}\n </Modal>\n );\n}\n\nexport default CreateLocalAccount;\n","import React, { useState } from 'react';\nimport { Formik } from 'formik';\nimport {\n View,\n Text,\n Modal,\n Button,\n P,\n Select,\n FormError,\n AnchorLink\n} from '../common';\nimport { integerToCurrency } from 'loot-core/src/shared/util';\nimport { colors } from '../../style';\n\nfunction needsCategory(account, currentTransfer, accounts) {\n const acct = accounts.find(a => a.id === currentTransfer);\n const isOffBudget = acct && acct.offbudget === 1;\n\n // The user must select a category if transferring from a budgeted\n // account to an off-budget account\n return account.offbudget === 0 && isOffBudget;\n}\n\nfunction CategorySelect({ categoryGroups, ...nativeProps }) {\n return (\n <Select {...nativeProps}>\n <option value=\"\">Select category...</option>\n {categoryGroups.map(group => (\n <optgroup key={group.id} label={group.name}>\n {group.categories.map(category => (\n <option key={category.id} value={category.id}>\n {category.name}\n </option>\n ))}\n </optgroup>\n ))}\n </Select>\n );\n}\n\nfunction CloseAccount({\n account,\n accounts,\n categoryGroups,\n balance,\n canDelete,\n actions,\n modalProps\n}) {\n let [loading, setLoading] = useState(false);\n\n let filtered = accounts.filter(a => a.id !== account.id);\n let onbudget = filtered.filter(a => a.offbudget === 0);\n let offbudget = filtered.filter(a => a.offbudget === 1);\n\n return (\n <Modal\n title=\"Close Account\"\n {...modalProps}\n style={{ flex: 0 }}\n loading={loading}\n >\n {() => (\n <View>\n <P>\n Are you sure you want to close <strong>{account.name}</strong>?{' '}\n {canDelete ? (\n <span>\n This account has no transactions so it will be permanently\n deleted.\n </span>\n ) : (\n <span>\n This account has transactions so we can\n {\"'\"}t permanently delete it.\n </span>\n )}\n </P>\n <Formik\n validateOnChange={false}\n initialValues={{ transfer: '', category: '' }}\n onSubmit={(values, { setErrors }) => {\n const errors = {};\n if (balance !== 0 && values.transfer === '') {\n errors.transfer = 'required';\n }\n if (\n needsCategory(account, values.transfer, accounts) &&\n values.category === ''\n ) {\n errors.category = 'required';\n }\n setErrors(errors);\n\n if (Object.keys(errors).length === 0) {\n setLoading(true);\n\n actions\n .closeAccount(\n account.id,\n values.transfer || null,\n values.category || null\n )\n .then(() => {\n modalProps.onClose();\n });\n }\n }}\n render={({\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n handleSubmit,\n isSubmitting,\n setFieldValue\n }) => (\n <form onSubmit={handleSubmit}>\n {balance !== 0 && (\n <View>\n <P>\n This account has a balance of{' '}\n <strong>${integerToCurrency(balance)}</strong>. To close\n this account, select a different account to transfer this\n balance to:\n </P>\n\n <Select\n name=\"transfer\"\n value={values.transfer}\n onChange={handleChange}\n onBlur={handleBlur}\n style={{ width: 200, marginBottom: 15 }}\n >\n <option value=\"\">Select account...</option>\n <optgroup label=\"For Budget\">\n {onbudget.map(acct => (\n <option key={acct.id} value={acct.id}>\n {acct.name}\n </option>\n ))}\n </optgroup>\n\n <optgroup label=\"Off Budget\">\n {offbudget.map(acct => (\n <option key={acct.id} value={acct.id}>\n {acct.name}\n </option>\n ))}\n </optgroup>\n </Select>\n {errors.transfer && (\n <FormError style={{ marginBottom: 15 }}>\n Transfer is required\n </FormError>\n )}\n\n {needsCategory(account, values.transfer, accounts) && (\n <View style={{ marginBottom: 15 }}>\n <P>\n Since you are transferring the balance from a budgeted\n account to an off-budget account, this transaction\n must be categorized. Select a category:\n </P>\n\n <CategorySelect\n categoryGroups={categoryGroups}\n name=\"category\"\n value={values.category}\n onChange={handleChange}\n onBlur={handleBlur}\n style={{ width: 200 }}\n />\n {errors.category && (\n <FormError>Category is required</FormError>\n )}\n </View>\n )}\n </View>\n )}\n\n {!canDelete && (\n <View style={{ marginBottom: 15 }}>\n <Text style={{ fontSize: 12 }}>\n You can also {/* eslint-disable-next-line */}\n <a\n href=\"#\"\n onClick={e => {\n e.preventDefault();\n setLoading(true);\n\n actions\n .forceCloseAccount(account.id)\n .then(() => modalProps.onClose());\n }}\n style={{ color: colors.r6 }}\n >\n force close\n </a>{' '}\n the account which will delete it and all its transactions\n permanently. Doing so may change your budget unexpectedly\n since money in it may vanish.\n </Text>\n </View>\n )}\n\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'flex-end'\n }}\n >\n <Button\n type=\"submit\"\n style={{ marginRight: 10 }}\n onClick={modalProps.onClose}\n >\n Cancel\n </Button>\n <Button type=\"submit\" primary>\n Close Account\n </Button>\n </View>\n </form>\n )}\n />\n </View>\n )}\n </Modal>\n );\n}\n\nexport default CloseAccount;\n","import React, { useState } from 'react';\nimport { styles, colors } from '../../style';\nimport { View, Text, Modal, P, Button } from '../common';\nimport { amountToPrettyCurrency } from 'loot-core/src/shared/util';\nimport {\n fromPlaidAccountType,\n prettyAccountType\n} from 'loot-core/src/shared/accounts';\n\nlet selectedStyle = {\n color: colors.n1\n};\n\nfunction EmptyMessage() {\n return null;\n}\n\nfunction Account({ account, selected, onSelect }) {\n return (\n <View\n style={[\n { marginBottom: 8, flexShrink: 0, userSelect: 'none' },\n styles.mediumText\n ]}\n onClick={onSelect}\n >\n <View\n style={[\n {\n padding: 12,\n boxShadow: styles.shadow,\n cursor: 'pointer',\n transition: 'transform .20s',\n fontSize: 14,\n borderRadius: 4,\n flexDirection: 'row',\n alignItems: 'center',\n border: '1px solid ' + colors.n10,\n ':hover': selectedStyle\n },\n selected && {\n ...selectedStyle,\n borderColor: colors.b9,\n backgroundColor: colors.b10\n }\n ]}\n >\n <View>\n <View style={{ fontWeight: 600, flex: 1 }}>{account.name}</View>\n <View\n style={{\n fontSize: 13,\n color: colors.n5,\n flexDirection: 'row'\n }}\n >\n {prettyAccountType(\n fromPlaidAccountType(account.type, account.subtype)\n )}\n <Text style={{ marginLeft: 4 }}>\n ...\n {account.mask}\n </Text>\n </View>\n </View>\n </View>\n </View>\n );\n}\n\nexport default function SelectLinkedAccounts({\n institution,\n publicToken,\n upgradingId,\n modalProps,\n accounts,\n actions\n}) {\n let [selectedAccounts, setSelectedAccounts] = useState([]);\n\n function toggleAccount(id) {\n if (upgradingId) {\n setSelectedAccounts([id]);\n } else {\n if (selectedAccounts.includes(id)) {\n setSelectedAccounts(selectedAccounts.filter(x => x !== id));\n } else {\n setSelectedAccounts([...selectedAccounts, id]);\n }\n }\n }\n\n async function onNext() {\n if (selectedAccounts.length > 0) {\n if (upgradingId) {\n actions.linkAccount(\n institution,\n publicToken,\n selectedAccounts[0],\n upgradingId\n );\n actions.closeModal();\n } else {\n actions.pushModal('configure-linked-accounts', {\n institution,\n publicToken,\n accounts: selectedAccounts.map(id =>\n accounts.find(acct => acct.id === id)\n )\n });\n }\n }\n }\n\n return (\n <Modal\n title={upgradingId ? 'Link Account' : 'Link Accounts'}\n {...modalProps}\n >\n {() => (\n <View style={{ maxWidth: 500 }}>\n {upgradingId ? (\n <P>\n We found the following accounts. Select the one you want to link\n with:\n </P>\n ) : (\n <P>\n We found the following accounts. Select which ones you want to\n add:\n </P>\n )}\n\n <View\n style={{\n maxHeight: 300,\n overflow: 'auto',\n // Allow the shadow to appear on left/right edge\n paddingLeft: 5,\n paddingRight: 5,\n marginLeft: -5,\n marginRight: -5\n }}\n >\n <View>\n {accounts.length === 0 ? (\n <EmptyMessage />\n ) : (\n accounts.map(account => {\n let selected = selectedAccounts.includes(account.id);\n\n return (\n <Account\n key={account.id}\n account={account}\n selected={selected}\n onSelect={() => toggleAccount(account.id)}\n />\n );\n })\n )}\n </View>\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'flex-end',\n marginTop: 30\n }}\n >\n <Button style={{ marginRight: 10 }} onClick={modalProps.onClose}>\n Cancel\n </Button>\n <Button primary onClick={onNext}>\n {upgradingId ? 'Link Account' : 'Next'}\n </Button>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n","import React, { useState } from 'react';\nimport { View, Text, Modal, Button } from '../common';\nimport { styles, colors } from '../../style';\nimport {\n fromPlaidAccountType,\n determineOffBudget,\n prettyAccountType\n} from 'loot-core/src/shared/accounts';\nimport Checkmark from 'loot-design/src/svg/v1/Checkmark';\n\nfunction EmptyMessage() {\n return null;\n}\n\nfunction Account({ account, offbudget, onSelect }) {\n return (\n <View\n style={[\n { marginBottom: 8, flexShrink: 0, userSelect: 'none' },\n styles.mediumText\n ]}\n onClick={onSelect}\n >\n <View\n style={[\n {\n padding: 12,\n boxShadow: styles.shadow,\n cursor: 'pointer',\n transition: 'transform .20s',\n fontSize: 14,\n borderRadius: 4,\n flexDirection: 'row',\n alignItems: 'center',\n border: '1px solid ' + colors.n10\n }\n ]}\n >\n <View style={{ flex: 1 }}>\n <View style={{ fontWeight: 600 }}>{account.name}</View>\n <View\n style={{\n fontSize: 13,\n color: colors.n5,\n flexDirection: 'row'\n }}\n >\n {prettyAccountType(\n fromPlaidAccountType(account.type, account.subtype)\n )}\n <Text style={{ marginLeft: 4 }}>\n ...\n {account.mask}\n </Text>\n </View>\n </View>\n\n {offbudget ? (\n <Text style={{ color: colors.n8 }}>Off budget</Text>\n ) : (\n <>\n <Checkmark style={{ width: 15, height: 15, color: colors.g5 }} />\n <Text style={{ color: colors.g5, marginLeft: 5 }}>Budgeted</Text>\n </>\n )}\n </View>\n </View>\n );\n}\n\nexport default function ConfigureLinkedAccounts({\n institution,\n publicToken,\n upgradingId,\n modalProps,\n accounts,\n actions\n}) {\n let [offbudgetAccounts, setOffbudgetAccounts] = useState(() =>\n accounts\n .filter(acct => determineOffBudget(fromPlaidAccountType(acct.type)))\n .map(acct => acct.id)\n );\n\n function toggleAccount(id) {\n if (offbudgetAccounts.includes(id)) {\n setOffbudgetAccounts(offbudgetAccounts.filter(x => x !== id));\n } else {\n setOffbudgetAccounts([...offbudgetAccounts, id]);\n }\n }\n\n async function onNext() {\n let ids = await actions.connectAccounts(\n institution,\n publicToken,\n accounts.map(acct => acct.id),\n offbudgetAccounts\n );\n\n actions.closeModal();\n\n if (ids.length === 1) {\n window.location.hash = '/accounts/' + ids[0];\n } else if (ids.length > 0) {\n window.location.hash = '/accounts';\n }\n }\n\n return (\n <Modal\n title={upgradingId ? 'Link Account' : 'Link Accounts'}\n {...modalProps}\n >\n {() => (\n <View style={{ maxWidth: 500 }}>\n <Text style={{ fontSize: 15, marginBottom: 15, lineHeight: '1.4em' }}>\n A <strong>budgeted account</strong> is one where expenses and income\n affect the budget. Usually things like investments are off budget.\n We{\"'\"}ve chosen some defaults here, but you can change the status\n if you like.\n </Text>\n\n <View\n style={{\n maxHeight: 300,\n overflow: 'auto',\n // Allow the shadow to appear on left/right edge\n paddingLeft: 5,\n paddingRight: 5,\n marginLeft: -5,\n marginRight: -5\n }}\n >\n <View>\n {accounts.length === 0 ? (\n <EmptyMessage />\n ) : (\n accounts.map(account => {\n let offbudget = offbudgetAccounts.includes(account.id);\n\n return (\n <Account\n key={account.id}\n account={account}\n offbudget={offbudget}\n onSelect={() => toggleAccount(account.id)}\n />\n );\n })\n )}\n </View>\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'flex-end',\n marginTop: 30\n }}\n >\n <Button style={{ marginRight: 10 }} onClick={modalProps.onBack}>\n Back\n </Button>\n <Button primary onClick={onNext}>\n {upgradingId ? 'Link Account' : 'Next'}\n </Button>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n","/* This file is auto-generated, do not touch! Please edit the SVG file instead. */\nimport React from \"react\";\nimport { css } from \"glamor\";\n\nfunction Merge({ width, height, style, color = \"currentColor\", ...props }) {\n return (\n <svg\n width={width}\n height={height}\n {...props}\n {...css(style)}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M24 29H29.3333\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8.00002 29H2.66669\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 21L8 29\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 21L24 29\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 2.66669V21.3334\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 2.66669L8 9.33335\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 2.66669L24 9.33335\"\n stroke={color}\n className=\"path\"\n strokeWidth=\"3.5\"\n strokeMiterlimit=\"10\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport default Merge;\n","import React, {\n useState,\n useEffect,\n useLayoutEffect,\n useRef,\n useMemo,\n useCallback,\n useImperativeHandle\n} from 'react';\nimport {\n useStableCallback,\n View,\n Text,\n Modal,\n Input,\n Button,\n Tooltip,\n Menu\n} from './common';\nimport memoizeOne from 'memoize-one';\nimport Component from '@reactions/component';\nimport { groupById } from 'loot-core/src/shared/util';\nimport { colors } from '../style';\nimport {\n Table,\n Row,\n Cell,\n InputCell,\n SelectCell,\n CellButton,\n useTableNavigator\n} from './table';\nimport useSelected, {\n SelectedProvider,\n useSelectedItems,\n useSelectedDispatch\n} from './useSelected';\nimport Delete from '../svg/Delete';\nimport Merge from '../svg/merge';\nimport ExpandArrow from '../svg/ExpandArrow';\nimport ArrowThinRight from '../svg/v1/ArrowThinRight';\n\nlet getPayeesById = memoizeOne(payees => groupById(payees));\n\nfunction plural(count, singleText, pluralText) {\n return count === 1 ? singleText : pluralText;\n}\n\nfunction RuleButton({ ruleCount, focused, onEdit, onClick }) {\n return (\n <Cell\n name=\"rule-count\"\n width=\"auto\"\n focused={focused}\n style={{ padding: '0 10px' }}\n plain\n >\n <CellButton\n style={{\n borderRadius: 4,\n padding: '3px 6px',\n backgroundColor: colors.g9,\n border: '1px solid ' + colors.g9,\n color: colors.g1,\n fontSize: 12\n }}\n onEdit={onEdit}\n onSelect={onClick}\n onFocus={onEdit}\n >\n <Text style={{ paddingRight: 5 }}>\n {ruleCount > 0 ? (\n <>\n {ruleCount} associated {plural(ruleCount, 'rule', 'rules')}\n </>\n ) : (\n <>Create rule</>\n )}\n </Text>\n <ArrowThinRight style={{ width: 8, height: 8, color: colors.g1 }} />\n </CellButton>\n </Cell>\n );\n}\n\nlet Payee = React.memo(\n ({\n style,\n payee,\n ruleCount,\n categoryGroups,\n selected,\n highlighted,\n hovered,\n editing,\n focusedField,\n onViewRules,\n onCreateRule,\n onHover,\n onEdit,\n onUpdate,\n ruleActions\n }) => {\n let { id } = payee;\n let dispatchSelected = useSelectedDispatch();\n let borderColor = selected ? colors.b8 : colors.border;\n let backgroundFocus = hovered || focusedField === 'select';\n\n return (\n <Row\n borderColor={borderColor}\n backgroundColor={\n selected ? colors.b9 : backgroundFocus ? colors.hover : 'white'\n }\n highlighted={highlighted}\n style={[\n { alignItems: 'stretch' },\n style,\n {\n backgroundColor: hovered ? colors.hover : null\n },\n selected && {\n backgroundColor: colors.b9,\n zIndex: 100\n }\n ]}\n data-focus-key={payee.id}\n onMouseEnter={() => onHover && onHover(payee.id)}\n >\n <SelectCell\n exposed={\n payee.transfer_acct == null && (hovered || selected || editing)\n }\n focused={focusedField === 'select'}\n selected={selected}\n onSelect={() => {\n dispatchSelected({ type: 'select', id: payee.id });\n }}\n />\n <InputCell\n value={(payee.transfer_acct ? 'Transfer: ' : '') + payee.name}\n valueStyle={!selected && payee.transfer_acct && { color: colors.n7 }}\n exposed={focusedField === 'name'}\n width=\"flex\"\n onUpdate={value =>\n !payee.transfer_acct && onUpdate(id, 'name', value)\n }\n onExpose={() => onEdit(id, 'name')}\n inputProps={{ readOnly: !!payee.transfer_acct }}\n />\n <RuleButton\n ruleCount={ruleCount}\n focused={focusedField === 'rule-count'}\n onEdit={() => onEdit(id, 'rule-count')}\n onClick={() =>\n ruleCount > 0 ? onViewRules(payee.id) : onCreateRule(payee.id)\n }\n />\n </Row>\n );\n }\n);\n\nconst PayeeTable = React.forwardRef(\n (\n {\n payees,\n ruleCounts,\n navigator,\n categoryGroups,\n highlightedRows,\n ruleActions,\n onUpdate,\n onViewRules,\n onCreateRule\n },\n ref\n ) => {\n let [hovered, setHovered] = useState(null);\n let selectedItems = useSelectedItems();\n\n useLayoutEffect(() => {\n let firstSelected = [...selectedItems][0];\n ref.current.scrollTo(firstSelected, 'center');\n navigator.onEdit(firstSelected, 'select');\n }, []);\n\n let onHover = useCallback(id => {\n setHovered(id);\n }, []);\n\n return (\n <View style={[{ flex: 1 }]} onMouseLeave={() => setHovered(null)}>\n <Table\n ref={ref}\n items={payees}\n navigator={navigator}\n renderItem={({ item, editing, focusedField, onEdit }) => {\n return (\n <Payee\n payee={item}\n ruleCount={ruleCounts.get(item.id) || 0}\n categoryGroups={categoryGroups}\n selected={selectedItems.has(item.id)}\n highlighted={highlightedRows && highlightedRows.has(item.id)}\n editing={editing}\n focusedField={focusedField}\n hovered={hovered === item.id}\n onHover={onHover}\n onEdit={onEdit}\n onUpdate={onUpdate}\n onViewRules={onViewRules}\n onCreateRule={onCreateRule}\n />\n );\n }}\n />\n </View>\n );\n }\n);\n\nfunction PayeeTableHeader() {\n let borderColor = colors.border;\n let dispatchSelected = useSelectedDispatch();\n let selectedItems = useSelectedItems();\n\n return (\n <View>\n <Row\n borderColor={borderColor}\n style={{\n backgroundColor: 'white',\n color: colors.n4,\n zIndex: 200,\n userSelect: 'none'\n }}\n collapsed={true}\n >\n <SelectCell\n exposed={true}\n focused={false}\n selected={selectedItems.size > 0}\n onSelect={() => dispatchSelected({ type: 'select-all' })}\n />\n <Cell value=\"Name\" width=\"flex\" />\n </Row>\n </View>\n );\n}\n\nfunction EmptyMessage({ text, style }) {\n return (\n <View\n style={[\n {\n textAlign: 'center',\n color: colors.n7,\n fontStyle: 'italic',\n fontSize: 13,\n marginTop: 5\n },\n style\n ]}\n >\n {text}\n </View>\n );\n}\n\nfunction PayeeMenu({ payeesById, selectedPayees, onDelete, onMerge, onClose }) {\n // Transfer accounts are never editable\n let isDisabled = [...selectedPayees].some(\n id => payeesById[id] == null || payeesById[id].transfer_acct\n );\n\n return (\n <Tooltip\n position=\"bottom\"\n width={250}\n style={{ padding: 0 }}\n onClose={onClose}\n >\n <Menu\n onMenuSelect={type => {\n onClose();\n switch (type) {\n case 'delete':\n onDelete();\n break;\n case 'merge':\n onMerge();\n break;\n default:\n }\n }}\n footer={\n <View\n style={{\n padding: 3,\n fontSize: 11,\n fontStyle: 'italic',\n color: colors.n7\n }}\n >\n {[...selectedPayees]\n .slice(0, 4)\n .map(id => payeesById[id].name)\n .join(', ') + (selectedPayees.size > 4 ? ', and more' : '')}\n </View>\n }\n items={[\n {\n icon: Delete,\n name: 'delete',\n text: 'Delete',\n disabled: isDisabled\n },\n {\n icon: Merge,\n iconSize: 9,\n name: 'merge',\n text: 'Merge',\n disabled: isDisabled || selectedPayees.size < 2\n },\n Menu.line\n ]}\n />\n </Tooltip>\n );\n}\n\nexport const ManagePayees = React.forwardRef(\n (\n {\n modalProps,\n payees,\n ruleCounts,\n categoryGroups,\n tableNavigatorOpts,\n initialSelectedIds,\n ruleActions,\n onBatchChange,\n onViewRules,\n onCreateRule,\n ...props\n },\n ref\n ) => {\n let [highlightedRows, setHighlightedRows] = useState(null);\n let [filter, setFilter] = useState('');\n let table = useRef(null);\n let scrollTo = useRef(null);\n let resetAnimation = useRef(false);\n\n let filteredPayees = useMemo(\n () =>\n filter === ''\n ? payees\n : payees.filter(p =>\n p.name.toLowerCase().includes(filter.toLowerCase())\n ),\n [payees, filter]\n );\n\n let selected = useSelected('payees', filteredPayees, initialSelectedIds);\n\n function applyFilter(f) {\n if (filter !== f) {\n table.current && table.current.setRowAnimation(false);\n setFilter(f);\n resetAnimation.current = true;\n }\n }\n\n function _scrollTo(id) {\n applyFilter('');\n scrollTo.current = id;\n }\n\n useEffect(() => {\n if (resetAnimation.current) {\n // Very annoying, for some reason it's as if the table doesn't\n // actually update its contents until the next tick or\n // something? The table keeps being animated without this\n setTimeout(() => {\n table.current && table.current.setRowAnimation(true);\n }, 0);\n resetAnimation.current = false;\n }\n });\n\n useImperativeHandle(ref, () => ({\n selectRows: (ids, scroll) => {\n tableNavigator.onEdit(null);\n selected.dispatch({ type: 'select-all', ids });\n setHighlightedRows(null);\n\n if (scroll && ids.length > 0) {\n _scrollTo(ids[0]);\n }\n },\n\n highlightRow: id => {\n tableNavigator.onEdit(null);\n setHighlightedRows(new Set([id]));\n _scrollTo(id);\n }\n }));\n\n // `highlightedRows` should only ever be true once, and we\n // immediately discard it. This triggers an animation.\n useEffect(() => {\n if (highlightedRows) {\n setHighlightedRows(null);\n }\n }, [highlightedRows]);\n\n useLayoutEffect(() => {\n if (scrollTo.current) {\n table.current.scrollTo(scrollTo.current);\n scrollTo.current = null;\n }\n });\n\n let onUpdate = useStableCallback((id, name, value) => {\n let payee = payees.find(p => p.id === id);\n if (payee[name] !== value) {\n onBatchChange({ updated: [{ id, [name]: value }] });\n }\n });\n\n let getSelectableIds = useCallback(() => {\n return filteredPayees.filter(p => p.transfer_acct == null).map(p => p.id);\n }, [filteredPayees]);\n\n function onDelete() {\n onBatchChange({ deleted: [...selected.items].map(id => ({ id })) });\n selected.dispatch({ type: 'select-none' });\n }\n\n async function onMerge() {\n let ids = [...selected.items];\n await props.onMerge(ids);\n\n tableNavigator.onEdit(ids[0], 'name');\n selected.dispatch({ type: 'select-none' });\n _scrollTo(ids[0]);\n }\n\n let buttonsDisabled = selected.items.size === 0;\n\n let tableNavigator = useTableNavigator(\n filteredPayees,\n item =>\n ['select', 'name', 'rule-count'].filter(name => {\n switch (name) {\n case 'select':\n return item.transfer_acct == null;\n default:\n return true;\n }\n }),\n tableNavigatorOpts\n );\n\n let payeesById = getPayeesById(payees);\n\n return (\n <Modal\n title=\"Payees\"\n padding={0}\n {...modalProps}\n style={[modalProps.style, { flex: 'inherit', maxWidth: '90%' }]}\n >\n <View\n style={{\n maxWidth: '100%',\n width: 900,\n height: 550\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 10px'\n }}\n >\n <Component initialState={{ menuOpen: false }}>\n {({ state, setState }) => (\n <View>\n <Button\n bare\n style={{ marginRight: 10 }}\n disabled={buttonsDisabled}\n onClick={() => setState({ menuOpen: true })}\n >\n {buttonsDisabled\n ? 'No payees selected'\n : selected.items.size +\n ' ' +\n plural(selected.items.size, 'payee', 'payees')}\n <ExpandArrow\n width={8}\n height={8}\n style={{ marginLeft: 5 }}\n />\n </Button>\n {state.menuOpen && (\n <PayeeMenu\n payeesById={payeesById}\n selectedPayees={selected.items}\n onClose={() => setState({ menuOpen: false })}\n onDelete={onDelete}\n onMerge={onMerge}\n />\n )}\n </View>\n )}\n </Component>\n <View style={{ flex: 1 }} />\n <Input\n placeholder=\"Filter payees...\"\n value={filter}\n onChange={e => {\n applyFilter(e.target.value);\n tableNavigator.onEdit(null);\n }}\n style={{\n width: 350,\n borderColor: 'transparent',\n backgroundColor: colors.n11,\n ':focus': {\n backgroundColor: 'white',\n '::placeholder': { color: colors.n8 }\n }\n }}\n />\n </View>\n\n <SelectedProvider instance={selected} fetchAllIds={getSelectableIds}>\n <View\n style={{\n flex: 1,\n border: '1px solid ' + colors.border,\n borderRadius: 4,\n overflow: 'hidden',\n margin: 5\n }}\n >\n <PayeeTableHeader />\n {filteredPayees.length === 0 ? (\n <EmptyMessage text=\"No payees\" style={{ marginTop: 15 }} />\n ) : (\n <PayeeTable\n ref={table}\n payees={filteredPayees}\n ruleCounts={ruleCounts}\n categoryGroups={categoryGroups}\n highlightedRows={highlightedRows}\n navigator={tableNavigator}\n onUpdate={onUpdate}\n onViewRules={onViewRules}\n onCreateRule={onCreateRule}\n />\n )}\n </View>\n </SelectedProvider>\n </View>\n </Modal>\n );\n }\n);\n","import React, { useState, useEffect, useRef } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport * as undo from 'loot-core/src/platform/client/undo';\nimport uuid from 'loot-core/src/platform/uuid';\nimport { send, listen, unlisten } from 'loot-core/src/platform/client/fetch';\nimport { ManagePayees } from 'loot-design/src/components/payees';\nimport { applyChanges } from 'loot-core/src/shared/util';\n\nfunction ManagePayeesWithData({\n history,\n modalProps,\n initialSelectedIds,\n lastUndoState,\n initialPayees,\n categoryGroups,\n initiallyLoadPayees,\n getPayees,\n setLastUndoState,\n pushModal\n}) {\n let [payees, setPayees] = useState(initialPayees);\n let [ruleCounts, setRuleCounts] = useState({ value: new Map() });\n let payeesRef = useRef();\n\n async function refetchRuleCounts() {\n let counts = await send('payees-get-rule-counts');\n counts = new Map(Object.entries(counts));\n setRuleCounts({ value: counts });\n }\n\n useEffect(() => {\n async function loadData() {\n let result = await initiallyLoadPayees();\n\n // Wait a bit before setting the data. This lets the modal\n // settle and makes for a smoother experience.\n await new Promise(resolve => setTimeout(resolve, 100));\n\n if (result) {\n setPayees(result);\n }\n\n refetchRuleCounts();\n }\n loadData();\n\n let unlisten = listen('sync-event', async ({ type, tables }) => {\n if (type === 'applied') {\n if (tables.includes('rules')) {\n refetchRuleCounts();\n }\n }\n });\n\n undo.setUndoState('openModal', 'manage-payees');\n\n return () => {\n undo.setUndoState('openModal', null);\n unlisten();\n };\n }, []);\n\n async function onUndo({ tables, messages, meta, url }, scroll = false) {\n if (\n !tables.includes('payees') &&\n !tables.includes('payee_mapping') &&\n !tables.includes('payee_rules')\n ) {\n return;\n }\n\n setPayees(await getPayees());\n\n if (\n (meta && meta.targetId) ||\n messages.find(msg => msg.dataset === 'rules')\n ) {\n refetchRuleCounts();\n }\n\n setLastUndoState(null);\n }\n\n useEffect(() => {\n if (lastUndoState.current) {\n onUndo(lastUndoState.current, true);\n }\n\n return listen('undo-event', onUndo);\n }, []);\n\n function onViewRules(id) {\n pushModal('manage-rules', { payeeId: id });\n }\n\n function onCreateRule(id) {\n let payee = payees.find(p => p.id === id);\n let rule = {\n id: null,\n stage: null,\n conditions: [\n {\n field: 'description',\n op: 'is',\n value: payee.id,\n type: 'id'\n }\n ],\n actions: []\n };\n pushModal('edit-rule', { rule });\n }\n\n return (\n <ManagePayees\n ref={payeesRef}\n modalProps={modalProps}\n payees={payees}\n ruleCounts={ruleCounts.value}\n categoryGroups={categoryGroups}\n initialSelectedIds={initialSelectedIds}\n lastUndoState={lastUndoState}\n onBatchChange={changes => {\n send('payees-batch-change', changes);\n setPayees(applyChanges(changes, payees));\n }}\n onMerge={async ([targetId, ...mergeIds]) => {\n await send('payees-merge', { targetId, mergeIds });\n\n let result = payees.filter(p => !mergeIds.includes(p.id));\n mergeIds.forEach(id => {\n let count = ruleCounts.value.get(id) || 0;\n ruleCounts.value.set(\n targetId,\n (ruleCounts.value.get(targetId) || 0) + count\n );\n });\n\n setPayees(result);\n setRuleCounts({ value: ruleCounts.value });\n }}\n onViewRules={onViewRules}\n onCreateRule={onCreateRule}\n />\n );\n}\n\nexport default connect(\n state => ({\n initialPayees: state.queries.payees,\n lastUndoState: state.app.lastUndoState,\n categoryGroups: state.queries.categories.grouped\n }),\n actions\n)(ManagePayeesWithData);\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n View,\n Text,\n Modal,\n ModalButtons,\n Button,\n P,\n Stack\n} from 'loot-design/src/components/common';\nimport { Information } from 'loot-design/src/components/alerts';\nimport { colors, styles } from 'loot-design/src/style';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { replaceModal } from 'loot-core/src/client/actions/modals';\n\nlet highlightStyle = { color: colors.p5 };\n\nexport default function MergeUnusedPayees({\n history,\n modalProps,\n payeeIds,\n targetPayeeId\n}) {\n let { payees: allPayees, modalStack } = useSelector(state => ({\n payees: state.queries.payees,\n modalStack: state.modals.modalStack\n }));\n let isEditingRule = !!modalStack.find(m => m.name === 'edit-rule');\n let dispatch = useDispatch();\n let [shouldCreateRule, setShouldCreateRule] = useState(true);\n let flashRef = useRef(null);\n\n useEffect(() => {\n // Flash the scrollbar\n if (flashRef.current) {\n let el = flashRef.current;\n let top = el.scrollTop;\n el.scrollTop = top + 1;\n el.scrollTop = top;\n }\n }, [flashRef.current, true]);\n\n // We store the orphaned payees into state because when we merge it,\n // it will be deleted and this component will automatically\n // rerender. Is there a better pattern for live bindings?\n //\n // TODO: I think a custom `useSelector` hook that doesn't bind would\n // be nice\n let [payees] = useState(() =>\n payeeIds.map(id => allPayees.find(p => p.id === id))\n );\n let targetPayee = allPayees.find(p => p.id === targetPayeeId);\n\n if (!targetPayee) {\n return null;\n }\n\n async function onMerge() {\n await send('payees-merge', {\n targetId: targetPayee.id,\n mergeIds: payees.map(p => p.id)\n });\n\n let ruleId;\n if (shouldCreateRule && !isEditingRule) {\n let id = await send('rule-add-payee-rename', {\n fromNames: payees.map(p => p.name),\n to: targetPayee.id\n });\n ruleId = id;\n }\n\n modalProps.onClose();\n\n return ruleId;\n }\n\n async function onMergeAndCreateRule() {\n let ruleId = await onMerge();\n\n if (ruleId) {\n let rule = await send('rule-get', { id: ruleId });\n dispatch(replaceModal('edit-rule', { rule }));\n }\n }\n\n return (\n <Modal\n title=\"Merge payee?\"\n padding={0}\n showHeader={false}\n {...modalProps}\n style={modalProps.style}\n >\n {() => (\n <View style={{ padding: 20, maxWidth: 500 }}>\n <View>\n <P style={{ marginBottom: 10, fontWeight: 500 }}>\n {payees.length === 1 ? (\n <>\n The payee <Text style={highlightStyle}>{payees[0].name}</Text>{' '}\n is not used by transactions any more. Would like to merge it\n with <Text style={highlightStyle}>{targetPayee.name}</Text>?\n </>\n ) : (\n <>\n The following payees are not used by transactions any more.\n Would like to merge them with{' '}\n <Text style={highlightStyle}>{targetPayee.name}</Text>?\n <ul\n ref={flashRef}\n style={{\n margin: 0,\n marginTop: 10,\n maxHeight: 140,\n overflow: 'auto'\n }}\n >\n {payees.map(p => (\n <li>\n <Text style={highlightStyle}>{p.name}</Text>\n </li>\n ))}\n </ul>\n </>\n )}\n </P>\n\n <Information>\n Merging will remove the payee and transfer any existing rules to\n the new payee. If checked below, a rule will be created to do this\n rename while importing transactions.\n </Information>\n\n {!isEditingRule && (\n <label\n style={{\n fontSize: 13,\n marginTop: 10,\n color: colors.n4,\n userSelect: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n <input\n type=\"checkbox\"\n checked={shouldCreateRule}\n onChange={e => setShouldCreateRule(e.target.checked)}\n />\n <Text style={{ marginLeft: 3 }}>\n Automatically rename{' '}\n {payees.length === 1 ? 'this payee' : 'these payees'} in the\n future\n </Text>\n </label>\n )}\n\n <ModalButtons style={{ marginTop: 20 }} focusButton>\n <Button\n primary\n style={{ marginRight: 10 }}\n onClick={onMerge}\n type=\"button\"\n >\n Merge\n </Button>\n {!isEditingRule && (\n <Button\n style={{ marginRight: 10 }}\n onClick={onMergeAndCreateRule}\n type=\"button\"\n >\n Merge and edit rule\n </Button>\n )}\n <Button\n style={{ marginRight: 10 }}\n onClick={() => modalProps.onBack()}\n type=\"button\"\n >\n Do nothing\n </Button>\n </ModalButtons>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n","import React, { useState, useRef } from 'react';\nimport {\n View,\n Text,\n Modal,\n Button,\n P,\n ModalButtons\n} from '../common';\nimport { Error } from '../alerts';\nimport { colors } from '../../style';\nimport AnimatedLoading from '../../svg/v1/AnimatedLoading';\n\nfunction renderError(error) {\n return (\n <Error style={{ alignSelf: 'center' }}>\n {error === 'timeout'\n ? 'Timed out. Please try again.'\n : 'An error occurred while linking your account, sorry!'}\n </Error>\n );\n}\n\nexport default function PlaidExternalMsg({\n modalProps,\n onMoveExternal,\n onSuccess,\n onClose: originalOnClose\n}) {\n let [waiting, setWaiting] = useState(null);\n let [success, setSuccess] = useState(false);\n let [error, setError] = useState(null);\n let data = useRef(null);\n\n async function onJump() {\n setError(null);\n setWaiting('browser');\n\n let res = await onMoveExternal();\n if (res.error) {\n setError(res.error);\n setWaiting(null);\n return;\n }\n\n data.current = res.data;\n setWaiting(null);\n setSuccess(true);\n }\n\n function onClose() {\n originalOnClose && originalOnClose();\n modalProps.onClose();\n }\n\n async function onContinue() {\n setWaiting('accounts');\n await onSuccess(data.current);\n setWaiting(null);\n }\n\n return (\n <Modal\n title=\"Link Your Bank\"\n {...modalProps}\n onClose={onClose}\n style={{ flex: 0 }}\n >\n {() => (\n <View>\n <P style={{ fontSize: 15 }}>\n To link your bank account, you will be moved to your browser for\n enhanced security. Click below and Actual will automatically resume\n when you have given your bank{\"'\"}s credentials.\n </P>\n {error && renderError(error)}\n\n {waiting ? (\n <View style={{ alignItems: 'center', marginTop: 15 }}>\n <AnimatedLoading\n color={colors.n1}\n style={{ width: 20, height: 20 }}\n />\n <View style={{ marginTop: 10, color: colors.n4 }}>\n {waiting === 'browser'\n ? 'Waiting on browser...'\n : waiting === 'accounts'\n ? 'Loading accounts...'\n : null}\n </View>\n </View>\n ) : success ? (\n <Button\n primary\n style={{\n padding: '10px 0',\n fontSize: 15,\n fontWeight: 600,\n marginTop: 10,\n backgroundColor: colors.g4,\n borderColor: colors.g4\n }}\n onClick={onContinue}\n >\n Success! Click to continue &rarr;\n </Button>\n ) : (\n <Button\n primary\n style={{\n padding: '10px 0',\n fontSize: 15,\n fontWeight: 600,\n marginTop: 10\n }}\n onClick={onJump}\n >\n Link bank in browser &rarr;\n </Button>\n )}\n <div style={{ marginTop: waiting ? 30 : 35 }}>\n <Text style={{ color: colors.n5, fontWeight: 600 }}>\n Why not link it in the app?\n </Text>\n </div>\n <Text\n style={{\n marginTop: 10,\n color: colors.n5,\n fontSize: 13,\n '& a, & a:visited': {\n color: colors.n5\n }\n }}\n >\n Typing your bank{\"'\"}s username and password is one of the most\n security-sensitive things you can do, and the browser is the most\n secure app in the world. Why not use it to make sure your\n information is safe?{' '}\n <a href=\"https://actualbudget.com/security-learn-more\">\n Learn more about security\n </a>\n </Text>\n\n <ModalButtons style={{ marginTop: 10 }}>\n <Button onClick={() => modalProps.onBack()}>Back</Button>\n </ModalButtons>\n </View>\n )}\n </Modal>\n );\n}\n","import React from 'react';\nimport {\n View,\n Text,\n Block,\n Modal,\n Button,\n Select\n} from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\nimport { NativeCategorySelect } from 'loot-design/src/components/CategorySelect';\n\nclass ConfirmCategoryDelete extends React.Component {\n state = { transferCategory: null, error: null };\n\n componentDidMount() {\n // Hack: 200ms is the timing of the modal animation\n setTimeout(() => {\n this.input.focus();\n }, 200);\n }\n\n onDelete = () => {\n let { transferCategory } = this.state;\n let { category, group, onDelete } = this.props;\n\n if (!transferCategory) {\n this.setState({ error: 'required-transfer' });\n } else {\n onDelete(transferCategory);\n this.props.modalProps.onClose();\n }\n };\n\n renderError = error => {\n let msg;\n\n switch (error) {\n case 'required-transfer':\n msg = 'You must select a category';\n break;\n default:\n msg = 'Something bad happened, sorry!';\n }\n\n return <Text style={{ marginTop: 15, color: colors.r4 }}>{msg}</Text>;\n };\n\n render() {\n const { modalProps, category, group, categoryGroups } = this.props;\n const { transferCategory, error } = this.state;\n const isIncome = !!(category || group).is_income;\n\n return (\n <Modal title=\"Confirm Delete\" {...modalProps} style={{ flex: 0 }}>\n {() => (\n <View style={{ lineHeight: 1.5 }}>\n {group ? (\n <Block>\n Categories in the group <strong>{group.name}</strong> are used\n by existing transaction\n {!isIncome &&\n ' or it has a positive leftover balance currently'}\n . <strong>Are you sure you want to delete it?</strong> If so,\n you must select another category to transfer existing\n transactions and balance to.\n </Block>\n ) : (\n <Block>\n <strong>{category.name}</strong> is used by existing\n transactions\n {!isIncome &&\n ' or it has a positive leftover balance currently'}\n . <strong>Are you sure you want to delete it?</strong> If so,\n you must select another category to transfer existing\n transactions and balance to.\n </Block>\n )}\n\n {error && this.renderError(error)}\n\n <View\n style={{\n marginTop: 20,\n flexDirection: 'row',\n justifyContent: 'flex-start',\n alignItems: 'center'\n }}\n >\n <Text>Transfer to:</Text>\n\n <View style={{ flex: 1, marginLeft: 10, marginRight: 30 }}>\n <NativeCategorySelect\n ref={el => (this.input = el)}\n categoryGroups={\n group\n ? categoryGroups.filter(\n g => g.id !== group.id && !!g.is_income === isIncome\n )\n : categoryGroups\n .filter(g => !!g.is_income === isIncome)\n .map(g => ({\n ...g,\n categories: g.categories.filter(\n c => c.id !== category.id\n )\n }))\n }\n name=\"category\"\n value={transferCategory}\n onChange={e =>\n this.setState({ transferCategory: e.target.value })\n }\n />\n </View>\n\n <Button primary onClick={() => this.onDelete()}>\n Delete\n </Button>\n </View>\n </View>\n )}\n </Modal>\n );\n }\n}\n\nexport default ConfirmCategoryDelete;\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Modal,\n Button,\n P,\n ExternalLink\n} from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\n\nfunction WelcomeScreen({ modalProps, actions }) {\n return (\n <Modal title=\"Welcome to Actual\" {...modalProps}>\n {() => (\n <View style={{ maxWidth: 500, fontSize: 15 }}>\n <P>\n Actual is a personal finance tool that focuses on beautiful design\n and a slick user experience.{' '}\n <strong>Editing your data should be as fast as possible.</strong> On\n top of that, we want to provide powerful tools to allow you to do\n whatever you want with your data.\n </P>\n <P>\n Currently Actual implements budgeting based on a{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/how-it-works/\"\n >\n monthly envelope system\n </ExternalLink>\n .\n </P>\n <P>\n In the future, we{\"'\"}ll support multiple ways to do budgeting. We\n {\"'\"}re also working hard on custom reports and a lot more things.\n </P>\n <P\n style={{\n color: colors.p5,\n fontWeight: 600,\n '& a, & a:visited': { color: colors.p5 }\n }}\n >\n Read the{' '}\n <ExternalLink asAnchor href=\"https://actualbudget.com/docs/\">\n documentation\n </ExternalLink>{' '}\n to get started and learn about{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/docs/budgeting/how-it-works/\"\n >\n budgeting\n </ExternalLink>\n ,{' '}\n <ExternalLink\n asAnchor\n href=\"https://actualbudget.com/docs/accounts/overview/\"\n >\n accounts\n </ExternalLink>{' '}\n and more.\n </P>\n </View>\n )}\n </Modal>\n );\n}\n\nexport default connect(\n null,\n actions\n)(WelcomeScreen);\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { connect } from 'react-redux';\nimport * as d from 'date-fns';\nimport * as actions from 'loot-core/src/client/actions';\nimport { format as formatDate_ } from 'loot-core/src/shared/months';\nimport {\n amountToCurrency,\n amountToInteger,\n looselyParseAmount\n} from 'loot-core/src/shared/util';\nimport {\n View,\n Text,\n Stack,\n Modal,\n Select,\n Button,\n ButtonWithLoading\n} from '../common';\nimport { Checkbox } from '../forms';\nimport { TableHeader, TableWithNavigator, Row, Field } from '../table';\nimport { SectionLabel, FieldLabel } from '../forms';\nimport { colors, styles } from '../../style';\n\nlet dateFormats = [\n { format: 'yyyy mm dd', label: 'YYYY MM DD' },\n { format: 'yy mm dd', label: 'YY MM DD' },\n { format: 'mm dd yyyy', label: 'MM DD YYYY' },\n { format: 'mm dd yy', label: 'MM DD YY' },\n { format: 'dd mm yyyy', label: 'DD MM YYYY' },\n { format: 'dd mm yy', label: 'DD MM YY' }\n];\n\nfunction parseDate(str, order) {\n if (typeof str !== 'string') {\n return null;\n }\n\n function pad(v) {\n return v && v.length === 1 ? '0' + v : v;\n }\n\n let parts = str.replace(/ /g, '').split(/[^0-9]/);\n\n let year, month, day;\n switch (order) {\n case 'dd mm yyyy':\n year = parts[2];\n month = parts[1];\n day = parts[0];\n break;\n case 'dd mm yy':\n year = `20${parts[2]}`;\n month = parts[1];\n day = parts[0];\n break;\n case 'yyyy mm dd':\n year = parts[0];\n month = parts[1];\n day = parts[2];\n break;\n case 'yy mm dd':\n year = `20${parts[0]}`;\n month = parts[1];\n day = parts[2];\n break;\n case 'mm dd yy':\n year = `20${parts[2]}`;\n month = parts[0];\n day = parts[1];\n break;\n default:\n case 'mm dd yyyy':\n year = parts[2];\n month = parts[0];\n day = parts[1];\n }\n\n let parsed = `${year}-${pad(month)}-${pad(day)}`;\n if (!d.isValid(d.parseISO(parsed))) {\n return null;\n }\n return parsed;\n}\n\nfunction formatDate(date, format) {\n if (!date) {\n return null;\n }\n try {\n return formatDate_(date, format);\n } catch (e) {}\n return null;\n}\n\nfunction getFileType(filepath) {\n let m = filepath.match(/\\.([^.]*)$/);\n return m ? m[1].toLowerCase() : 'ofx';\n}\n\nfunction ParsedDate({ parseDateFormat, showParsed, dateFormat, date }) {\n let parsed =\n date &&\n formatDate(\n parseDateFormat ? parseDate(date, parseDateFormat) : date,\n dateFormat\n );\n return (\n <Text>\n <Text>\n {date || (\n <Text style={{ color: colors.n4, fontStyle: 'italic' }}>Empty</Text>\n )}{' '}\n &rarr;{' '}\n </Text>\n <Text style={{ color: parsed ? colors.g3 : colors.r4 }}>\n {parsed || 'Invalid'}\n </Text>\n </Text>\n );\n}\n\nfunction getInitialDateFormat(transactions, mappings) {\n if (transactions.length === 0 || mappings.date == null) {\n return 'yyyy mm dd';\n }\n\n let transaction = transactions[0];\n let date = transaction[mappings.date];\n\n let found =\n date == null\n ? null\n : dateFormats.find(f => parseDate(date, f.format) != null);\n return found ? found.format : 'mm dd yyyy';\n}\n\nfunction getInitialMappings(transactions) {\n if (transactions.length === 0) {\n return {};\n }\n\n let transaction = transactions[0];\n let fields = Object.entries(transaction);\n\n function key(entry) {\n return entry ? entry[0] : null;\n }\n\n let dateField = key(\n fields.find(([name, value]) => name.toLowerCase().includes('date')) ||\n fields.find(([name, value]) => value.match(/^\\d+[-/]\\d+[-/]\\d+$/))\n );\n\n let amountField = key(\n fields.find(([name, value]) => name.toLowerCase().includes('amount')) ||\n fields.find(([name, value]) => value.match(/^-?[.,\\d]+$/))\n );\n\n let payeeField = key(\n fields.find(([name, value]) => name !== dateField && name !== amountField)\n );\n\n let notesField = key(\n fields.find(\n ([name, value]) =>\n name !== dateField && name !== amountField && name !== payeeField\n )\n );\n\n return {\n date: dateField,\n amount: amountField,\n payee: payeeField,\n notes: notesField\n };\n}\n\nfunction applyFieldMappings(transaction, mappings) {\n let result = {};\n for (let [field, target] of Object.entries(mappings)) {\n if (field === 'payee') {\n field = 'payee_name';\n }\n\n result[field] = transaction[target || field];\n }\n return result;\n}\n\nfunction parseAmount(amount, mapper) {\n if (amount == null) {\n return null;\n }\n let parsed = typeof amount === 'string' ? looselyParseAmount(amount) : amount;\n let value = mapper(parsed);\n return value;\n}\n\nfunction parseAmountFields(trans, splitMode, flipAmount) {\n if (splitMode) {\n // Split mode is a little weird; first we look for an outflow and\n // if that has a value, we never want to show a number in the\n // inflow. Same for `amount`; we choose outflow first and then inflow\n let outflow = parseAmount(trans.outflow, n => -Math.abs(n));\n let inflow = outflow ? 0 : parseAmount(trans.inflow, n => Math.abs(n));\n\n return {\n amount: outflow || inflow,\n outflow,\n inflow\n };\n }\n return {\n amount: parseAmount(trans.amount, n => (flipAmount ? n * -1 : n)),\n outflow: null,\n inflow: null\n };\n}\n\nfunction Transaction({\n transaction: rawTransaction,\n fieldMappings,\n showParsed,\n parseDateFormat,\n dateFormat,\n splitMode,\n flipAmount\n}) {\n let transaction = useMemo(\n () =>\n fieldMappings\n ? applyFieldMappings(rawTransaction, fieldMappings)\n : rawTransaction,\n [rawTransaction, fieldMappings]\n );\n\n let { amount, outflow, inflow } = parseAmountFields(\n transaction,\n splitMode,\n flipAmount\n );\n amount = amountToCurrency(amount);\n outflow = amountToCurrency(outflow);\n inflow = amountToCurrency(inflow);\n\n return (\n <Row style={{ backgroundColor: 'white' }}>\n <Field width={200} borderColor={colors.border}>\n {showParsed ? (\n <ParsedDate\n parseDateFormat={parseDateFormat}\n dateFormat={dateFormat}\n date={transaction.date}\n />\n ) : (\n formatDate(transaction.date, dateFormat)\n )}\n </Field>\n <Field\n width=\"flex\"\n borderColor={colors.border}\n title={transaction.imported_payee || transaction.payee_name}\n >\n {transaction.payee_name}\n </Field>\n <Field width=\"flex\" borderColor={colors.border} title={transaction.notes}>\n {transaction.notes}\n </Field>\n {splitMode ? (\n <>\n <Field\n width={90}\n borderColor={colors.border}\n contentStyle={[{ textAlign: 'right' }, styles.tnum]}\n title={outflow}\n >\n {outflow}\n </Field>\n <Field\n width={90}\n borderColor={colors.border}\n contentStyle={[{ textAlign: 'right' }, styles.tnum]}\n title={inflow}\n >\n {inflow}\n </Field>\n </>\n ) : (\n <Field\n width={90}\n borderColor={colors.border}\n contentStyle={[{ textAlign: 'right' }, styles.tnum]}\n title={amount}\n >\n {amount}\n </Field>\n )}\n </Row>\n );\n}\n\nfunction SubLabel({ title }) {\n return (\n <Text style={{ fontSize: 13, marginBottom: 3, color: colors.n3 }}>\n {title}\n </Text>\n );\n}\n\nfunction SelectField({ width, style, options, value, onChange }) {\n return (\n <Select\n value={value}\n style={style}\n onChange={e => onChange(e.target.value)}\n >\n <option value=\"\">Choose field...</option>\n {options.map(x => (\n <option key={x} value={x}>\n {x}\n </option>\n ))}\n </Select>\n );\n}\n\nfunction DateFormatSelect({\n transactions,\n fieldMappings,\n parseDateFormat,\n onChange\n}) {\n // We don't actually care about the delimiter, but we try to render\n // it based on the data we have so far. Look in a transaction and\n // try to figure out what delimiter the date is using, and default\n // to space if we can't figure it out.\n let delimiter = '-';\n if (\n transactions.length > 0 &&\n (fieldMappings && fieldMappings.date != null)\n ) {\n let date = transactions[0][fieldMappings.date];\n let m = date && date.match(/[/.,-/\\\\]/);\n delimiter = m ? m[0] : ' ';\n }\n\n return (\n <View style={{ width: 120 }}>\n <SectionLabel title=\"Date format\" />\n <Select\n value={parseDateFormat || ''}\n onChange={e => onChange(e.target.value)}\n >\n {dateFormats.map(f => (\n <option key={f.format} value={f.format}>\n {f.label.replace(/ /g, delimiter)}\n </option>\n ))}\n </Select>\n </View>\n );\n}\n\nfunction FlipAmountOption({ value, disabled, onChange }) {\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none'\n }}\n >\n <Checkbox\n id=\"form_flip\"\n checked={value}\n disabled={disabled}\n onChange={onChange}\n />\n <label\n htmlFor=\"form_flip\"\n style={{ userSelect: 'none', color: disabled ? colors.n6 : null }}\n >\n Flip amount\n </label>\n </View>\n );\n}\n\nfunction SplitOption({ value, onChange }) {\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none'\n }}\n >\n <Checkbox id=\"form_split\" checked={value} onChange={onChange} />\n <label htmlFor=\"form_split\" style={{ userSelect: 'none' }}>\n Split amount into separate inflow/outflow columns\n </label>\n </View>\n );\n}\n\nfunction FieldMappings({ transactions, mappings, onChange, splitMode }) {\n if (transactions.length === 0) {\n return null;\n }\n\n let options = Object.keys(transactions[0]);\n mappings = mappings || {};\n\n return (\n <View>\n <SectionLabel title=\"CSV FIELDS\" />\n <Stack\n direction=\"row\"\n align=\"flex-start\"\n spacing={1}\n style={{ marginTop: 5 }}\n >\n <View style={{ width: 200 }}>\n <SubLabel title=\"Date\" />\n <SelectField\n width={200}\n options={options}\n value={mappings.date || ''}\n style={{ marginRight: 5 }}\n onChange={name => onChange('date', name)}\n />\n </View>\n <View style={{ flex: 1 }}>\n <SubLabel title=\"Payee\" />\n <SelectField\n width=\"flex\"\n options={options}\n value={mappings.payee || ''}\n style={{ marginRight: 5 }}\n onChange={name => onChange('payee', name)}\n />\n </View>\n <View style={{ flex: 1 }}>\n <SubLabel title=\"Notes\" />\n <SelectField\n width=\"flex\"\n options={options}\n value={mappings.notes || ''}\n style={{ marginRight: 5 }}\n onChange={name => onChange('notes', name)}\n />\n </View>\n {splitMode ? (\n <>\n <View style={{ width: 90 }}>\n <SubLabel title=\"Outflow\" />\n <SelectField\n width={90}\n options={options}\n value={mappings.outflow || ''}\n onChange={name => onChange('outflow', name)}\n />\n </View>\n <View style={{ width: 90 }}>\n <SubLabel title=\"Inflow\" />\n <SelectField\n width={90}\n options={options}\n value={mappings.inflow || ''}\n onChange={name => onChange('inflow', name)}\n />\n </View>\n </>\n ) : (\n <View style={{ width: 90 }}>\n <SubLabel title=\"Amount\" />\n <SelectField\n width={90}\n options={options}\n value={mappings.amount || ''}\n onChange={name => onChange('amount', name)}\n />\n </View>\n )}\n </Stack>\n </View>\n );\n}\n\nexport function ImportTransactions({\n modalProps,\n options,\n dateFormat = 'MM/dd/yyyy',\n prefs,\n parseTransactions,\n importTransactions,\n getPayees,\n savePrefs\n}) {\n let [loadingState, setLoadingState] = useState('parsing');\n let [error, setError] = useState(null);\n let [filename, setFilename] = useState(options.filename);\n let [transactions, setTransactions] = useState([]);\n let [filetype, setFileType] = useState(null);\n let [fieldMappings, setFieldMappings] = useState(null);\n let [splitMode, setSplitMode] = useState(false);\n let [flipAmount, setFlipAmount] = useState(false);\n let { accountId, onImported } = options;\n\n // This cannot be set after parsing the file, because changing it\n // requires re-parsing the file. This is different from the other\n // options which are simple post-processing. That means if you\n // parsed different files without closing the modal, it wouldn't\n // re-read this.\n let [csvDelimiter, setCsvDelimiter] = useState(\n prefs[`csv-delimiter-${accountId}`] || ','\n );\n\n let [parseDateFormat, setParseDateFormat] = useState(null);\n\n async function parse(filename, options) {\n setLoadingState('parsing');\n\n let { errors, transactions } = await parseTransactions(filename, options);\n\n setLoadingState(null);\n setError(null);\n\n if (errors.length > 0) {\n setError({\n parsed: true,\n message: errors[0].message || 'Internal error'\n });\n } else {\n let filetype = getFileType(filename);\n setFilename(filename);\n setFileType(filetype);\n\n if (filetype === 'csv' || filetype === 'qif') {\n setFlipAmount(prefs[`flip-amount-${accountId}-${filetype}`] || false);\n }\n\n if (filetype === 'csv') {\n let mappings = prefs[`csv-mappings-${accountId}`];\n mappings = mappings\n ? JSON.parse(mappings)\n : getInitialMappings(transactions);\n\n setFieldMappings(mappings);\n\n // Set initial split mode based on any saved mapping\n let initialSplitMode = !!(mappings.outflow || mappings.inflow);\n setSplitMode(initialSplitMode);\n\n setParseDateFormat(\n prefs[`parse-date-${accountId}-${filetype}`] ||\n getInitialDateFormat(transactions, mappings)\n );\n } else if (filetype === 'qif') {\n setParseDateFormat(\n prefs[`parse-date-${accountId}-${filetype}`] ||\n getInitialDateFormat(transactions, { date: 'date' })\n );\n } else {\n setFieldMappings(null);\n setParseDateFormat(null);\n }\n\n // Reverse the transactions because it's very common for them to\n // be ordered ascending, but we show transactions descending by\n // date. This is purely cosmetic.\n setTransactions(transactions.reverse());\n }\n }\n\n useEffect(() => {\n parse(\n options.filename,\n getFileType(options.filename) === 'csv'\n ? { delimiter: csvDelimiter }\n : null\n );\n }, [parseTransactions, options.filename]);\n\n function onSplitMode() {\n if (fieldMappings == null) {\n return;\n }\n\n let isSplit = !splitMode;\n setSplitMode(isSplit);\n\n // Run auto-detection on the fields to try to detect the fields\n // automatically\n let mappings = getInitialMappings(transactions);\n\n let newFieldMappings = isSplit\n ? {\n amount: null,\n outflow: mappings.amount,\n inflow: null\n }\n : {\n amount: mappings.amount,\n outflow: null,\n inflow: null\n };\n setFieldMappings({ ...fieldMappings, ...newFieldMappings });\n }\n\n function onNewFile() {\n const res = window.Actual.openFileDialog({\n filters: [\n { name: 'Financial Files', extensions: ['qif', 'ofx', 'qfx', 'csv'] }\n ]\n });\n\n parse(\n res[0],\n getFileType(res[0]) === 'csv' ? { delimiter: csvDelimiter } : null\n );\n }\n\n function onUpdateFields(field, name) {\n setFieldMappings({ ...fieldMappings, [field]: name === '' ? null : name });\n }\n\n async function onImport() {\n setLoadingState('importing');\n\n let finalTransactions = [];\n let errorMessage;\n\n for (let trans of transactions) {\n trans = fieldMappings ? applyFieldMappings(trans, fieldMappings) : trans;\n\n let date =\n filetype === 'qfx' || filetype === 'ofx'\n ? trans.date\n : parseDate(trans.date, parseDateFormat);\n if (date == null) {\n errorMessage = `Unable to parse date ${trans.date ||\n '(empty)'} with given date format`;\n break;\n }\n\n let { amount } = parseAmountFields(trans, splitMode, flipAmount);\n if (amount == null) {\n errorMessage = `Transaction on ${trans.date} has no amount`;\n break;\n }\n\n let { inflow, outflow, ...finalTransaction } = trans;\n finalTransactions.push({\n ...finalTransaction,\n date,\n amount: amountToInteger(amount)\n });\n }\n\n if (errorMessage) {\n setLoadingState(null);\n setError({ parsed: false, message: errorMessage });\n return;\n }\n\n if (filetype !== 'ofx' && filetype !== 'qfx') {\n let key = `parse-date-${accountId}-${filetype}`;\n savePrefs({ [key]: parseDateFormat });\n }\n\n if (filetype === 'csv') {\n savePrefs({\n [`csv-mappings-${accountId}`]: JSON.stringify(fieldMappings)\n });\n savePrefs({ [`csv-delimiter-${accountId}`]: csvDelimiter });\n }\n\n if (filetype === 'csv' || filetype === 'qif') {\n savePrefs({ [`flip-amount-${accountId}-${filetype}`]: flipAmount });\n }\n\n let didChange = await importTransactions(accountId, finalTransactions);\n if (didChange) {\n await getPayees();\n }\n\n if (onImported) {\n onImported(didChange);\n }\n\n modalProps.onClose();\n }\n\n let headers = [\n { name: 'Date', width: 200 },\n { name: 'Payee', width: 'flex' },\n { name: 'Notes', width: 'flex' }\n ];\n\n if (splitMode) {\n headers.push({ name: 'Outflow', width: 90, style: { textAlign: 'right' } });\n headers.push({ name: 'Inflow', width: 90, style: { textAlign: 'right' } });\n } else {\n headers.push({ name: 'Amount', width: 90, style: { textAlign: 'right' } });\n }\n\n return (\n <Modal\n title={\n 'Import transactions' + (filetype ? ` (${filetype.toUpperCase()})` : '')\n }\n {...modalProps}\n loading={loadingState === 'parsing'}\n style={{ width: 800 }}\n >\n {error && !error.parsed && (\n <View style={{ alignItems: 'center', marginBottom: 15 }}>\n <Text style={{ marginRight: 10, color: colors.r4 }}>\n <strong>Error:</strong> {error.message}\n </Text>\n </View>\n )}\n {(!error || !error.parsed) && (\n <View\n style={{\n flex: 'unset',\n height: 300,\n border: '1px solid ' + colors.border\n }}\n >\n <TableHeader headers={headers} />\n\n <TableWithNavigator\n items={transactions}\n fields={['payee', 'amount']}\n style={{ backgroundColor: colors.n11 }}\n getItemKey={index => index}\n renderEmpty={() => {\n return (\n <View\n style={{\n textAlign: 'center',\n marginTop: 25,\n color: colors.n4,\n fontStyle: 'italic'\n }}\n >\n No transactions found\n </View>\n );\n }}\n renderItem={({ key, style, item, editing, focusedField }) => (\n <View key={key} style={style}>\n <Transaction\n transaction={item}\n showParsed={filetype === 'csv' || filetype === 'qif'}\n parseDateFormat={parseDateFormat}\n dateFormat={dateFormat}\n fieldMappings={fieldMappings}\n splitMode={splitMode}\n flipAmount={flipAmount}\n />\n </View>\n )}\n />\n </View>\n )}\n {error && error.parsed && (\n <View\n style={{\n color: colors.r4,\n alignItems: 'center',\n marginTop: 10\n }}\n >\n <Text style={{ maxWidth: 450, marginBottom: 15 }}>\n <strong>Error:</strong> {error.message}\n </Text>\n {error.parsed && (\n <Button onClick={() => onNewFile()}>Select new file...</Button>\n )}\n </View>\n )}\n\n {filetype === 'csv' && (\n <View style={{ marginTop: 25 }}>\n <FieldMappings\n transactions={transactions}\n onChange={onUpdateFields}\n mappings={fieldMappings}\n splitMode={splitMode}\n />\n </View>\n )}\n\n {(filetype === 'qif' || filetype === 'csv') && (\n <View style={{ marginTop: 25 }}>\n <SectionLabel title=\"IMPORT OPTIONS\" />\n <View style={{ marginTop: 5 }}>\n <FlipAmountOption\n value={flipAmount}\n disabled={splitMode}\n onChange={() => {\n setFlipAmount(!flipAmount);\n }}\n />\n </View>\n {filetype === 'csv' && (\n <View style={{ marginTop: 10 }}>\n <SplitOption value={splitMode} onChange={onSplitMode} />\n </View>\n )}\n </View>\n )}\n\n <View style={{ flexDirection: 'row', marginTop: 25 }}>\n {(filetype === 'qif' || filetype === 'csv') && (\n <DateFormatSelect\n transactions={transactions}\n fieldMappings={fieldMappings}\n parseDateFormat={parseDateFormat}\n onChange={setParseDateFormat}\n />\n )}\n\n {filetype === 'csv' && (\n <View style={{ marginLeft: 25 }}>\n <SectionLabel title=\"CSV DELIMITER\" />\n <Select\n value={csvDelimiter}\n onChange={e => {\n setCsvDelimiter(e.target.value);\n parse(filename, { delimiter: e.target.value });\n }}\n >\n <option value=\",\">,</option>\n <option value=\";\">;</option>\n </Select>\n </View>\n )}\n\n <View style={{ flex: 1 }} />\n\n <View\n style={{\n alignSelf: 'flex-end',\n flexDirection: 'row',\n alignItems: 'center'\n }}\n >\n <ButtonWithLoading\n primary\n disabled={transactions.length === 0}\n loading={loadingState === 'importing'}\n onClick={onImport}\n >\n Import {transactions.length} transactions\n </ButtonWithLoading>\n </View>\n </View>\n </Modal>\n );\n}\n\nexport default connect(\n state => ({\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n prefs: state.prefs.local\n }),\n actions\n)(ImportTransactions);\n","import React, { useRef } from 'react';\nimport { connect } from 'react-redux';\nimport { parseISO, format as formatDate, parse as parseDate } from 'date-fns';\nimport * as actions from 'loot-core/src/client/actions';\nimport { amountToInteger } from 'loot-core/src/shared/util';\nimport { currentDay, dayFromDate } from 'loot-core/src/shared/months';\nimport { View, Modal, Stack, Button, Input } from '../common';\nimport DateSelect from '../DateSelect';\nimport CategoryAutocomplete from '../CategorySelect';\nimport AccountAutocomplete from '../AccountAutocomplete';\nimport PayeeAutocomplete from '../PayeeAutocomplete';\nimport { SectionLabel } from '../forms';\nimport { colors } from '../../style';\n// import { colors } from '../../style';\n\nfunction EditField({\n actions,\n modalProps,\n name,\n accounts,\n categoryGroups,\n payees,\n onSubmit,\n dateFormat,\n createPayee\n}) {\n let submitRef = useRef();\n\n function onSelect(value) {\n // Process the value if needed\n if (name === 'amount') {\n value = amountToInteger(value);\n }\n\n onSubmit(name, value);\n modalProps.onClose();\n }\n\n let label, editor, minWidth;\n let inputStyle = { ':focus': { boxShadow: 0 } };\n let autocompleteProps = {\n inputProps: { style: inputStyle },\n containerProps: { style: { height: 275 } }\n };\n\n switch (name) {\n case 'date': {\n let today = currentDay();\n label = 'Date';\n minWidth = 350;\n editor = (\n <DateSelect\n value={formatDate(parseISO(today), dateFormat)}\n dateFormat={dateFormat}\n focused={true}\n embedded={true}\n onUpdate={() => {}}\n onSelect={date => {\n onSelect(dayFromDate(parseDate(date, 'yyyy-MM-dd', new Date())));\n }}\n />\n );\n break;\n }\n\n case 'account':\n label = 'Account';\n editor = (\n <AccountAutocomplete\n value={null}\n accounts={accounts}\n focused={true}\n embedded={true}\n onSelect={value => {\n if (value) {\n onSelect(value);\n }\n }}\n {...autocompleteProps}\n />\n );\n break;\n\n case 'payee':\n label = 'Payee';\n editor = (\n <PayeeAutocomplete\n payees={payees}\n accounts={accounts}\n value={null}\n focused={true}\n embedded={true}\n showManagePayees={false}\n onSelect={async value => {\n if (value && value.startsWith('new:')) {\n value = await createPayee(value.slice('new:'.length));\n }\n\n onSelect(value);\n }}\n {...autocompleteProps}\n />\n );\n break;\n\n case 'notes':\n label = 'Notes';\n editor = (\n <Input\n focused={true}\n onEnter={e => onSelect(e.target.value)}\n style={inputStyle}\n />\n );\n break;\n\n case 'category':\n label = 'Category';\n editor = (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={null}\n focused={true}\n embedded={true}\n showSplitOption={false}\n onUpdate={() => {}}\n onSelect={value => {\n onSelect(value);\n }}\n {...autocompleteProps}\n />\n );\n break;\n\n case 'amount':\n label = 'Amount';\n editor = (\n <Input\n focused={true}\n onEnter={e => onSelect(e.target.value)}\n style={inputStyle}\n />\n );\n break;\n\n default:\n }\n\n return (\n <Modal\n noAnimation={true}\n showHeader={false}\n focusAfterClose={false}\n {...modalProps}\n padding={0}\n style={[\n {\n flex: 0,\n padding: '15px 10px',\n backgroundColor: colors.n1,\n color: 'white'\n },\n minWidth && { minWidth }\n ]}\n >\n {() => (\n <View>\n <SectionLabel\n title={label}\n style={{\n alignSelf: 'center',\n color: colors.b10,\n marginBottom: 10\n }}\n />\n <View style={{ flex: 1 }}>{editor}</View>\n </View>\n )}\n </Modal>\n );\n}\n\nexport default connect(\n state => ({\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n categoryGroups: state.queries.categories.grouped,\n accounts: state.queries.accounts,\n payees: state.queries.payees\n }),\n actions\n)(EditField);\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { Route, Switch } from 'react-router-dom';\nimport { createLocation } from 'history';\nimport Component from '@reactions/component';\nimport * as actions from 'loot-core/src/client/actions';\nimport { send, listen, unlisten } from 'loot-core/src/platform/client/fetch';\nimport { getModalRoute } from '../util';\n\nimport CreateAccount from './modals/CreateAccount';\nimport CreateLocalAccount from 'loot-design/src/components/modals/CreateLocalAccount';\nimport CloseAccount from 'loot-design/src/components/modals/CloseAccount';\nimport SelectLinkedAccounts from 'loot-design/src/components/modals/SelectLinkedAccounts';\nimport ConfigureLinkedAccounts from 'loot-design/src/components/modals/ConfigureLinkedAccounts';\nimport LoadBackup from 'loot-design/src/components/modals/LoadBackup';\nimport ManagePayeesWithData from './payees/ManagePayeesWithData';\nimport ManageRules from './modals/ManageRules';\nimport EditRule from './modals/EditRule';\nimport MergeUnusedPayees from './modals/MergeUnusedPayees';\nimport PlaidExternalMsg from 'loot-design/src/components/modals/PlaidExternalMsg';\nimport ConfirmCategoryDelete from './modals/ConfirmCategoryDelete';\nimport WelcomeScreen from './modals/WelcomeScreen';\nimport ImportTransactions from 'loot-design/src/components/modals/ImportTransactions';\nimport CreateEncryptionKey from './modals/CreateEncryptionKey';\nimport FixEncryptionKey from './modals/FixEncryptionKey';\nimport EditField from 'loot-design/src/components/modals/EditField';\n\nfunction Modals({\n history,\n modalStack,\n isHidden,\n accounts,\n categoryGroups,\n categories,\n payees,\n budgetId,\n actions\n}) {\n return modalStack.map(({ name, options = {} }, idx) => {\n const modalProps = {\n onClose: actions.popModal,\n onBack: actions.popModal,\n showBack: idx > 0,\n isCurrent: idx === modalStack.length - 1,\n isHidden,\n stackIndex: idx\n };\n\n let location = createLocation('/' + name);\n return (\n <Switch key={name} location={location}>\n <Route path=\"/import-transactions\">\n <ImportTransactions modalProps={modalProps} options={options} />\n </Route>\n\n <Route path=\"/add-account\">\n <CreateAccount modalProps={modalProps} actions={actions} />\n </Route>\n\n <Route path=\"/add-local-account\">\n <CreateLocalAccount\n modalProps={modalProps}\n actions={actions}\n history={history}\n />\n </Route>\n\n <Route path=\"/close-account\">\n <CloseAccount\n modalProps={modalProps}\n account={options.account}\n balance={options.balance}\n canDelete={options.canDelete}\n accounts={accounts.filter(acct => acct.closed === 0)}\n categoryGroups={categoryGroups}\n actions={actions}\n />\n </Route>\n\n <Route path=\"/select-linked-accounts\">\n <SelectLinkedAccounts\n modalProps={modalProps}\n institution={options.institution}\n publicToken={options.publicToken}\n accounts={options.accounts}\n upgradingId={options.upgradingId}\n actions={actions}\n />\n </Route>\n\n <Route path=\"/configure-linked-accounts\">\n <ConfigureLinkedAccounts\n modalProps={modalProps}\n institution={options.institution}\n publicToken={options.publicToken}\n accounts={options.accounts}\n upgradingId={options.upgradingId}\n actions={actions}\n />\n </Route>\n\n <Route\n path=\"/confirm-category-delete\"\n render={() => {\n const { category, group, onDelete } = options;\n return (\n <ConfirmCategoryDelete\n modalProps={modalProps}\n actions={actions}\n category={categories.find(c => c.id === category)}\n group={categoryGroups.find(g => g.id === group)}\n categoryGroups={categoryGroups}\n onDelete={onDelete}\n />\n );\n }}\n />\n\n <Route\n path=\"/load-backup\"\n render={() => {\n return (\n <Component\n initialState={{ backups: [] }}\n didMount={async ({ setState }) => {\n setState({\n backups: await send('backups-get', { id: budgetId })\n });\n\n listen('backups-updated', backups => {\n setState({ backups });\n });\n }}\n willUnmount={() => {\n unlisten('backups-updated');\n }}\n >\n {({ state }) => (\n <LoadBackup\n budgetId={budgetId}\n modalProps={modalProps}\n actions={actions}\n backups={state.backups}\n />\n )}\n </Component>\n );\n }}\n />\n\n <Route\n path=\"/manage-payees\"\n render={() => {\n return (\n <ManagePayeesWithData\n history={history}\n modalProps={modalProps}\n initialSelectedIds={\n options.selectedPayee ? [options.selectedPayee] : undefined\n }\n />\n );\n }}\n />\n\n <Route\n path=\"/manage-rules\"\n render={() => {\n return (\n <ManageRules\n history={history}\n modalProps={modalProps}\n payeeId={options.payeeId}\n />\n );\n }}\n />\n\n <Route\n path=\"/edit-rule\"\n render={() => {\n return (\n <EditRule\n history={history}\n modalProps={modalProps}\n defaultRule={options.rule}\n onSave={options.onSave}\n />\n );\n }}\n />\n\n <Route\n path=\"/merge-unused-payees\"\n render={() => {\n return (\n <MergeUnusedPayees\n history={history}\n modalProps={modalProps}\n payeeIds={options.payeeIds}\n targetPayeeId={options.targetPayeeId}\n />\n );\n }}\n />\n\n <Route\n path=\"/plaid-external-msg\"\n render={() => {\n return (\n <PlaidExternalMsg\n modalProps={modalProps}\n actions={actions}\n onMoveExternal={options.onMoveExternal}\n onClose={() => {\n options.onClose && options.onClose();\n send('poll-web-token-stop');\n }}\n onSuccess={options.onSuccess}\n />\n );\n }}\n />\n\n <Route\n path=\"/create-encryption-key\"\n render={() => {\n return (\n <CreateEncryptionKey\n key={name}\n modalProps={modalProps}\n actions={actions}\n options={options}\n />\n );\n }}\n />\n\n <Route\n path=\"/fix-encryption-key\"\n render={() => {\n return (\n <FixEncryptionKey\n key={name}\n modalProps={modalProps}\n actions={actions}\n options={options}\n />\n );\n }}\n />\n\n <Route\n path=\"/edit-field\"\n render={() => {\n return (\n <EditField\n key={name}\n modalProps={modalProps}\n actions={actions}\n name={options.name}\n onSubmit={options.onSubmit}\n />\n );\n }}\n />\n\n <Route path=\"/welcome-screen\">\n <WelcomeScreen modalProps={modalProps} actions={actions} />\n </Route>\n </Switch>\n );\n });\n}\n\nexport default connect(\n state => ({\n modalStack: state.modals.modalStack,\n isHidden: state.modals.isHidden,\n accounts: state.queries.accounts,\n categoryGroups: state.queries.categories.grouped,\n categories: state.queries.categories.list,\n payees: state.queries.payees,\n budgetId: state.prefs.local && state.prefs.local.id\n }),\n dispatch => ({ actions: bindActionCreators(actions, dispatch) })\n)(Modals);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport Platform from 'loot-core/src/client/platform';\n\nclass GlobalKeys extends React.Component {\n componentDidMount() {\n const handleKeys = e => {\n if (Platform.isBrowser) {\n return;\n }\n\n if (e.metaKey) {\n const { history } = this.props;\n switch (e.keyCode) {\n case 49:\n history.push('/budget');\n break;\n case 50:\n history.push('/reports');\n break;\n case 51:\n history.push('/accounts');\n break;\n case 188: // ,\n if (Platform.OS === 'mac') {\n history.push('/settings');\n }\n break;\n default:\n }\n }\n };\n\n document.addEventListener('keydown', handleKeys);\n\n this.cleanupListeners = () => {\n document.removeEventListener('keydown', handleKeys);\n };\n }\n\n componentWillUnmount() {\n this.cleanupListeners();\n }\n\n render() {\n return null;\n }\n}\n\nexport default withRouter(GlobalKeys);\n","import React, { useMemo } from 'react';\nimport { Router, Route, Redirect, Switch, useLocation } from 'react-router-dom';\nimport { createBrowserHistory } from 'history';\nimport { connect } from 'react-redux';\nimport { DndProvider } from 'react-dnd';\nimport Backend from 'react-dnd-html5-backend';\nimport hotkeys from 'hotkeys-js';\nimport * as actions from 'loot-core/src/client/actions';\nimport { SpreadsheetProvider } from 'loot-core/src/client/SpreadsheetProvider';\nimport checkForUpgradeNotifications from 'loot-core/src/client/upgrade-notifications';\nimport { colors } from 'loot-design/src/style';\nimport { View } from 'loot-design/src/components/common';\nimport BankSyncStatus from './BankSyncStatus';\nimport { BudgetMonthCountProvider } from 'loot-design/src/components/budget/BudgetMonthCountContext';\nimport * as undo from 'loot-core/src/platform/client/undo';\nimport { PageTypeProvider } from './Page';\nimport { getLocationState } from '../util/location-state';\nimport { ActiveLocationProvider } from './ActiveLocation';\nimport { makeLocationState } from '../util/location-state';\nimport { PayeesProvider } from 'loot-core/src/client/data-hooks/payees';\nimport { AccountsProvider } from 'loot-core/src/client/data-hooks/accounts';\n\nimport Titlebar, { TitlebarProvider } from './Titlebar';\nimport FloatableSidebar, { SidebarProvider } from './FloatableSidebar';\nimport Account from './accounts/Account';\nimport Budget from './budget';\nimport Reports from './reports';\nimport Schedules from './schedules';\nimport EditSchedule from './schedules/EditSchedule';\nimport LinkSchedule from './schedules/LinkSchedule';\nimport DiscoverSchedules from './schedules/DiscoverSchedules';\nimport PostsOfflineNotification from './schedules/PostsOfflineNotification';\nimport FixSplitsTool from './tools/FixSplitsTool';\nimport Settings from './Settings';\nimport Modals from './Modals';\nimport Notifications from './Notifications';\nimport GlobalKeys from './GlobalKeys';\n// import Debugger from './Debugger';\n\nfunction URLBar() {\n let location = useLocation();\n\n return (\n <View\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n margin: 15,\n backgroundColor: colors.n9,\n padding: 8,\n borderRadius: 6\n }}\n >\n {location.pathname}\n </View>\n );\n}\n\nfunction PageRoute({ path, component: Component }) {\n return (\n <Route\n path={path}\n children={props => {\n return (\n <View\n style={{\n flex: 1,\n display: props.match ? 'flex' : 'none'\n }}\n >\n <Component {...props} />\n </View>\n );\n }}\n />\n );\n}\n\nfunction Routes({ location }) {\n return (\n <Switch location={location}>\n <Route path=\"/\">\n <Route path=\"/\" exact render={() => <Redirect to=\"/budget\" />} />\n\n <PageRoute path=\"/reports\" component={Reports} />\n <PageRoute path=\"/budget\" component={Budget} />\n\n <Route path=\"/schedules\" exact component={Schedules} />\n <Route path=\"/schedule/edit\" exact component={EditSchedule} />\n <Route path=\"/schedule/edit/:id\" component={EditSchedule} />\n <Route path=\"/schedule/link\" component={LinkSchedule} />\n <Route path=\"/schedule/discover\" component={DiscoverSchedules} />\n <Route\n path=\"/schedule/posts-offline-notification\"\n component={PostsOfflineNotification}\n />\n\n <Route path=\"/tools/fix-splits\" exact component={FixSplitsTool} />\n\n <Route\n path=\"/accounts/:id\"\n exact\n children={props => {\n return (\n props.match && <Account key={props.match.params.id} {...props} />\n );\n }}\n />\n <Route path=\"/accounts\" exact component={Account} />\n <Route path=\"/settings\" component={Settings} />\n </Route>\n </Switch>\n );\n}\n\nfunction StackedRoutes() {\n let location = useLocation();\n let locationPtr = getLocationState(location, 'locationPtr');\n\n let locations = [location];\n while (locationPtr) {\n locations.unshift(locationPtr);\n locationPtr = getLocationState(locationPtr, 'locationPtr');\n }\n\n let base = locations[0];\n let stack = locations.slice(1);\n\n return (\n <ActiveLocationProvider location={locations[locations.length - 1]}>\n <Routes location={base} />\n {stack.map((location, idx) => (\n <PageTypeProvider\n key={location.key}\n type=\"modal\"\n current={idx === stack.length - 1}\n >\n <Routes location={location} />\n </PageTypeProvider>\n ))}\n </ActiveLocationProvider>\n );\n}\n\nclass FinancesApp extends React.Component {\n constructor(props) {\n super(props);\n this.history = createBrowserHistory();\n\n let oldPush = this.history.push;\n this.history.push = (to, state) => {\n return oldPush.call(this.history, to, makeLocationState(state));\n };\n\n // I'm not sure if this is the best approach but we need this to\n // globally. We could instead move various workflows inside global\n // React components, but that's for another day.\n window.__history = this.history;\n\n undo.setUndoState('url', window.location.href);\n\n this.cleanup = this.history.listen(location => {\n undo.setUndoState('url', window.location.href);\n });\n }\n\n componentDidMount() {\n // TODO: quick hack fix for showing the demo\n if (this.history.location.pathname === '/subscribe') {\n this.history.push('/');\n }\n\n // Get the accounts and check if any exist. If there are no\n // accounts, we want to redirect the user to the All Accounts\n // screen which will prompt them to add an account\n this.props.getAccounts().then(accounts => {\n if (accounts.length === 0) {\n this.history.push('/accounts');\n }\n });\n\n // The default key handler scope\n hotkeys.setScope('app');\n\n // Wait a little bit to make sure the sync button will get the\n // sync start event. This can be improved later.\n setTimeout(async () => {\n await this.props.sync();\n\n // Check for upgrade notifications. We do this after syncing\n // because these states are synced across devices, so they will\n // only see it once for this file\n checkForUpgradeNotifications(\n this.props.addNotification,\n this.props.resetSync,\n this.history\n );\n }, 100);\n }\n\n componentWillUnmount() {\n this.cleanup();\n }\n\n render() {\n return (\n <Router history={this.history}>\n <View style={{ height: '100%', backgroundColor: colors.n10 }}>\n <GlobalKeys />\n\n <View style={{ flexDirection: 'row', flex: 1 }}>\n <FloatableSidebar />\n\n <div\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative'\n }}\n >\n <Titlebar\n style={{\n WebkitAppRegion: 'drag',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n zIndex: 1000\n }}\n />\n <div\n style={{\n flex: 1,\n display: 'flex',\n overflow: 'auto',\n position: 'relative'\n }}\n >\n <Notifications />\n <BankSyncStatus />\n\n <StackedRoutes />\n\n {/*window.Actual.IS_DEV && <Debugger />*/}\n {/*window.Actual.IS_DEV && <URLBar />*/}\n\n <Modals history={this.history} />\n </div>\n </div>\n </View>\n </View>\n </Router>\n );\n }\n}\n\nfunction FinancesAppWithContext(props) {\n let app = useMemo(() => <FinancesApp {...props} />, [props]);\n\n return (\n <SpreadsheetProvider>\n <TitlebarProvider>\n <SidebarProvider>\n <BudgetMonthCountProvider>\n <PayeesProvider>\n <AccountsProvider>\n <DndProvider backend={Backend}>{app}</DndProvider>\n </AccountsProvider>\n </PayeesProvider>\n </BudgetMonthCountProvider>\n </SidebarProvider>\n </TitlebarProvider>\n </SpreadsheetProvider>\n );\n}\n\nexport default connect(\n null,\n actions\n)(FinancesAppWithContext);\n","import React, { useState, useEffect } from 'react';\nimport {\n View,\n Text,\n AnchorLink,\n Button\n} from 'loot-design/src/components/common';\nimport { send } from 'loot-core/src/platform/client/fetch';\n\nexport default function ServerURL() {\n let [url, setUrl] = useState(null);\n\n useEffect(() => {\n async function run() {\n let url = await send('get-server-url');\n setUrl(url);\n }\n run();\n }, []);\n\n return (\n <View\n style={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n justifyContent: 'center',\n flexDirection: 'row',\n marginBottom: 15,\n zIndex: 5000\n }}\n >\n <Text>\n Using server: <strong>{url}</strong>\n </Text>\n <AnchorLink bare to=\"/config-server\" style={{ marginLeft: 15 }}>\n Change\n </AnchorLink>\n </View>\n );\n}\n","import React from 'react';\n\nconst SvgCloudCheck = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M24 11.113a5.765 5.765 0 0 0-5.216-5.952.249.249 0 0 1-.191-.12 7.684 7.684 0 0 0-14.1 2.294.251.251 0 0 1-.227.2A4.643 4.643 0 0 0 .624 9.774 4.47 4.47 0 0 0 0 12.223a4.293 4.293 0 0 0 1.235 3.1 4.624 4.624 0 0 0 1.78 1.062.963.963 0 0 0 1.243-.86v-.026a.985.985 0 0 0-.658-1.033 2.58 2.58 0 0 1-.96-.572A2.374 2.374 0 0 1 2 12.109a2.588 2.588 0 0 1 2.586-2.588 2.7 2.7 0 0 1 .535.054.989.989 0 0 0 .811-.184 1 1 0 0 0 .392-.779c.085-5.736 8.293-7.372 10.818-2.044a.974.974 0 0 0 .941.57 3.733 3.733 0 0 1 3 1.309 3.888 3.888 0 0 1 .9 2.812 3.428 3.428 0 0 1-1.473 2.667.973.973 0 0 0-.4.964l.01.059a.968.968 0 0 0 1.525.608A5.4 5.4 0 0 0 24 11.113z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12.231 9.7a6.5 6.5 0 1 0 6.5 6.5 6.508 6.508 0 0 0-6.5-6.5zm3.124 4.155a.75.75 0 0 1 .15 1.05l-2.905 3.87a1.493 1.493 0 0 1-1.1.6h-.111a1.485 1.485 0 0 1-1.055-.443l-1.5-1.5a.75.75 0 0 1 1.066-1.06l1.3 1.3a.249.249 0 0 0 .376-.026L14.305 14a.751.751 0 0 1 1.05-.149z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCloudCheck;\n","import React from 'react';\n\nconst SvgCloudDownload = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M24 10.663A5.817 5.817 0 0 0 22.228 6.5a5.711 5.711 0 0 0-3.447-1.585.249.249 0 0 1-.191-.12 7.684 7.684 0 0 0-14.1 2.294.251.251 0 0 1-.227.2A4.59 4.59 0 0 0 0 11.859a4.324 4.324 0 0 0 1.236 3.21 5.529 5.529 0 0 0 3.605 1.377 1 1 0 0 0 .985-1.015 1.023 1.023 0 0 0-1.015-.985 3.3 3.3 0 0 1-2.172-.8A2.374 2.374 0 0 1 2 11.859a2.576 2.576 0 0 1 .954-2.007 2.6 2.6 0 0 1 2.167-.527 1 1 0 0 0 1.2-.919 5.686 5.686 0 0 1 10.82-2.088.959.959 0 0 0 .941.57 3.687 3.687 0 0 1 2.758 1.049A3.752 3.752 0 0 1 22 10.663a3.835 3.835 0 0 1-3.438 3.791 1 1 0 0 0 .132 1.992.961.961 0 0 0 .131-.009A5.807 5.807 0 0 0 24 10.663z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M15.5 17.446h-1.75a.25.25 0 0 1-.25-.25v-7.25a1.5 1.5 0 1 0-3 0V17.2a.25.25 0 0 1-.25.25H8.5a1 1 0 0 0-.707 1.707l3.5 3.5a1 1 0 0 0 1.414 0l3.5-3.5a1 1 0 0 0-.707-1.707z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCloudDownload;\n","import React from 'react';\n\nconst SvgCloudUnknown = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M3.566 15.457a1 1 0 0 0-.5-.844 2.248 2.248 0 0 1-.431-.329A2.371 2.371 0 0 1 2 12.5a2.588 2.588 0 0 1 2.585-2.588 2.645 2.645 0 0 1 .536.056A1 1 0 0 0 6.324 9c.081-5.754 8.3-7.363 10.818-2.045a.97.97 0 0 0 .941.571 3.7 3.7 0 0 1 3 1.3 3.874 3.874 0 0 1 .908 2.811 3.428 3.428 0 0 1-1.1 2.375 1.316 1.316 0 0 0-.42 1.089.912.912 0 0 0 1.476.628A5.408 5.408 0 0 0 24 11.418a5.763 5.763 0 0 0-5.22-5.866.25.25 0 0 1-.19-.12 7.685 7.685 0 0 0-14.1 2.3.251.251 0 0 1-.227.2 4.642 4.642 0 0 0-3.643 2.24A4.471 4.471 0 0 0 0 12.619a4.287 4.287 0 0 0 1.235 3.09 4.177 4.177 0 0 0 .852.645 1 1 0 0 0 1.478-.9z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18.5 15.8a6.5 6.5 0 1 0-6.5 6.5 6.508 6.508 0 0 0 6.5-6.5zm-7.25 1.25v-.55a1.257 1.257 0 0 1 .986-1.221 1.125 1.125 0 1 0-1.361-1.1.75.75 0 1 1-1.5 0 2.625 2.625 0 1 1 3.538 2.461.25.25 0 0 0-.163.234v.18a.75.75 0 0 1-1.5 0zM12 18.8a1 1 0 1 1-1 1 1 1 0 0 1 1-1z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgCloudUnknown;\n","import React from 'react';\n\nconst SvgFileDouble = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M21.941 3.607L18.87.554A1.912 1.912 0 0 0 17.527 0H8.9A1.9 1.9 0 0 0 7 1.9V5H3.4a1.9 1.9 0 0 0-1.9 1.9v15.21A1.9 1.9 0 0 0 3.4 24h11.7a1.9 1.9 0 0 0 1.9-1.895V19h3.6a1.9 1.9 0 0 0 1.9-1.895V4.949a1.882 1.882 0 0 0-.559-1.342zM14.5 22H4a.5.5 0 0 1-.5-.5v-14A.5.5 0 0 1 4 7h7.784a.5.5 0 0 1 .35.143L14.85 9.8a.5.5 0 0 1 .15.357V21.5a.5.5 0 0 1-.5.5zm5.5-5h-2.75a.25.25 0 0 1-.25-.25v-6.8a1.892 1.892 0 0 0-.558-1.341L13.37 5.554A1.9 1.9 0 0 0 12.028 5H9.25A.25.25 0 0 1 9 4.75V2.5a.5.5 0 0 1 .5-.5l7.756-.026a.5.5 0 0 1 .351.143L20.35 4.8a.5.5 0 0 1 .15.357V16.5a.5.5 0 0 1-.5.5z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgFileDouble;\n","import React from 'react';\n\nconst SvgKey = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M23.113 5.954L21.849 4.69l.881-.88a1.914 1.914 0 1 0-2.707-2.71L9.04 12.085a6.014 6.014 0 1 0 2.707 2.707l3.739-3.737.762.762a1.75 1.75 0 1 0 2.475-2.475l-.763-.762 1.416-1.417 1.264 1.263a1.788 1.788 0 0 0 2.473 0 1.751 1.751 0 0 0 0-2.472zm-16.737 8.5a3 3 0 1 1-3 3 3 3 0 0 1 3-2.998z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgKey;\n","import React from 'react';\n\nconst SvgRefreshArrow = props => (\n <svg\n {...props}\n viewBox=\"0 0 24 24\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M10.664 20.073a1.249 1.249 0 1 0-.507 2.447A10.739 10.739 0 1 0 2.4 16.1a.25.25 0 0 1-.084.3l-1 .726a1 1 0 0 0 .377 1.787l3.946.849a1.062 1.062 0 0 0 .21.022 1 1 0 0 0 .978-.79l.945-4.4a1 1 0 0 0-1.565-1.02l-1.361.989a.25.25 0 0 1-.386-.128 8.255 8.255 0 1 1 6.205 5.643z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgRefreshArrow;\n","import React, { useState, useRef } from 'react';\nimport { View, Text, Modal, Button, Tooltip, Menu } from '../common';\nimport { styles, colors } from '../../style';\nimport CloudCheck from '../../svg/v1/CloudCheck';\nimport CloudDownload from '../../svg/v1/CloudDownload';\nimport CloudUnknown from '../../svg/v2/CloudUnknown';\nimport FileDouble from '../../svg/v1/FileDouble';\nimport Key from 'loot-design/src/svg/v2/Key';\nimport DotsHorizontalTriple from '../../svg/v1/DotsHorizontalTriple';\nimport RefreshArrow from 'loot-design/src/svg/v2/RefreshArrow';\nimport Loading from 'loot-design/src/svg/v1/AnimatedLoading';\n\nfunction getFileDescription(file) {\n if (file.state === 'unknown') {\n return (\n \"This is a cloud-based file but it's state is unknown because you \" +\n 'are offline.'\n );\n }\n\n if (file.encryptKeyId) {\n if (file.hasKey) {\n return 'This file is encrypted and you have key to access it.';\n }\n return 'This file is encrypted and you do not have the key for it.';\n }\n\n return null;\n}\n\nfunction FileMenu({ state, onDelete, onUpload, onClose, onDownload }) {\n function onMenuSelect(type) {\n onClose();\n\n switch (type) {\n case 'delete':\n onDelete();\n break;\n default:\n }\n }\n\n let items = [{ name: 'delete', text: 'Delete' }];\n\n return <Menu onMenuSelect={onMenuSelect} items={items} />;\n}\n\nfunction DetailButton({ state, onDelete }) {\n let [menuOpen, setMenuOpen] = useState(false);\n\n return (\n <View>\n <Button\n bare\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n >\n <DotsHorizontalTriple style={{ width: 16, height: 16 }} />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <FileMenu\n state={state}\n onDelete={onDelete}\n onClose={() => setMenuOpen(false)}\n />\n </Tooltip>\n )}\n </View>\n );\n}\n\nfunction FileState({ file }) {\n let Icon;\n let status;\n let color;\n\n switch (file.state) {\n case 'unknown':\n Icon = CloudUnknown;\n status = 'Network unavailable';\n color = colors.n7;\n break;\n case 'remote':\n Icon = CloudDownload;\n status = 'Available for download';\n break;\n case 'local':\n case 'broken':\n Icon = FileDouble;\n status = 'Local';\n break;\n default:\n Icon = CloudCheck;\n status = 'Syncing';\n break;\n }\n\n return (\n <View\n style={{\n color,\n alignItems: 'center',\n flexDirection: 'row',\n marginTop: 8\n }}\n >\n <Icon\n color={color}\n style={{\n width: 18,\n height: 18,\n color: 'currentColor'\n }}\n />\n\n <Text style={{ marginLeft: 5 }}>{status}</Text>\n </View>\n );\n}\n\nfunction File({ file, onSelect, onDelete }) {\n let selecting = useRef(false);\n\n async function _onSelect(file) {\n // Never allow selecting the file while uploading/downloading, and\n // make sure to never allow duplicate clicks\n if (!selecting.current) {\n selecting.current = true;\n await onSelect(file);\n selecting.current = false;\n }\n }\n\n return (\n <View\n onClick={() => _onSelect(file)}\n title={getFileDescription(file)}\n style={[\n {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n boxShadow: styles.shadow,\n margin: 10,\n padding: '12px 15px',\n backgroundColor: 'white',\n borderRadius: 6,\n flexShrink: 0,\n cursor: 'pointer',\n ':hover': {\n backgroundColor: colors.hover\n }\n }\n ]}\n >\n <View style={{ alignItems: 'flex-start' }}>\n <Text style={[{ fontSize: 16, fontWeight: 700 }]}>{file.name}</Text>\n\n <FileState file={file} />\n </View>\n\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {file.encryptKeyId && (\n <Key\n style={{\n width: 13,\n height: 13,\n marginRight: 8,\n color: file.hasKey ? colors.b5 : colors.n8\n }}\n />\n )}\n\n <DetailButton state={file.state} onDelete={() => onDelete(file)} />\n </View>\n </View>\n );\n}\n\nclass BudgetTable extends React.Component {\n render() {\n const { files, onSelect, onDelete } = this.props;\n\n return (\n <View\n style={{\n flex: 1,\n maxHeight: 310,\n overflow: 'auto',\n '& *': { userSelect: 'none' }\n }}\n >\n {files.map((file, idx) => (\n <File\n key={file.id || file.cloudFileId}\n file={file}\n onSelect={onSelect}\n onDelete={onDelete}\n />\n ))}\n </View>\n );\n }\n}\n\nfunction RefreshButton({ onRefresh }) {\n let [loading, setLoading] = useState(false);\n\n async function _onRefresh() {\n setLoading(true);\n await onRefresh();\n setLoading(false);\n }\n\n let Icon = loading ? Loading : RefreshArrow;\n\n return (\n <Button bare style={{ padding: 10, marginRight: 5 }} onClick={_onRefresh}>\n <Icon\n color={colors.n1}\n style={{ width: 18, height: 18, color: colors.n1 }}\n />\n </Button>\n );\n}\n\nclass BudgetList extends React.Component {\n creating = false;\n\n onCreate = ({ testMode } = {}) => {\n if (!this.creating) {\n this.creating = true;\n this.props.actions.createBudget({ testMode });\n }\n };\n\n render() {\n let { modalProps, files = [], actions, onDownload } = this.props;\n\n return (\n <Modal\n {...modalProps}\n noAnimation={true}\n showHeader={false}\n showOverlay={false}\n padding={0}\n style={{ boxShadow: 'none', backgroundColor: 'transparent' }}\n >\n {() => (\n <View style={{ flex: 1 }}>\n <View>\n <Text style={[styles.veryLargeText, { margin: 20 }]}>Files</Text>\n <View\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n justifyContent: 'center',\n marginRight: 5\n }}\n >\n <RefreshButton\n onRefresh={() => {\n actions.getUserData();\n actions.loadAllFiles();\n }}\n />\n </View>\n </View>\n <BudgetTable\n files={files}\n actions={actions}\n onSelect={file => {\n if (file.state === 'remote') {\n onDownload(file.cloudFileId);\n } else {\n actions.loadBudget(file.id);\n }\n }}\n onDelete={file => actions.pushModal('delete-budget', { file })}\n />\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'flex-end',\n padding: 25,\n paddingLeft: 5\n }}\n >\n <Button\n bare\n style={{\n marginLeft: 10,\n color: colors.n4\n }}\n onClick={e => {\n e.preventDefault();\n actions.pushModal('import');\n }}\n >\n Import file\n </Button>\n\n <Button\n primary\n onClick={() => this.onCreate()}\n style={{ marginLeft: 15 }}\n >\n Create new file\n </Button>\n\n {process.env.NODE_ENV === 'development' && (\n <Button\n primary\n onClick={() => this.onCreate({ testMode: true })}\n style={{ marginLeft: 15 }}\n >\n Create test file\n </Button>\n )}\n </View>\n </View>\n )}\n </Modal>\n );\n }\n}\n\nexport default BudgetList;\n","import React, { useState } from 'react';\nimport { View, Block, Modal, Button, Link } from '../common';\nimport { styles, colors } from '../../style';\n\nfunction getErrorMessage(error) {\n switch (error) {\n case 'not-ynab4':\n return 'This file is not valid. Please select a .ynab4 file';\n default:\n return 'An unknown error occurred while importing. Sorry! We have been notified of this issue.';\n }\n}\n\n// const res = await window.Actual.openFileDialog({\n// // Windows treats the ynab4 file as a directroy, while Mac\n// // treats it like a normal file\n// properties: ['openDirectory', 'openFile'],\n// filters: [{ name: 'ynab', extensions: ['ynab4'] }]\n// });\n// if (res) {\n// this.doImport(res[0]);\n// }\n// this.props.actions.importBudget(filepath).catch(err => {\n// this.setState({ error: err.message, importing: false });\n// });\n\nfunction Import({ modalProps, actions, availableImports }) {\n const [error, setError] = useState(false);\n const [importing, setImporting] = useState(false);\n const [type, setType] = useState(null);\n\n function onSelectType(type) {\n switch (type) {\n case 'ynab4':\n actions.pushModal('import-ynab4');\n break;\n case 'ynab5':\n actions.pushModal('import-ynab5');\n break;\n default:\n }\n }\n\n let itemStyle = {\n padding: 10,\n border: '1px solid ' + colors.border,\n borderRadius: 6,\n marginBottom: 10,\n display: 'block'\n };\n\n return (\n <Modal\n {...modalProps}\n noAnimation={true}\n showHeader={false}\n showOverlay={false}\n style={{ width: 400 }}\n >\n {() => (\n <View style={[styles.smallText, { lineHeight: 1.5, marginTop: 20 }]}>\n {error && (\n <Block style={{ color: colors.r4, marginBottom: 15 }}>\n {getErrorMessage(error)}\n </Block>\n )}\n\n <View>\n <View style={{ fontSize: 25, fontWeight: 700, marginBottom: 20 }}>\n Import from:\n </View>\n\n <View>\n <Button style={itemStyle} onClick={() => onSelectType('ynab4')}>\n <span style={{ fontWeight: 700 }}>YNAB4</span>\n <View style={{ color: colors.n5 }}>\n The old unsupported desktop app\n </View>\n </Button>\n <Button style={itemStyle} onClick={() => onSelectType('ynab5')}>\n <span style={{ fontWeight: 700 }}>nYNAB</span>\n <View style={{ color: colors.n5 }}>\n <div>The newer web app</div>\n </View>\n </Button>\n {false && (\n <Button style={itemStyle}>\n <span style={{ fontWeight: 700 }}>Actual</span>\n <View style={{ color: colors.n5 }}>\n <div>Import a backup or external file</div>\n </View>\n </Button>\n )}\n </View>\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n marginTop: 20,\n alignItems: 'center'\n }}\n >\n <View style={{ flex: 1 }} />\n <Button\n style={{ marginRight: 10 }}\n onClick={() => modalProps.onBack()}\n >\n Back\n </Button>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nexport default Import;\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { importBudget } from 'loot-core/src/client/actions/budgets';\nimport {\n View,\n Block,\n Modal,\n Button,\n ButtonWithLoading,\n Link,\n P\n} from '../common';\nimport { styles, colors } from '../../style';\n\nfunction getErrorMessage(error) {\n switch (error) {\n case 'not-ynab4':\n return 'This file is not valid. Please select a compressed ynab4 zip file.';\n default:\n return 'An unknown error occurred while importing. Sorry! We have been notified of this issue.';\n }\n}\n\nfunction Import({ modalProps, availableImports }) {\n const dispatch = useDispatch();\n const [error, setError] = useState(false);\n const [importing, setImporting] = useState(false);\n\n async function onImport() {\n const res = await window.Actual.openFileDialog({\n properties: ['openFile'],\n filters: [{ name: 'ynab', extensions: ['zip'] }]\n });\n if (res) {\n setImporting(true);\n setError(false);\n try {\n await dispatch(importBudget(res[0], 'ynab4'));\n } catch (err) {\n setError(err.message);\n } finally {\n setImporting(false);\n }\n }\n }\n\n return (\n <Modal\n {...modalProps}\n showHeader={false}\n showOverlay={false}\n noAnimation={true}\n style={{ width: 400 }}\n >\n {() => (\n <View style={[styles.smallText, { lineHeight: 1.5, marginTop: 20 }]}>\n {error && (\n <Block style={{ color: colors.r4, marginBottom: 15 }}>\n {getErrorMessage(error)}\n </Block>\n )}\n\n <View style={{ alignItems: 'center' }}>\n <P>\n To import data from YNAB4, locate where your YNAB4 data is stored.\n It is usually in your Documents folder under YNAB. Your data is a\n directory inside that with the \".ynab4\" suffix.\n </P>\n <P>\n When you've located your data,{' '}\n <strong>compress it into a zip file</strong>. On macOS, right-click\n the folder and select \"Compress\". On Windows, right-click and\n select \"Send to > Compressed (zipped) folder\". Upload the zipped\n folder for importing.\n </P>\n <View>\n <ButtonWithLoading loading={importing} primary onClick={onImport}>\n Select zip file...\n </ButtonWithLoading>\n </View>\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n marginTop: 20,\n alignItems: 'center'\n }}\n >\n <View style={{ flex: 1 }} />\n <Button\n style={{ marginRight: 10 }}\n onClick={() => modalProps.onBack()}\n >\n Back\n </Button>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nexport default Import;\n","import React, { useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { importBudget } from 'loot-core/src/client/actions/budgets';\nimport {\n View,\n Block,\n Modal,\n ButtonWithLoading,\n Button,\n Link,\n P,\n ExternalLink\n} from '../common';\nimport { styles, colors } from '../../style';\n\nfunction getErrorMessage(error) {\n switch (error) {\n case 'parse-error':\n return 'Unable to parse file. Please select a JSON file exported from nYNAB.';\n case 'not-ynab5':\n return 'This file is not valid. Please select a JSON file exported from nYNAB.';\n default:\n return 'An unknown error occurred while importing. Sorry! We have been notified of this issue.';\n }\n}\n\nfunction Import({ modalProps, availableImports }) {\n const dispatch = useDispatch();\n const [error, setError] = useState(false);\n const [importing, setImporting] = useState(false);\n\n async function onImport() {\n const res = await window.Actual.openFileDialog({\n properties: ['openFile'],\n filters: [{ name: 'ynab', extensions: ['json'] }]\n });\n if (res) {\n setImporting(true);\n setError(false);\n try {\n await dispatch(importBudget(res[0], 'ynab5'));\n } catch (err) {\n setError(err.message);\n } finally {\n setImporting(false);\n }\n }\n }\n\n return (\n <Modal\n {...modalProps}\n showHeader={false}\n showOverlay={false}\n noAnimation={true}\n style={{ width: 400 }}\n >\n {() => (\n <View style={[styles.smallText, { lineHeight: 1.5, marginTop: 20 }]}>\n {error && (\n <Block style={{ color: colors.r4, marginBottom: 15 }}>\n {getErrorMessage(error)}\n </Block>\n )}\n\n <View\n style={{ alignItems: 'center', '& > div': { lineHeight: '1.7em' } }}\n >\n <P>\n <ExternalLink\n asAnchor={true}\n href=\"https://actualbudget.com/blog/importing-from-ynab\"\n target=\"_blank\"\n >\n Read here\n </ExternalLink>{' '}\n for instructions on how to migrate your data from YNAB. You need\n to export your data as JSON, and that page explains how to do\n that.\n </P>\n <P>\n Once you have exported your data, select the file and Actual will\n import it. Budgets may not match up exactly because things work\n slightly differently, but you should be able to fix up any\n problems.\n </P>\n <View>\n <ButtonWithLoading loading={importing} primary onClick={onImport}>\n Select file...\n </ButtonWithLoading>\n </View>\n </View>\n\n <View\n style={{\n flexDirection: 'row',\n marginTop: 20,\n alignItems: 'center'\n }}\n >\n <View style={{ flex: 1 }} />\n <Button\n style={{ marginRight: 10 }}\n onClick={() => modalProps.onBack()}\n >\n Back\n </Button>\n </View>\n </View>\n )}\n </Modal>\n );\n}\n\nexport default Import;\n","import React, { useState } from 'react';\nimport { View, Text, Modal, Button, ButtonWithLoading } from '../common';\nimport { styles, colors } from '../../style';\n\nexport default function DeleteMenu({ modalProps, actions, file }) {\n let [loadingState, setLoadingState] = useState(null);\n let { state } = file;\n\n async function onDeleteCloud() {\n setLoadingState('cloud');\n await actions.deleteBudget(file.id, file.cloudFileId);\n setLoadingState(null);\n\n modalProps.onBack();\n }\n\n async function onDeleteLocal() {\n setLoadingState('local');\n await actions.deleteBudget(file.id);\n setLoadingState(null);\n\n modalProps.onBack();\n }\n\n // If the state is \"broken\" that means it was created by another\n // user. The current user should be able to delete the local file,\n // but not the remote one\n let isRemote = file.cloudFileId && file.state !== 'broken';\n\n return (\n <Modal\n {...modalProps}\n title={'Delete ' + file.name}\n padding={0}\n showOverlay={false}\n onClose={modalProps.onBack}\n >\n {() => (\n <View\n style={{\n padding: 15,\n paddingTop: 0,\n paddingBottom: 25,\n width: 500,\n lineHeight: '1.5em'\n }}\n >\n {isRemote && (\n <>\n <Text>\n This is a <strong>hosted file</strong> which we store to make it\n available for download on any device. You can delete it from our\n servers which will remove it from all of your devices.\n </Text>\n\n <ButtonWithLoading\n primary\n loading={loadingState === 'cloud'}\n style={{\n backgroundColor: colors.r4,\n alignSelf: 'center',\n border: 0,\n marginTop: 10,\n padding: '10px 30px',\n fontSize: 14\n }}\n onClick={onDeleteCloud}\n >\n Delete file from all devices\n </ButtonWithLoading>\n </>\n )}\n\n {file.id && (\n <>\n <Text style={[isRemote && { marginTop: 20 }]}>\n {isRemote ? (\n <Text>\n You can also delete just the local copy. This will remove\n all local data and the file will be listed as available for\n download.\n </Text>\n ) : (\n <Text>\n {file.state === 'broken' ? (\n <Text>\n This is a <strong>hosted file</strong> but it was\n created by another user. You can only delete the local\n copy.\n </Text>\n ) : (\n <Text>\n This a <strong>local file</strong> which is not stored\n on our servers.\n </Text>\n )}{' '}\n Deleting it will remove it and all of its backup\n permanently.\n </Text>\n )}\n </Text>\n\n <ButtonWithLoading\n primary={!isRemote}\n loading={loadingState === 'local'}\n style={[\n {\n alignSelf: 'center',\n marginTop: 10,\n padding: '10px 30px',\n fontSize: 14\n },\n isRemote\n ? {\n color: colors.r4,\n borderColor: colors.r4\n }\n : {\n border: 0,\n backgroundColor: colors.r4\n }\n ]}\n onClick={onDeleteLocal}\n >\n Delete file locally\n </ButtonWithLoading>\n </>\n )}\n </View>\n )}\n </Modal>\n );\n}\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport Component from '@reactions/component';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View } from 'loot-design/src/components/common';\nimport BudgetList from 'loot-design/src/components/manager/BudgetList';\nimport LoadBackup from 'loot-design/src/components/modals/LoadBackup';\nimport Import from 'loot-design/src/components/manager/Import';\nimport ImportYNAB4 from 'loot-design/src/components/manager/ImportYNAB4';\nimport ImportYNAB5 from 'loot-design/src/components/manager/ImportYNAB5';\nimport DeleteFile from 'loot-design/src/components/manager/DeleteFile';\nimport CreateEncryptionKey from '../modals/CreateEncryptionKey';\nimport FixEncryptionKey from '../modals/FixEncryptionKey';\nimport { colors } from 'loot-design/src/style';\n\nfunction Modals({\n modalStack,\n isHidden,\n allFiles,\n availableImports,\n globalPrefs,\n isLoggedIn,\n actions\n}) {\n let stack = modalStack.map(({ name, options }, idx) => {\n const modalProps = {\n onClose: actions.closeModal,\n onPush: actions.pushModal,\n onBack: actions.popModal,\n isCurrent: idx === modalStack.length - 1,\n isHidden,\n stackIndex: idx\n };\n\n switch (name) {\n case 'select-budget':\n return (\n <BudgetList\n key={name}\n modalProps={modalProps}\n files={allFiles}\n actions={actions}\n isLoggedIn={isLoggedIn}\n onDownload={cloudFileId => actions.downloadBudget(cloudFileId)}\n />\n );\n case 'delete-budget':\n return (\n <DeleteFile\n key={name}\n modalProps={modalProps}\n actions={actions}\n file={options.file}\n />\n );\n case 'import':\n return (\n <Import\n key={name}\n modalProps={modalProps}\n actions={actions}\n availableImports={availableImports}\n />\n );\n case 'import-ynab4':\n return (\n <ImportYNAB4 key={name} modalProps={modalProps} actions={actions} />\n );\n case 'import-ynab5':\n return (\n <ImportYNAB5 key={name} modalProps={modalProps} actions={actions} />\n );\n case 'load-backup': {\n return (\n <Component\n key={name}\n initialState={{ backups: [] }}\n didMount={async ({ setState }) => {\n setState({\n backups: await send('backups-get', { id: options.budgetId })\n });\n }}\n >\n {({ state }) => (\n <LoadBackup\n budgetId={options.budgetId}\n modalProps={{\n ...modalProps,\n onClose: actions.popModal\n }}\n backupDisabled={true}\n actions={actions}\n backups={state.backups}\n />\n )}\n </Component>\n );\n }\n case 'create-encryption-key':\n return (\n <CreateEncryptionKey\n key={name}\n modalProps={modalProps}\n actions={actions}\n options={options}\n />\n );\n case 'fix-encryption-key':\n return (\n <FixEncryptionKey\n key={name}\n modalProps={modalProps}\n actions={actions}\n options={options}\n />\n );\n default:\n throw new Error('Unknown modal: ' + name);\n }\n });\n\n return <View style={{ flex: 1, padding: 50 }}>{stack}</View>;\n}\n\nexport default connect(\n state => ({\n modalStack: state.modals.modalStack,\n isHidden: state.modals.isHidden,\n budgets: state.budgets.budgets,\n availableImports: state.budgets.availableImports,\n globalPrefs: state.prefs.global,\n allFiles: state.budgets.allFiles,\n isLoggedIn: !!state.user.data\n }),\n dispatch => ({ actions: bindActionCreators(actions, dispatch) })\n)(Modals);\n","import React, { useEffect, useState } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport {\n AnchorLink,\n Text,\n Button,\n ButtonLink,\n Input as BaseInput\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { send } from 'loot-core/src/platform/client/fetch';\n\n// There are two URLs that dance with each other: `/login` and\n// `/bootstrap`. Both of these URLs check the state of the the server\n// and make sure the user is looking at the right page. For example,\n// it doesn't make sense to show the login page if the server doesn't\n// have any accounts yet. It also doesn't make sense to show the\n// bootstrap page if the server already has been setup with a\n// password. Both pages will redirect to the other depending on state;\n// they will also potentially redirect to other pages which do *not*\n// do any checks.\nexport function useBootstrapped() {\n let [checked, setChecked] = useState(false);\n let history = useHistory();\n let location = useLocation();\n\n useEffect(() => {\n async function run() {\n let ensure = url => {\n if (location.pathname !== url) {\n history.push(url);\n } else {\n setChecked(true);\n }\n };\n\n let url = await send('get-server-url');\n if (url == null) {\n // A server hasn't been specified yet\n history.push('/config-server');\n } else {\n let { error, bootstrapped } = await send('subscribe-needs-bootstrap');\n if (error) {\n history.push('/error', { error });\n } else if (bootstrapped) {\n console.log('ensuring login');\n ensure('/login');\n } else {\n ensure('/bootstrap');\n }\n }\n }\n run();\n }, [history, location]);\n\n return { checked };\n}\n\nexport function getEmail(location) {\n let m = location.search.match(/email=([^&]*)/);\n if (!m) {\n return '';\n }\n return decodeURIComponent(m[1]);\n}\n\nexport function Title({ text }) {\n return (\n <Text\n style={{\n fontSize: 40,\n fontWeight: 700,\n color: colors.p3,\n marginBottom: 20\n }}\n >\n {text}\n </Text>\n );\n}\n\nexport const Input = React.forwardRef((props, ref) => {\n return (\n <BaseInput\n {...props}\n style={[\n {\n padding: 10,\n fontSize: 15,\n border: 'none',\n boxShadow: styles.shadow,\n ':focus': { border: 'none', boxShadow: styles.shadow }\n },\n props.style\n ]}\n />\n );\n});\n\nexport const BareButton = React.forwardRef((props, ref) => {\n return (\n <Button\n ref={ref}\n bare\n {...props}\n style={[\n {\n color: colors.p4,\n fontSize: 15,\n textDecoration: 'none',\n padding: '5px 7px',\n borderRadius: 4,\n ':hover': {\n backgroundColor: colors.n9\n },\n ':active': {\n backgroundColor: colors.n9\n }\n },\n props.style\n ]}\n />\n );\n});\n\nexport const ExternalLink = React.forwardRef((props, ref) => {\n let { href, ...linkProps } = props;\n return (\n <BareButton\n to=\"/\"\n {...linkProps}\n onClick={e => {\n e.preventDefault();\n window.Actual.openURLInBrowser(href);\n }}\n />\n );\n});\n\nexport const BackLink = React.forwardRef((props, ref) => {\n return (\n <BareButton\n ref={ref}\n to=\"/\"\n onClick={e => {\n e.preventDefault();\n props.history.goBack();\n }}\n >\n Back\n </BareButton>\n );\n});\n\nexport function Paragraph({ style, children }) {\n return (\n <Text\n style={[\n {\n fontSize: 15,\n color: colors.n2,\n lineHeight: 1.5,\n marginTop: 20\n },\n style\n ]}\n >\n {children}\n </Text>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Button,\n ButtonWithLoading\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { loggedIn } from 'loot-core/src/client/actions/user';\nimport { createBudget } from 'loot-core/src/client/actions/budgets';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { useBootstrapped, Title, Input, Link, ExternalLink } from './common';\n\nexport default function Login() {\n let dispatch = useDispatch();\n let history = useHistory();\n let [password, setPassword] = useState('');\n let [loading, setLoading] = useState(false);\n let [error, setError] = useState(null);\n\n let { checked } = useBootstrapped();\n\n function getErrorMessage(error) {\n switch (error) {\n case 'invalid-password':\n return 'Invalid password';\n case 'network-failure':\n return 'Unable to contact the server';\n default:\n return \"Whoops, an error occurred on our side! We'll try to get it fixed soon.\";\n }\n }\n\n async function onSubmit(e) {\n e.preventDefault();\n if (password === '' || loading) {\n return;\n }\n\n setError(null);\n setLoading(true);\n let { error } = await send('subscribe-sign-in', { password });\n setLoading(false);\n\n if (error) {\n setError(error);\n } else {\n dispatch(loggedIn());\n }\n }\n\n async function onDemo() {\n await dispatch(createBudget({ demoMode: true }));\n }\n\n if (!checked) {\n return null;\n }\n\n return (\n <>\n <View style={{ width: 450, marginTop: -30 }}>\n <Title text=\"Sign in to this Actual instance\" />\n <Text\n style={{\n fontSize: 16,\n color: colors.n2,\n lineHeight: 1.4\n }}\n >\n If you lost your password, you likely still have access to your server\n to manually reset it.\n </Text>\n\n {error && (\n <Text\n style={{\n marginTop: 20,\n color: colors.r4,\n borderRadius: 4,\n fontSize: 15\n }}\n >\n {getErrorMessage(error)}\n </Text>\n )}\n\n <form\n style={{ display: 'flex', flexDirection: 'row', marginTop: 30 }}\n onSubmit={onSubmit}\n >\n <Input\n autoFocus={true}\n placeholder=\"Password\"\n type=\"password\"\n onChange={e => setPassword(e.target.value)}\n style={{ flex: 1, marginRight: 10 }}\n />\n <ButtonWithLoading primary loading={loading} style={{ fontSize: 15 }}>\n Sign in\n </ButtonWithLoading>\n </form>\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'center',\n marginTop: 15\n }}\n >\n <Button\n bare\n style={{ fontSize: 15, color: colors.b4, marginLeft: 10 }}\n onClick={onDemo}\n >\n Try Demo &rarr;\n </Button>\n </View>\n </View>\n </>\n );\n}\n","import React, { useState } from 'react';\nimport {\n View,\n Button,\n ButtonWithLoading\n} from 'loot-design/src/components/common';\nimport { Input } from './common';\n\nexport function ConfirmPasswordForm({ buttons, onSetPassword, onError }) {\n let [password1, setPassword1] = useState('');\n let [password2, setPassword2] = useState('');\n let [showPassword, setShowPassword] = useState(false);\n let [loading, setLoading] = useState(false);\n\n async function onSubmit(e) {\n e.preventDefault();\n if (loading) {\n return;\n }\n\n if (password1 === password2) {\n setLoading(true);\n await onSetPassword(password1);\n setLoading(false);\n } else {\n onError('password-match');\n }\n }\n\n function onShowPassword(e) {\n setShowPassword(e.target.checked);\n }\n\n return (\n <form\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n marginTop: 30\n }}\n onSubmit={onSubmit}\n >\n <Input\n autoFocus={true}\n placeholder=\"Password\"\n type={showPassword ? 'text' : 'password'}\n value={password1}\n onChange={e => setPassword1(e.target.value)}\n />\n <Input\n placeholder=\"Confirm password\"\n type={showPassword ? 'text' : 'password'}\n value={password2}\n onChange={e => setPassword2(e.target.value)}\n style={{ marginTop: 10 }}\n />\n\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n fontSize: 15,\n marginTop: 20\n }}\n >\n <label style={{ userSelect: 'none' }}>\n <input type=\"checkbox\" onChange={onShowPassword} /> Show password\n </label>\n <View style={{ flex: 1 }} />\n {buttons}\n <ButtonWithLoading\n primary\n loading={loading}\n >\n OK\n </ButtonWithLoading>\n </View>\n </form>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View, Text, Button } from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { loggedIn } from 'loot-core/src/client/actions/user';\nimport { createBudget } from 'loot-core/src/client/actions/budgets';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { ConfirmPasswordForm } from './ConfirmPasswordForm';\nimport { useBootstrapped, Title, Input, Link, ExternalLink } from './common';\n\nexport default function Bootstrap() {\n let dispatch = useDispatch();\n let history = useHistory();\n let [error, setError] = useState(null);\n\n let { checked } = useBootstrapped();\n\n function getErrorMessage(error) {\n switch (error) {\n case 'invalid-password':\n return 'Password cannot be empty';\n case 'password-match':\n return 'Passwords do not match';\n case 'network-failure':\n return 'Unable to contact the server';\n default:\n return \"Whoops, an error occurred on our side! We'll try to get it fixed soon.\";\n }\n }\n\n async function onSetPassword(password) {\n setError(null);\n let { error } = await send('subscribe-bootstrap', { password });\n\n if (error) {\n setError(error);\n } else {\n dispatch(loggedIn());\n }\n }\n\n async function onDemo() {\n await dispatch(createBudget({ demoMode: true }));\n }\n\n if (!checked) {\n return null;\n }\n\n return (\n <>\n <View style={{ width: 450, marginTop: -30 }}>\n <Title text=\"Bootstrap this Actual instance\" />\n <Text\n style={{\n fontSize: 16,\n color: colors.n2,\n lineHeight: 1.4\n }}\n >\n Set a password for this server instance\n </Text>\n\n {error && (\n <Text\n style={{\n marginTop: 20,\n color: colors.r4,\n borderRadius: 4,\n fontSize: 15\n }}\n >\n {getErrorMessage(error)}\n </Text>\n )}\n\n <ConfirmPasswordForm\n buttons={\n <Button\n bare\n style={{ fontSize: 15, color: colors.b4, marginRight: 15 }}\n onClick={onDemo}\n >\n Try Demo\n </Button>\n }\n onSetPassword={onSetPassword}\n onError={setError}\n />\n </View>\n </>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport {\n View,\n Text,\n Button,\n ButtonWithLoading\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\n\nfunction getErrorMessage(reason) {\n switch (reason) {\n case 'network-failure':\n return 'Unable to access server. Make sure the configured URL for the server is accessible.';\n default:\n return 'Server returned an error while checking its status.';\n }\n}\n\nexport default function Error() {\n let history = useHistory();\n let location = useLocation();\n let { error } = location.state || {};\n\n function onTryAgain() {\n history.push('/');\n }\n\n return (\n <View style={{ alignItems: 'center' }}>\n <Text\n style={{\n fontSize: 16,\n color: colors.n2,\n lineHeight: 1.4\n }}\n >\n {getErrorMessage(error)}\n </Text>\n <Button onClick={onTryAgain} style={{ marginTop: 20 }}>\n Try again\n </Button>\n </View>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Button,\n ButtonWithLoading\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { loggedIn } from 'loot-core/src/client/actions/user';\nimport { createBudget } from 'loot-core/src/client/actions/budgets';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { ConfirmPasswordForm } from './ConfirmPasswordForm';\nimport { useBootstrapped, Title, Input, Link, ExternalLink } from './common';\n\nexport default function ChangePassword() {\n let dispatch = useDispatch();\n let history = useHistory();\n let [error, setError] = useState(null);\n let [msg, setMessage] = useState(null);\n\n function getErrorMessage(error) {\n switch (error) {\n case 'invalid-password':\n return 'Password cannot be empty';\n case 'password-match':\n return 'Passwords do not match';\n case 'network-failure':\n return 'Unable to contact the server';\n default:\n return 'Internal server error';\n }\n }\n\n async function onSetPassword(password) {\n setError(null);\n let { error } = await send('subscribe-change-password', { password });\n\n if (error) {\n setError(error);\n } else {\n setMessage('Password successfully changed');\n\n setTimeout(() => {\n history.push('/');\n }, 1500);\n }\n }\n\n return (\n <>\n <View style={{ width: 500, marginTop: -30 }}>\n <Title text=\"Change server password\" />\n <Text\n style={{\n fontSize: 16,\n color: colors.n2,\n lineHeight: 1.4\n }}\n >\n This will change the password for this server instance. All existing\n sessions will stay logged in.\n </Text>\n\n {error && (\n <Text\n style={{\n marginTop: 20,\n color: colors.r4,\n borderRadius: 4,\n fontSize: 15\n }}\n >\n {getErrorMessage(error)}\n </Text>\n )}\n\n {msg && (\n <Text\n style={{\n marginTop: 20,\n color: colors.g4,\n borderRadius: 4,\n fontSize: 15\n }}\n >\n {msg}\n </Text>\n )}\n\n <ConfirmPasswordForm\n buttons={\n <Button\n bare\n type=\"button\"\n style={{ fontSize: 15, marginRight: 10 }}\n onClick={() => history.push('/')}\n >\n Cancel\n </Button>\n }\n onSetPassword={onSetPassword}\n onError={setError}\n />\n </View>\n </>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Button,\n ButtonWithLoading\n} from 'loot-design/src/components/common';\nimport { colors, styles } from 'loot-design/src/style';\nimport { signOut } from 'loot-core/src/client/actions/user';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n useBootstrapped,\n Title,\n Input,\n Link,\n ExternalLink\n} from './subscribe/common';\n\nexport default function ConfigServer() {\n let dispatch = useDispatch();\n let history = useHistory();\n let [url, setUrl] = useState('');\n let [loading, setLoading] = useState(false);\n let [error, setError] = useState(null);\n\n let [currentUrl, setCurrentUrl] = useState(null);\n\n useEffect(() => {\n async function run() {\n let url = await send('get-server-url');\n setUrl(url);\n setCurrentUrl(url);\n }\n run();\n }, []);\n\n function getErrorMessage(error) {\n switch (error) {\n case 'network-failure':\n return 'Server is not running at this URL';\n default:\n return 'Server does not look like an Actual server. Is it set up correctly?';\n }\n }\n\n async function onSubmit(e) {\n e.preventDefault();\n if (url === '' || loading) {\n return;\n }\n\n setError(null);\n setLoading(true);\n let { error } = await send('set-server-url', { url });\n setLoading(false);\n\n if (error) {\n setError(error);\n } else {\n await dispatch(signOut());\n history.push('/');\n }\n }\n\n return (\n <>\n <View style={{ width: 500, marginTop: -30 }}>\n <Title text=\"Where's the server?\" />\n\n <Text\n style={{\n fontSize: 16,\n color: colors.n2,\n lineHeight: 1.5\n }}\n >\n {currentUrl ? (\n <>\n Existing sessions will be logged out and you will log in to this\n server. We will validate that Actual is running at this URL.\n </>\n ) : (\n <>\n There is no server configured. After running the server, specify\n the URL here to use the app. You can always change this later. We\n will validate that Actual is running at this URL.\n </>\n )}\n </Text>\n\n {error && (\n <Text\n style={{\n marginTop: 20,\n color: colors.r4,\n borderRadius: 4,\n fontSize: 15\n }}\n >\n {getErrorMessage(error)}\n </Text>\n )}\n\n <form\n style={{ display: 'flex', flexDirection: 'row', marginTop: 30 }}\n onSubmit={onSubmit}\n >\n <Input\n autoFocus={true}\n placeholder={'https://example.com'}\n value={url}\n onChange={e => setUrl(e.target.value)}\n style={{ flex: 1, marginRight: 10 }}\n />\n <ButtonWithLoading primary loading={loading} style={{ fontSize: 15 }}>\n OK\n </ButtonWithLoading>\n <Button\n bare\n type=\"button\"\n loading={loading}\n style={{ fontSize: 15, marginLeft: 10 }}\n onClick={() => history.goBack()}\n >\n Cancel\n </Button>\n </form>\n </View>\n </>\n );\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { createBrowserHistory } from 'history';\nimport { Switch, Redirect, Router, Route } from 'react-router-dom';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport * as actions from 'loot-core/src/client/actions';\nimport { View, ExternalLink, Button } from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\nimport ServerURL from './ServerURL';\nimport LoggedInUser from '../LoggedInUser';\nimport Notifications from '../Notifications';\n\nimport Modals from './Modals';\nimport Login from './subscribe/Login';\nimport Bootstrap from './subscribe/Bootstrap';\nimport Error from './subscribe/Error';\nimport ChangePassword from './subscribe/ChangePassword';\nimport ConfigServer from './ConfigServer';\n\nfunction Version() {\n return (\n <ExternalLink\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n color: colors.n7,\n margin: 15,\n marginRight: 17,\n ':hover': { color: colors.n2 },\n zIndex: 5001\n }}\n href={'https://actualbudget.com/blog/' + window.Actual.ACTUAL_VERSION}\n >\n {window.Actual.ACTUAL_VERSION}\n </ExternalLink>\n );\n}\n\nclass ManagementApp extends React.Component {\n constructor(props) {\n super(props);\n this.mounted = true;\n this.history = createBrowserHistory();\n window.__history = this.history;\n console.log('SETTING', window.__history);\n }\n\n async componentDidMount() {\n // An action may have been triggered from outside, and we don't\n // want to override its loading message so we only show the\n // initial loader if there isn't already a message\n let alreadyLoading = this.props.loadingText != null;\n\n // Remember: this component is remounted every time the user\n // closes a budget. That's why we keep `managerHasInitialized` in\n // redux so that it persists across renders. This will show the\n // loading spinner on first run, but never again since we'll have\n // a cached list of files and can show them\n if (!this.props.managerHasInitialized) {\n if (!alreadyLoading) {\n this.props.setAppState({ loadingText: '' });\n }\n } else {\n // If it's not the first time rendering, immediately show the\n // modal since we should have cached data\n this.showModal();\n }\n\n let userData = await this.props.getUserData();\n if (userData) {\n await this.props.loadAllFiles();\n }\n\n // TODO: There is a race condition here. The user could perform an\n // action that starts loading in between where `alreadyLoading`\n // was captured and this would clear it. We really only want to\n // ever clear the initial loading screen, so we need a \"loading\n // id\" of some kind.\n this.props.setAppState({\n managerHasInitialized: true,\n ...(!alreadyLoading ? { loadingText: null } : null)\n });\n }\n\n async showModal() {\n // This runs when `files` has changed, and we need to perform\n // actions based on whether or not files is empty or not\n if (this.props.managerHasInitialized) {\n let { currentModals, userData, files, replaceModal } = this.props;\n\n // We want to decide where to take the user if they have logged\n // in and we've tried to load their files\n if (files && userData) {\n if (files.length > 0) {\n // If the user is logged in and files exist, show the budget\n // list screen\n if (!currentModals.includes('select-budget')) {\n replaceModal('select-budget');\n }\n } else {\n // If the user is logged in and there's no existing files,\n // automatically create one. This will load the budget and\n // swap out the manager with the new budget, so there's\n // nothing else we need to do\n this.props.createBudget();\n }\n }\n }\n }\n\n componentDidUpdate(prevProps) {\n if (!this.mounted) {\n return;\n }\n\n if (\n this.props.managerHasInitialized !== prevProps.managerHasInitialized ||\n this.props.files !== prevProps.files ||\n this.props.userData !== prevProps.userData\n ) {\n this.showModal();\n }\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n render() {\n let { userData, managerHasInitialized, loadingText } = this.props;\n\n if (!managerHasInitialized) {\n return null;\n }\n\n let isHidden = loadingText != null;\n\n console.log('his', this.history.location);\n\n return (\n <Router history={this.history}>\n <View style={{ height: '100%', minHeight: 500 }}>\n <View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: 40,\n WebkitAppRegion: 'drag'\n }}\n />\n <View\n style={{\n position: 'absolute',\n bottom: 40,\n right: 15\n }}\n >\n <Notifications\n style={{\n position: 'relative',\n left: 'initial',\n right: 'initial'\n }}\n />\n </View>\n\n {!isHidden && (\n <View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n justifyContent: 'center',\n alignItems: 'center'\n }}\n >\n {userData ? (\n <>\n <Switch>\n <Route\n exact\n path=\"/config-server\"\n component={ConfigServer}\n />\n <Route\n exact\n path=\"/change-password\"\n component={ChangePassword}\n />\n <Route exact path=\"/\" component={Modals} />\n {/* Redirect all other pages to this route */}\n <Route path=\"/\" render={() => <Redirect to=\"/\" />} />\n </Switch>\n\n <View\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n padding: '6px 10px',\n zIndex: 4000\n }}\n >\n <LoggedInUser />\n </View>\n </>\n ) : (\n <Switch>\n <Route exact path=\"/login\" component={Login} />\n <Route exact path=\"/error\" component={Error} />\n <Route exact path=\"/config-server\" component={ConfigServer} />\n <Route exact path=\"/bootstrap\" component={Bootstrap} />\n {/* Redirect all other pages to this route */}\n <Route path=\"/\" render={() => <Redirect to=\"/bootstrap\" />} />\n </Switch>\n )}\n </View>\n )}\n\n <ServerURL />\n <Version />\n </View>\n </Router>\n );\n }\n}\n\nexport default connect(\n state => {\n let { modalStack } = state.modals;\n\n return {\n files: state.budgets.allFiles,\n userData: state.user.data,\n managerHasInitialized: state.app.managerHasInitialized,\n loadingText: state.app.loadingText,\n currentModals: modalStack.map(modal => modal.name)\n };\n },\n actions\n)(ManagementApp);\n","import React from 'react';\n\nconst SvgClose = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgClose;\n","import React from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n View,\n Text,\n Block,\n Link,\n Button\n} from 'loot-design/src/components/common';\nimport { colors } from 'loot-design/src/style';\nimport Close from 'loot-design/src/svg/v1/Close';\n\nfunction closeNotification(setAppState) {\n // Set a flag to never show an update notification again for this session\n setAppState({\n updateInfo: null,\n showUpdateNotification: false\n });\n}\n\nfunction UpdateNotification({\n updateInfo,\n showUpdateNotification,\n updateApp,\n setAppState\n}) {\n if (updateInfo && showUpdateNotification) {\n let notes = updateInfo.releaseNotes;\n\n return (\n <View\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n margin: '15px 17px',\n backgroundColor: colors.p6,\n color: 'white',\n padding: '7px 10px',\n borderRadius: 4,\n zIndex: 10000,\n maxWidth: 450\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n <View style={{ marginRight: 10, fontWeight: 700 }}>\n <Text>App updated to {updateInfo.version}</Text>\n </View>\n <View style={{ flex: 1 }} />\n <View style={{ marginTop: -1 }}>\n <Text>\n <Link\n onClick={updateApp}\n style={{ color: 'white', textDecoration: 'underline' }}\n >\n Restart\n </Link>{' '}\n (\n <Link\n style={{ color: 'white', textDecoration: 'underline' }}\n onClick={() =>\n window.Actual.openURLInBrowser(\n 'https://actualbudget.com/blog/' + updateInfo.version\n )\n }\n >\n notes\n </Link>\n )\n <Button\n bare\n style={{ display: 'inline', padding: '1px 7px 2px 7px' }}\n onClick={() => closeNotification(setAppState)}\n >\n <Close width={9} style={{ color: 'white' }} />\n </Button>\n </Text>\n </View>\n </View>\n {notes && (\n <View style={{ marginTop: 10, fontWeight: 500 }}>{notes}</View>\n )}\n </View>\n );\n }\n\n return null;\n}\n\nexport default connect(\n state => ({\n updateInfo: state.app.updateInfo,\n showUpdateNotification: state.app.showUpdateNotification\n }),\n dispatch => bindActionCreators(actions, dispatch)\n)(UpdateNotification);\n","import * as Sentry from '@sentry/browser';\nimport { SentryMetricIntegration } from '@jlongster/sentry-metrics-actual';\nimport { initBackend as initSQLBackend } from 'absurd-sql/dist/indexeddb-main-thread';\n// eslint-disable-next-line import/no-webpack-loader-syntax\nimport BackendWorker from 'worker-loader!./browser-server';\n\n// This file installs global variables that the app expects.\n// Normally these are already provided by electron, but in a real\n// browser environment this is where we initialize the backend and\n// everything else.\n\nlet IS_DEV = process.env.NODE_ENV === 'development';\nlet IS_PERF_BUILD = process.env.PERF_BUILD != null;\nlet ACTUAL_VERSION = process.env.REACT_APP_ACTUAL_VERSION;\n\nif (!IS_DEV) {\n Sentry.init({\n dsn: 'https://9e6094adfc9f43b5b5b9994cee44d7c2@sentry.io/5169928',\n release: ACTUAL_VERSION,\n ignoreErrors: ['ResizeObserver loop'],\n integrations: [\n new SentryMetricIntegration({\n url: 'https://sync.actualbudget.com/metrics',\n metric: 'app-errors',\n dimensions: { platform: 'web' }\n })\n ]\n });\n\n window.SentryClient = Sentry;\n}\n\n// *** Start the backend ***\nlet worker;\n\nfunction createBackendWorker() {\n worker = new BackendWorker();\n initSQLBackend(worker);\n\n worker.postMessage({\n type: 'init',\n version: ACTUAL_VERSION,\n isDev: IS_DEV,\n hash: process.env.REACT_APP_BACKEND_WORKER_HASH\n });\n\n if (IS_DEV || IS_PERF_BUILD) {\n worker.addEventListener('message', e => {\n if (e.data.type === '__actual:backend-running') {\n let activity = document.querySelector('.debugger .activity');\n if (activity) {\n let original = window.getComputedStyle(activity)['background-color'];\n activity.style.transition = 'none';\n activity.style.backgroundColor = '#3EBD93';\n setTimeout(() => {\n activity.style.transition = 'background-color 1s';\n activity.style.backgroundColor = original;\n }, 100);\n }\n }\n });\n\n import('perf-deets/frontend').then(({ listenForPerfData }) => {\n listenForPerfData(worker);\n });\n }\n}\n\ncreateBackendWorker();\n\nglobal.SentryClient = Sentry;\n\nif (IS_DEV || IS_PERF_BUILD) {\n import('perf-deets/frontend').then(({ listenForPerfData }) => {\n listenForPerfData(window);\n\n global.__startProfile = () => {\n window.postMessage({ type: '__perf-deets:start-profile' });\n worker.postMessage({ type: '__perf-deets:start-profile' });\n };\n global.__stopProfile = () => {\n window.postMessage({ type: '__perf-deets:stop-profile' });\n worker.postMessage({ type: '__perf-deets:stop-profile' });\n };\n });\n}\n\nglobal.Actual = {\n IS_DEV,\n ACTUAL_VERSION,\n IS_FAKE_WEB: true,\n IS_BETA: process.env.REACT_APP_RELEASE_TYPE === 'beta',\n\n logToTerminal: (...args) => {\n console.log(...args);\n },\n\n relaunch: () => {\n window.location.reload();\n },\n\n openFileDialog: async ({ filters = [], properties }) => {\n return new Promise(resolve => {\n let input = document.createElement('input');\n input.type = 'file';\n\n let filter = filters.find(filter => filter.extensions);\n if (filter) {\n input.accept = filter.extensions.map(ext => '.' + ext).join(',');\n }\n\n input.style.position = 'absolute';\n input.style.top = '0px';\n input.style.left = '0px';\n input.dispatchEvent(\n new MouseEvent('click', {\n view: window,\n bubbles: true,\n cancelable: true\n })\n );\n\n input.addEventListener('change', e => {\n let file = e.target.files[0];\n let filename = file.name.replace(/.*(\\.[^.]*)/, 'file$1');\n\n if (file) {\n var reader = new FileReader();\n reader.readAsArrayBuffer(file);\n reader.onload = async function(ev) {\n let filepath = `/uploads/${filename}`;\n\n window.__actionsForMenu\n .uploadFile(filename, ev.target.result)\n .then(() => resolve([filepath]));\n };\n reader.onerror = function(ev) {\n alert('Error reading file');\n };\n }\n });\n });\n },\n\n saveFile: (contents, defaultFilename, dialogTitle) => {\n const temp = document.createElement('a');\n temp.style = 'display: none';\n temp.download = defaultFilename;\n temp.rel = 'noopener';\n\n const blob = new Blob([contents]);\n temp.href = URL.createObjectURL(blob);\n temp.dispatchEvent(new MouseEvent('click'));\n },\n\n openURLInBrowser: url => {\n window.open(url, '_blank');\n },\n onEventFromMain: (type, handler) => {},\n applyAppUpdate: () => {},\n updateAppMenu: isBudgetOpen => {},\n\n ipcConnect: () => {},\n getServerSocket: async () => {\n return worker;\n }\n};\n\nif (IS_DEV) {\n global.Actual.reloadBackend = () => {\n worker.postMessage({ type: '__actual:shutdown' });\n createBackendWorker();\n };\n}\n\ndocument.addEventListener('keydown', e => {\n if (e.metaKey || e.ctrlKey) {\n // Cmd/Ctrl+o\n if (e.keyCode === 79) {\n e.preventDefault();\n window.__actionsForMenu.closeBudget();\n }\n // Cmd/Ctrl+z\n else if (e.keyCode === 90) {\n if (e.shiftKey) {\n // Redo\n window.__actionsForMenu.redo();\n } else {\n // Undo\n window.__actionsForMenu.undo();\n }\n }\n }\n});\n","/* global SentryClient */\n\nexport function captureException(exc) {\n console.log('[Exception]', exc);\n SentryClient.captureException(exc);\n}\n\nexport function captureBreadcrumb(breadcrumb) {\n SentryClient.addBreadcrumb(breadcrumb);\n}\n","import React from 'react';\nimport { css } from 'glamor';\n\nfunction View(props) {\n // The default styles are special-cased and pulled out into static\n // styles, and hardcode the class name here. View is used almost\n // everywhere and we can avoid any perf penalty that glamor would\n // incur.\n\n const { style, nativeStyle, innerRef, ...restProps } = props;\n return (\n <div\n {...restProps}\n ref={innerRef}\n style={nativeStyle}\n className={`view ${props.className || ''} ${css(props.style)}`}\n />\n );\n}\n\nexport default View;\n","import constants from '../constants';\n\nexport function pushModal(name, options) {\n return { type: constants.PUSH_MODAL, name, options };\n}\n\nexport function replaceModal(name, options) {\n return { type: constants.REPLACE_MODAL, name, options };\n}\n\nexport function hideModals() {\n return { type: constants.HIDE_MODALS };\n}\n\nexport function showModals() {\n return { type: constants.SHOW_MODALS };\n}\n\nexport function popModal() {\n return { type: constants.POP_MODAL };\n}\n\nexport function closeModal() {\n return { type: constants.CLOSE_MODAL };\n}\n","const isWindows =\n navigator.platform && navigator.platform.toLowerCase() === 'win32';\n\nconst isMac =\n navigator.platform && navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n\nconst isProbablySafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n);\n\nexport default {\n OS: isWindows ? 'windows' : isMac ? 'mac' : 'linux',\n env: 'web',\n isBrowser: !!window.Actual.IS_FAKE_WEB,\n isReactNativeWeb: false,\n isProbablySafari\n};\n","import constants from '../constants';\n\nexport const initialState = {\n loadingText: null,\n updateInfo: null,\n showUpdateNotification: true,\n managerHasInitialized: false,\n lastUndoState: { current: null },\n lastSplitState: { current: null }\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.SET_APP_STATE:\n return {\n ...state,\n ...action.state\n };\n case constants.SET_LAST_UNDO_STATE:\n // Intentionally mutate it. Components should never rerender\n // looking at this, so we put it in a \"box\" like a ref. They\n // only ever need to look at this on mount.\n state.lastUndoState.current = action.undoState;\n return state;\n\n case constants.SET_LAST_SPLIT_STATE:\n state.lastSplitState.current = action.splitState;\n return state;\n\n default:\n }\n return state;\n}\n","import constants from '../constants';\n\nconst initialState = {\n banks: [],\n failedAccounts: new Map(),\n accountsSyncing: null\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.LOAD_BANKS:\n return {\n ...state,\n banks: action.banks\n };\n case constants.SET_ACCOUNTS_SYNCING:\n return {\n ...state,\n accountsSyncing: action.name\n };\n case constants.ACCOUNT_SYNC_STATUS: {\n let failedAccounts = new Map(state.failedAccounts);\n if (action.failed) {\n failedAccounts.set(action.id, {\n type: action.errorType,\n code: action.errorCode\n });\n } else {\n failedAccounts.delete(action.id);\n }\n\n return { ...state, failedAccounts };\n }\n case constants.ACCOUNT_SYNC_FAILURES: {\n let failures = new Map();\n action.syncErrors.forEach(error => {\n failures.set(error.id, {\n type: error.type,\n code: error.code\n });\n });\n\n return { ...state, failedAccounts: failures };\n }\n default:\n }\n return state;\n}\n","import constants from '../constants';\n\nconst initialState = {\n selectedCell: null\n};\n\nfunction update(state = initialState, action) {\n switch (action.type) {\n case constants.DEBUG_CELL:\n return {\n ...state,\n selectedCell: action.sheet\n ? { sheet: action.sheet, name: action.name }\n : null\n };\n default:\n }\n return state;\n}\n\nexport default update;\n","import constants from '../constants';\n\nconst initialState = {};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.SET_PROFILE:\n return {\n ...state,\n ...action.profile\n };\n default:\n }\n return state;\n}\n","import constants from '../constants';\nimport { setNumberFormat } from '../../shared/util.js';\n\nconst initialState = {\n local: null,\n global: null\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.SET_PREFS:\n if (action.prefs) {\n setNumberFormat(action.prefs.numberFormat || 'comma-dot');\n }\n return { local: action.prefs, global: action.globalPrefs };\n case constants.MERGE_LOCAL_PREFS:\n if (action.prefs.numberFormat) {\n setNumberFormat(action.prefs.numberFormat);\n }\n\n return {\n ...state,\n local: { ...state.local, ...action.prefs }\n };\n case constants.MERGE_GLOBAL_PREFS:\n return {\n ...state,\n global: { ...state.global, ...action.globalPrefs }\n };\n\n default:\n }\n return state;\n}\n","import constants from '../constants';\n\nconst initialState = {\n modalStack: [],\n isHidden: false\n};\n\nfunction update(state = initialState, action) {\n switch (action.type) {\n case constants.PUSH_MODAL:\n return {\n ...state,\n modalStack: [\n ...state.modalStack,\n { name: action.name, options: action.options }\n ]\n };\n case constants.REPLACE_MODAL:\n return {\n ...state,\n modalStack: [{ name: action.name, options: action.options }]\n };\n case constants.POP_MODAL:\n return { ...state, modalStack: state.modalStack.slice(0, -1) };\n case constants.CLOSE_MODAL:\n return { ...state, modalStack: [] };\n case constants.HIDE_MODALS:\n return { ...state, isHidden: true };\n case constants.SHOW_MODALS:\n return { ...state, isHidden: false };\n case constants.SET_APP_STATE:\n if ('loadingText' in action.state) {\n return {\n ...state,\n isHidden: action.state.loadingText != null\n };\n }\n break;\n case constants.SIGN_OUT:\n return initialState;\n default:\n }\n\n return state;\n}\n\nexport default update;\n","import constants from '../constants';\n\nconst initialState = {\n notifications: []\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.ADD_NOTIFICATION:\n if (state.notifications.find(n => n.id === action.notification.id)) {\n return state;\n }\n\n return {\n ...state,\n notifications: [...state.notifications, action.notification]\n };\n case constants.REMOVE_NOTIFICATION:\n return {\n ...state,\n notifications: state.notifications.filter(n => n.id !== action.id)\n };\n default:\n }\n\n return state;\n}\n","import constants from '../constants';\n\nfunction sortFiles(arr) {\n arr.sort((x, y) => {\n let name1 = x.name.toLowerCase();\n let name2 = y.name.toLowerCase();\n let i = name1 < name2 ? -1 : name1 > name2 ? 1 : 0;\n if (i === 0) {\n i = x.id < y.id ? -1 : x.id > y.id ? 1 : 0;\n }\n return i;\n });\n return arr;\n}\n\n// States of a file:\n// 1. local - Only local (not uploaded/synced)\n// 2. remote - Unavailable locally, available to download\n// 3. synced - Downloaded & synced\n// 4. detached - Downloaded but broken group id (reset sync state)\n// 5. broken - user shouldn't have access to this file\n// 6. unknown - user is offline so can't determine the status\nexport function reconcileFiles(localFiles, remoteFiles) {\n let reconciled = new Set();\n\n let files = localFiles.map(localFile => {\n if (localFile.cloudFileId) {\n // This is the case where for some reason getting the files from\n // the server failed. We don't want to scare the user, just show\n // an unknown state and tell them it'll be OK once they come\n // back online\n\n if (remoteFiles == null) {\n return { ...localFile, state: 'unknown' };\n }\n\n let remote = remoteFiles.find(f => localFile.cloudFileId === f.fileId);\n if (remote) {\n // Mark reconciled\n reconciled.add(remote.fileId);\n\n if (remote.groupId === localFile.groupId) {\n return {\n ...localFile,\n name: remote.name,\n deleted: remote.deleted,\n encryptKeyId: remote.encryptKeyId,\n hasKey: remote.hasKey,\n state: 'synced'\n };\n } else {\n return {\n ...localFile,\n name: remote.name,\n deleted: remote.deleted,\n encryptKeyId: remote.encryptKeyId,\n hasKey: remote.hasKey,\n state: 'detached'\n };\n }\n } else {\n return { ...localFile, state: 'broken' };\n }\n } else {\n return { ...localFile, state: 'local' };\n }\n });\n\n let sorted = sortFiles(\n files\n .concat(\n (remoteFiles || [])\n .filter(f => !reconciled.has(f.fileId))\n .map(f => {\n return {\n cloudFileId: f.fileId,\n groupId: f.groupId,\n name: f.name,\n deleted: f.deleted,\n encryptKeyId: f.encryptKeyId,\n hasKey: f.hasKey,\n state: 'remote'\n };\n })\n )\n .filter(f => !f.deleted)\n );\n\n // One last pass to list all the broken (unauthorized) files at the\n // bottom\n return sorted\n .filter(f => f.state !== 'broken')\n .concat(sorted.filter(f => f.state === 'broken'));\n}\n\nconst initialState = {\n budgets: [],\n availableImports: [],\n remoteFiles: null,\n allFiles: null\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.SET_BUDGETS:\n return {\n ...state,\n budgets: action.budgets,\n allFiles: reconcileFiles(action.budgets, state.remoteFiles)\n };\n case constants.SET_REMOTE_FILES:\n return {\n ...state,\n remoteFiles: action.files,\n allFiles: reconcileFiles(state.budgets, action.files)\n };\n case constants.SET_ALL_FILES:\n return {\n ...state,\n budgets: action.budgetes,\n remoteFiles: action.remoteFiles,\n allFiles: reconcileFiles(action.budgets, action.remoteFiles)\n };\n case constants.SET_AVAILABLE_IMPORTS:\n return {\n ...state,\n availableImports: action.imports\n };\n case constants.SIGN_OUT:\n // If the user logs out, make sure to reset all the files\n return { ...state, allFiles: null };\n default:\n }\n return state;\n}\n","import constants from '../constants';\n\nconst initialState = {\n stage: null,\n fromYNAB: false\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.SET_TUTORIAL_STAGE:\n return {\n ...state,\n deactivated: false,\n stage: action.stage,\n fromYNAB: 'fromYNAB' in action ? action.fromYNAB : state.fromYNAB\n };\n case constants.DEACTIVATE_TUTORIAL:\n return { ...state, stage: null };\n default:\n }\n\n return state;\n}\n","import constants from '../constants';\n\nconst initialState = {\n data: null\n};\n\nexport default function update(state = initialState, action) {\n switch (action.type) {\n case constants.GET_USER_DATA:\n return { ...state, data: action.data };\n default:\n }\n\n return state;\n}\n","import app from './app';\nimport queries from './queries';\nimport account from './account';\nimport debug from './debug';\nimport profile from './profile';\nimport prefs from './prefs';\nimport modals from './modals';\nimport notifications from './notifications';\nimport budgets from './budgets';\nimport tutorial from './tutorial';\nimport user from './user';\n\nexport default {\n app,\n queries,\n account,\n debug,\n profile,\n prefs,\n modals,\n notifications,\n budgets,\n tutorial,\n user\n};\n","// This file will initialize the app if we are in a real browser\n// environment (not electron)\nimport './browser-preload';\n\n// A hack for now: this makes sure it's appended before glamor\nimport '@reach/listbox/styles.css';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './components/App';\nimport {\n createStore,\n combineReducers,\n applyMiddleware,\n bindActionCreators\n} from 'redux';\nimport { Provider } from 'react-redux';\nimport constants from 'loot-core/src/client/constants';\nimport reducers from 'loot-core/src/client/reducers';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport q, { runQuery } from 'loot-core/src/client/query-helpers';\nimport * as actions from 'loot-core/src/client/actions';\nimport thunk from 'redux-thunk';\nimport { handleGlobalEvents } from './global-events';\nimport { initialState as initialAppState } from 'loot-core/src/client/reducers/app';\n\n// See https://github.com/WICG/focus-visible. Only makes the blue\n// focus outline appear from keyboard events.\nrequire('focus-visible');\n\nfunction lightweightStringify(obj) {\n return JSON.stringify(obj, function(k, v) {\n return k ? '' + v : v;\n });\n}\n\nfunction log() {\n return next => action => {\n if (window.Actual.IS_DEV) {\n console.log(action);\n }\n\n if (window.SentryClient) {\n window.SentryClient.addBreadcrumb({\n message: lightweightStringify(action).slice(0, 500),\n category: 'redux',\n level: 'info'\n });\n }\n\n return next(action);\n };\n}\n\nconst appReducer = combineReducers(reducers);\nfunction rootReducer(state, action) {\n if (action.type === constants.CLOSE_BUDGET) {\n // Reset the state and only keep around things intentionally. This\n // blows away everything else\n state = {\n budgets: state.budgets,\n user: state.user,\n prefs: { local: null, global: state.prefs.global },\n app: {\n ...initialAppState,\n updateInfo: state.updateInfo,\n showUpdateNotification: state.showUpdateNotification,\n managerHasInitialized: state.app.managerHasInitialized,\n loadingText: state.app.loadingText\n }\n };\n }\n\n return appReducer(state, action);\n}\n\nconst store = createStore(\n rootReducer,\n undefined,\n applyMiddleware(thunk /*log*/)\n);\nconst boundActions = bindActionCreators(actions, store.dispatch);\n\n// Listen for global events from the server or main process\nhandleGlobalEvents(boundActions, store);\n\n// Expose this to the main process to menu items can access it\nwindow.__actionsForMenu = boundActions;\n\n// Expose send for fun!\nwindow.$send = send;\nwindow.$query = runQuery;\nwindow.$q = q;\n\nReactDOM.render(\n <Provider store={store}>\n <App />\n </Provider>,\n document.getElementById('root')\n);\n","import constants from '../constants';\nimport { closeModal, pushModal } from './modals';\nimport { loadPrefs, loadGlobalPrefs } from './prefs';\nimport { send } from '../../platform/client/fetch';\nimport { setAppState } from './app';\nimport { startTutorialFirstTime } from './tutorial';\nimport { getDownloadError } from '../../shared/errors';\nconst uuid = require('../../platform/uuid');\n\nexport function updateStatusText(text) {\n return (dispatch, getState) => {\n const { loadingText } = getState().app;\n // The presence of any loading text puts the app in a \"loading\"\n // state. We only ever want to update the text, we never want to\n // set the app into a loading state. It's expected for workflows\n // to set a blank loading text to show the loading screen.\n if (loadingText != null) {\n dispatch(setAppState({ loadingText: text }));\n }\n };\n}\n\nexport function loadBudgets() {\n return async dispatch => {\n const budgets = await send('get-budgets');\n\n dispatch({\n type: constants.SET_BUDGETS,\n budgets\n });\n };\n}\n\nexport function loadRemoteFiles() {\n return async dispatch => {\n const files = await send('get-remote-files');\n\n dispatch({\n type: constants.SET_REMOTE_FILES,\n files\n });\n };\n}\n\nexport function loadAllFiles() {\n return async (dispatch, getState) => {\n const budgets = await send('get-budgets');\n const files = await send('get-remote-files');\n\n dispatch({\n type: constants.SET_ALL_FILES,\n budgets,\n remoteFiles: files\n });\n\n return getState().budgets.allFiles;\n };\n}\n\nexport function loadBudget(id, loadingText = '', options = {}) {\n return async (dispatch, getState) => {\n dispatch(setAppState({ loadingText }));\n\n // Loading a budget may fail\n let { error } = await send('load-budget', { id, ...options });\n\n if (error) {\n if (error === 'out-of-sync-migrations' || error === 'out-of-sync-data') {\n // confirm is not available on iOS\n // eslint-disable-next-line\n if (typeof confirm !== 'undefined') {\n // eslint-disable-next-line\n let showBackups = confirm(\n 'This budget cannot be loaded with this version of the app. ' +\n 'Make sure the app is up-to-date. Do you want to load a backup?'\n );\n\n if (showBackups) {\n dispatch(pushModal('load-backup', { budgetId: id }));\n }\n } else {\n alert(\n 'This budget cannot be loaded with this version of the app. ' +\n 'Make sure the app is up-to-date.'\n );\n }\n } else if (error === 'budget-not-found') {\n alert(\n 'Budget file could not be found. If you changed something manually, please restart the app.'\n );\n } else {\n alert(\n 'Error loading budget. Please contact help@actualbudget.com for support.'\n );\n }\n\n dispatch(setAppState({ loadingText: null }));\n return;\n }\n\n dispatch(closeModal());\n\n await dispatch(loadPrefs());\n\n const prefs = getState().prefs.local;\n dispatch(setAppState({ loadingText: null }));\n dispatch(setAppState({ maxMonths: prefs.maxMonths }));\n dispatch(startTutorialFirstTime());\n };\n}\n\nexport function closeBudget() {\n return async (dispatch, getState) => {\n const prefs = getState().prefs.local;\n if (prefs && prefs.id) {\n // This clears out all the app state so the user starts fresh\n dispatch({ type: constants.CLOSE_BUDGET });\n\n dispatch(setAppState({ loadingText: 'Closing...' }));\n await send('close-budget');\n dispatch(setAppState({ loadingText: null }));\n }\n };\n}\n\nexport function closeBudgetUI() {\n return async (dispatch, getState) => {\n let prefs = getState().prefs.local;\n if (prefs && prefs.id) {\n dispatch({ type: constants.CLOSE_BUDGET });\n }\n };\n}\n\nexport function deleteBudget(id, cloudFileId) {\n return async dispatch => {\n await send('delete-budget', { id, cloudFileId });\n await dispatch(loadAllFiles());\n };\n}\n\nexport function createBudget({ testMode, demoMode } = {}) {\n return async (dispatch, getState) => {\n dispatch(\n setAppState({ loadingText: testMode || demoMode ? 'Making demo...' : '' })\n );\n\n if (demoMode) {\n await send('create-demo-budget');\n } else {\n await send('create-budget', { testMode });\n }\n\n dispatch(closeModal());\n\n await dispatch(loadAllFiles());\n await dispatch(loadPrefs());\n dispatch(startTutorialFirstTime());\n\n // Set the loadingText to null after we've loaded the budget prefs\n // so that the existing manager page doesn't flash\n dispatch(setAppState({ loadingText: null }));\n };\n}\n\nexport function importBudget(filepath, type) {\n return async (dispatch, getState) => {\n const { error } = await send('import-budget', { filepath, type });\n if (error) {\n throw new Error(error);\n }\n\n dispatch(closeModal());\n\n await dispatch(loadPrefs());\n dispatch(startTutorialFirstTime());\n };\n}\n\nexport function uploadBudget(id) {\n return async dispatch => {\n let { error } = await send('upload-budget', { id });\n if (error) {\n return { error };\n }\n\n await dispatch(loadAllFiles());\n return {};\n };\n}\n\nexport function closeAndDownloadBudget(cloudFileId) {\n return async dispatch => {\n // It's very important that we set this loading message before\n // closing the budget. Otherwise, the manager will ignore our\n // loading message and clear it when it loads, showing the file\n // list which we don't want\n dispatch(setAppState({ loadingText: 'Downloading...' }));\n await dispatch(closeBudget());\n dispatch(downloadBudget(cloudFileId, { replace: true }));\n };\n}\n\nexport function downloadBudget(cloudFileId, { replace } = {}) {\n return async dispatch => {\n dispatch(setAppState({ loadingText: 'Downloading...' }));\n\n let { id, error } = await send('download-budget', {\n fileId: cloudFileId,\n replace\n });\n\n if (error) {\n if (error.reason === 'decrypt-failure') {\n let opts = {\n hasExistingKey: error.meta && error.meta.isMissingKey,\n cloudFileId,\n onSuccess: () => {\n dispatch(downloadBudget(cloudFileId, { replace }));\n }\n };\n\n dispatch(pushModal('fix-encryption-key', opts));\n dispatch(setAppState({ loadingText: null }));\n } else if (error.reason === 'file-exists') {\n alert(\n `A file with id \"${error.meta.id}\" already exists with the name \"${error.meta.name}\". ` +\n 'This file will be replaced. This probably happened because files were manually ' +\n 'moved around outside of Actual.'\n );\n\n return dispatch(downloadBudget(cloudFileId, { replace: true }));\n } else {\n dispatch(setAppState({ loadingText: null }));\n alert(getDownloadError(error));\n }\n return null;\n } else {\n await Promise.all([\n dispatch(loadGlobalPrefs()),\n dispatch(loadAllFiles()),\n dispatch(loadBudget(id))\n ]);\n dispatch(setAppState({ loadingText: null }));\n }\n\n return id;\n };\n}\n\nexport function getYNAB4Imports() {\n return async dispatch => {\n let imports = await send('get-ynab4-files');\n dispatch({\n type: 'SET_AVAILABLE_IMPORTS',\n imports\n });\n return imports;\n };\n}\n","import React, {\n useState,\n useCallback,\n useRef,\n useEffect,\n useLayoutEffect,\n useImperativeHandle,\n useContext,\n useMemo\n} from 'react';\nimport { useStore } from 'react-redux';\nimport { scope } from '@jlongster/lively';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { FixedSizeList } from './FixedSizeList';\nimport { styles, colors } from '../style';\nimport DeleteIcon from '../svg/Delete';\nimport Checkmark from '../svg/v1/Checkmark';\nimport ExpandArrow from '../svg/ExpandArrow';\nimport AnimatedLoading from '../svg/v1/AnimatedLoading';\nimport {\n View,\n Text,\n Button,\n Input,\n Tooltip,\n IntersectionBoundary,\n Menu\n} from './common';\nimport { KeyHandlers } from './KeyHandlers';\nimport SheetValue from './spreadsheet/SheetValue';\nimport DateSelect from './DateSelect';\nimport format from './spreadsheet/format';\nimport { keys } from '../util/keys';\nimport {\n AvoidRefocusScrollProvider,\n useProperFocus,\n focusElement\n} from './useProperFocus';\nimport { useSelectedItems } from './useSelected';\n\nexport const ROW_HEIGHT = 32;\nexport const TABLE_BACKGROUND_COLOR = colors.n11;\n\nfunction fireBlur(onBlur, e) {\n if (document.hasFocus()) {\n // We only fire the blur event if the app is still focused\n // because the blur event is fired when the app goes into\n // the background and we want to ignore that\n onBlur && onBlur(e);\n } else {\n // Otherwise, stop React from bubbling this event and swallow it\n e.stopPropagation();\n }\n}\n\nconst CellContext = React.createContext({\n backgroundColor: 'white',\n borderColor: colors.n9\n});\n\nfunction CellProvider({ backgroundColor, borderColor, children }) {\n let value = useMemo(\n () => ({\n backgroundColor,\n borderColor\n }),\n [backgroundColor, borderColor]\n );\n\n return <CellContext.Provider value={value}>{children}</CellContext.Provider>;\n}\n\nexport const Field = React.forwardRef(function Field(\n {\n width,\n name,\n borderColor: oldBorderColor,\n truncate = true,\n children,\n style,\n contentStyle,\n ...props\n },\n ref\n) {\n let { backgroundColor, borderColor } = useContext(CellContext);\n\n // TODO: Get rid of this. Go through and remove all the places where\n // the border color is manually passed in.\n if (oldBorderColor) {\n borderColor = oldBorderColor;\n }\n\n return (\n <View\n innerRef={ref}\n {...props}\n style={[\n width === 'flex' ? { flex: 1, flexBasis: 0 } : { width },\n {\n position: 'relative',\n borderTopWidth: borderColor ? 1 : 0,\n borderBottomWidth: borderColor ? 1 : 0,\n borderColor,\n backgroundColor\n },\n styles.smallText,\n style\n ]}\n data-testid={name}\n >\n {/* This is wrapped so that the padding is not taken into\n account with the flex width (which aligns it with the Cell\n component) */}\n <View\n style={[\n {\n flex: 1,\n padding: '0 5px',\n justifyContent: 'center'\n },\n contentStyle\n ]}\n >\n {truncate ? (\n <Text\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </View>\n </View>\n );\n});\n\nexport function Cell({\n width,\n name,\n exposed,\n focused,\n value,\n formatter,\n textAlign,\n onExpose,\n borderColor: oldBorderColor,\n children,\n plain,\n style,\n valueStyle,\n ...viewProps\n}) {\n let mouseCoords = useRef(null);\n let viewRef = useRef(null);\n\n let { backgroundColor, borderColor } = useContext(CellContext);\n\n useProperFocus(viewRef, focused !== undefined ? focused : exposed);\n\n // TODO: Get rid of this. Go through and remove all the places where\n // the border color is manually passed in.\n if (oldBorderColor) {\n borderColor = oldBorderColor;\n }\n\n const widthStyle = width === 'flex' ? { flex: 1, flexBasis: 0 } : { width };\n const cellStyle = {\n position: 'relative',\n textAlign: textAlign || 'left',\n justifyContent: 'center',\n borderTopWidth: borderColor ? 1 : 0,\n borderBottomWidth: borderColor ? 1 : 0,\n borderColor,\n backgroundColor\n };\n\n return (\n <View\n innerRef={viewRef}\n style={[widthStyle, cellStyle, style]}\n className=\"animated-cell\"\n {...viewProps}\n data-testid={name}\n >\n {plain ? (\n children\n ) : exposed ? (\n children()\n ) : (\n <View\n style={[\n {\n flex: 1,\n padding: '0 5px',\n justifyContent: 'center'\n },\n styles.smallText,\n valueStyle\n ]}\n // Can't use click because we only want to expose the cell if\n // the user does a direct click, not if they also drag the\n // mouse to select something\n onMouseDown={e => (mouseCoords.current = [e.clientX, e.clientY])}\n onMouseUp={e => {\n if (\n mouseCoords.current &&\n Math.abs(e.clientX - mouseCoords.current[0]) < 5 &&\n Math.abs(e.clientY - mouseCoords.current[1]) < 5\n ) {\n onExpose && onExpose(name);\n }\n }}\n // When testing, allow the click handler to be used instead\n onClick={global.IS_TESTING && (() => onExpose && onExpose(name))}\n >\n <Text\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {formatter ? formatter(value) : value}\n </Text>\n </View>\n )}\n </View>\n );\n}\n\nexport function Row({\n backgroundColor = 'white',\n borderColor = colors.border,\n inset = 0,\n collapsed,\n focused,\n highlighted,\n children,\n height,\n style,\n ...nativeProps\n}) {\n let [shouldHighlight, setShouldHighlight] = useState(false);\n let prevHighlighted = useRef(false);\n let rowRef = useRef(null);\n let timer = useRef(null);\n\n useEffect(\n () => {\n if (highlighted && !prevHighlighted.current && rowRef.current) {\n rowRef.current.classList.add('animated');\n setShouldHighlight(true);\n\n clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n setShouldHighlight(false);\n\n timer.current = setTimeout(() => {\n if (rowRef.current) {\n rowRef.current.classList.remove('animated');\n }\n }, 500);\n }, 500);\n }\n },\n [highlighted]\n );\n\n useEffect(() => {\n prevHighlighted.current = highlighted;\n });\n\n return (\n <CellProvider\n backgroundColor={shouldHighlight ? colors.y9 : backgroundColor}\n borderColor={shouldHighlight ? colors.y8 : borderColor}\n >\n <View\n innerRef={rowRef}\n style={[\n {\n flexDirection: 'row',\n height: height || ROW_HEIGHT,\n flex: '0 0 ' + (height || ROW_HEIGHT) + 'px',\n userSelect: 'text',\n '&.animated .animated-cell': {\n transition: '.7s background-color'\n }\n },\n collapsed && { marginTop: -1 },\n style\n ]}\n data-testid=\"row\"\n {...nativeProps}\n >\n {inset !== 0 && <Field width={inset} />}\n {children}\n {inset !== 0 && <Field width={inset} />}\n </View>\n </CellProvider>\n );\n}\n\nconst inputCellStyle = {\n backgroundColor: 'white',\n padding: '5px 3px',\n margin: '0 1px'\n};\n\nconst readonlyInputStyle = {\n backgroundColor: 'transparent',\n '::selection': { backgroundColor: '#d9d9d9' }\n};\n\nfunction InputValue({ value: defaultValue, onUpdate, onBlur, ...props }) {\n let [value, setValue] = useState(defaultValue);\n\n function onBlur_(e) {\n onUpdate && onUpdate(value);\n onBlur && fireBlur(onBlur, e);\n }\n\n function onKeyDown(e) {\n // Only enter and tab to escape (which allows the user to move\n // around)\n if (e.keyCode !== keys.ENTER && e.keyCode !== keys.TAB) {\n e.stopPropagation();\n }\n\n if (e.keyCode === keys.ESC) {\n if (value !== defaultValue) {\n setValue(defaultValue);\n }\n } else if (shouldSaveFromKey(e)) {\n onUpdate && onUpdate(value);\n }\n }\n\n return (\n <Input\n {...props}\n value={value}\n onUpdate={text => setValue(text)}\n onBlur={onBlur_}\n onKeyDown={onKeyDown}\n style={[\n inputCellStyle,\n props.readOnly ? readonlyInputStyle : null,\n props.style\n ]}\n />\n );\n}\n\nexport function InputCell({\n inputProps,\n onUpdate,\n onBlur,\n textAlign,\n error,\n ...props\n}) {\n return (\n <Cell textAlign={textAlign} {...props}>\n {() => (\n <React.Fragment>\n <InputValue\n value={props.value}\n onUpdate={onUpdate}\n onBlur={onBlur}\n style={[{ textAlign }, inputProps && inputProps.style]}\n {...inputProps}\n />\n {error && (\n <Tooltip\n key=\"error\"\n targetHeight={ROW_HEIGHT}\n width={180}\n position=\"bottom-left\"\n >\n {error}\n </Tooltip>\n )}\n </React.Fragment>\n )}\n </Cell>\n );\n}\n\nexport function shouldSaveFromKey(e) {\n switch (e.keyCode) {\n case keys.TAB:\n case keys.ENTER:\n e.preventDefault();\n return true;\n default:\n }\n}\n\nexport function CustomCell({\n value: defaultValue,\n children,\n onUpdate,\n onBlur,\n ...props\n}) {\n let [value, setValue] = useState(defaultValue);\n let [prevDefaultValue, setPrevDefaultValue] = useState(defaultValue);\n\n if (prevDefaultValue !== defaultValue) {\n setValue(defaultValue);\n setPrevDefaultValue(defaultValue);\n }\n\n function onBlur_(e) {\n // Only save on blur if the app is focused. Blur events fire when\n // the app unfocuses, and it's unintuitive to save the value since\n // the input will be focused again when the app regains focus\n if (document.hasFocus()) {\n onUpdate && onUpdate(value);\n fireBlur(onBlur, e);\n }\n }\n\n function onKeyDown(e) {\n if (shouldSaveFromKey(e)) {\n onUpdate && onUpdate(value);\n }\n }\n\n return (\n <Cell {...props} value={defaultValue}>\n {() =>\n children({\n onBlur: onBlur_,\n onKeyDown,\n onUpdate: val => setValue(val),\n onSave: val => {\n setValue(val);\n onUpdate && onUpdate(val);\n },\n shouldSaveFromKey,\n inputStyle: inputCellStyle\n })\n }\n </Cell>\n );\n}\n\nexport const DateSelectCell = scope(lively => {\n function DateSelectCell({ props: { dateSelectProps, ...props }, updater }) {\n const { inputProps = {} } = dateSelectProps;\n return (\n <Cell\n {...props}\n style={{\n zIndex: props.exposed ? 1 : 0,\n ...props.style\n }}\n >\n {() => (\n <DateSelect\n {...dateSelectProps}\n tooltipStyle={{ minWidth: 225 }}\n inputProps={{\n ...inputProps,\n onBlur: e => fireBlur(inputProps && inputProps.onBlur, e),\n style: [inputCellStyle, { zIndex: 300 }]\n }}\n />\n )}\n </Cell>\n );\n }\n\n return lively(DateSelectCell);\n});\n\nexport function DeleteCell({ onDelete, style, ...props }) {\n return (\n <Cell\n {...props}\n name=\"delete\"\n width={20}\n style={[{ alignItems: 'center', userSelect: 'none' }, style]}\n onClick={e => {\n e.stopPropagation();\n onDelete && onDelete();\n }}\n >\n {() => <DeleteIcon width={7} height={7} />}\n </Cell>\n );\n}\n\nexport const CellButton = React.forwardRef(\n ({ style, disabled, clickBehavior, onSelect, onEdit, children }, ref) => {\n // This represents a cell that acts like a button: it's clickable,\n // focusable, etc. The reason we don't use a button is because the\n // full behavior is undesirable: we really don't want stuff like\n // \"click is fired when enter is pressed\". We have very custom\n // controls and focus/active states.\n //\n // Important behavior:\n // * X/SPACE/etc keys select the button _on key down_ and not on key\n // up. This means it instantly selects and if you hold it down it\n // will repeatedly select.\n // * The cell begins editing on focus. That means if the user does a\n // mouse down, but moves out of the element and then does mouse\n // up, it will properly still receive focus & being editing\n return (\n <View\n innerRef={ref}\n className=\"cell-button\"\n tabIndex=\"0\"\n onKeyDown={e => {\n if (e.keyCode === keys.X || e.keyCode === keys.SPACE) {\n e.preventDefault();\n if (!disabled) {\n onSelect && onSelect();\n }\n }\n }}\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n cursor: 'default',\n transition: 'box-shadow .15s',\n ':focus': {\n outline: 0,\n boxShadow: `0 0 0 3px white, 0 0 0 5px ${colors.b5}`\n }\n },\n style\n ]}\n onFocus={() => onEdit && onEdit()}\n data-testid=\"cell-button\"\n onClick={\n clickBehavior === 'none'\n ? null\n : () => {\n if (!disabled) {\n onSelect && onSelect();\n onEdit && onEdit();\n }\n }\n }\n >\n {children}\n </View>\n );\n }\n);\n\nexport function SelectCell({\n focused,\n selected,\n partial,\n style,\n onSelect,\n onEdit,\n ...props\n}) {\n return (\n <Cell\n {...props}\n focused={focused}\n name=\"select\"\n width={20}\n style={[{ alignItems: 'center', userSelect: 'none' }, style]}\n onClick={e => {\n e.stopPropagation();\n onSelect && onSelect();\n onEdit && onEdit();\n }}\n >\n {() => (\n <CellButton\n style={[\n {\n width: 12,\n height: 12,\n border: '1px solid ' + colors.n8,\n borderRadius: 3,\n justifyContent: 'center',\n alignItems: 'center',\n\n ':focus': {\n border: '1px solid ' + colors.b5,\n boxShadow: '0 1px 2px ' + colors.b5\n }\n },\n selected && {\n backgroundColor: partial ? colors.b9 : colors.b5,\n borderColor: partial ? colors.b9 : colors.b5\n }\n ]}\n onEdit={onEdit}\n onSelect={onSelect}\n clickBehavior=\"none\"\n >\n {selected && (\n <Checkmark width={6} height={6} style={{ color: 'white' }} />\n )}\n </CellButton>\n )}\n </Cell>\n );\n}\n\nexport function SheetCell({\n valueProps,\n valueStyle,\n inputProps,\n sync,\n textAlign,\n onSave,\n ...props\n}) {\n const { binding, type, getValueStyle, formatExpr, unformatExpr } = valueProps;\n\n return (\n <SheetValue\n binding={binding}\n onChange={() => {\n // \"close\" the cell if it's editing\n if (props.exposed && inputProps && inputProps.onBlur) {\n inputProps.onBlur();\n }\n }}\n >\n {node => {\n return (\n <Cell\n valueStyle={\n getValueStyle\n ? [valueStyle, getValueStyle(node.value)]\n : valueStyle\n }\n textAlign={textAlign}\n {...props}\n value={node.value}\n formatter={value =>\n props.formatter\n ? props.formatter(value, type)\n : format(value, type)\n }\n data-cellname={node.name}\n >\n {() => {\n return (\n <InputValue\n value={formatExpr ? formatExpr(node.value) : node.value}\n onUpdate={value => {\n onSave(unformatExpr ? unformatExpr(value) : value);\n }}\n style={{ textAlign }}\n {...inputProps}\n />\n );\n }}\n </Cell>\n );\n }}\n </SheetValue>\n );\n}\n\nexport const Highlight = scope(lively => {\n function Highlight({ inst, state: { activated, highlightOff } }) {\n return (\n <View\n innerRef={el => (inst.el = el)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n transition: 'background-color 1.8s',\n backgroundColor: 'white'\n }}\n />\n );\n }\n\n function activate({ inst }) {\n inst.el.style.transitionDuration = '0s';\n inst.el.style.backgroundColor = colors.y9;\n setTimeout(() => {\n if (inst.el) {\n inst.el.style.transitionDuration = '1.8s';\n inst.el.style.backgroundColor = 'white';\n }\n }, 0);\n }\n\n return lively(Highlight, {\n getInitialState({ props }) {\n return { activated: false, highlightOff: true };\n },\n\n componentWillReceiveProps(bag, nextProps) {\n if (!bag.props.active && nextProps.active) {\n return activate(bag);\n }\n },\n\n componentDidMount(bag) {\n if (bag.props.active) {\n return activate(bag);\n }\n }\n });\n});\n\nexport function TableHeader({ headers, children, version, ...rowProps }) {\n return (\n <View\n style={\n version === 'v2' && { borderRadius: '6px 6px 0 0', overflow: 'hidden' }\n }\n >\n <Row\n backgroundColor=\"white\"\n borderColor={colors.border}\n collapsed={true}\n {...rowProps}\n style={[\n { zIndex: 200 },\n version === 'v2'\n ? { color: colors.n4, fontWeight: 500 }\n : { color: colors.n4 },\n rowProps.style\n ]}\n >\n {headers\n ? headers.map(header => {\n return (\n <Cell\n key={header.name}\n value={header.name}\n width={header.width}\n style={header.style}\n valueStyle={header.valueStyle}\n />\n );\n })\n : children}\n </Row>\n </View>\n );\n}\n\nexport function SelectedItemsButton({ name, keyHandlers, items, onSelect }) {\n let selectedItems = useSelectedItems();\n let [menuOpen, setMenuOpen] = useState(null);\n\n if (selectedItems.size === 0) {\n return null;\n }\n\n return (\n <View>\n <KeyHandlers keys={keyHandlers || {}} />\n\n <Button\n bare\n style={{ color: colors.b3 }}\n onClick={() => setMenuOpen(true)}\n >\n <ExpandArrow width={8} height={8} style={{ marginRight: 5 }} />\n {selectedItems.size} {name}\n </Button>\n\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={name => {\n onSelect(name, [...selectedItems]);\n setMenuOpen(false);\n }}\n items={items}\n />\n </Tooltip>\n )}\n </View>\n );\n}\n\nlet rowStyle = { position: 'absolute', willChange: 'transform', width: '100%' };\n\nexport const TableWithNavigator = React.forwardRef(\n ({ fields, ...props }, ref) => {\n let navigator = useTableNavigator(props.items, fields);\n return <Table {...props} navigator={navigator} />;\n }\n);\n\nexport const Table = React.forwardRef(\n (\n {\n items,\n count,\n headers,\n contentHeader,\n loading,\n rowHeight = ROW_HEIGHT,\n backgroundColor = TABLE_BACKGROUND_COLOR,\n renderItem,\n renderEmpty,\n getItemKey,\n loadMore,\n style,\n navigator,\n listRef,\n onScroll,\n version = 'v1',\n animated,\n allowPopupsEscape,\n isSelected,\n ...props\n },\n ref\n ) => {\n if (!navigator) {\n navigator = {\n onEdit: () => {},\n editingId: null,\n focusedField: null,\n getNavigatorProps: props => props\n };\n }\n\n let { onEdit, editingId, focusedField, getNavigatorProps } = navigator;\n let list = useRef(null);\n let listContainer = useRef(null);\n let scrollContainer = useRef(null);\n let initialScrollTo = useRef(null);\n let listInitialized = useRef(false);\n\n useImperativeHandle(ref, () => ({\n scrollTo: (id, alignment = 'smart') => {\n let index = items.findIndex(item => item.id === id);\n if (index !== -1) {\n if (!list.current) {\n // If the table hasn't been laid out yet, we need to wait for\n // that to happen before we can scroll to something\n initialScrollTo.current = index;\n } else {\n list.current.scrollToItem(index, alignment);\n }\n }\n },\n\n scrollToTop: () => {\n list.current && list.current.scrollTo(0);\n },\n\n getScrolledItem: () => {\n if (scrollContainer.current) {\n let offset = scrollContainer.current.scrollTop;\n let index = list.current.getStartIndexForOffset(offset);\n return items[index].id;\n }\n return 0;\n },\n\n setRowAnimation: flag => {\n list.current && list.current.setRowAnimation(flag);\n },\n\n edit(id, field, shouldScroll) {\n onEdit(id, field);\n\n if (id && shouldScroll) {\n ref.scrollTo(id);\n }\n },\n\n anchor() {\n list.current && list.current.anchor();\n },\n\n unanchor() {\n list.current && list.current.unanchor();\n },\n\n isAnchored() {\n return list.current && list.current.isAnchored();\n }\n }));\n\n useLayoutEffect(() => {\n // We wait for the list to mount because AutoSizer needs to run\n // before it's mounted\n if (!listInitialized.current && listContainer.current) {\n // Animation is on by default\n list.current && list.current.setRowAnimation(true);\n listInitialized.current = true;\n }\n });\n\n function renderRow({ index, style, key }) {\n let item = items[index];\n let editing = editingId === item.id;\n let selected = isSelected && isSelected(item.id);\n\n let row = renderItem({\n item,\n editing,\n focusedField: editing && focusedField,\n onEdit,\n index,\n position: style.top\n });\n\n // TODO: Need to also apply zIndex if item is selected\n // * Port over ListAnimation to Table\n // * Move highlighted functionality into here\n return (\n <View\n key={key}\n className=\"animated-row\"\n style={[\n rowStyle,\n {\n zIndex: editing || selected ? 101 : 'auto',\n transform: 'translateY(var(--pos))'\n }\n ]}\n nativeStyle={{ '--pos': `${style.top - 1}px` }}\n data-focus-key={item.id}\n >\n {row}\n </View>\n );\n }\n\n function getScrollOffset(height, index) {\n return (\n index * (rowHeight - 1) +\n (rowHeight - 1) / 2 -\n height / 2 +\n (rowHeight - 1) * 2\n );\n }\n\n function onItemsRendered({ overscanStartIndex, overscanStopIndex }) {\n if (loadMore && overscanStopIndex > items.length - 100) {\n loadMore();\n }\n }\n\n function getEmptyContent(empty) {\n if (empty == null) {\n return null;\n } else if (typeof empty === 'function') {\n return empty();\n }\n\n return (\n <View\n style={{\n justifyContent: 'center',\n alignItems: 'center',\n fontStyle: 'italic',\n color: colors.n6,\n flex: 1\n }}\n >\n {empty}\n </View>\n );\n }\n\n if (loading) {\n return (\n <View\n style={[{ flex: 1, justifyContent: 'center', alignItems: 'center' }]}\n >\n <AnimatedLoading width={25} color={colors.n1} />\n </View>\n );\n }\n\n let isEmpty = (count || items.length) === 0;\n\n return (\n <View\n style={[\n {\n flex: 1,\n outline: 'none',\n '& .animated .animated-row': { transition: '.25s transform' }\n },\n style\n ]}\n tabIndex=\"1\"\n {...getNavigatorProps(props)}\n data-testid=\"table\"\n >\n {headers && (\n <TableHeader\n version={version}\n height={rowHeight}\n {...(Array.isArray(headers) ? { headers } : { children: headers })}\n />\n )}\n <View style={{ flex: 1, backgroundColor }}>\n {isEmpty ? (\n getEmptyContent(renderEmpty)\n ) : (\n <AutoSizer>\n {({ width, height }) => {\n if (width === 0 || height === 0) {\n return null;\n }\n\n return (\n <IntersectionBoundary.Provider\n value={!allowPopupsEscape && listContainer}\n >\n <AvoidRefocusScrollProvider>\n <FixedSizeList\n ref={list}\n header={contentHeader}\n innerRef={listContainer}\n outerRef={scrollContainer}\n width={width}\n height={height}\n renderRow={renderRow}\n itemCount={count || items.length}\n itemSize={rowHeight - 1}\n itemKey={\n getItemKey || ((index, data) => items[index].id)\n }\n indexForKey={key =>\n items.findIndex(item => item.id === key)\n }\n initialScrollOffset={\n initialScrollTo.current\n ? getScrollOffset(height, initialScrollTo.current)\n : 0\n }\n version={version}\n animated={animated}\n overscanCount={5}\n onItemsRendered={onItemsRendered}\n onScroll={onScroll}\n />\n </AvoidRefocusScrollProvider>\n </IntersectionBoundary.Provider>\n );\n }}\n </AutoSizer>\n )}\n </View>\n </View>\n );\n }\n);\n\nexport function useTableNavigator(data, fields, opts = {}) {\n let getFields = typeof fields !== 'function' ? () => fields : fields;\n let { initialEditingId, initialFocusedField, moveKeys } = opts;\n let [editingId, setEditingId] = useState(initialEditingId || null);\n let [focusedField, setFocusedField] = useState(initialFocusedField || null);\n let containerRef = useRef();\n\n // See `onBlur` for why we need this\n let store = useStore();\n let modalStackLength = useRef(0);\n\n // onEdit is passed to children, so make sure it maintains identity\n let onEdit = useCallback((id, field) => {\n setEditingId(id);\n setFocusedField(id ? field : null);\n }, []);\n\n useEffect(() => {\n modalStackLength.current = store.getState().modals.modalStack.length;\n }, []);\n\n function flashInput() {\n // Force the container to be focused which suppresses the \"space\n // pages down\" behavior. If we don't do this and the user presses\n // up + space down quickly while nothing is focused, it would page\n // down.\n containerRef.current.focus();\n\n // Not ideal, but works for now. Let the UI show the input\n // go away, and then bring it back on the same row/field\n onEdit(null);\n\n setTimeout(() => {\n onEdit(editingId, focusedField);\n }, 100);\n }\n\n function onFocusPrevious() {\n let idx = data.findIndex(item => item.id === editingId);\n if (idx > 0) {\n let item = data[idx - 1];\n let fields = getFields(item);\n onEdit(item.id, fields[fields.length - 1]);\n } else {\n flashInput();\n }\n }\n\n function onFocusNext() {\n let idx = data.findIndex(item => item.id === editingId);\n if (idx < data.length - 1) {\n let item = data[idx + 1];\n let fields = getFields(item);\n onEdit(item.id, fields[0]);\n } else {\n flashInput();\n }\n }\n\n function moveHorizontally(dir) {\n if (editingId) {\n let fields = getFields(data.find(item => item.id === editingId));\n let idx = fields.indexOf(focusedField) + dir;\n\n if (idx < 0) {\n onFocusPrevious();\n } else if (idx >= fields.length) {\n onFocusNext();\n } else {\n setFocusedField(fields[idx]);\n }\n }\n }\n\n function moveVertically(dir) {\n if (editingId) {\n let idx = data.findIndex(item => item.id === editingId);\n let nextIdx = idx;\n\n while (true) {\n nextIdx = nextIdx + dir;\n if (nextIdx >= 0 && nextIdx < data.length) {\n const next = data[nextIdx];\n if (getFields(next).includes(focusedField)) {\n onEdit(next.id, focusedField);\n break;\n }\n } else {\n flashInput();\n break;\n }\n }\n }\n }\n\n function onMove(dir) {\n switch (dir) {\n case 'left':\n moveHorizontally(-1);\n break;\n case 'right':\n moveHorizontally(1);\n break;\n case 'up':\n moveVertically(-1);\n break;\n case 'down':\n moveVertically(1);\n break;\n default:\n throw new Error('Unknown direction: ' + dir);\n }\n }\n\n function getNavigatorProps(userProps) {\n return {\n ...userProps,\n\n innerRef: containerRef,\n\n onKeyDown: e => {\n userProps && userProps.onKeyDown && userProps.onKeyDown(e);\n if (e.isPropagationStopped()) {\n return;\n }\n\n let fieldKeys =\n moveKeys && moveKeys[focusedField] && moveKeys[focusedField];\n\n if (fieldKeys && fieldKeys[e.keyCode]) {\n e.preventDefault();\n e.stopPropagation();\n\n onMove(fieldKeys[e.keyCode]);\n } else {\n switch (e.keyCode) {\n case keys.UP:\n case keys.K:\n if (e.target.tagName !== 'INPUT') {\n onMove('up');\n }\n break;\n\n case keys.DOWN:\n case keys.J:\n if (e.target.tagName !== 'INPUT') {\n onMove('down');\n }\n break;\n\n case keys.ENTER:\n case keys.TAB:\n e.preventDefault();\n e.stopPropagation();\n\n onMove(\n e.keyCode === keys.ENTER\n ? e.shiftKey\n ? 'up'\n : 'down'\n : e.shiftKey\n ? 'left'\n : 'right'\n );\n break;\n default:\n }\n }\n },\n\n onBlur: e => {\n // We want to hide the editing field if the user clicked away\n // from the table. We use `relatedTarget` to figure out where\n // the focus is going, and if it's nothing (the user clicked\n // somewhere that doesn't have an editable field) or if it's\n // anything outside of the table, clear editing.\n //\n // Also important: only do this if the app is focused. The\n // blur event is fired when the app loses focus and we don't\n // want to hide the input.\n\n // The last tricky edge case: we don't want to blur if a new\n // modal just opened. This way the field still shows an\n // input, and it will be refocused when the modal closes.\n let prevNumModals = modalStackLength.current;\n let numModals = store.getState().modals.modalStack.length;\n\n if (\n document.hasFocus() &&\n (e.relatedTarget == null ||\n !containerRef.current.contains(e.relatedTarget)) &&\n prevNumModals === numModals\n ) {\n onEdit(null);\n }\n }\n };\n }\n\n return { onEdit, editingId, focusedField, getNavigatorProps };\n}\n","const uuid = require('../../uuid');\nconst { getChangedValues } = require('../../../shared/util');\n\n// List of recently used states. We don't use a true MRU structure\n// because our needs are simple and we also do some custom reordering.\nlet HISTORY_SIZE = 40;\nlet UNDO_STATE_MRU = [];\n\nlet currentUndoState = {\n url: null,\n openModal: null,\n selectedItems: null\n};\n\nfunction setUndoState(name, value) {\n currentUndoState[name] = value;\n currentUndoState.id = uuid.v4Sync();\n}\n\nfunction getUndoState(name) {\n return currentUndoState[name];\n}\n\nfunction getTaggedState(id) {\n return UNDO_STATE_MRU.find(state => state.id === id);\n}\n\nfunction snapshot() {\n let tagged = { ...currentUndoState, id: uuid.v4Sync() };\n UNDO_STATE_MRU.unshift(tagged);\n UNDO_STATE_MRU = UNDO_STATE_MRU.slice(0, HISTORY_SIZE);\n return tagged.id;\n}\n\nfunction gc(id) {\n UNDO_STATE_MRU = UNDO_STATE_MRU.filter(state => state.id !== id);\n}\n\nmodule.exports = { setUndoState, getUndoState, getTaggedState, snapshot, gc };\n","import throttle from 'throttleit';\nimport { send } from '../../platform/client/fetch';\nimport constants from '../constants';\nimport { addNotification, addGenericErrorNotification } from './notifications';\nimport { pushModal } from './modals';\n\nexport function applyBudgetAction(month, type, args) {\n return async function() {\n switch (type) {\n case 'budget-amount':\n await send('budget/budget-amount', {\n month,\n category: args.category,\n amount: args.amount\n });\n break;\n case 'copy-last':\n await send('budget/copy-previous-month', { month });\n break;\n case 'set-zero':\n await send('budget/set-zero', { month });\n break;\n case 'set-3-avg':\n await send('budget/set-3month-avg', { month });\n break;\n case 'set-all-future':\n await send('budget/set-all-future', { startMonth: month });\n break;\n case 'hold':\n await send('budget/hold-for-next-month', {\n month,\n amount: args.amount\n });\n break;\n case 'hold-all-future':\n await send('budget/hold-for-future-months', {\n startMonth: month,\n amount: args.amount\n });\n break;\n case 'reset-hold':\n await send('budget/reset-hold', { month });\n break;\n case 'cover':\n await send('budget/cover-overspending', {\n month,\n to: args.to,\n from: args.from\n });\n break;\n case 'transfer-available':\n await send('budget/transfer-available', {\n month,\n amount: args.amount,\n category: args.category\n });\n break;\n case 'transfer-category':\n await send('budget/transfer-category', {\n month,\n amount: args.amount,\n from: args.from,\n to: args.to\n });\n break;\n case 'carryover': {\n await send('budget/set-carryover', {\n startMonth: month,\n category: args.category,\n flag: args.flag\n });\n break;\n }\n default:\n }\n };\n}\n\nexport function getCategories() {\n return async function(dispatch) {\n const categories = await send('get-categories');\n dispatch({\n type: constants.LOAD_CATEGORIES,\n categories\n });\n return categories;\n };\n}\n\nexport function createCategory(name, groupId, isIncome) {\n return async function(dispatch) {\n let id = await send('category-create', {\n name,\n groupId,\n isIncome\n });\n dispatch(getCategories());\n return id;\n };\n}\n\nexport function deleteCategory(id, transferId) {\n return async function(dispatch, getState) {\n let { error } = await send('category-delete', { id, transferId });\n\n if (error) {\n let msg;\n switch (error) {\n case 'category-type':\n dispatch(\n addNotification({\n type: 'error',\n message:\n 'A category must be transferred to another of the same type (expense or income)'\n })\n );\n break;\n default:\n dispatch(addGenericErrorNotification());\n }\n\n throw new Error(error);\n } else {\n dispatch(getCategories());\n // Also need to refresh payees because they might use one of the\n // deleted categories as the default category\n dispatch(getPayees());\n }\n };\n}\n\nexport function updateCategory(category) {\n return async dispatch => {\n await send('category-update', category);\n dispatch(getCategories());\n };\n}\n\nexport function moveCategory(id, groupId, targetId) {\n return async (dispatch, getState) => {\n await send('category-move', { id, groupId, targetId });\n await dispatch(getCategories());\n };\n}\n\nexport function moveCategoryGroup(id, targetId) {\n return async dispatch => {\n await send('category-group-move', { id, targetId });\n await dispatch(getCategories());\n };\n}\n\nexport function createGroup(name) {\n return async dispatch => {\n let id = await send('category-group-create', { name });\n dispatch(getCategories());\n return id;\n };\n}\n\nexport function updateGroup(group) {\n // Strip off the categories field if it exist. It's not a real db\n // field but groups have this extra field in the client most of the\n // time\n const { categories, ...rawGroup } = group;\n\n return async dispatch => {\n await send('category-group-update', rawGroup);\n await dispatch(getCategories());\n };\n}\n\nexport function deleteGroup(id, transferId) {\n return async function(dispatch, getState) {\n const group = getState().queries.categories.grouped.find(g => g.id === id);\n await send('category-group-delete', { id, transferId });\n await dispatch(getCategories());\n // See `deleteCategory` for why we need this\n await dispatch(getPayees());\n };\n}\n\nexport function getPayees() {\n return async function(dispatch) {\n let payees = await send('payees-get');\n dispatch({\n type: constants.LOAD_PAYEES,\n payees\n });\n return payees;\n };\n}\n\nexport function initiallyLoadPayees() {\n return async function(dispatch, getState) {\n if (getState().queries.payees.length === 0) {\n return dispatch(getPayees());\n }\n };\n}\n\nexport function createPayee(name) {\n return async dispatch => {\n return send('payee-create', { name: name.trim() });\n };\n}\n\nexport function getAccounts() {\n return async function(dispatch) {\n const accounts = await send('accounts-get');\n dispatch({ type: constants.LOAD_ACCOUNTS, accounts });\n return accounts;\n };\n}\n\nexport function updateAccount(account) {\n return async function(dispatch) {\n dispatch({ type: constants.UPDATE_ACCOUNT, account });\n await send('account-update', account);\n };\n}\n\nexport function createAccount(name, type, balance, offBudget) {\n return async function(dispatch) {\n let id = await send('account-create', { name, type, balance, offBudget });\n await dispatch(getAccounts());\n await dispatch(getPayees());\n return id;\n };\n}\n\nexport function openAccountCloseModal(accountId) {\n return async function(dispatch, getState) {\n const { balance, numTransactions } = await send('account-properties', {\n id: accountId\n });\n const account = getState().queries.accounts.find(\n acct => acct.id === accountId\n );\n\n dispatch(\n pushModal('close-account', {\n account,\n balance,\n canDelete: numTransactions === 0\n })\n );\n };\n}\n\nexport function closeAccount(accountId, transferAccountId, categoryId, forced) {\n return async function(dispatch) {\n await send('account-close', {\n id: accountId,\n transferAccountId,\n categoryId,\n forced\n });\n dispatch(getAccounts());\n };\n}\n\nexport function reopenAccount(accountId) {\n return async function(dispatch) {\n await send('account-reopen', { id: accountId });\n dispatch(getAccounts());\n };\n}\n\nexport function forceCloseAccount(accountId) {\n return closeAccount(accountId, null, null, true);\n}\n\nlet _undo = throttle(() => send('undo'), 100);\nlet _redo = throttle(() => send('redo'), 100);\n\nlet _undoEnabled = true;\nexport function setUndoEnabled(flag) {\n _undoEnabled = flag;\n}\n\nexport function undo() {\n return async () => {\n if (_undoEnabled) {\n _undo();\n }\n };\n}\n\nexport function redo() {\n return async () => {\n if (_undoEnabled) {\n _redo();\n }\n };\n}\n","import React from 'react';\n\nexport default React.createContext(undefined);\n","import React, { useState } from 'react';\n\nconst SvgLoading = props => {\n let { color = '#fff' } = props;\n let [gradientId] = useState('gradient-' + Math.random());\n\n return (\n <svg {...props} viewBox=\"0 0 38 38\" style={{ ...props.style }}>\n <defs>\n <linearGradient\n x1=\"8.042%\"\n y1=\"0%\"\n x2=\"65.682%\"\n y2=\"23.865%\"\n id={gradientId}\n >\n <stop stopColor={color} stopOpacity={0} offset=\"0%\" />\n <stop stopColor={color} stopOpacity={0.631} offset=\"63.146%\" />\n <stop stopColor={color} offset=\"100%\" />\n </linearGradient>\n </defs>\n <g transform=\"translate(1 2)\" fill=\"none\" fillRule=\"evenodd\">\n <path\n d=\"M36 18c0-9.94-8.06-18-18-18\"\n stroke={'url(#' + gradientId + ')'}\n strokeWidth={2}\n fill=\"none\"\n />\n <circle fill={color} cx={36} cy={18} r={1} />\n </g>\n </svg>\n );\n};\n\nexport default SvgLoading;\n","import React from 'react';\nimport Loading from './Loading';\nimport { css } from 'glamor';\n\nconst rotation = css.keyframes({\n '0%': { transform: 'rotate(-90deg)' },\n '100%': { transform: 'rotate(666deg)' }\n});\n\nfunction AnimatedLoading(props) {\n return (\n <span\n {...css({\n animationName: rotation,\n animationDuration: '1.6s',\n animationTimingFunction: 'cubic-bezier(0.17, 0.67, 0.83, 0.67)',\n animationIterationCount: 'infinite',\n lineHeight: 0\n })}\n >\n <Loading {...props} />\n </span>\n );\n}\n\nexport default AnimatedLoading;\n","import React from 'react';\n\nexport default React.createContext(undefined);\n","export class Query {\n constructor(state) {\n this.state = {\n filterExpressions: state.filterExpressions || [],\n selectExpressions: state.selectExpressions || [],\n groupExpressions: state.groupExpressions || [],\n orderExpressions: state.orderExpressions || [],\n calculation: false,\n rawMode: false,\n withDead: false,\n validateRefs: true,\n limit: null,\n offset: null,\n ...state\n };\n }\n\n filter(expr) {\n return new Query({\n ...this.state,\n filterExpressions: [...this.state.filterExpressions, expr]\n });\n }\n\n unfilter(exprs) {\n let exprSet = new Set(exprs);\n return new Query({\n ...this.state,\n filterExpressions: this.state.filterExpressions.filter(\n expr => !exprSet.has(Object.keys(expr)[0])\n )\n });\n }\n\n select(exprs = []) {\n if (!Array.isArray(exprs)) {\n exprs = [exprs];\n }\n\n let query = new Query({ ...this.state, selectExpressions: exprs });\n query.state.calculation = false;\n return query;\n }\n\n calculate(expr) {\n let query = this.select({ result: expr });\n query.state.calculation = true;\n return query;\n }\n\n groupBy(exprs) {\n if (!Array.isArray(exprs)) {\n exprs = [exprs];\n }\n\n return new Query({\n ...this.state,\n groupExpressions: [...this.state.groupExpressions, ...exprs]\n });\n }\n\n orderBy(exprs) {\n if (!Array.isArray(exprs)) {\n exprs = [exprs];\n }\n\n return new Query({\n ...this.state,\n orderExpressions: [...this.state.orderExpressions, ...exprs]\n });\n }\n\n limit(num) {\n return new Query({ ...this.state, limit: num });\n }\n\n offset(num) {\n return new Query({ ...this.state, offset: num });\n }\n\n raw() {\n return new Query({ ...this.state, rawMode: true });\n }\n\n withDead() {\n return new Query({ ...this.state, withDead: true });\n }\n\n withoutValidatedRefs() {\n return new Query({ ...this.state, validateRefs: false });\n }\n\n options(opts) {\n return new Query({ ...this.state, tableOptions: opts });\n }\n\n serialize() {\n return this.state;\n }\n}\n\nexport function getPrimaryOrderBy(query, defaultOrderBy) {\n let orderExprs = query.serialize().orderExpressions;\n if (orderExprs.length === 0) {\n if (defaultOrderBy) {\n return { order: 'asc', ...defaultOrderBy };\n }\n return null;\n }\n\n let firstOrder = orderExprs[0];\n if (typeof firstOrder === 'string') {\n return { field: firstOrder, order: 'asc' };\n }\n // Handle this form: { field: 'desc' }\n let [field] = Object.keys(firstOrder);\n return { field, order: firstOrder[field] };\n}\n\nexport default function q(table) {\n return new Query({ table });\n}\n","import React from 'react';\n\nconst SvgDotsHorizontalTriple = props => (\n <svg\n {...props}\n viewBox=\"0 0 20 20\"\n style={{\n color: '#242134',\n ...props.style\n }}\n >\n <path\n d=\"M10 12a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0-6a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 12a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nexport default SvgDotsHorizontalTriple;\n","import React, {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useImperativeHandle,\n useMemo\n} from 'react';\nimport * as d from 'date-fns';\nimport { css } from 'glamor';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport { styles, colors } from '../style';\nimport { View, Input, Tooltip } from './common';\nimport {\n getDayMonthFormat,\n getDayMonthRegex,\n getShortYearFormat,\n getShortYearRegex\n} from 'loot-core/src/shared/months';\n\nimport DateSelectLeft from './DateSelect.left.png';\nimport DateSelectRight from './DateSelect.right.png';\n\nlet pickerStyles = {\n '& .pika-single.actual-date-picker': {\n color: colors.n11,\n background: colors.n1,\n border: 'none',\n boxShadow: '0 0px 4px rgba(0, 0, 0, .25)',\n borderRadius: 4\n },\n\n '& .actual-date-picker': {\n '& .pika-lendar': {\n float: 'none',\n width: 'auto'\n },\n '& .pika-label': {\n backgroundColor: colors.n1\n },\n '& .pika-prev': {\n backgroundImage: `url(${DateSelectLeft})`\n },\n '& .pika-next': {\n backgroundImage: `url(${DateSelectRight})`\n },\n '& .pika-table th': {\n color: colors.n11,\n '& abbr': { textDecoration: 'none' }\n },\n '& .pika-button': {\n backgroundColor: colors.n2,\n color: colors.n11\n },\n '& .is-today .pika-button': {\n textDecoration: 'underline'\n },\n '& .is-selected .pika-button': {\n backgroundColor: colors.n5,\n boxShadow: 'none'\n }\n }\n};\n\nexport let DatePicker = React.forwardRef(\n ({ value, dateFormat, onUpdate, onSelect }, ref) => {\n let picker = useRef(null);\n let mountPoint = useRef(null);\n\n useImperativeHandle(\n ref,\n () => ({\n handleInputKeyDown(e) {\n let newDate = null;\n switch (e.keyCode) {\n case 37:\n e.preventDefault();\n newDate = d.subDays(picker.current.getDate(), 1);\n break;\n case 38:\n e.preventDefault();\n newDate = d.subDays(picker.current.getDate(), 7);\n break;\n case 39:\n e.preventDefault();\n newDate = d.addDays(picker.current.getDate(), 1);\n break;\n case 40:\n e.preventDefault();\n newDate = d.addDays(picker.current.getDate(), 7);\n break;\n default:\n }\n if (newDate) {\n picker.current.setDate(newDate, true);\n onUpdate && onUpdate(newDate);\n }\n }\n }),\n []\n );\n\n useLayoutEffect(() => {\n picker.current = new Pikaday({\n theme: 'actual-date-picker',\n keyboardInput: false,\n defaultDate: value\n ? d.parse(value, dateFormat, new Date())\n : new Date(),\n setDefaultDate: true,\n toString(date) {\n return d.format(date, dateFormat);\n },\n parse(dateString) {\n return d.parse(dateString, dateFormat, new Date());\n },\n onSelect\n });\n\n mountPoint.current.appendChild(picker.current.el);\n\n return () => {\n picker.current.destroy();\n };\n }, []);\n\n useEffect(() => {\n if (picker.current.getDate() !== value) {\n picker.current.setDate(d.parse(value, dateFormat, new Date()), true);\n }\n }, [value, dateFormat]);\n\n return (\n <View style={[pickerStyles, { flex: 1 }]} innerRef={mountPoint}></View>\n );\n }\n);\n\nfunction defaultShouldSaveFromKey(e) {\n // Enter\n return e.keyCode === 13;\n}\n\nexport default function DateSelect({\n containerProps,\n inputProps,\n tooltipStyle,\n value: defaultValue,\n isOpen,\n embedded,\n dateFormat = 'yyyy-MM-dd',\n focused,\n openOnFocus = true,\n inputRef: originalInputRef,\n shouldSaveFromKey = defaultShouldSaveFromKey,\n tableBehavior,\n onUpdate,\n onSelect\n}) {\n let parsedDefaultValue = useMemo(() => {\n if (defaultValue) {\n let date = d.parseISO(defaultValue);\n if (d.isValid(date)) {\n return d.format(date, dateFormat);\n }\n }\n return null;\n }, [defaultValue, dateFormat]);\n\n let picker = useRef(null);\n let [value, setValue] = useState(parsedDefaultValue || '');\n let [open, setOpen] = useState(embedded || isOpen || false);\n let inputRef = useRef(null);\n\n useLayoutEffect(() => {\n if (originalInputRef) {\n originalInputRef.current = inputRef.current;\n }\n }, []);\n\n // This is confusing, so let me explain: `selectedValue` should be\n // renamed to `currentValue`. It represents the current highlighted\n // value in the date select and always changes as the user moves\n // around. `userSelectedValue` represents the last value that the\n // user actually selected (with enter or click). Having both allows\n // us to make various UX decisions\n let [selectedValue, setSelectedValue] = useState(value);\n let userSelectedValue = useRef(selectedValue);\n\n useEffect(() => {\n userSelectedValue.current = value;\n }, [value]);\n\n useEffect(() => setValue(parsedDefaultValue), [parsedDefaultValue]);\n\n useEffect(() => {\n if (getDayMonthRegex(dateFormat).test(value)) {\n // Support only entering the month and day (4/5). This is complex\n // because of the various date formats - we need to derive\n // the right day/month format from it\n let test = d.parse(value, getDayMonthFormat(dateFormat), new Date());\n if (d.isValid(test)) {\n onUpdate && onUpdate(d.format(test, 'yyyy-MM-dd'));\n setSelectedValue(d.format(test, dateFormat));\n }\n } else if (getShortYearRegex(dateFormat).test(value)) {\n // Support entering the year as only two digits (4/5/19)\n let test = d.parse(value, getShortYearFormat(dateFormat), new Date());\n if (d.isValid(test)) {\n onUpdate && onUpdate(d.format(test, 'yyyy-MM-dd'));\n setSelectedValue(d.format(test, dateFormat));\n }\n } else {\n let test = d.parse(value, dateFormat, new Date());\n if (d.isValid(test)) {\n let date = d.format(test, 'yyyy-MM-dd');\n onUpdate && onUpdate(date);\n setSelectedValue(value);\n }\n }\n }, [value]);\n\n function onKeyDown(e) {\n let ENTER = 13;\n let UP = 38;\n let DOWN = 40;\n let ESC = 27;\n\n if (\n e.keyCode >= 37 &&\n e.keyCode <= 40 &&\n !e.shiftKey &&\n !e.metaKey &&\n !e.altKey &&\n open\n ) {\n picker.current.handleInputKeyDown(e);\n } else if (e.keyCode === ESC) {\n setValue(parsedDefaultValue);\n setSelectedValue(parsedDefaultValue);\n\n if (parsedDefaultValue === value) {\n if (open) {\n if (!embedded) {\n e.stopPropagation();\n }\n\n setOpen(false);\n }\n } else {\n setOpen(true);\n onUpdate && onUpdate(defaultValue);\n }\n } else if (shouldSaveFromKey(e)) {\n setValue(selectedValue);\n setOpen(false);\n\n let date = d.parse(selectedValue, dateFormat, new Date());\n onSelect(d.format(date, 'yyyy-MM-dd'));\n\n if (open) {\n if (userSelectedValue.current !== selectedValue) {\n // This stops the event from propagating up\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n let { onKeyDown } = inputProps || {};\n onKeyDown && onKeyDown(e);\n } else if (!open) {\n setOpen(true);\n if (inputRef.current) {\n inputRef.current.setSelectionRange(0, 10000);\n }\n }\n }\n\n function onChange(e) {\n setValue(e.target.value);\n }\n\n let maybeWrapTooltip = content => {\n return embedded ? (\n content\n ) : (\n <Tooltip\n position=\"bottom-left\"\n offset={2}\n style={[{ padding: 0, minWidth: 225 }, tooltipStyle]}\n >\n {content}\n </Tooltip>\n );\n };\n\n return (\n <View {...containerProps}>\n <Input\n focused={focused}\n {...inputProps}\n inputRef={inputRef}\n value={value}\n onKeyDown={onKeyDown}\n onChange={onChange}\n onFocus={e => {\n if (!embedded && openOnFocus) {\n setOpen(true);\n }\n inputProps && inputProps.onFocus && inputProps.onFocus(e);\n }}\n onBlur={e => {\n if (!embedded) {\n setOpen(false);\n }\n inputProps && inputProps.onBlur && inputProps.onBlur(e);\n\n if (!tableBehavior) {\n // If value is empty, that drives what gets selected.\n // Otherwise the input is reset to whatever is already\n // selected\n if (value === '') {\n setSelectedValue(null);\n onSelect(null);\n } else {\n setValue(selectedValue || '');\n\n let date = d.parse(selectedValue, dateFormat, new Date());\n onSelect(d.format(date, 'yyyy-MM-dd'));\n }\n }\n }}\n />\n {open &&\n maybeWrapTooltip(\n <DatePicker\n ref={picker}\n value={selectedValue}\n dateFormat={dateFormat}\n onUpdate={date => {\n setSelectedValue(d.format(date, dateFormat));\n onUpdate && onUpdate(d.format(date, 'yyyy-MM-dd'));\n }}\n onSelect={date => {\n setValue(d.format(date, dateFormat));\n onSelect(d.format(date, 'yyyy-MM-dd'));\n setOpen(false);\n }}\n />\n )}\n </View>\n );\n}\n","import * as d from 'date-fns';\nimport memoizeOne from 'memoize-one';\n\nfunction _parse(value) {\n if (typeof value === 'string') {\n // Dates are hard. We just want to deal with months in the format\n // 2020-01 and days in the format 2020-01-01, but life is never\n // simple. We want to rely on native dates for date logic because\n // days are complicated (leap years, etc). But relying on native\n // dates mean we're exposed to craziness.\n //\n // The biggest problem is that JS dates work with local time by\n // default. We could try to only work with UTC, but there's not an\n // easy way to make `format` avoid local time, and not sure if we\n // want that anyway (`currentMonth` should surely print the local\n // time). We need to embrace local time, and as long as inputs to\n // date logic and outputs from format are local time, it should\n // work.\n //\n // To make sure we're in local time, always give Date integer\n // values. If you pass in a string to parse, different string\n // formats produce different results.\n //\n // A big problem is daylight savings, however. Usually, when\n // giving the time to the Date constructor, you get back a date\n // specifically for that time in your local timezone. However, if\n // daylight savings occurs on that exact time, you will get back\n // something different:\n //\n // This is fine:\n // > new Date(2017, 2, 12, 1).toString()\n // > 'Sun Mar 12 2017 01:00:00 GMT-0500 (Eastern Standard Time)'\n //\n // But wait, we got back a different time (3AM instead of 2AM):\n // > new Date(2017, 2, 12, 2).toString()\n // > 'Sun Mar 12 2017 03:00:00 GMT-0400 (Eastern Daylight Time)'\n //\n // The time is \"correctly\" adjusted via DST, but we _really_\n // wanted 2AM. The problem is that time simply doesn't exist.\n //\n // Why is this a problem? Well, consider a case where the DST\n // shift happens *at midnight* and it goes back an hour. You think\n // you have a date object for the next day, but when formatted it\n // actually shows the previous day. A more likely scenario: buggy\n // timezone data makes JS dates do this shift when it shouldn't,\n // so using midnight at the time for date logic gives back the\n // last day. See the time range of Sep 30 15:00 - Oct 1 1:00 for\n // the AEST timezone when nodejs-mobile incorrectly gives you back\n // a time an hour *before* you specified. Since this happens on\n // Oct 1, doing `addMonths(September, 1)` still gives you back\n // September. Issue here:\n // https://github.com/JaneaSystems/nodejs-mobile/issues/251\n //\n // The fix is simple once you understand this. Always use the 12th\n // hour of the day. That's it. There is no DST that shifts more\n // than 12 hours (god let's hope not) so no matter how far DST has\n // shifted backwards or forwards, doing date logic will stay\n // within the day we want.\n\n let [year, month, day] = value.split('-');\n if (day != null) {\n return new Date(parseInt(year), parseInt(month) - 1, parseInt(day), 12);\n } else if (month != null) {\n return new Date(parseInt(year), parseInt(month) - 1, 1, 12);\n } else {\n return new Date(parseInt(year), 0, 1, 12);\n }\n }\n return value;\n}\n\nexport const parseDate = _parse;\n\nexport function yearFromDate(date) {\n return d.format(_parse(date), 'yyyy');\n}\n\nexport function monthFromDate(date) {\n return d.format(_parse(date), 'yyyy-MM');\n}\n\nexport function dayFromDate(date) {\n return d.format(_parse(date), 'yyyy-MM-dd');\n}\n\nexport function currentMonth() {\n if (global.IS_TESTING) {\n return '2017-01';\n } else {\n return d.format(new Date(), 'yyyy-MM');\n }\n}\n\nexport function currentDay() {\n if (global.IS_TESTING) {\n return '2017-01-01';\n } else {\n return d.format(new Date(), 'yyyy-MM-dd');\n }\n}\n\nexport function nextMonth(month) {\n return d.format(d.addMonths(_parse(month), 1), 'yyyy-MM');\n}\n\nexport function prevMonth(month) {\n return d.format(d.subMonths(_parse(month), 1), 'yyyy-MM');\n}\n\nexport function addMonths(month, n) {\n return d.format(d.addMonths(_parse(month), n), 'yyyy-MM');\n}\n\nexport function subMonths(month, n) {\n return d.format(d.subMonths(_parse(month), n), 'yyyy-MM');\n}\n\nexport function addDays(day, n) {\n return d.format(d.addDays(_parse(day), n), 'yyyy-MM-dd');\n}\n\nexport function subDays(day, n) {\n return d.format(d.subDays(_parse(day), n), 'yyyy-MM-dd');\n}\n\nexport function isBefore(month1, month2) {\n return d.isBefore(_parse(month1), _parse(month2));\n}\n\nexport function isAfter(month1, month2) {\n return d.isAfter(_parse(month1), _parse(month2));\n}\n\n// TODO: This doesn't really fit in this module anymore, should\n// probably live elsewhere\nexport function bounds(month) {\n return {\n start: parseInt(d.format(d.startOfMonth(_parse(month)), 'yyyyMMdd')),\n end: parseInt(d.format(d.endOfMonth(_parse(month)), 'yyyyMMdd'))\n };\n}\n\nexport function _range(start, end, inclusive) {\n const months = [];\n let month = monthFromDate(start);\n while (d.isBefore(_parse(month), _parse(end))) {\n months.push(month);\n month = addMonths(month, 1);\n }\n\n if (inclusive) {\n months.push(month);\n }\n\n return months;\n}\n\nexport function range(start, end) {\n return _range(start, end);\n}\n\nexport function rangeInclusive(start, end) {\n return _range(start, end, true);\n}\n\nexport function _dayRange(start, end, inclusive) {\n const days = [];\n let day = start;\n while (d.isBefore(_parse(day), _parse(end))) {\n days.push(day);\n day = addDays(day, 1);\n }\n\n if (inclusive) {\n days.push(day);\n }\n\n return days;\n}\n\nexport function dayRange(start, end) {\n return _dayRange(start, end);\n}\n\nexport function dayRangeInclusive(start, end) {\n return _dayRange(start, end, true);\n}\n\nexport function getMonthIndex(month) {\n return parseInt(month.slice(5, 7)) - 1;\n}\n\nexport function getYear(month) {\n return month.slice(0, 4);\n}\n\nexport function getMonth(day) {\n return day.slice(0, 7);\n}\n\nexport function getYearStart(month) {\n return getYear(month) + '-01';\n}\n\nexport function getYearEnd(month) {\n return getYear(month) + '-12';\n}\n\nexport function sheetForMonth(month) {\n return 'budget' + month.replace('-', '');\n}\n\nexport function nameForMonth(month) {\n return d.format(_parse(month), \"MMMM 'yy\");\n}\n\nexport function format(month, str) {\n return d.format(_parse(month), str);\n}\n\nexport const getDateFormatRegex = memoizeOne(format => {\n return new RegExp(\n format\n .replace(/d+/g, '\\\\d{1,2}')\n .replace(/M+/g, '\\\\d{1,2}')\n .replace(/y+/g, '\\\\d{4}')\n );\n});\n\nexport const getDayMonthFormat = memoizeOne(format => {\n return format\n .replace(/y+/g, '')\n .replace(/[^\\w]$/, '')\n .replace(/^[^\\w]/, '');\n});\n\nexport const getDayMonthRegex = memoizeOne(format => {\n let regex = format\n .replace(/y+/g, '')\n .replace(/[^\\w]$/, '')\n .replace(/^[^\\w]/, '')\n .replace(/d+/g, '\\\\d{1,2}')\n .replace(/M+/g, '\\\\d{1,2}');\n return new RegExp('^' + regex + '$');\n});\n\nexport const getMonthYearFormat = memoizeOne(format => {\n return format\n .replace(/d+/g, '')\n .replace(/[^\\w]$/, '')\n .replace(/^[^\\w]/, '')\n .replace(/\\/\\//, '/')\n .replace(/\\.\\./, '.')\n .replace(/--/, '-');\n});\n\nexport const getMonthYearRegex = memoizeOne(format => {\n let regex = format\n .replace(/d+/g, '')\n .replace(/[^\\w]$/, '')\n .replace(/^[^\\w]/, '')\n .replace(/\\/\\//, '/')\n .replace(/M+/g, '\\\\d{1,2}')\n .replace(/y+/g, '\\\\d{2,4}');\n return new RegExp('^' + regex + '$');\n});\n\nexport const getShortYearFormat = memoizeOne(format => {\n return format.replace(/y+/g, 'yy');\n});\n\nexport const getShortYearRegex = memoizeOne(format => {\n let regex = format\n .replace(/[^\\w]$/, '')\n .replace(/^[^\\w]/, '')\n .replace(/d+/g, '\\\\d{1,2}')\n .replace(/M+/g, '\\\\d{1,2}')\n .replace(/y+/g, '\\\\d{2}');\n return new RegExp('^' + regex + '$');\n});\n","let currencyFormatter = require('currency-formatter');\n\nexport function cleanUUID(uuid) {\n return uuid.replace(/-/g, '');\n}\n\nexport function last(arr) {\n return arr[arr.length - 1];\n}\n\nexport function mergeObjects(objects) {\n return Object.assign.apply(null, [{}, ...objects]);\n}\n\nexport function composeCellChanges(objects) {\n const merged = {};\n Object.keys(objects).forEach(key => {\n if (merged[key]) {\n merged[key] = { ...merged[key], ...objects[key] };\n } else {\n merged[key] = objects[key];\n }\n });\n}\n\nexport function flattenArray(arrays) {\n return Array.prototype.concat.apply([], arrays);\n}\n\nexport function shallowEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n var numKeysA = 0,\n numKeysB = 0,\n key;\n for (key in b) {\n numKeysB++;\n if (!a.hasOwnProperty(key) || a[key] !== b[key]) {\n return false;\n }\n }\n for (key in a) {\n numKeysA++;\n }\n return numKeysA === numKeysB;\n}\n\nexport function getChangedValues(obj1, obj2) {\n // Keep the id field because this is mostly used to diff database\n // objects\n const diff = obj1.id ? { id: obj1.id } : {};\n const keys = Object.keys(obj2);\n let hasChanged = false;\n\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n\n if (obj1[key] !== obj2[key]) {\n diff[key] = obj2[key];\n hasChanged = true;\n }\n }\n\n return hasChanged ? diff : null;\n}\n\nexport function hasFieldsChanged(obj1, obj2, fields) {\n let changed = false;\n for (var i = 0; i < fields.length; i++) {\n let field = fields[i];\n if (obj1[field] !== obj2[field]) {\n changed = true;\n break;\n }\n }\n return changed;\n}\n\nexport function applyChanges(changes, items) {\n items = [...items];\n\n if (changes.added) {\n changes.added.forEach(add => {\n items.push(add);\n });\n }\n\n if (changes.updated) {\n changes.updated.forEach(({ id, ...fields }) => {\n const idx = items.findIndex(t => t.id === id);\n items[idx] = {\n ...items[idx],\n ...fields\n };\n });\n }\n\n if (changes.deleted) {\n changes.deleted.forEach(t => {\n const idx = items.findIndex(t2 => t.id === t2.id);\n if (idx !== -1) {\n items.splice(idx, 1);\n }\n });\n }\n\n return items;\n}\n\nexport function partitionByField(data, field) {\n let res = new Map();\n for (let i = 0; i < data.length; i++) {\n let item = data[i];\n let key = item[field];\n\n let items = res.get(key) || [];\n items.push(item);\n\n res.set(key, items);\n }\n return res;\n}\n\nexport function groupBy(data, field, mapper) {\n let res = new Map();\n for (let i = 0; i < data.length; i++) {\n let item = data[i];\n let key = item[field];\n let existing = res.get(key) || [];\n res.set(key, existing.concat([mapper ? mapper(item) : data[i]]));\n }\n return res;\n}\n\nexport function groupBySingle(data, field, mapper) {\n let res = new Map();\n for (let i = 0; i < data.length; i++) {\n let item = data[i];\n let key = item[field];\n if (res.has(key)) {\n throw new Error('groupBySingle found conflicting key: ' + key);\n }\n res.set(key, mapper ? mapper(item) : data[i]);\n }\n return res;\n}\n\n// This should replace the existing `groupById` function, since a\n// `Map` is better, but we can't swap it out because `Map` has a\n// different API and we need to go through and update everywhere that\n// uses it.\nfunction _groupById(data) {\n let res = new Map();\n for (let i = 0; i < data.length; i++) {\n let item = data[i];\n res.set(item.id, item);\n }\n return res;\n}\n\nexport function diffItems(items, newItems) {\n let grouped = _groupById(items);\n let newGrouped = _groupById(newItems);\n let added = [];\n let updated = [];\n\n let deleted = items\n .filter(item => !newGrouped.has(item.id))\n .map(item => ({ id: item.id }));\n\n newItems.forEach(newItem => {\n let item = grouped.get(newItem.id);\n if (!item) {\n added.push(newItem);\n } else {\n const changes = getChangedValues(item, newItem);\n if (changes) {\n updated.push(changes);\n }\n }\n });\n\n return { added, updated, deleted };\n}\n\nexport function groupById(data) {\n let res = {};\n for (let i = 0; i < data.length; i++) {\n let item = data[i];\n res[item.id] = item;\n }\n return res;\n}\n\nexport function debugMemoFailure(prevProps, nextProps) {\n let changed = getChangedValues(prevProps, nextProps);\n if (changed !== null) {\n console.log(changed);\n }\n return changed === null;\n}\n\nexport function setIn(map, keys, item) {\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n\n if (i === keys.length - 1) {\n map.set(key, item);\n } else {\n if (!map.has(key)) {\n map.set(key, new Map());\n }\n\n map = map.get(key);\n }\n }\n}\n\nexport function getIn(map, keys) {\n let item = map;\n for (let i = 0; i < keys.length; i++) {\n item = item.get(keys[i]);\n\n if (item == null) {\n return item;\n }\n }\n return item;\n}\n\n// Useful for throwing exception from expressions\nexport function throwError(err) {\n throw err;\n}\n\nexport function fastSetMerge(set1, set2) {\n let finalSet = new Set(set1);\n let iter = set2.values();\n let value = iter.next();\n while (!value.done) {\n finalSet.add(value.value);\n value = iter.next();\n }\n return finalSet;\n}\n\nexport function titleFirst(str) {\n return str[0].toUpperCase() + str.slice(1);\n}\n\nexport let numberFormats = [\n { value: 'comma-dot', label: '1,000.33' },\n { value: 'dot-comma', label: '1.000,33' },\n { value: 'space-comma', label: '1 000,33' }\n];\n\nlet numberFormat = {\n value: null,\n formatter: null,\n regex: null\n};\n\nexport function setNumberFormat(format) {\n let locale, regex, separator;\n\n switch (format) {\n case 'space-comma':\n locale = 'za-ZA';\n regex = /[^-0-9,]/g;\n separator = ',';\n break;\n case 'dot-comma':\n locale = 'de-DE';\n regex = /[^-0-9,]/g;\n separator = ',';\n break;\n case 'comma-dot':\n default:\n locale = 'en-US';\n regex = /[^-0-9.]/g;\n separator = '.';\n }\n\n numberFormat = {\n value: format,\n separator,\n // This is the keep in line with the Intl API which we might\n // switch to when it's available on all mobile platforms\n formatter: {\n format: number =>\n currencyFormatter.format(number, { locale, format: '%v' })\n },\n regex\n };\n}\n\nexport function getNumberFormat() {\n return numberFormat;\n}\n\nsetNumberFormat('1,000.33');\n\nexport function toRelaxedNumber(value) {\n return integerToAmount(currencyToInteger(value) || 0);\n}\n\nexport function toRelaxedInteger(value) {\n return stringToInteger(value) || 0;\n}\n\nexport function integerToCurrency(n) {\n // Awesome\n return numberFormat.formatter.format(n / 100);\n}\n\nexport function amountToCurrency(n) {\n return numberFormat.formatter.format(n);\n}\n\nexport function amountToPrettyCurrency(n, code) {\n return currencyFormatter.format(n, { code });\n}\n\nexport function currencyToAmount(str) {\n let amount = parseFloat(\n str.replace(numberFormat.regex, '').replace(numberFormat.separator, '.')\n );\n return isNaN(amount) ? null : amount;\n}\n\nexport function currencyToInteger(str) {\n let amount = currencyToAmount(str);\n return amount ? amountToInteger(amount) : null;\n}\n\nexport function stringToInteger(str) {\n let amount = parseInt(str.replace(/[^-0-9.,]/g, ''));\n if (!isNaN(amount)) {\n return amount;\n }\n return null;\n}\n\nexport function amountToInteger(n) {\n return Math.round(n * 100);\n}\n\nexport function integerToAmount(n) {\n return parseFloat((n / 100).toFixed(2));\n}\n\n// This is used when the input format could be anything (from\n// financial files and we don't want to parse based on the user's\n// number format, because the user could be importing from many\n// currencies. We extract out the numbers and just ignore separators.\nexport function looselyParseAmount(amount) {\n function safeNumber(v) {\n return isNaN(v) ? null : v;\n }\n\n let m = amount.match(/[.,][^.,]*$/);\n if (!m || m.index === 0) {\n return safeNumber(parseFloat(amount));\n }\n\n let left = amount.slice(0, m.index);\n let right = amount.slice(m.index + 1);\n\n return safeNumber(parseFloat(left.replace(/[^0-9-]/g, '') + '.' + right));\n}\n\nexport function semverToNumber(str) {\n return parseInt(\n '1' +\n str\n .split('.')\n .map(x => {\n return ('000' + x.replace(/[^0-9]/g, '')).slice(-3);\n })\n .join('')\n );\n}\n","import { useContext, useState, useRef, useLayoutEffect } from 'react';\nimport NamespaceContext from './NamespaceContext.js';\nimport SpreadsheetContext from './SpreadsheetContext';\n\n// !! Do not use this!! This is deprecated. Use the `useSheetValue`\n// hook instead. The reason this hasn't been refactored on top of it\n// is because the hook only exposes the value, not the node. It also\n// doesn't provide a setter function. In the future there will be\n// separate hooks for those things.\nexport default function SheetValue({\n binding,\n initialValue,\n children,\n onChange\n}) {\n if (!binding) {\n throw new Error('SheetValue binding is required');\n }\n\n if (global.IS_TESTING && typeof binding !== 'string' && !binding.name) {\n binding = { ...binding, name: binding.value.toString() };\n }\n\n binding =\n typeof binding === 'string' ? { name: binding, value: null } : binding;\n\n if (binding.name == null) {\n throw new Error('Binding name is now required');\n }\n\n let spreadsheet = useContext(SpreadsheetContext);\n let sheetName = useContext(NamespaceContext) || '__global';\n let [result, setResult] = useState({\n name: sheetName + '!' + binding.name,\n value: initialValue != null ? initialValue : binding.value,\n query: binding.query\n });\n let latestOnChange = useRef(onChange);\n let latestValue = useRef(result.value);\n\n function setCell() {\n throw new Error('setCell is not implemented anymore');\n }\n\n useLayoutEffect(() => {\n latestOnChange.current = onChange;\n latestValue.current = result.value;\n });\n\n useLayoutEffect(\n () => {\n if (binding.query) {\n spreadsheet.createQuery(sheetName, binding.name, binding.query);\n }\n\n return spreadsheet.bind(sheetName, binding, null, newResult => {\n if (latestOnChange.current) {\n latestOnChange.current(newResult);\n }\n\n if (newResult.value !== latestValue.current) {\n setResult(newResult);\n }\n });\n },\n [sheetName, binding.name]\n );\n\n return result.value != null ? children(result, setCell) : null;\n}\n","const uuid = require('uuid');\n\nmodule.exports = {\n v4: function() {\n return Promise.resolve(uuid.v4());\n },\n\n v4Sync: function() {\n return uuid.v4();\n }\n};\n"],"sourceRoot":""}