@actual-app/web 23.8.1 → 23.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +37 -1
  2. package/build/asset-manifest.json +13 -17
  3. package/build/index.html +1 -1
  4. package/build/kcab/{kcab.worker.61dd77d50c3de3a5c965.js → kcab.worker.903b11c4b36a7822451f.js} +3 -3
  5. package/build/kcab/kcab.worker.903b11c4b36a7822451f.js.map +1 -0
  6. package/build/static/js/{457.4c255aed.chunk.js → 171.491e33e7.chunk.js} +2 -2
  7. package/build/static/js/171.491e33e7.chunk.js.map +1 -0
  8. package/build/static/js/{383.1b04bac1.chunk.js → 383.d7919241.chunk.js} +2 -2
  9. package/build/static/js/{383.1b04bac1.chunk.js.map → 383.d7919241.chunk.js.map} +1 -1
  10. package/build/static/js/main.041e259e.js +3 -0
  11. package/build/static/js/main.041e259e.js.map +1 -0
  12. package/build/static/js/narrow-components.b48d7cb2.chunk.js +2 -0
  13. package/build/static/js/narrow-components.b48d7cb2.chunk.js.map +1 -0
  14. package/build/static/js/reports.2402a148.chunk.js +2 -0
  15. package/build/static/js/reports.2402a148.chunk.js.map +1 -0
  16. package/build/static/js/wide-components.2c2e09e4.chunk.js +2 -0
  17. package/build/static/js/wide-components.2c2e09e4.chunk.js.map +1 -0
  18. package/package.json +10 -8
  19. package/build/kcab/kcab.worker.61dd77d50c3de3a5c965.js.map +0 -1
  20. package/build/static/js/281.6bb03bd1.chunk.js +0 -2
  21. package/build/static/js/281.6bb03bd1.chunk.js.map +0 -1
  22. package/build/static/js/457.4c255aed.chunk.js.map +0 -1
  23. package/build/static/js/876.00fe0e63.chunk.js +0 -2
  24. package/build/static/js/876.00fe0e63.chunk.js.map +0 -1
  25. package/build/static/js/main.b9496410.js +0 -3
  26. package/build/static/js/main.b9496410.js.map +0 -1
  27. package/build/static/js/narrow-components.55a3b7fd.chunk.js +0 -2
  28. package/build/static/js/narrow-components.55a3b7fd.chunk.js.map +0 -1
  29. package/build/static/js/reports.689f3940.chunk.js +0 -2
  30. package/build/static/js/reports.689f3940.chunk.js.map +0 -1
  31. package/build/static/js/wide-components.e3cfa9ca.chunk.js +0 -2
  32. package/build/static/js/wide-components.e3cfa9ca.chunk.js.map +0 -1
  33. /package/build/kcab/{kcab.worker.61dd77d50c3de3a5c965.js.LICENSE.txt → kcab.worker.903b11c4b36a7822451f.js.LICENSE.txt} +0 -0
  34. /package/build/static/js/{main.b9496410.js.LICENSE.txt → main.041e259e.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_actual_app_web=self.webpackChunk_actual_app_web||[]).push([[447],{29214:function(e,t,n){n.r(t),n.d(t,{Account:function(){return Ie},Accounts:function(){return J},Budget:function(){return $}});var o=n(83017),r=n(71274),i=n(62914),s=n(97156),a=n(58155),l=n(24917),d=n(43045),c=n(48099),u=n(9314),h=n(53819),g=n(91743);function p(e){let{onSync:t,children:n}=e,[r,i]=(0,o.useState)(!1);return n({refreshing:r,onRefresh:async function(){i(!0),await t(),i(!1)}})}var y=n(51678),f=n(28321),x=n(69585),m=n(81576),j=n(28993);var b=e=>(0,j.jsx)("svg",{...e,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",style:{color:"inherit",...e.style},children:(0,j.jsx)("path",{d:"m3.828 9 6.071-6.071-1.414-1.414L0 10l.707.707 7.778 7.778 1.414-1.414L3.828 11H20V9H3.828z",fill:"currentColor"})}),w=n(62506),C=n(13743);var S=(0,o.forwardRef)(((e,t)=>{let{children:n,...o}=e;return(0,j.jsx)(g.Z,{...o,ref:t,style:[{marginTop:15,marginLeft:5,marginRight:5,borderRadius:6,backgroundColor:"white",borderColor:h.O9.p3,boxShadow:"0 1px 2px #9594A8"},o.style],children:(0,j.jsx)(g.Z,{style:{borderRadius:6,overflow:"hidden"},children:n})})})),Z=n(10666);function v(e){let{title:t,style:n}=e;return(0,j.jsx)(Z.Z,{style:[h.W2.text,{color:h.O9.n2,textAlign:"right",fontSize:12,marginBottom:2},n],children:t})}var A=n(91742),B=n(40336),O=n(7401),T=n(17422),M=n(79291),_=n(41218);const k=e=>{let{children:t,style:n,...o}=e;return(0,j.jsx)(g.Z,{style:[{height:50,borderBottomWidth:1,borderColor:h.O9.Cg,flexDirection:"row",alignItems:"center",paddingLeft:10,paddingRight:10,zIndex:1},n],...o,children:t})};function W(e){let{toBudget:t,onClick:n}=e,o=(0,T.Z)(t);return(0,j.jsxs)(C.Z,{type:"bare",style:{flexDirection:"column",alignItems:"flex-start"},onClick:n,children:[(0,j.jsx)(v,{title:o<0?"OVERBUDGETED":"TO BUDGET",style:{color:h.O9.n1,flexShrink:0}}),(0,j.jsx)(Z.Z,{style:[h.W2.smallText,{fontWeight:"500",color:o<0?h.O9.r4:h.O9.n1}],children:(0,B.Z)(o,"financial")})]})}function R(e){let{projected:t}=e,n=(0,T.Z)(f.u8.totalBudgetedSaved)||0,o=(0,T.Z)(f.u8.totalSaved)||0,r=t?n:o,i=r<0;return(0,j.jsxs)(g.Z,{style:{flexDirection:"column",alignItems:"flex-start"},children:[t?(0,j.jsx)(v,{title:"PROJECTED SAVINGS",style:{color:h.O9.n1}}):(0,j.jsx)(v,{title:i?"OVERSPENT":"SAVED",style:{color:h.O9.n1}}),(0,j.jsx)(Z.Z,{style:[h.W2.smallText,{fontWeight:"500",color:t?h.O9.y3:i?h.O9.r4:h.O9.n1}],children:(0,B.Z)(r,"financial")})]})}const D=(0,o.memo)((function(e){const{name:t,binding:n,editing:o,style:r,textStyle:i,categoryId:s,month:a,onBudgetAction:l}=e;let d=(0,T.Z)(n);return(0,j.jsxs)(g.Z,{style:r,children:[(0,j.jsx)(_._,{value:(0,x.Bf)(d||0),style:{height:46,transform:"translateX(6px)",...!o&&{opacity:0,position:"absolute",top:0}},focused:o,textStyle:[h.W2.smallText,i],onChange:()=>{},onBlur:e=>{l(a,"budget-amount",{category:s,amount:(0,x.l9)(e)})}}),(0,j.jsx)(g.Z,{style:{justifyContent:"center",height:46,...o&&{display:"none"}},children:(0,j.jsx)(Z.Z,{style:[h.W2.smallText,i],"data-testid":t,children:(0,B.Z)(d||0,"financial")})})]})}));class E extends o.PureComponent{constructor(e){super(e);let{editMode:t,blank:n}=e;this.opacity=t||n?0:1}render(){let{category:e,editing:t,index:n,style:o,month:r,onBudgetAction:i}=this.props,s=f.aK.catBudgeted(e.id),a=f.aK.catBalance(e.id),l=(0,j.jsxs)(k,{style:[{backgroundColor:t?h.O9.Ft:"transparent",borderBottomWidth:0,borderTopWidth:n>0?1:0},o],"data-testid":"row",children:[(0,j.jsx)(g.Z,{style:{flex:1},children:(0,j.jsx)(Z.Z,{style:h.W2.smallText,children:e.name})}),(0,j.jsxs)(g.Z,{style:{alignItems:"center",flexDirection:"row",opacity:this.opacity},children:[(0,j.jsx)(D,{name:"budgeted",binding:s,editing:t,style:{width:90},textStyle:[h.W2.smallText,{textAlign:"right"}],categoryId:e.id,month:r,onBudgetAction:i}),(0,j.jsx)(A.Z,{name:"balance",binding:a,style:[h.W2.smallText,{width:90,textAlign:"right"}],getStyle:e=>e<0&&{color:h.O9.r4},type:"financial"})]})]});return(0,j.jsx)("div",{children:l})}}class I extends o.PureComponent{constructor(e){super(e);let{editMode:t,blank:n}=e;this.opacity=t||n?0:1}render(){let{group:e,editMode:t,onAddCategory:n}=this.props,o=(0,j.jsxs)(k,{style:{flexDirection:"row",alignItems:"center",backgroundColor:h.O9.S0},"data-testid":"totals",children:[(0,j.jsx)(g.Z,{style:{flex:1},children:(0,j.jsx)(Z.Z,{style:[h.W2.smallText,{fontWeight:"500"}],"data-testid":"name",children:e.name})}),(0,j.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",opacity:this.opacity},children:[(0,j.jsx)(A.Z,{binding:f.aK.groupBudgeted(e.id),style:[h.W2.smallText,{width:90,fontWeight:"500",textAlign:"right"}],type:"financial"}),(0,j.jsx)(A.Z,{binding:f.aK.groupBalance(e.id),style:[h.W2.smallText,{width:90,fontWeight:"500",textAlign:"right"}],type:"financial"})]}),t&&(0,j.jsx)(g.Z,{children:(0,j.jsx)(C.Z,{onClick:()=>n(e.id),style:{padding:10},children:(0,j.jsx)(m.Z,{width:15,height:15})})})]});return o}}class G extends o.PureComponent{render(){const{name:e,budget:t,balance:n,style:o,nameTextStyle:r,amountTextStyle:i}=this.props;return(0,j.jsxs)(k,{style:[{flexDirection:"row",alignItems:"center",padding:10,backgroundColor:"transparent"},o],children:[(0,j.jsx)(g.Z,{style:{flex:1},children:(0,j.jsx)(Z.Z,{style:[h.W2.smallText,r],"data-testid":"name",children:e})}),t&&(0,j.jsx)(A.Z,{binding:t,style:[h.W2.smallText,{width:90,textAlign:"right"},i],type:"financial"}),(0,j.jsx)(A.Z,{binding:n,style:[h.W2.smallText,{width:90,textAlign:"right"},i],type:"financial"})]})}}class z extends o.PureComponent{render(){const{group:e,editMode:t,gestures:n,month:o,onEditCategory:r,onReorderCategory:i,onAddCategory:s,onBudgetAction:a}=this.props;return(0,j.jsxs)(S,{style:{marginTop:7,marginBottom:7},children:[(0,j.jsx)(I,{group:e,budgeted:f.aK.groupBudgeted(e.id),balance:f.aK.groupBalance(e.id),editMode:t,onAddCategory:s,onReorderCategory:i}),e.categories.map(((e,s)=>(0,j.jsx)(E,{index:s,category:e,editing:void 0,editMode:t,gestures:n,month:o,onEdit:r,onReorder:i,onBudgetAction:a},e.id)))]})}}class L extends o.Component{render(){const{type:e,group:t}=this.props;return(0,j.jsxs)(g.Z,{children:[(0,j.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",justifyContent:"flex-end",marginTop:50,marginBottom:5,marginRight:14},children:["report"===e&&(0,j.jsx)(v,{title:"BUDGETED",style:{width:90}}),(0,j.jsx)(v,{title:"RECEIVED",style:{width:90}})]}),(0,j.jsxs)(S,{style:{marginTop:0},children:[(0,j.jsx)(G,{name:"Income",budget:"report"===e?f.u8.groupBudgeted(t.id):null,balance:"report"===e?f.u8.groupSumAmount(t.id):f.aK.groupSumAmount(t.id),nameTextStyle:{fontWeight:"500"},amountTextStyle:{fontWeight:"500"},style:{backgroundColor:h.O9.S0}}),t.categories.map(((t,n)=>(0,j.jsx)(G,{type:e,name:t.name,budget:"report"===e?f.u8.catBudgeted(t.id):null,balance:"report"===e?f.u8.catSumAmount(t.id):f.aK.catSumAmount(t.id),index:n},t.id)))]})]})}}class P extends o.Component{constructor(){super(...arguments),this.getGroups=(0,y.Z)((e=>({incomeGroup:e.find((e=>e.is_income)),expenseGroups:e.filter((e=>!e.is_income))})))}render(){const{type:e,categoryGroups:t,editingId:n,gestures:o,month:r,onEditCategory:i,onAddCategory:s,onReorderCategory:a,onReorderGroup:l,onBudgetAction:d}=this.props,{incomeGroup:c,expenseGroups:u}=this.getGroups(t);return(0,j.jsxs)(g.Z,{"data-testid":"budget-groups",style:{flex:"1 0 auto",overflowY:"auto",paddingBottom:15},children:[u.map((e=>(0,j.jsx)(z,{group:e,editingId:n,editMode:void 0,gestures:o,month:r,onEditCategory:i,onAddCategory:s,onReorderCategory:a,onReorderGroup:l,onBudgetAction:d},e.id))),c&&(0,j.jsx)(L,{type:e,group:c})]})}}class N extends o.Component{constructor(){super(...arguments),this.state={editingCategory:null},this.onEditCategory=e=>{this.setState({editingCategory:e})}}render(){const{type:e,categoryGroups:t,month:n,monthBounds:o,editMode:r,onPrevMonth:i,onNextMonth:s,onAddCategory:a,onReorderCategory:d,onReorderGroup:c,onShowBudgetDetails:u,onOpenActionSheet:p,onBudgetAction:y}=this.props;let{editingCategory:x}=this.state,m=l.dK();return(0,j.jsx)(O.Z.Provider,{value:l.cv(n,e),children:(0,j.jsxs)(g.Z,{style:{flex:1,overflowY:"hidden"},"data-testid":"budget-table",children:[(0,j.jsx)(F,{currentMonth:n,monthBounds:o,editMode:r,onDone:()=>this.props.onEditMode(!1),onOpenActionSheet:p,onPrevMonth:i,onNextMonth:s}),(0,j.jsxs)(g.Z,{style:{flexDirection:"row",flex:"1 0 auto",padding:10,paddingRight:14,backgroundColor:"white",borderBottomWidth:1,borderColor:h.O9.n9},children:["report"===e?(0,j.jsx)(R,{projected:n>=m}):(0,j.jsx)(W,{toBudget:f.aK.toBudget,onClick:u}),(0,j.jsx)(g.Z,{style:{flex:1}}),(0,j.jsxs)(g.Z,{style:{width:90},children:[(0,j.jsx)(v,{title:"BUDGETED",style:{color:h.O9.n1}}),(0,j.jsx)(A.Z,{binding:f.u8.totalBudgetedExpense,type:"financial",style:[h.W2.smallText,{color:h.O9.n1,textAlign:"right",fontWeight:"500"}],formatter:e=>(0,B.Z)(-parseFloat(e||"0"),"financial")})]}),(0,j.jsxs)(g.Z,{style:{width:90},children:[(0,j.jsx)(v,{title:"BALANCE",style:{color:h.O9.n1}}),(0,j.jsx)(A.Z,{binding:f.aK.totalBalance,type:"financial",style:[h.W2.smallText,{color:h.O9.n1,textAlign:"right",fontWeight:"500"}]})]})]}),(0,j.jsx)(g.Z,{style:{overflowY:"auto"},children:r?(0,j.jsx)(j.Fragment,{children:(0,j.jsx)(g.Z,{children:(0,j.jsx)(P,{categoryGroups:t,editingId:x,editMode:r,gestures:this.gestures,onEditCategory:()=>{},onAddCategory:a,onReorderCategory:d,onReorderGroup:c})})}):(0,j.jsx)(g.Z,{children:(0,j.jsx)(P,{type:e,categoryGroups:t,editingId:x,editMode:r,gestures:this.gestures,month:n,onEditCategory:this.onEditCategory,onAddCategory:a,onReorderCategory:d,onReorderGroup:c,onBudgetAction:y})})})]})})}}function F(e){let{currentMonth:t,monthBounds:n,editMode:o,onDone:r,onPrevMonth:i,onNextMonth:s}=e,a=t>n.start,d=t<l.W9(n.end,1),c={paddingLeft:15,paddingRight:15,backgroundColor:"transparent"};return(0,j.jsxs)(g.Z,{style:{alignItems:"center",flexDirection:"row",flexShrink:0,height:50,justifyContent:"center",backgroundColor:h.O9.p5},children:[!o&&(0,j.jsx)(C.Z,{type:"bare",onClick:a&&i,style:[c,{left:0,opacity:a?1:.6,padding:"5px 30px 5px 0"}],children:(0,j.jsx)(b,{style:{color:h.O9.S0},width:"15",height:"15"})}),(0,j.jsx)(Z.Z,{style:[h.W2.mediumText,{marginTop:12,marginBottom:12,color:h.O9.S0,textAlign:"center"}],children:l.WU(t,"MMMM ''yy")}),o?(0,j.jsx)(C.Z,{type:"bare",onClick:r,style:[c,{position:"absolute",top:0,bottom:0,right:0}],textStyle:{color:h.O9.S0,fontSize:15,fontWeight:"500"},children:"Done"}):(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(C.Z,{type:"bare",onClick:d&&s,style:[c,{opacity:d?1:.6}],children:(0,j.jsx)(w.Z,{style:{color:h.O9.S0},width:"15",height:"15"})}),(0,j.jsx)(M.rD,{style:{color:"white",position:"absolute",top:0,bottom:0,right:0,backgroundColor:"transparent",paddingLeft:12,paddingRight:12}})]})]})}class K extends o.Component{constructor(e){var t;super(e),t=this,this.prewarmMonth=async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;n=n||t.props.budgetType;let o="report"===n?"report-budget-month":"rollover-budget-month",r=await(0,s.lW)(o,{month:e});for(let i of r)t.props.spreadsheet.prewarmCache(i.name,i);t.state.initialized||t.setState({initialized:!0})},this.onShowBudgetDetails=()=>{this.props.pushModal("budget-summary",{month:this.state.currentMonth})},this.onBudgetAction=e=>{const{currentMonth:t}=this.state;this.props.applyBudgetAction(t,e,this.state.bounds)},this.onAddCategory=e=>{this.props.navigation.navigate("AddCategoryModal",{groupId:e,onAdd:async t=>{let n=await this.props.createCategory(t,e),{categoryGroups:o}=this.state;this.setState({categoryGroups:(0,a.i8)(o,{name:t,cat_group:e,is_income:0,id:n})})}})},this.onReorderCategory=(e,t)=>{let n,o,{inGroup:r,aroundCategory:i}=t,{categoryGroups:s}=this.state;if(r)n=r;else if(i){let{id:e,position:t}=i,r=s.find((t=>t.categories.find((t=>t.id===e))));if("bottom"===t){let{categories:t}=r,n=t.findIndex((t=>t.id===e));e=n<t.length-1?t[n+1].id:null}n=r.id,o=e}this.props.moveCategory(e,n,o),this.setState({categoryGroups:(0,a.Wr)(s,e,n,o)})},this.onReorderGroup=(e,t,n)=>{let{categoryGroups:o}=this.state;if("bottom"===n){let e=o.findIndex((e=>e.id===t));t=e<o.length-1?o[e+1].id:null}this.props.moveCategoryGroup(e,t),this.setState({categoryGroups:(0,a.eq)(o,e,t)})},this.sync=async()=>{const{updated:e,error:t}=await this.props.sync();return t?"error":e?"updated":null},this.onPrevMonth=async()=>{let e=l.W9(this.state.currentMonth,1);await this.prewarmMonth(e),this.setState({currentMonth:e})},this.onNextMonth=async()=>{let e=l.zI(this.state.currentMonth,1);await this.prewarmMonth(e),this.setState({currentMonth:e})},this.onOpenActionSheet=()=>{let{budgetType:e}=this.props,t=["Edit Categories","Copy last month\u2019s budget","Set budgets to zero","Set budgets to 3 month average","report"===e&&"Apply to all future budgets","Cancel"].filter(Boolean);this.props.showActionSheetWithOptions({options:t,cancelButtonIndex:t.length-1,title:"Actions"},(t=>{switch(t){case 0:this.setState({editMode:!0});break;case 1:this.onBudgetAction("copy-last");break;case 2:this.onBudgetAction("set-zero");break;case 3:this.onBudgetAction("set-3-avg");break;case 4:"report"===e&&this.onBudgetAction("set-all-future")}}))},this.summary=0;const n=l.dK();this.state={bounds:{start:n,end:n},currentMonth:n,initialized:!1,editMode:!1,categoryGroups:null}}async loadCategories(){let e=await this.props.getCategories();this.setState({categoryGroups:e.grouped})}async componentDidMount(){this.loadCategories();const{start:e,end:t}=await(0,s.lW)("get-budget-bounds");this.setState({bounds:{start:e,end:t}}),this.prewarmMonth(this.state.currentMonth);let n=(0,s.oL)("sync-event",(e=>{let{type:t,tables:n}=e;"success"===t&&(n.includes("categories")||n.includes("category_mapping")||n.includes("category_groups"))&&this.loadCategories()}));this.cleanup=()=>{n()}}componentWillUnmount(){}render(){const{currentMonth:e,bounds:t,editMode:n,initialized:o}=this.state,{categories:r,categoryGroups:i,prefs:s,budgetType:a,navigation:l,applyBudgetAction:d}=this.props;let c=s.numberFormat||"comma-dot",h=s.hideFraction||!1;return i&&o?(0,j.jsx)(p,{onSync:this.sync,children:o=>{let{refreshing:s,onRefresh:u}=o;return(0,j.jsx)(N,{categories:r,categoryGroups:i,type:a,month:e,monthBounds:t,editMode:n,navigation:l,onEditMode:e=>this.setState({editMode:e}),onShowBudgetDetails:this.onShowBudgetDetails,onPrevMonth:this.onPrevMonth,onNextMonth:this.onNextMonth,onAddCategory:this.onAddCategory,onReorderCategory:this.onReorderCategory,onReorderGroup:this.onReorderGroup,onOpenActionSheet:()=>{},onBudgetAction:d},c+h)}}):(0,j.jsx)(g.Z,{style:{flex:1,backgroundColor:"white",alignItems:"center",justifyContent:"center",marginBottom:25},children:(0,j.jsx)(u.Z,{width:25,height:25})})}}function $(){let e=(0,r.v9)((e=>e.queries.categories.grouped)),t=(0,r.v9)((e=>e.queries.categories.list)),n=(0,r.v9)((e=>e.prefs.local.budgetType||"rollover")),o=(0,r.v9)((e=>e.prefs.local)),s=(0,d.o)(),a=(0,i.M)();return(0,c.j)(h.O9.p5),(0,j.jsx)(K,{categoryGroups:e,categories:t,budgetType:n,prefs:o,...s,spreadsheet:a})}var q=n(79274);function U(e){let{children:t,...n}=e;return(0,j.jsx)(Z.Z,{...n,style:[n.style,{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",display:"block"}],children:t})}var V=n(17877);function H(e){let{name:t,amount:n}=e;return(0,j.jsxs)(g.Z,{style:{flexDirection:"row",marginTop:28,marginBottom:10},children:[(0,j.jsx)(g.Z,{style:{flex:1},children:(0,j.jsx)(Z.Z,{style:[h.W2.text,{textTransform:"uppercase",color:h.O9.n5,fontSize:13}],"data-testid":"name",children:t})}),(0,j.jsx)(A.Z,{binding:n,style:[h.W2.text,{color:h.O9.n5,fontSize:13}],type:"financial"})]})}function Y(e){let{account:t,updated:n,getBalanceQuery:o,onSelect:r}=e;return(0,j.jsx)(g.Z,{style:{flex:"1 0 auto",flexDirection:"row",backgroundColor:"white",boxShadow:`0 1px 1px ${h.O9.n7}`,borderRadius:6,marginTop:10},children:(0,j.jsxs)(C.Z,{onMouseDown:()=>r(t.id),style:{flexDirection:"row",flex:1,alignItems:"center",borderRadius:6,"&:active":{opacity:.1}},children:[(0,j.jsx)(g.Z,{style:{flex:"1 auto",margin:"10px 0"},children:(0,j.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center"},children:[(0,j.jsx)(U,{style:[h.W2.text,{fontSize:17,fontWeight:600,color:n?h.O9.b2:h.O9.n2,paddingRight:30}],children:t.name}),t.bankId&&(0,j.jsx)(g.Z,{style:{backgroundColor:h.O9.g5,marginLeft:"-23px",width:8,height:8,borderRadius:8}})]})}),(0,j.jsx)(A.Z,{binding:o(t),type:"financial",style:{fontSize:16,color:h.O9.n3},getStyle:e=>e<0&&{color:h.O9.r4}})]})})}function Q(e){let{onAdd:t}=e;return(0,j.jsxs)(g.Z,{style:{flex:1,padding:30},children:[(0,j.jsx)(Z.Z,{style:h.W2.text,children:"For Actual to be useful, you need to add an account. You can link an account to automatically download transactions, or manage it locally yourself."}),(0,j.jsx)(C.Z,{type:"primary",style:{marginTop:20,alignSelf:"center"},onClick:()=>alert("Account creation is not supported on mobile on the self-hosted service yet"),children:"Add Account"}),(0,j.jsx)(Z.Z,{style:{marginTop:20,color:h.O9.n5},children:"In the future, you can add accounts using the add button in the header."})]})}class X extends o.Component{constructor(){super(...arguments),this.isNewTransaction=e=>this.props.newTransactions.includes(e)}render(){const{accounts:e,updatedAccounts:t,getBalanceQuery:n,getOnBudgetBalance:o,getOffBudgetBalance:r,onAddAccount:i,onSelectAccount:s}=this.props,a=e.filter((e=>0===e.offbudget)),l=e.filter((e=>1===e.offbudget));if(0===e.length)return(0,j.jsx)(Q,{onAdd:i});const d=(0,j.jsxs)(V.T3,{title:"Accounts",children:[(0,j.jsx)(H,{name:"Budgeted",amount:o()}),a.map(((e,o)=>(0,j.jsx)(Y,{account:e,updated:t.includes(e.id),getBalanceQuery:n,onSelect:s},e.id))),(0,j.jsx)(H,{name:"Off budget",amount:r()}),l.map(((e,o)=>(0,j.jsx)(Y,{account:e,updated:t.includes(e.id),getBalanceQuery:n,onSelect:s},e.id)))]});return(0,j.jsx)(g.Z,{style:{flex:1},children:d})}}function J(){let e=(0,r.v9)((e=>e.queries.accounts)),t=(0,r.v9)((e=>e.queries.newTransactions)),n=(0,r.v9)((e=>e.queries.updatedAccounts)),i=(0,r.v9)((e=>e.queries.categories.list)),s=(0,r.v9)((e=>e.prefs.local.numberFormat||"comma-dot")),a=(0,r.v9)((e=>e.prefs.local.hideFraction||!1)),{getCategories:l,getAccounts:u}=(0,d.o)();const p=(0,o.useState)({}),y=(0,q.s0)();(0,o.useEffect)((()=>{(async()=>{0===i.length&&await l(),u()})()}),[]);return(0,c.j)(h.O9.b2),(0,j.jsx)(g.Z,{style:{flex:1},children:(0,j.jsx)(X,{accounts:e.filter((e=>!e.closed)),categories:i,transactions:p||[],updatedAccounts:n,newTransactions:t,getBalanceQuery:f.cW,getOnBudgetBalance:f.SZ,getOffBudgetBalance:f.An,onAddAccount:()=>{},onSelectAccount:e=>{y(`/accounts/${e}`)},onSelectTransaction:e=>{y(`/transaction/${e}`)}},s+a)})}var ee=n(74881),te=n.n(ee),ne=n(18753),oe=n(17199),re=n(33865),ie=n(99121),se=n(28731),ae=n(17745);var le=e=>(0,j.jsx)("svg",{...e,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",style:{color:"inherit",...e.style},children:(0,j.jsx)("path",{d:"M7.05 9.293 6.343 10 12 15.657l1.414-1.414L9.172 10l4.242-4.243L12 4.343z",fill:"currentColor"})}),de=n(47631),ce=n(13419),ue=n(27876),he=n(93568),ge=n(1591),pe=n(51522),ye=n(86216),fe=n(86634),xe=n(88370),me=n(56288),je=n(46854);const be={SECTION_HEADING:10};let we=(0,y.Z)((e=>(0,x.ZZ)(e))),Ce=(0,y.Z)((e=>(0,x.ZZ)(e)));function Se(e){return-1!==e.indexOf("preview/")}function Ze(e){let t,{status:n}=e;switch(n){case"missed":t=h.O9.r3;break;case"due":t=h.O9.y3;break;case"upcoming":t=h.O9.n4}return(0,j.jsx)(Z.Z,{style:{fontSize:11,color:t,fontStyle:"italic"},children:(0,x.VL)(n)})}class ve extends o.PureComponent{render(){const{transaction:e,accounts:t,categories:n,payees:o,showCategory:r,added:i,style:s}=this.props;let{id:a,payee:l,amount:d,category:c,cleared:u,is_parent:p,notes:y,schedule:f}=e;Se(a)&&(d=(0,xe.lP)(d));let m=c?function(e,t){return e.find((e=>e.id===t)).name}(n,c):null,b=o&&l&&we(o)[l],w=b&&b.transfer_acct&&Ce(t)[b.transfer_acct],C=function(e,t,n){let{amount:o}=e;return n?`Transfer ${o>0?"from":"to"} ${n.name}`:t?t.name:""}(e,b,w),S=w?"Transfer":p?"Split":m,v=Se(a),A=v&&{fontStyle:"italic",color:h.O9.n5};return(0,j.jsxs)(Me,{style:[{flex:1,height:60,padding:"5px 10px"},v&&{backgroundColor:h.O9.S0},s],children:[(0,j.jsxs)(g.Z,{style:[{flex:1}],children:[(0,j.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center"},children:[f&&(0,j.jsx)(me.Z,{style:{width:12,height:12,marginRight:5,color:A.color||h.O9.n1}}),(0,j.jsx)(U,{style:[h.W2.text,A,{fontSize:14,fontWeight:i?"600":"400"},""===C&&{color:h.O9.n6,fontStyle:"italic"}],children:C||"Empty"})]}),v?(0,j.jsx)(Ze,{status:y}):(0,j.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",marginTop:3},children:[(0,j.jsx)(je.Z,{style:{width:11,height:11,color:u?h.O9.g6:h.O9.n8,marginRight:5}}),r&&(0,j.jsx)(U,{style:{fontSize:11,marginTop:1,fontWeight:"400",color:S?h.O9.n3:h.O9.p7,fontStyle:S?null:"italic",textAlign:"left"},children:S||"Uncategorized"})]})]}),(0,j.jsx)(Z.Z,{style:[h.W2.text,A,{marginLeft:25,marginRight:5,fontSize:14}],children:(0,x.zA)(d)})]})}}class Ae extends o.Component{constructor(){super(...arguments),this.makeData=(0,y.Z)((e=>{const t=[];return e.forEach((e=>{if(0===t.length||e.date!==t[t.length-1].date){let n=t[t.length-1];if(n&&n.data.length>0){let e=n.data;e[e.length-1].isLast=!0}t.push({id:e.date,date:e.date,data:[]})}e.is_child||t[t.length-1].data.push(e)})),t}))}render(){const{transactions:e,scrollProps:t={},onLoadMore:n}=this.props,o=this.makeData(e);return(0,j.jsxs)(j.Fragment,{children:[t.ListHeaderComponent,(0,j.jsxs)(Be,{...t,"aria-label":"transaction list",label:"",loadMore:n,selectionMode:"none",style:{flex:"1 auto",height:"100%",overflowY:"auto"},children:[0===o.length?(0,j.jsx)(pe.$0,{children:(0,j.jsx)(pe.ck,{children:(0,j.jsx)("div",{style:{display:"flex",justifyContent:"center",width:"100%"},children:(0,j.jsx)(Z.Z,{style:{fontSize:15},children:"No transactions"})})})}):null,o.map((e=>(0,j.jsx)(pe.$0,{title:l.WU(e.date,"MMMM dd, yyyy"),children:e.data.map(((e,t,n)=>(0,j.jsx)(pe.ck,{style:{fontSize:t===n.length-1?98:"inherit"},textValue:e.id,children:(0,j.jsx)(ve,{transaction:e,categories:this.props.categories,accounts:this.props.accounts,payees:this.props.payees,showCategory:this.props.showCategory,added:this.props.isNew(e.id),onSelect:()=>{}})},e.id)))},e.id)))]})]})}}function Be(e){let t=(0,ye.n_)(e),n=(0,o.useRef)(),{listBoxProps:r,labelProps:i}=(0,he.co)(e,t,n);return(0,o.useEffect)((()=>{function t(){Math.abs(n.current.scrollHeight-n.current.clientHeight-n.current.scrollTop)<n.current.clientHeight&&e.loadMore()}return n.current.addEventListener("scroll",t),()=>{var e;null===(e=n.current)||void 0===e||e.removeEventListener("scroll",t)}}),[t.collection]),(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)("div",{...i,children:e.label}),(0,j.jsx)("ul",{...r,ref:n,style:{padding:0,listStyle:"none",margin:0,overflowY:"auto",width:"100%"},children:[...t.collection].map((e=>(0,j.jsx)(Oe,{section:e,state:t},e.key)))})]})}function Oe(e){let{section:t,state:n}=e,{itemProps:o,headingProps:r,groupProps:i}=(0,he.TV)({heading:t.rendered,"aria-label":t["aria-label"]});return(0,j.jsxs)("li",{...o,style:{width:"100%"},children:[t.rendered&&(0,j.jsx)("div",{...r,...(0,fe.iv)(h.W2.smallText,{backgroundColor:h.O9.pK,borderBottom:`1px solid ${h.O9.n9}`,borderTop:`1px solid ${h.O9.n9}`,color:h.O9.n4,display:"flex",justifyContent:"center",paddingBottom:4,paddingTop:4,position:"sticky",top:"0",width:"100%",zIndex:be.SECTION_HEADING}),children:t.rendered}),(0,j.jsx)("ul",{...i,style:{padding:0,listStyle:"none"},children:[...t.childNodes].map(((e,t,o)=>(0,j.jsx)(Te,{item:e,state:n,isLast:t===o.length-1},e.key)))})]})}function Te(e){let{isLast:t,item:n,state:r}=e,i=(0,o.useRef)(),{optionProps:s,isSelected:a}=(0,he.Fv)({key:n.key},r,i),{isFocusVisible:l,focusProps:d}=(0,ue.Fx)();return(0,j.jsx)("li",{...(0,ge.dG)(s,d),ref:i,style:{background:a?"blueviolet":"transparent",color:a?"white":null,outline:l?"2px solid orange":"none",...!t&&{borderBottom:`1px solid ${h.O9.Cg}`}},children:n.rendered})}const Me=(0,o.forwardRef)(((e,t)=>{let{children:n,style:o,...r}=e;return(0,j.jsx)(g.Z,{style:[{height:50,flexDirection:"row",alignItems:"center",paddingLeft:10,paddingRight:10},o],ref:t,...r,children:n})}));function _e(e){let{accountName:t,onSearch:n}=e;const[r,i]=(0,o.useState)("");return(0,j.jsx)(g.Z,{style:{flexDirection:"row",alignItems:"center",backgroundColor:h.O9.S0,margin:"11px auto 4px",borderRadius:4,padding:10,width:"100%"},children:(0,j.jsx)(ce.Z,{leftContent:(0,j.jsx)(de.Z,{style:{width:13,height:13,flexShrink:0,color:r?h.O9.p7:"inherit",margin:5,marginRight:0}}),value:r,onUpdate:e=>{i(e),n(e)},placeholder:`Search ${t}`,style:{backgroundColor:h.O9.S0,border:`1px solid ${h.O9.n9}`,fontSize:15,flex:1,height:32,marginLeft:4,padding:8}})})}const ke=70;function We(e){let{account:t,prependTransactions:n,transactions:r,accounts:i,categories:s,payees:a,balance:l,isNewTransaction:d,onLoadMore:c,onSearch:u,onSelectTransaction:p}=e,y=(0,o.useMemo)((()=>n.concat(r)),[n,r]);return(0,j.jsxs)(g.Z,{style:{flex:1,backgroundColor:h.O9.S0,overflowY:"hidden",width:"100%"},children:[(0,j.jsxs)(g.Z,{style:{alignItems:"center",backgroundColor:h.O9.S0,flexShrink:0,overflowY:"hidden",paddingTop:20,top:0,width:"100%"},children:[(0,j.jsxs)(g.Z,{style:{alignItems:"center",flexDirection:"row",justifyContent:"space-between",width:"100%"},children:[(0,j.jsxs)(ae.rU,{to:"/accounts",style:{color:h.O9.b5,alignItems:"center",display:"flex",textDecoration:"none",width:ke},children:[(0,j.jsx)(le,{style:{width:32,height:32}}),(0,j.jsx)(Z.Z,{style:{...h.W2.text,fontWeight:500},children:"Back"})]}),(0,j.jsx)(g.Z,{style:{fontSize:16,fontWeight:500},children:t.name}),(0,j.jsx)(ae.rU,{to:"transaction/new",style:{visibility:"hidden"},children:(0,j.jsx)(C.Z,{type:"bare",style:{justifyContent:"center",width:ke},children:(0,j.jsx)(m.Z,{width:20,height:20})})})]}),(0,j.jsx)(v,{title:"BALANCE",style:{marginTop:10}}),(0,j.jsx)(A.Z,{binding:l,type:"financial",debug:!0,style:{fontSize:18,fontWeight:"500"},getStyle:e=>({color:e<0?h.O9.r4:h.O9.p5})}),(0,j.jsx)(_e,{accountName:t.name,onSearch:u})]}),(0,j.jsx)(Ae,{transactions:y,categories:s,accounts:i,payees:a,showCategory:!t.offbudget,isNew:d,onLoadMore:c,onSelect:p})]})}const Re=(0,y.Z)(((e,t)=>{let n=f.PK(e,"_account");return t&&(n={id:null}),e=>(e=e.filter({$and:[n,{"_account.closed":!1}]})).orderBy({next_date:"desc"})}));function De(e){let{accountId:t,children:n}=e,o=(0,re.oF)();return n(null==o?null:o.schedules.filter((e=>!e.completed&&["due","upcoming","missed"].includes(o.statuses.get(e.id)))).map((e=>({id:"preview/"+e.id,payee:e._payee,account:e._account,amount:e._amount,date:e.next_date,notes:o.statuses.get(e.id),schedule:e.id}))))}let Ee;function Ie(e){const t=(0,r.v9)((e=>e.queries.accounts)),{syncAndDownload:n}=(0,d.o)(),[i,a]=((0,q.s0)(),(0,o.useState)([])),[l,u]=(0,o.useState)(""),[g,y]=(0,o.useState)();let x=(0,r.v9)((e=>({payees:e.queries.payees,newTransactions:e.queries.newTransactions,categories:e.queries.categories.list,prefs:e.prefs.local,dateFormat:e.prefs.local.dateFormat||"MM/dd/yyyy"}))),m=(0,r.I0)(),b=(0,o.useMemo)((()=>(0,ne.DE)(oe,m)),[m]);const{id:w}=(0,q.UO)(),C=e=>{Ee&&Ee.unsubscribe(),Ee=(0,ie.Fr)(e.options({splits:"grouped"}).select("*"),(e=>a(e)),{pageCount:150,mapper:se.Xt})},S=async()=>{let e=f.yf(w);y(e),C(e)};(0,o.useEffect)((()=>{let e;return async function(){e=(0,s.oL)("sync-event",(e=>{let{type:t,tables:n}=e;if("applied"===t){var o;if(n.includes("transactions")||n.includes("category_mapping")||n.includes("payee_mapping"))null===(o=Ee)||void 0===o||o.run();(n.includes("payees")||n.includes("payee_mapping"))&&b.getPayees()}})),0===x.categories.length&&await b.getCategories(),0===t.length&&await b.getAccounts(),await b.initiallyLoadPayees(),await S(),b.markAccountRead(w)}(),()=>e()}),[]);const Z=te()((()=>{""===l&&g?C(g):l&&g&&C(f.jS(g,l,x.dateFormat))}),150);if((0,o.useEffect)(Z,[l,g,x.dateFormat]),(0,c.j)(h.O9.S0),!t||!t.length)return null;const v=t.find((e=>e.id===w)),A=e=>x.newTransactions.includes(e),B=async e=>{Ee.unsubscribe(),u(e)};let O=f.cW(v),T=x.prefs.numberFormat||"comma-dot",M=x.prefs.hideFraction||!1;return(0,j.jsx)(p,{onSync:async()=>{await n()},children:n=>{let{refreshing:r,onRefresh:s}=n;return(0,j.jsx)(re.up,{transform:Re(w,""!==l),children:(0,j.jsx)(De,{accountId:e.accountId,children:e=>null==e?null:(0,o.createElement)(We,{...x,...b,key:T+M,account:v,accounts:t,categories:x.categories,payees:x.payees,transactions:i,prependTransactions:e||[],balance:O,isNewTransaction:A,onLoadMore:()=>{var e;null===(e=Ee)||void 0===e||e.fetchNext()},onSearch:B,onSelectTransaction:()=>{}})})})}})}},58155:function(e,t,n){function o(e,t){return e.map((e=>(e.id===t.cat_group&&(e.categories=[t,...e.categories]),{...e})))}function r(e,t){return e.map((e=>(e.id===t.cat_group&&(e.categories=e.categories.map((e=>e.id===t.id?{...e,...t}:e))),e)))}function i(e,t,n,o){if(t===o)return e;let r=e.reduce(((e,n)=>e||n.categories.find((e=>e.id===t))),null);return r={...r,cat_group:n},e.map((e=>(e.id===n?(e.categories=e.categories.reduce(((e,n)=>(n.id===o?(e.push(r),e.push(n)):n.id!==t&&e.push(n),e)),[]),o||e.categories.push(r)):e.categories=e.categories.filter((e=>e.id!==t)),{...e})))}function s(e,t,n){if(t===n)return e;let o=e.find((e=>e.id===t));return e=e.reduce(((e,r)=>(r.id===n?(e.push(o),e.push(r)):r.id!==t&&e.push(r),e)),[]),n||e.push(o),e}function a(e,t){return e.map((e=>(e.categories=e.categories.filter((e=>e.id!==t)),e)))}function l(e,t){return[...e,t]}function d(e,t){return e.map((e=>e.id===t.id?{...e,...t}:e))}function c(e,t){return e.filter((e=>e.id!==t))}n.d(t,{Rp:function(){return l},Wr:function(){return i},eq:function(){return s},i8:function(){return o},iE:function(){return c},mD:function(){return d},uu:function(){return a},yr:function(){return r}})},28731:function(e,t,n){n.d(t,{CX:function(){return f},F6:function(){return g},J4:function(){return i},Ks:function(){return m},Ld:function(){return x},M$:function(){return c},V6:function(){return b},Xt:function(){return u},_n:function(){return p},oQ:function(){return j}});var o=n(5284),r=n(69585);function i(e){return-1!==e.indexOf("preview/")}function s(e){return"number"===typeof e?e:0}function a(e,t){return{type:"SplitTransactionError",version:1,difference:s(t.amount)-e}}function l(e,t){let n="temp"===e.id?"temp":"";return{amount:0,...t,payee:t.payee||e.payee,id:t.id?t.id:n+(0,o.Z)(),account:e.account,date:e.date,cleared:null!=e.cleared?e.cleared:null,starting_balance_flag:null!=e.starting_balance_flag?e.starting_balance_flag:null,is_child:!0,parent_id:e.id,error:null}}function d(e){const t=e.subtransactions.reduce(((e,t)=>e+s(t.amount)),0);return{...e,error:t===s(e.amount)?null:a(t,e)}}function c(e,t){let n=[e[t]],o=t+1;for(;o<e.length&&e[o].is_child;)n.push(e[o]),o++;return n}function u(e){return e.reduce(((e,t)=>{let{subtransactions:n,...o}=t;n=n||[],e.push(o);for(let r=0;r<n.length;r++)e.push(n[r]);return e}),[])}function h(e){return{...e[0],subtransactions:e.slice(1)}}function g(e){return null==e?null:u([e])}function p(e,t){return h((0,r.zb)(t,g(e)))}function y(e,t,n){let o=e.findIndex((e=>e.id===t)),i=e[o],s=[...e];if(-1===o)throw new Error("Tried to edit unknown transaction id: "+t);if(i.is_parent||i.is_child){let t=function(e,t){for(;t>=0;){if(e[t].is_parent)return t;t--}return null}(e,o);if(null==t)return console.log("Cannot find parent index"),{diff:{deleted:[],updated:[]}};let i,a=c(e,t),l=n(h(a)),d=g(l);return null==d?(i={deleted:[{id:a[0].id}],updated:[]},l={id:a[0].id,_deleted:!0},s.splice(t,a.length)):(i=(0,r.Th)(a,d),s.splice(t,a.length,...d)),{data:s,newTransaction:l,diff:i}}{let e=n(i),t=g(e)||[];return e&&(e.subtransactions=e.subtransactions||[]),s.splice(o,1,...t),{data:s,newTransaction:e||{id:i.id,_deleted:!0},diff:(0,r.Th)([i],t)}}}function f(e,t){return y(e,t,(e=>{if(!e.is_parent)return e;let t=(0,r.Z$)(e.subtransactions);return e.subtransactions.push(l(e,{amount:0,sort_order:s(t&&t.sort_order)-1})),e}))}function x(e,t){return y(e,t.id,(e=>{if(e.is_parent){let n=e.id===t.id?t:e,o=e.subtransactions.map((o=>{let r=o;return e.id===t.id?r={...o,payee:o.payee===e.payee?t.payee:o.payee}:o.id===t.id&&(r=t),l(n,r)}));return d({...n,subtransactions:o})}return t}))}function m(e,t){return y(e,t,(e=>{if(e.is_parent){if(e.id===t)return null;if(1===e.subtransactions.length)return{...e,subtransactions:null,is_parent:!1,error:null};{let n=e.subtransactions.filter((e=>e.id!==t));return d({...e,subtransactions:n})}}return null}))}function j(e,t){return y(e,t,(e=>e.is_parent||e.is_child?e:{...e,is_parent:!0,error:0===s(e.amount)?null:a(0,e),subtransactions:[l(e,{amount:0,sort_order:-1})]}))}function b(e){let t=e.find((e=>!e.is_child));t={...t,id:(0,o.Z)()};let n=e.filter((e=>e.is_child));return[t,...n.map((e=>({...e,id:(0,o.Z)(),parent_id:t.id})))]}}}]);
2
- //# sourceMappingURL=narrow-components.55a3b7fd.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/js/narrow-components.55a3b7fd.chunk.js","mappings":"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","sources":["components/SyncRefresh.js","icons/v1/ArrowThinLeft.js","components/common/Card.tsx","components/common/Label.tsx","components/budget/MobileTable.js","components/budget/MobileBudgetTable.js","components/budget/MobileBudget.js","components/common/TextOneLine.tsx","components/accounts/MobileAccounts.js","icons/v1/CheveronLeft.js","components/transactions/MobileTransaction.js","components/accounts/MobileAccountDetails.js","components/accounts/MobileAccount.js","../../loot-core/src/shared/categories.ts","../../loot-core/src/shared/transactions.ts"],"sourcesContent":["import { useState } from 'react';\n\nexport default function SyncRefresh({ onSync, children }) {\n let [syncing, setSyncing] = useState(false);\n\n async function onSync_() {\n setSyncing(true);\n await onSync();\n setSyncing(false);\n }\n\n return children({ refreshing: syncing, onRefresh: onSync_ });\n}\n","import * as React from 'react';\nconst SvgArrowThinLeft = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"m3.828 9 6.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);\nexport default SvgArrowThinLeft;\n","import { type ComponentProps, forwardRef } from 'react';\n\nimport { colors } from '../../style';\n\nimport View from './View';\n\ntype CardProps = ComponentProps<typeof View>;\n\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n ({ children, ...props }, ref) => {\n return (\n <View\n {...props}\n ref={ref}\n style={[\n {\n marginTop: 15,\n marginLeft: 5,\n marginRight: 5,\n borderRadius: 6,\n backgroundColor: 'white',\n borderColor: colors.p3,\n boxShadow: '0 1px 2px #9594A8',\n },\n props.style,\n ]}\n >\n <View\n style={{\n borderRadius: 6,\n overflow: 'hidden',\n }}\n >\n {children}\n </View>\n </View>\n );\n },\n);\n\nexport default Card;\n","import { type ReactNode } from 'react';\n\nimport { type CSSProperties } from 'glamor';\n\nimport { colors, styles } from '../../style';\n\nimport Text from './Text';\n\ntype LabelProps = {\n title: ReactNode;\n style?: CSSProperties;\n};\n\nexport default function Label({ title, style }: LabelProps) {\n return (\n <Text\n style={[\n styles.text,\n {\n color: colors.n2,\n textAlign: 'right',\n fontSize: 12,\n marginBottom: 2,\n },\n style,\n ]}\n >\n {title}\n </Text>\n );\n}\n","import React from 'react';\n\nimport { colors } from '../../style';\nimport View from '../common/View';\n\nexport const ROW_HEIGHT = 50;\n\nexport const ListItem = ({ children, style, ...props }) => {\n return (\n <View\n style={[\n {\n height: ROW_HEIGHT,\n borderBottomWidth: 1,\n borderColor: colors.border,\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: 10,\n paddingRight: 10,\n zIndex: 1,\n },\n style,\n ]}\n {...props}\n >\n {children}\n </View>\n );\n};\n","import React, { Component, memo, PureComponent } from 'react';\n// import {\n// RectButton,\n// PanGestureHandler,\n// NativeViewGestureHandler\n// } from 'react-native-gesture-handler';\n// import Animated, { Easing } from 'react-native-reanimated';\n// import AndroidKeyboardAvoidingView from './AndroidKeyboardAvoidingView';\n\nimport memoizeOne from 'memoize-one';\n\nimport { rolloverBudget, reportBudget } from 'loot-core/src/client/queries';\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { amountToInteger, integerToAmount } from 'loot-core/src/shared/util';\n\nimport Add from '../../icons/v1/Add';\nimport ArrowThinLeft from '../../icons/v1/ArrowThinLeft';\nimport ArrowThinRight from '../../icons/v1/ArrowThinRight';\nimport { colors, styles } from '../../style';\nimport Button from '../common/Button';\nimport Card from '../common/Card';\nimport Label from '../common/Label';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport CellValue from '../spreadsheet/CellValue';\nimport format from '../spreadsheet/format';\nimport NamespaceContext from '../spreadsheet/NamespaceContext';\nimport useSheetValue from '../spreadsheet/useSheetValue';\nimport { SyncButton } from '../Titlebar';\nimport { AmountInput } from '../util/AmountInput';\n// import {\n// AmountAccessoryContext,\n// MathOperations\n// } from '../mobile/AmountInput';\n\n// import { DragDrop, Draggable, Droppable, DragDropHighlight } from './dragdrop';\nimport { ListItem, ROW_HEIGHT } from './MobileTable';\n\nfunction ToBudget({ toBudget, onClick }) {\n let amount = useSheetValue(toBudget);\n return (\n <Button\n type=\"bare\"\n style={{ flexDirection: 'column', alignItems: 'flex-start' }}\n onClick={onClick}\n >\n <Label\n title={amount < 0 ? 'OVERBUDGETED' : 'TO BUDGET'}\n style={{ color: colors.n1, flexShrink: 0 }}\n />\n <Text\n style={[\n styles.smallText,\n {\n fontWeight: '500',\n color: amount < 0 ? colors.r4 : colors.n1,\n },\n ]}\n >\n {format(amount, 'financial')}\n </Text>\n </Button>\n );\n}\n\nfunction Saved({ projected }) {\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={{ flexDirection: 'column', alignItems: 'flex-start' }}>\n {projected ? (\n <Label title=\"PROJECTED SAVINGS\" style={{ color: colors.n1 }} />\n ) : (\n <Label\n title={isNegative ? 'OVERSPENT' : 'SAVED'}\n style={{ color: colors.n1 }}\n />\n )}\n\n <Text\n style={[\n styles.smallText,\n {\n fontWeight: '500',\n color: projected ? colors.y3 : isNegative ? colors.r4 : colors.n1,\n },\n ]}\n >\n {format(saved, 'financial')}\n </Text>\n </View>\n );\n}\n\nconst BudgetCell = memo(function BudgetCell(props) {\n const {\n name,\n binding,\n editing,\n style,\n textStyle,\n categoryId,\n month,\n onBudgetAction,\n } = props;\n\n let sheetValue = useSheetValue(binding);\n\n return (\n <View style={style}>\n <AmountInput\n value={integerToAmount(sheetValue || 0)}\n style={{\n height: ROW_HEIGHT - 4,\n transform: 'translateX(6px)',\n ...(!editing && {\n opacity: 0,\n position: 'absolute',\n top: 0,\n }),\n }}\n focused={editing}\n textStyle={[styles.smallText, textStyle]}\n onChange={() => {}} // temporarily disabled for read-only view\n onBlur={value => {\n onBudgetAction(month, 'budget-amount', {\n category: categoryId,\n amount: amountToInteger(value),\n });\n }}\n />\n\n <View\n style={{\n justifyContent: 'center',\n height: ROW_HEIGHT - 4,\n ...(editing && { display: 'none' }),\n }}\n >\n <Text style={[styles.smallText, textStyle]} data-testid={name}>\n {format(sheetValue || 0, 'financial')}\n </Text>\n </View>\n </View>\n );\n});\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction BudgetGroupPreview({ group, pending, style }) {\n // let opacity = useMemo(() => new Animated.Value(0), []);\n\n // useEffect(() => {\n // Animated.timing(opacity, {\n // toValue: 1,\n // duration: 100,\n // easing: Easing.inOut(Easing.ease)\n // }).start();\n // }, []);\n\n return (\n // <Animated.View\n // style={[\n // style,\n // { opacity },\n // pending && {\n // shadowColor: '#000',\n // shadowOffset: {\n // width: 0,\n // height: 3\n // },\n // shadowOpacity: 0.45,\n // shadowRadius: 20,\n // elevation: 5\n // }\n // ]}\n // >\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n opacity: pending ? 1 : 0.4,\n }}\n >\n <TotalsRow group={group} blank={true} />\n\n {group.categories.map((cat, index) => (\n <BudgetCategory category={cat} blank={true} index={index} />\n ))}\n </Card>\n // </Animated.View>\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction BudgetCategoryPreview({ name, pending, style }) {\n return (\n // <Animated.View\n // style={[\n // style,\n // { opacity: pending ? 1 : 0.4 },\n // {\n // backgroundColor: 'white',\n // shadowColor: '#000',\n // shadowOffset: {\n // width: 0,\n // height: 2\n // },\n // shadowOpacity: 0.25,\n // shadowRadius: 10,\n // elevation: 5\n // }\n // ]}\n // >\n <ListItem\n style={{\n flex: 1,\n borderColor: 'transparent',\n borderRadius: 4,\n }}\n >\n <Text style={styles.smallText}>{name}</Text>\n </ListItem>\n // </Animated.View>\n );\n}\n\nclass BudgetCategory extends PureComponent {\n constructor(props) {\n super(props);\n\n let { editMode, blank } = props;\n // this.opacity = new Animated.Value(editMode || blank ? 0 : 1);\n this.opacity = editMode || blank ? 0 : 1;\n }\n\n // componentDidUpdate(prevProps) {\n // if (prevProps.editing !== this.props.editing) {\n // if (this.props.editing && ACTScrollViewManager) {\n // ACTScrollViewManager.setFocused(findNodeHandle(this.container));\n // }\n // }\n\n // if (prevProps.editMode !== this.props.editMode) {\n // Animated.timing(this.opacity, {\n // toValue: this.props.editMode ? 0 : 1,\n // duration: 200,\n // easing: Easing.inOut(Easing.ease)\n // }).start();\n // }\n // }\n\n render() {\n let {\n category,\n editing,\n index,\n // gestures,\n // editMode,\n style,\n month,\n // onEdit,\n onBudgetAction,\n } = this.props;\n\n let budgeted = rolloverBudget.catBudgeted(category.id);\n let balance = rolloverBudget.catBalance(category.id);\n\n let content = (\n <ListItem\n // ref={el => (this.container = el)}\n style={[\n {\n backgroundColor: editing ? colors.p11 : 'transparent',\n borderBottomWidth: 0,\n borderTopWidth: index > 0 ? 1 : 0,\n },\n style,\n ]}\n data-testid=\"row\"\n >\n <View style={{ flex: 1 }}>\n <Text style={styles.smallText}>{category.name}</Text>\n </View>\n {/* <Animated.View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n opacity: this.opacity\n }}\n > */}\n <View\n style={{\n alignItems: 'center',\n flexDirection: 'row',\n opacity: this.opacity,\n }}\n >\n <BudgetCell\n name=\"budgeted\"\n binding={budgeted}\n editing={editing}\n style={{ width: 90 }}\n textStyle={[styles.smallText, { textAlign: 'right' }]}\n categoryId={category.id}\n month={month}\n onBudgetAction={onBudgetAction}\n />\n <CellValue\n name=\"balance\"\n binding={balance}\n style={[styles.smallText, { width: 90, textAlign: 'right' }]}\n getStyle={value => value < 0 && { color: colors.r4 }}\n type=\"financial\"\n />\n </View>\n {/* </Animated.View> */}\n </ListItem>\n );\n\n return <div>{content}</div>;\n // <Draggable\n // id={category.id}\n // type=\"category\"\n // preview={({ pending, style }) => (\n // <BudgetCategoryPreview\n // name={category.name}\n // pending={pending}\n // style={style}\n // />\n // )}\n // gestures={gestures}\n // >\n // <Droppable\n // type=\"category\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // let pos = (y - layout.y) / layout.height;\n // return pos < 0.5 ? 'top' : 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) =>\n // this.props.onReorder(id.replace('category:', ''), {\n // aroundCategory: {\n // id: category.id,\n // position: status\n // }\n // })\n // }\n // >\n // {() => content}\n // </Droppable>\n // </Draggable>\n }\n}\n\nclass TotalsRow extends PureComponent {\n constructor(props) {\n super(props);\n\n let { editMode, blank } = props;\n // this.animation = new Animated.Value(editMode || blank ? 0 : 1);\n this.opacity = editMode || blank ? 0 : 1;\n }\n\n // componentDidUpdate(prevProps) {\n // if (prevProps.editMode !== this.props.editMode) {\n // Animated.timing(this.animation, {\n // toValue: this.props.editMode ? 0 : 1,\n // duration: 200,\n // easing: Easing.inOut(Easing.ease)\n // }).start();\n // }\n // }\n\n render() {\n let { group, editMode, onAddCategory } = this.props;\n\n let content = (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: colors.n11,\n }}\n data-testid=\"totals\"\n >\n <View style={{ flex: 1 }}>\n <Text\n style={[styles.smallText, { fontWeight: '500' }]}\n data-testid=\"name\"\n >\n {group.name}\n </Text>\n </View>\n {/* <Animated.View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n opacity: this.animation\n }}\n > */}\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n opacity: this.opacity,\n }}\n >\n <CellValue\n binding={rolloverBudget.groupBudgeted(group.id)}\n style={[\n styles.smallText,\n { width: 90, fontWeight: '500', textAlign: 'right' },\n ]}\n type=\"financial\"\n />\n <CellValue\n binding={rolloverBudget.groupBalance(group.id)}\n style={[\n styles.smallText,\n { width: 90, fontWeight: '500', textAlign: 'right' },\n ]}\n type=\"financial\"\n />\n </View>\n {/* </Animated.View> */}\n\n {editMode && (\n // <Animated.View\n // style={{\n // flexDirection: 'row',\n // alignItems: 'center',\n // opacity: this.opacity,\n // position: 'absolute',\n // top: 0,\n // bottom: 0,\n // right: this.animation.interpolate({\n // inputRange: [0, 1],\n // outputRange: [5, -30]\n // })\n // }}\n // >\n <View>\n <Button\n onClick={() => onAddCategory(group.id)}\n style={{ padding: 10 }}\n >\n <Add width={15} height={15} />\n </Button>\n </View>\n // </Animated.View>\n )}\n </ListItem>\n );\n\n if (!editMode) {\n return content;\n }\n\n return content;\n // <Droppable\n // type=\"category\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // return 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) =>\n // this.props.onReorderCategory(id, { inGroup: group.id })\n // }\n // >\n // {() => content}\n // </Droppable>\n }\n}\n\nclass IncomeCategory extends PureComponent {\n render() {\n const { name, budget, balance, style, nameTextStyle, amountTextStyle } =\n this.props;\n return (\n <ListItem\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 10,\n backgroundColor: 'transparent',\n },\n style,\n ]}\n >\n <View style={{ flex: 1 }}>\n <Text style={[styles.smallText, nameTextStyle]} data-testid=\"name\">\n {name}\n </Text>\n </View>\n {budget && (\n <CellValue\n binding={budget}\n style={[\n styles.smallText,\n { width: 90, textAlign: 'right' },\n amountTextStyle,\n ]}\n type=\"financial\"\n />\n )}\n <CellValue\n binding={balance}\n style={[\n styles.smallText,\n { width: 90, textAlign: 'right' },\n amountTextStyle,\n ]}\n type=\"financial\"\n />\n </ListItem>\n );\n }\n}\n\n// export function BudgetAccessoryView() {\n// let emitter = useContext(AmountAccessoryContext);\n\n// return (\n// <View>\n// <View\n// style={{\n// flexDirection: 'row',\n// justifyContent: 'flex-end',\n// alignItems: 'stretch',\n// backgroundColor: colors.n10,\n// padding: 5,\n// height: 45\n// }}\n// >\n// <MathOperations emitter={emitter} />\n// <View style={{ flex: 1 }} />\n// <Button\n// onClick={() => emitter.emit('moveUp')}\n// style={{ marginRight: 5 }}\n// data-testid=\"up\"\n// >\n// <ArrowThinUp width={13} height={13} />\n// </Button>\n// <Button\n// onClick={() => emitter.emit('moveDown')}\n// style={{ marginRight: 5 }}\n// data-testid=\"down\"\n// >\n// <ArrowThinDown width={13} height={13} />\n// </Button>\n// <Button onClick={() => emitter.emit('done')} data-testid=\"done\">\n// Done\n// </Button>\n// </View>\n// </View>\n// );\n// }\n\nclass BudgetGroup extends PureComponent {\n render() {\n const {\n group,\n // editingId,\n editMode,\n gestures,\n month,\n onEditCategory,\n onReorderCategory,\n // onReorderGroup,\n onAddCategory,\n onBudgetAction,\n } = this.props;\n\n function editable(content) {\n if (!editMode) {\n return content;\n }\n\n return content;\n // <Draggable\n // id={group.id}\n // type=\"group\"\n // preview={({ pending, style }) => (\n // <BudgetGroupPreview group={group} pending={pending} style={style} />\n // )}\n // gestures={gestures}\n // >\n // <Droppable\n // type=\"group\"\n // getActiveStatus={(x, y, { layout }, { id }) => {\n // let pos = (y - layout.y) / layout.height;\n // return pos < 0.5 ? 'top' : 'bottom';\n // }}\n // onDrop={(id, type, droppable, status) => {\n // onReorderGroup(id, group.id, status);\n // }}\n // >\n // {() => content}\n // </Droppable>\n // </Draggable>\n }\n\n return editable(\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n }}\n >\n <TotalsRow\n group={group}\n budgeted={rolloverBudget.groupBudgeted(group.id)}\n balance={rolloverBudget.groupBalance(group.id)}\n editMode={editMode}\n onAddCategory={onAddCategory}\n onReorderCategory={onReorderCategory}\n />\n\n {group.categories.map((category, index) => {\n // const editing = editingId === category.id;\n return (\n <BudgetCategory\n key={category.id}\n index={index}\n category={category}\n editing={undefined} //editing}\n editMode={editMode}\n gestures={gestures}\n month={month}\n onEdit={onEditCategory}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n />\n );\n })}\n </Card>,\n );\n }\n}\n\nclass IncomeBudgetGroup extends Component {\n render() {\n const { type, group } = this.props;\n return (\n <View>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 50,\n marginBottom: 5,\n marginRight: 14,\n }}\n >\n {type === 'report' && (\n <Label title=\"BUDGETED\" style={{ width: 90 }} />\n )}\n <Label title=\"RECEIVED\" style={{ width: 90 }} />\n </View>\n\n <Card style={{ marginTop: 0 }}>\n <IncomeCategory\n name=\"Income\"\n budget={\n type === 'report' ? reportBudget.groupBudgeted(group.id) : null\n }\n balance={\n type === 'report'\n ? reportBudget.groupSumAmount(group.id)\n : rolloverBudget.groupSumAmount(group.id)\n }\n nameTextStyle={{ fontWeight: '500' }}\n amountTextStyle={{ fontWeight: '500' }}\n style={{ backgroundColor: colors.n11 }}\n />\n\n {group.categories.map((category, index) => {\n return (\n <IncomeCategory\n key={category.id}\n type={type}\n name={category.name}\n budget={\n type === 'report'\n ? reportBudget.catBudgeted(category.id)\n : null\n }\n balance={\n type === 'report'\n ? reportBudget.catSumAmount(category.id)\n : rolloverBudget.catSumAmount(category.id)\n }\n index={index}\n />\n );\n })}\n </Card>\n </View>\n );\n }\n}\n\nclass BudgetGroups extends Component {\n getGroups = memoizeOne(groups => {\n return {\n incomeGroup: groups.find(group => group.is_income),\n expenseGroups: groups.filter(group => !group.is_income),\n };\n });\n\n render() {\n const {\n type,\n categoryGroups,\n editingId,\n // editMode,\n gestures,\n month,\n onEditCategory,\n onAddCategory,\n onReorderCategory,\n onReorderGroup,\n onBudgetAction,\n } = this.props;\n const { incomeGroup, expenseGroups } = this.getGroups(categoryGroups);\n\n return (\n <View\n data-testid=\"budget-groups\"\n style={{ flex: '1 0 auto', overflowY: 'auto', paddingBottom: 15 }}\n >\n {expenseGroups.map(group => {\n return (\n <BudgetGroup\n key={group.id}\n group={group}\n editingId={editingId}\n editMode={undefined} //editMode}\n gestures={gestures}\n month={month}\n onEditCategory={onEditCategory}\n onAddCategory={onAddCategory}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onBudgetAction={onBudgetAction}\n />\n );\n })}\n\n {incomeGroup && <IncomeBudgetGroup type={type} group={incomeGroup} />}\n </View>\n );\n }\n}\n\nexport class BudgetTable extends Component {\n // static contextType = AmountAccessoryContext;\n state = { editingCategory: null };\n\n // constructor(props) {\n // super(props);\n // this.gestures = {\n // scroll: React.createRef(null),\n // pan: React.createRef(null),\n // rows: []\n // };\n // }\n\n // componentDidMount() {\n // if (ACTScrollViewManager) {\n // ACTScrollViewManager.activate(\n // (this.list.getNode\n // ? this.list.getNode()\n // : this.list\n // ).getScrollableNode()\n // );\n // }\n\n // const removeFocus = this.props.navigation.addListener('focus', () => {\n // if (ACTScrollViewManager) {\n // ACTScrollViewManager.activate(\n // (this.list.getNode\n // ? this.list.getNode()\n // : this.list\n // ).getScrollableNode()\n // );\n // }\n // });\n\n // const keyboardWillHide = e => {\n // if (ACTScrollViewManager) {\n // ACTScrollViewManager.setFocused(-1);\n // }\n // this.onEditCategory(null);\n // };\n\n // let keyListener = Keyboard.addListener(\n // Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide',\n // keyboardWillHide\n // );\n\n // let emitter = this.context;\n // emitter.on('done', this.onKeyboardDone);\n // emitter.on('moveUp', this.onMoveUp);\n // emitter.on('moveDown', this.onMoveDown);\n\n // this.cleanup = () => {\n // // removeFocus();\n // // keyListener.remove();\n\n // emitter.off('done', this.onKeyboardDone);\n // emitter.off('moveUp', this.onMoveUp);\n // emitter.off('moveDown', this.onMoveDown);\n // };\n // }\n\n // componentWillUnmount() {\n // this.cleanup();\n // }\n\n onEditCategory = id => {\n this.setState({ editingCategory: id });\n };\n\n // onKeyboardDone = () => {\n // Keyboard.dismiss();\n\n // onMoveUp = () => {\n // const { categories } = this.props;\n // const { editingCategory } = this.state;\n // const expenseCategories = categories.filter(cat => !cat.is_income);\n\n // const idx = expenseCategories.findIndex(cat => editingCategory === cat.id);\n // if (idx - 1 >= 0) {\n // this.onEditCategory(expenseCategories[idx - 1].id);\n // }\n // };\n\n // onMoveDown = () => {\n // const { categories } = this.props;\n // const { editingCategory } = this.state;\n // const expenseCategories = categories.filter(cat => !cat.is_income);\n\n // const idx = expenseCategories.findIndex(cat => editingCategory === cat.id);\n // if (idx + 1 < expenseCategories.length) {\n // this.onEditCategory(expenseCategories[idx + 1].id);\n // }\n // };\n\n render() {\n const {\n type,\n categoryGroups,\n month,\n monthBounds,\n editMode,\n // refreshControl,\n onPrevMonth,\n onNextMonth,\n onAddCategory,\n onReorderCategory,\n onReorderGroup,\n onShowBudgetDetails,\n onOpenActionSheet,\n onBudgetAction,\n } = this.props;\n // let editMode = false; // neuter editMode -- sorry, not rewriting drag-n-drop right now\n let { editingCategory } = this.state;\n let currentMonth = monthUtils.currentMonth();\n\n return (\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month, type)}>\n <View\n style={{ flex: 1, overflowY: 'hidden' }}\n data-testid=\"budget-table\"\n >\n <BudgetHeader\n currentMonth={month}\n monthBounds={monthBounds}\n editMode={editMode}\n onDone={() => this.props.onEditMode(false)}\n onOpenActionSheet={onOpenActionSheet}\n onPrevMonth={onPrevMonth}\n onNextMonth={onNextMonth}\n />\n <View\n style={{\n flexDirection: 'row',\n flex: '1 0 auto',\n padding: 10,\n paddingRight: 14,\n backgroundColor: 'white',\n borderBottomWidth: 1,\n borderColor: colors.n9,\n }}\n >\n {type === 'report' ? (\n <Saved projected={month >= currentMonth} />\n ) : (\n <ToBudget\n toBudget={rolloverBudget.toBudget}\n onClick={onShowBudgetDetails}\n />\n )}\n <View style={{ flex: 1 }} />\n\n <View style={{ width: 90 }}>\n <Label title=\"BUDGETED\" style={{ color: colors.n1 }} />\n <CellValue\n binding={reportBudget.totalBudgetedExpense}\n type=\"financial\"\n style={[\n styles.smallText,\n { color: colors.n1, textAlign: 'right', fontWeight: '500' },\n ]}\n formatter={value => {\n return format(-parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={{ width: 90 }}>\n <Label title=\"BALANCE\" style={{ color: colors.n1 }} />\n <CellValue\n binding={rolloverBudget.totalBalance}\n type=\"financial\"\n style={[\n styles.smallText,\n { color: colors.n1, textAlign: 'right', fontWeight: '500' },\n ]}\n />\n </View>\n </View>\n\n {/* <AndroidKeyboardAvoidingView includeStatusBar={true}> */}\n <View style={{ overflowY: 'auto' }}>\n {!editMode ? (\n // <ScrollView\n // ref={el => (this.list = el)}\n // keyboardShouldPersistTaps=\"always\"\n // refreshControl={refreshControl}\n // style={{ backgroundColor: colors.n10 }}\n // automaticallyAdjustContentInsets={false}\n // >\n <View>\n <BudgetGroups\n type={type}\n categoryGroups={categoryGroups}\n editingId={editingCategory}\n editMode={editMode}\n gestures={this.gestures}\n month={month}\n onEditCategory={this.onEditCategory}\n onAddCategory={onAddCategory}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n onBudgetAction={onBudgetAction}\n />\n </View>\n ) : (\n // </ScrollView>\n // <DragDrop>\n // {({\n // dragging,\n // onGestureEvent,\n // onHandlerStateChange,\n // scrollRef,\n // onScroll\n // }) => (\n <>\n <View>\n <BudgetGroups\n categoryGroups={categoryGroups}\n editingId={editingCategory}\n editMode={editMode}\n gestures={this.gestures}\n onEditCategory={() => {}} //this.onEditCategory}\n onAddCategory={onAddCategory}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n />\n </View>\n\n {/* <DragDropHighlight /> */}\n </>\n // )}\n // </DragDrop>\n )}\n </View>\n {/* </AndroidKeyboardAvoidingView> */}\n </View>\n </NamespaceContext.Provider>\n );\n }\n}\n\nfunction BudgetHeader({\n currentMonth,\n monthBounds,\n editMode,\n onDone,\n onPrevMonth,\n onNextMonth,\n}) {\n // let [menuOpen, setMenuOpen] = useState(false);\n\n // let onMenuSelect = type => {\n // setMenuOpen(false);\n\n // switch (type) {\n // case 'sync':\n // sync();\n // break;\n // default:\n // }\n // };\n\n let prevEnabled = currentMonth > monthBounds.start;\n let nextEnabled = currentMonth < monthUtils.subMonths(monthBounds.end, 1);\n\n let buttonStyle = {\n paddingLeft: 15,\n paddingRight: 15,\n backgroundColor: 'transparent',\n };\n\n return (\n <View\n style={{\n alignItems: 'center',\n flexDirection: 'row',\n flexShrink: 0,\n height: 50,\n justifyContent: 'center',\n backgroundColor: colors.p5,\n }}\n >\n {!editMode && (\n <Button\n type=\"bare\"\n // hitSlop={{ top: 5, bottom: 5, left: 0, right: 30 }}\n\n onClick={prevEnabled && onPrevMonth}\n style={[\n buttonStyle,\n {\n left: 0,\n opacity: prevEnabled ? 1 : 0.6,\n padding: '5px 30px 5px 0',\n },\n ]}\n >\n <ArrowThinLeft style={{ color: colors.n11 }} width=\"15\" height=\"15\" />\n </Button>\n )}\n <Text\n style={[\n styles.mediumText,\n {\n marginTop: 12,\n marginBottom: 12,\n color: colors.n11,\n textAlign: 'center',\n // zIndex: -1\n },\n ]}\n >\n {/* eslint-disable-next-line rulesdir/typography */}\n {monthUtils.format(currentMonth, \"MMMM ''yy\")}\n </Text>\n {editMode ? (\n <Button\n type=\"bare\"\n onClick={onDone}\n style={[\n buttonStyle,\n { position: 'absolute', top: 0, bottom: 0, right: 0 },\n ]}\n textStyle={{\n color: colors.n11,\n fontSize: 15,\n fontWeight: '500',\n }}\n >\n Done\n </Button>\n ) : (\n <>\n <Button\n type=\"bare\"\n onClick={nextEnabled && onNextMonth}\n // hitSlop={{ top: 5, bottom: 5, left: 30, right: 5 }}\n style={[buttonStyle, { opacity: nextEnabled ? 1 : 0.6 }]}\n >\n <ArrowThinRight\n style={{ color: colors.n11 }}\n width=\"15\"\n height=\"15\"\n />\n </Button>\n\n <SyncButton\n style={{\n color: 'white',\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n backgroundColor: 'transparent',\n paddingLeft: 12,\n paddingRight: 12,\n }}\n />\n {/* <Button\n type=\"bare\"\n onClick={() => setMenuOpen(true)}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n backgroundColor: 'transparent',\n paddingLeft: 12,\n paddingRight: 12\n }}\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\n {/* <DotsHorizontalTriple\n width=\"20\"\n height=\"20\"\n style={{ color: 'white' }}\n /> */}\n {/* </Button> */}\n </>\n )}\n </View>\n );\n}\n","import React, { Component } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport {\n addCategory,\n moveCategory,\n moveCategoryGroup,\n} from 'loot-core/src/shared/categories';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useActions } from '../../hooks/useActions';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport AnimatedLoading from '../../icons/AnimatedLoading';\nimport { colors } from '../../style';\nimport View from '../common/View';\nimport SyncRefresh from '../SyncRefresh';\n\nimport { BudgetTable } from './MobileBudgetTable';\n\nclass Budget extends Component {\n constructor(props) {\n super(props);\n\n this.summary = 0;\n\n const currentMonth = monthUtils.currentMonth();\n this.state = {\n bounds: { start: currentMonth, end: currentMonth },\n currentMonth: currentMonth,\n initialized: false,\n editMode: false,\n categoryGroups: null,\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 removeBlur = this.props.navigation.addListener('didBlur', () => {\n // this.setState({ editMode: false });\n // });\n\n this.loadCategories();\n\n const { start, end } = await send('get-budget-bounds');\n this.setState({ bounds: { start, end } });\n\n this.prewarmMonth(this.state.currentMonth);\n\n let unlisten = 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 // TODO: is this loading every time?\n this.loadCategories();\n }\n });\n\n this.cleanup = () => {\n // removeBlur();\n unlisten();\n };\n }\n\n componentWillUnmount() {\n // this.cleanup();\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 if (!this.state.initialized) {\n this.setState({ initialized: true });\n }\n };\n\n onShowBudgetDetails = () => {\n this.props.pushModal('budget-summary', { month: this.state.currentMonth });\n };\n\n onBudgetAction = type => {\n const { currentMonth } = this.state;\n this.props.applyBudgetAction(currentMonth, type, this.state.bounds);\n };\n\n onAddCategory = groupId => {\n this.props.navigation.navigate('AddCategoryModal', {\n groupId,\n onAdd: async name => {\n let id = await this.props.createCategory(name, groupId);\n let { categoryGroups } = this.state;\n\n this.setState({\n categoryGroups: addCategory(categoryGroups, {\n name,\n cat_group: groupId,\n is_income: 0,\n id,\n }),\n });\n },\n });\n };\n\n onReorderCategory = (id, { inGroup, aroundCategory }) => {\n let { categoryGroups } = this.state;\n let groupId, targetId;\n\n if (inGroup) {\n groupId = inGroup;\n } else if (aroundCategory) {\n let { id: catId, position } = aroundCategory;\n\n let group = categoryGroups.find(group =>\n group.categories.find(cat => cat.id === catId),\n );\n\n if (position === 'bottom') {\n let { categories } = group;\n let idx = categories.findIndex(cat => cat.id === catId);\n catId = idx < categories.length - 1 ? categories[idx + 1].id : null;\n }\n\n groupId = group.id;\n targetId = catId;\n }\n\n this.props.moveCategory(id, groupId, targetId);\n\n this.setState({\n categoryGroups: moveCategory(categoryGroups, id, groupId, targetId),\n });\n };\n\n onReorderGroup = (id, targetId, position) => {\n let { categoryGroups } = this.state;\n\n if (position === 'bottom') {\n let idx = categoryGroups.findIndex(group => group.id === targetId);\n targetId =\n idx < categoryGroups.length - 1 ? categoryGroups[idx + 1].id : null;\n }\n\n this.props.moveCategoryGroup(id, targetId);\n\n this.setState({\n categoryGroups: moveCategoryGroup(categoryGroups, id, targetId),\n });\n };\n\n sync = async () => {\n const { updated, error } = await this.props.sync();\n if (error) {\n return 'error';\n } else if (updated) {\n return 'updated';\n }\n return null;\n };\n\n onPrevMonth = async () => {\n let month = monthUtils.subMonths(this.state.currentMonth, 1);\n await this.prewarmMonth(month);\n this.setState({ currentMonth: month });\n };\n\n onNextMonth = async () => {\n let month = monthUtils.addMonths(this.state.currentMonth, 1);\n await this.prewarmMonth(month);\n this.setState({ currentMonth: month });\n };\n\n onOpenActionSheet = () => {\n let { budgetType } = this.props;\n\n let options = [\n 'Edit Categories',\n 'Copy last month’s budget',\n 'Set budgets to zero',\n 'Set budgets to 3 month average',\n budgetType === 'report' && 'Apply to all future budgets',\n 'Cancel',\n ].filter(Boolean);\n\n this.props.showActionSheetWithOptions(\n {\n options,\n cancelButtonIndex: options.length - 1,\n title: 'Actions',\n },\n idx => {\n switch (idx) {\n case 0:\n this.setState({ editMode: true });\n break;\n case 1:\n this.onBudgetAction('copy-last');\n break;\n case 2:\n this.onBudgetAction('set-zero');\n break;\n case 3:\n this.onBudgetAction('set-3-avg');\n break;\n case 4:\n if (budgetType === 'report') {\n this.onBudgetAction('set-all-future');\n }\n break;\n default:\n }\n },\n );\n };\n\n render() {\n const { currentMonth, bounds, editMode, initialized } = this.state;\n const {\n categories,\n categoryGroups,\n prefs,\n budgetType,\n navigation,\n applyBudgetAction,\n } = this.props;\n let numberFormat = prefs.numberFormat || 'comma-dot';\n let hideFraction = prefs.hideFraction || false;\n\n if (!categoryGroups || !initialized) {\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: 'white',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 25,\n }}\n >\n <AnimatedLoading width={25} height={25} />\n </View>\n );\n }\n\n return (\n <SyncRefresh onSync={this.sync}>\n {({ refreshing, onRefresh }) => (\n <BudgetTable\n // This key forces the whole table rerender when the number\n // format changes\n key={numberFormat + hideFraction}\n categories={categories}\n categoryGroups={categoryGroups}\n type={budgetType}\n month={currentMonth}\n monthBounds={bounds}\n editMode={editMode}\n navigation={navigation}\n // refreshControl={\n // <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />\n // }\n onEditMode={flag => this.setState({ editMode: flag })}\n onShowBudgetDetails={this.onShowBudgetDetails}\n onPrevMonth={this.onPrevMonth}\n onNextMonth={this.onNextMonth}\n onAddCategory={this.onAddCategory}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n onOpenActionSheet={() => {}} //this.onOpenActionSheet}\n onBudgetAction={applyBudgetAction}\n />\n )}\n </SyncRefresh>\n );\n }\n}\n\nexport default function BudgetWrapper() {\n let categoryGroups = useSelector(state => state.queries.categories.grouped);\n let categories = useSelector(state => state.queries.categories.list);\n let budgetType = useSelector(\n state => state.prefs.local.budgetType || 'rollover',\n );\n let prefs = useSelector(state => state.prefs.local);\n\n let actions = useActions();\n let spreadsheet = useSpreadsheet();\n\n useSetThemeColor(colors.p5);\n return (\n <Budget\n categoryGroups={categoryGroups}\n categories={categories}\n budgetType={budgetType}\n prefs={prefs}\n {...actions}\n spreadsheet={spreadsheet}\n />\n );\n}\n","import { type ComponentProps } from 'react';\n\nimport Text from './Text';\n\ntype TextOneLineProps = ComponentProps<typeof Text>;\n\nexport default function TextOneLine({ children, ...props }: TextOneLineProps) {\n return (\n <Text\n {...props}\n style={[\n props.style,\n {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'block',\n },\n ]}\n >\n {children}\n </Text>\n );\n}\n","import React, { Component, useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useNavigate } from 'react-router-dom';\n\nimport * as queries from 'loot-core/src/client/queries';\n\nimport { useActions } from '../../hooks/useActions';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { colors, styles } from '../../style';\nimport Button from '../common/Button';\nimport Text from '../common/Text';\nimport TextOneLine from '../common/TextOneLine';\nimport View from '../common/View';\nimport { Page } from '../Page';\nimport CellValue from '../spreadsheet/CellValue';\n\nfunction AccountHeader({ name, amount }) {\n return (\n <View\n style={{\n flexDirection: 'row',\n marginTop: 28,\n marginBottom: 10,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={[\n styles.text,\n { textTransform: 'uppercase', color: colors.n5, fontSize: 13 },\n ]}\n data-testid=\"name\"\n >\n {name}\n </Text>\n </View>\n <CellValue\n binding={amount}\n style={[styles.text, { color: colors.n5, fontSize: 13 }]}\n type=\"financial\"\n />\n </View>\n );\n}\n\nfunction AccountCard({ account, updated, getBalanceQuery, onSelect }) {\n return (\n <View\n style={{\n flex: '1 0 auto',\n flexDirection: 'row',\n backgroundColor: 'white',\n boxShadow: `0 1px 1px ${colors.n7}`,\n borderRadius: 6,\n marginTop: 10,\n }}\n >\n <Button\n onMouseDown={() => onSelect(account.id)}\n style={{\n flexDirection: 'row',\n flex: 1,\n alignItems: 'center',\n borderRadius: 6,\n '&:active': {\n opacity: 0.1,\n },\n }}\n >\n <View\n style={{\n flex: '1 auto',\n margin: '10px 0',\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <TextOneLine\n style={[\n styles.text,\n {\n fontSize: 17,\n fontWeight: 600,\n color: updated ? colors.b2 : colors.n2,\n paddingRight: 30,\n },\n ]}\n >\n {account.name}\n </TextOneLine>\n {account.bankId && (\n <View\n style={{\n backgroundColor: colors.g5,\n marginLeft: '-23px',\n width: 8,\n height: 8,\n borderRadius: 8,\n }}\n />\n )}\n </View>\n </View>\n <CellValue\n binding={getBalanceQuery(account)}\n type=\"financial\"\n style={{ fontSize: 16, color: colors.n3 }}\n getStyle={value => value < 0 && { color: colors.r4 }}\n />\n </Button>\n </View>\n );\n}\n\nfunction EmptyMessage({ onAdd }) {\n return (\n <View style={{ flex: 1, padding: 30 }}>\n <Text style={styles.text}>\n For Actual to be useful, you need to add an account. You can link an\n account to automatically download transactions, or manage it locally\n yourself.\n </Text>\n\n <Button\n type=\"primary\"\n style={{ marginTop: 20, alignSelf: 'center' }}\n onClick={() =>\n alert(\n 'Account creation is not supported on mobile on the self-hosted service yet',\n )\n }\n >\n Add Account\n </Button>\n\n <Text style={{ marginTop: 20, color: colors.n5 }}>\n In the future, you can add accounts using the add button in the header.\n </Text>\n </View>\n );\n}\n\nclass AccountList extends Component {\n isNewTransaction = id => {\n return this.props.newTransactions.includes(id);\n };\n\n render() {\n const {\n accounts,\n updatedAccounts,\n // transactions,\n // categories,\n getBalanceQuery,\n getOnBudgetBalance,\n getOffBudgetBalance,\n onAddAccount,\n onSelectAccount,\n // onSelectTransaction,\n // refreshControl\n } = this.props;\n const budgetedAccounts = accounts.filter(\n account => account.offbudget === 0,\n );\n const offbudgetAccounts = accounts.filter(\n account => account.offbudget === 1,\n );\n\n // If there are no accounts, show a helpful message\n if (accounts.length === 0) {\n return <EmptyMessage onAdd={onAddAccount} />;\n }\n\n const accountContent = (\n <Page title=\"Accounts\">\n <AccountHeader name=\"Budgeted\" amount={getOnBudgetBalance()} />\n {budgetedAccounts.map((acct, idx) => (\n <AccountCard\n account={acct}\n key={acct.id}\n updated={updatedAccounts.includes(acct.id)}\n getBalanceQuery={getBalanceQuery}\n onSelect={onSelectAccount}\n />\n ))}\n\n <AccountHeader name=\"Off budget\" amount={getOffBudgetBalance()} />\n {offbudgetAccounts.map((acct, idx) => (\n <AccountCard\n account={acct}\n key={acct.id}\n updated={updatedAccounts.includes(acct.id)}\n getBalanceQuery={getBalanceQuery}\n onSelect={onSelectAccount}\n />\n ))}\n\n {/*<Label\n title=\"RECENT TRANSACTIONS\"\n style={{\n textAlign: 'center',\n marginTop: 50,\n marginBottom: 20,\n marginLeft: 10\n }}\n />*/}\n </Page>\n );\n\n return (\n <View style={{ flex: 1 }}>\n {/* <TransactionList\n transactions={transactions}\n categories={categories}\n isNew={this.isNewTransaction}\n scrollProps={{\n ListHeaderComponent: accountContent\n }}\n // refreshControl={refreshControl}\n onSelect={onSelectTransaction}\n /> */}\n {accountContent}\n </View>\n );\n }\n}\n\nexport default function Accounts() {\n let accounts = useSelector(state => state.queries.accounts);\n let newTransactions = useSelector(state => state.queries.newTransactions);\n let updatedAccounts = useSelector(state => state.queries.updatedAccounts);\n let categories = useSelector(state => state.queries.categories.list);\n let numberFormat = useSelector(\n state => state.prefs.local.numberFormat || 'comma-dot',\n );\n let hideFraction = useSelector(\n state => state.prefs.local.hideFraction || false,\n );\n\n let { getCategories, getAccounts } = useActions();\n\n const transactions = useState({});\n const navigate = useNavigate();\n\n useEffect(() => {\n (async () => {\n if (categories.length === 0) {\n await getCategories();\n }\n\n getAccounts();\n })();\n }, []);\n\n // const sync = async () => {\n // await props.syncAndDownload();\n // };\n\n const onSelectAccount = id => {\n navigate(`/accounts/${id}`);\n };\n\n const onSelectTransaction = transaction => {\n navigate(`/transaction/${transaction}`);\n };\n\n useSetThemeColor(colors.b2);\n\n return (\n <View style={{ flex: 1 }}>\n <AccountList\n // This key forces the whole table rerender when the number\n // format changes\n key={numberFormat + hideFraction}\n accounts={accounts.filter(account => !account.closed)}\n categories={categories}\n transactions={transactions || []}\n updatedAccounts={updatedAccounts}\n newTransactions={newTransactions}\n getBalanceQuery={queries.accountBalance}\n getOnBudgetBalance={queries.budgetedAccountBalance}\n getOffBudgetBalance={queries.offbudgetAccountBalance}\n onAddAccount={() => {}} // () => navigate('AddAccountModal')\n onSelectAccount={onSelectAccount}\n onSelectTransaction={onSelectTransaction}\n // refreshControl={\n // <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />\n // }\n />\n </View>\n );\n}\n","import * as React from 'react';\nconst SvgCheveronLeft = props => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M7.05 9.293 6.343 10 12 15.657l1.414-1.414L9.172 10l4.242-4.243L12 4.343z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport default SvgCheveronLeft;\n","import React, {\n PureComponent,\n Component,\n forwardRef,\n useEffect,\n useRef,\n} from 'react';\n\nimport { useFocusRing } from '@react-aria/focus';\nimport { useListBox, useListBoxSection, useOption } from '@react-aria/listbox';\nimport { mergeProps } from '@react-aria/utils';\nimport { Item, Section } from '@react-stately/collections';\nimport { useListState } from '@react-stately/list';\nimport { css } from 'glamor';\nimport memoizeOne from 'memoize-one';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\nimport {\n titleFirst,\n integerToCurrency,\n groupById,\n} from 'loot-core/src/shared/util';\n\nimport ArrowsSynchronize from '../../icons/v2/ArrowsSynchronize';\nimport CheckCircle1 from '../../icons/v2/CheckCircle1';\nimport { styles, colors } from '../../style';\nimport Text from '../common/Text';\nimport TextOneLine from '../common/TextOneLine';\nimport View from '../common/View';\n\nconst zIndices = { SECTION_HEADING: 10 };\n\nlet getPayeesById = memoizeOne(payees => groupById(payees));\nlet getAccountsById = memoizeOne(accounts => groupById(accounts));\n\nfunction isPreviewId(id) {\n return id.indexOf('preview/') !== -1;\n}\n\nfunction getDescriptionPretty(transaction, payee, transferAcct) {\n let { amount } = transaction;\n\n if (transferAcct) {\n return `Transfer ${amount > 0 ? 'from' : 'to'} ${transferAcct.name}`;\n } else if (payee) {\n return payee.name;\n }\n\n return '';\n}\n\nfunction lookupName(items, id) {\n return items.find(item => item.id === id).name;\n}\n\n// TODO: delete if not needed\n/* eslint-disable-next-line import/no-unused-modules */\nexport function DateHeader({ date }) {\n return (\n <ListItem\n style={{\n height: 25,\n backgroundColor: colors.n10,\n borderColor: colors.n9,\n justifyContent: 'center',\n }}\n >\n <Text style={[styles.text, { fontSize: 13, color: colors.n4 }]}>\n {monthUtils.format(date, 'MMMM dd, yyyy')}\n </Text>\n </ListItem>\n );\n}\n\nfunction Status({ status }) {\n let color;\n\n switch (status) {\n case 'missed':\n color = colors.r3;\n break;\n case 'due':\n color = colors.y3;\n break;\n case 'upcoming':\n color = colors.n4;\n break;\n default:\n }\n\n return (\n <Text\n style={{\n fontSize: 11,\n color,\n fontStyle: 'italic',\n }}\n >\n {titleFirst(status)}\n </Text>\n );\n}\n\nclass Transaction extends PureComponent {\n render() {\n const {\n transaction,\n accounts,\n categories,\n payees,\n showCategory,\n added,\n // onSelect,\n style,\n } = this.props;\n let {\n id,\n payee: payeeId,\n amount,\n category,\n cleared,\n is_parent,\n notes,\n schedule,\n } = transaction;\n\n if (isPreviewId(id)) {\n amount = getScheduledAmount(amount);\n }\n\n let categoryName = category ? lookupName(categories, category) : null;\n\n let payee = payees && payeeId && getPayeesById(payees)[payeeId];\n let transferAcct =\n payee &&\n payee.transfer_acct &&\n getAccountsById(accounts)[payee.transfer_acct];\n\n let prettyDescription = getDescriptionPretty(\n transaction,\n payee,\n transferAcct,\n );\n let prettyCategory = transferAcct\n ? 'Transfer'\n : is_parent\n ? 'Split'\n : categoryName;\n\n let isPreview = isPreviewId(id);\n let textStyle = isPreview && {\n fontStyle: 'italic',\n color: colors.n5,\n };\n\n return (\n // <Button\n // onClick={() => onSelect(transaction)}\n // style={{\n // backgroundColor: 'white',\n // border: 'none',\n // width: '100%',\n // '&:active': { opacity: 0.1 }\n // }}\n // >\n <ListItem\n style={[\n { flex: 1, height: 60, padding: '5px 10px' }, // remove padding when Button is back\n isPreview && { backgroundColor: colors.n11 },\n style,\n ]}\n >\n <View style={[{ flex: 1 }]}>\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {schedule && (\n <ArrowsSynchronize\n style={{\n width: 12,\n height: 12,\n marginRight: 5,\n color: textStyle.color || colors.n1,\n }}\n />\n )}\n <TextOneLine\n style={[\n styles.text,\n textStyle,\n { fontSize: 14, fontWeight: added ? '600' : '400' },\n prettyDescription === '' && {\n color: colors.n6,\n fontStyle: 'italic',\n },\n ]}\n >\n {prettyDescription || 'Empty'}\n </TextOneLine>\n </View>\n {isPreview ? (\n <Status status={notes} />\n ) : (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginTop: 3,\n }}\n >\n <CheckCircle1\n style={{\n width: 11,\n height: 11,\n color: cleared ? colors.g6 : colors.n8,\n marginRight: 5,\n }}\n />\n {showCategory && (\n <TextOneLine\n style={{\n fontSize: 11,\n marginTop: 1,\n fontWeight: '400',\n color: prettyCategory ? colors.n3 : colors.p7,\n fontStyle: prettyCategory ? null : 'italic',\n textAlign: 'left',\n }}\n >\n {prettyCategory || 'Uncategorized'}\n </TextOneLine>\n )}\n </View>\n )}\n </View>\n <Text\n style={[\n styles.text,\n textStyle,\n { marginLeft: 25, marginRight: 5, fontSize: 14 },\n ]}\n >\n {integerToCurrency(amount)}\n </Text>\n </ListItem>\n // </Button>\n );\n }\n}\n\nexport class TransactionList extends Component {\n makeData = memoizeOne(transactions => {\n // Group by date. We can assume transactions is ordered\n const sections = [];\n transactions.forEach(transaction => {\n if (\n sections.length === 0 ||\n transaction.date !== sections[sections.length - 1].date\n ) {\n // Mark the last transaction in the section so it can render\n // with a different border\n let lastSection = sections[sections.length - 1];\n if (lastSection && lastSection.data.length > 0) {\n let lastData = lastSection.data;\n lastData[lastData.length - 1].isLast = true;\n }\n\n sections.push({\n id: transaction.date,\n date: transaction.date,\n data: [],\n });\n }\n\n if (!transaction.is_child) {\n sections[sections.length - 1].data.push(transaction);\n }\n });\n return sections;\n });\n\n render() {\n const {\n transactions,\n scrollProps = {},\n onLoadMore,\n // refreshControl\n } = this.props;\n\n const sections = this.makeData(transactions);\n\n return (\n <>\n {scrollProps.ListHeaderComponent}\n <ListBox\n {...scrollProps}\n aria-label=\"transaction list\"\n label=\"\"\n loadMore={onLoadMore}\n selectionMode=\"none\"\n style={{ flex: '1 auto', height: '100%', overflowY: 'auto' }}\n >\n {sections.length === 0 ? (\n <Section>\n <Item>\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n }}\n >\n <Text style={{ fontSize: 15 }}>No transactions</Text>\n </div>\n </Item>\n </Section>\n ) : null}\n {sections.map(section => {\n return (\n <Section\n title={monthUtils.format(section.date, 'MMMM dd, yyyy')}\n key={section.id}\n >\n {section.data.map((transaction, index, transactions) => {\n return (\n <Item\n key={transaction.id}\n style={{\n fontSize:\n index === transactions.length - 1 ? 98 : 'inherit',\n }}\n textValue={transaction.id}\n >\n <Transaction\n transaction={transaction}\n categories={this.props.categories}\n accounts={this.props.accounts}\n payees={this.props.payees}\n showCategory={this.props.showCategory}\n added={this.props.isNew(transaction.id)}\n onSelect={() => {}} // onSelect(transaction)}\n />\n </Item>\n );\n })}\n </Section>\n );\n })}\n </ListBox>\n </>\n );\n }\n}\n\nfunction ListBox(props) {\n let state = useListState(props);\n let listBoxRef = useRef();\n let { listBoxProps, labelProps } = useListBox(props, state, listBoxRef);\n\n useEffect(() => {\n function loadMoreTransactions() {\n if (\n Math.abs(\n listBoxRef.current.scrollHeight -\n listBoxRef.current.clientHeight -\n listBoxRef.current.scrollTop,\n ) < listBoxRef.current.clientHeight // load more when we're one screen height from the end\n ) {\n props.loadMore();\n }\n }\n\n listBoxRef.current.addEventListener('scroll', loadMoreTransactions);\n\n return () => {\n listBoxRef.current?.removeEventListener('scroll', loadMoreTransactions);\n };\n }, [state.collection]);\n\n return (\n <>\n <div {...labelProps}>{props.label}</div>\n <ul\n {...listBoxProps}\n ref={listBoxRef}\n style={{\n padding: 0,\n listStyle: 'none',\n margin: 0,\n overflowY: 'auto',\n width: '100%',\n }}\n >\n {[...state.collection].map(item => (\n <ListBoxSection key={item.key} section={item} state={state} />\n ))}\n </ul>\n </>\n );\n}\n\nfunction ListBoxSection({ section, state }) {\n let { itemProps, headingProps, groupProps } = useListBoxSection({\n heading: section.rendered,\n 'aria-label': section['aria-label'],\n });\n\n // The heading is rendered inside an <li> element, which contains\n // a <ul> with the child items.\n return (\n <li {...itemProps} style={{ width: '100%' }}>\n {section.rendered && (\n <div\n {...headingProps}\n {...css(styles.smallText, {\n backgroundColor: colors.n10,\n borderBottom: `1px solid ${colors.n9}`,\n borderTop: `1px solid ${colors.n9}`,\n color: colors.n4,\n display: 'flex',\n justifyContent: 'center',\n paddingBottom: 4,\n paddingTop: 4,\n position: 'sticky',\n top: '0',\n width: '100%',\n zIndex: zIndices.SECTION_HEADING,\n })}\n >\n {section.rendered}\n </div>\n )}\n <ul\n {...groupProps}\n style={{\n padding: 0,\n listStyle: 'none',\n }}\n >\n {[...section.childNodes].map((node, index, nodes) => (\n <Option\n key={node.key}\n item={node}\n state={state}\n isLast={index === nodes.length - 1}\n />\n ))}\n </ul>\n </li>\n );\n}\n\nfunction Option({ isLast, item, state }) {\n // Get props for the option element\n let ref = useRef();\n let { optionProps, isSelected } = useOption({ key: item.key }, state, ref);\n\n // Determine whether we should show a keyboard\n // focus ring for accessibility\n let { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <li\n {...mergeProps(optionProps, focusProps)}\n ref={ref}\n style={{\n background: isSelected ? 'blueviolet' : 'transparent',\n color: isSelected ? 'white' : null,\n outline: isFocusVisible ? '2px solid orange' : 'none',\n ...(!isLast && { borderBottom: `1px solid ${colors.border}` }),\n }}\n >\n {item.rendered}\n </li>\n );\n}\n\nconst ROW_HEIGHT = 50;\n\nconst ListItem = forwardRef(({ children, style, ...props }, ref) => {\n return (\n <View\n style={[\n {\n height: ROW_HEIGHT,\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: 10,\n paddingRight: 10,\n },\n style,\n ]}\n ref={ref}\n {...props}\n >\n {children}\n </View>\n );\n});\n","import React, { useState, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport Add from '../../icons/v1/Add';\nimport CheveronLeft from '../../icons/v1/CheveronLeft';\nimport SearchAlternate from '../../icons/v2/SearchAlternate';\nimport { colors, styles } from '../../style';\nimport Button from '../common/Button';\nimport InputWithContent from '../common/InputWithContent';\nimport Label from '../common/Label';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport CellValue from '../spreadsheet/CellValue';\nimport { TransactionList } from '../transactions/MobileTransaction';\n\nfunction TransactionSearchInput({ accountName, onSearch }) {\n const [text, setText] = useState('');\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: colors.n11,\n margin: '11px auto 4px',\n borderRadius: 4,\n padding: 10,\n width: '100%',\n }}\n >\n <InputWithContent\n leftContent={\n <SearchAlternate\n style={{\n width: 13,\n height: 13,\n flexShrink: 0,\n color: text ? colors.p7 : 'inherit',\n margin: 5,\n marginRight: 0,\n }}\n />\n }\n value={text}\n onUpdate={text => {\n setText(text);\n onSearch(text);\n }}\n placeholder={`Search ${accountName}`}\n style={{\n backgroundColor: colors.n11,\n border: `1px solid ${colors.n9}`,\n fontSize: 15,\n flex: 1,\n height: 32,\n marginLeft: 4,\n padding: 8,\n }}\n />\n </View>\n );\n}\n\nconst LEFT_RIGHT_FLEX_WIDTH = 70;\nexport default function AccountDetails({\n account,\n prependTransactions,\n transactions,\n accounts,\n categories,\n payees,\n balance,\n isNewTransaction,\n onLoadMore,\n onSearch,\n onSelectTransaction,\n // refreshControl\n}) {\n let allTransactions = useMemo(() => {\n return prependTransactions.concat(transactions);\n }, [prependTransactions, transactions]);\n\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: colors.n11,\n overflowY: 'hidden',\n width: '100%',\n }}\n >\n <View\n style={{\n alignItems: 'center',\n backgroundColor: colors.n11,\n flexShrink: 0,\n overflowY: 'hidden',\n paddingTop: 20,\n top: 0,\n width: '100%',\n }}\n >\n <View\n style={{\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <Link\n to=\"/accounts\"\n style={{\n color: colors.b5,\n alignItems: 'center',\n display: 'flex',\n textDecoration: 'none',\n width: LEFT_RIGHT_FLEX_WIDTH,\n }}\n >\n <CheveronLeft style={{ width: 32, height: 32 }} />\n <Text style={{ ...styles.text, fontWeight: 500 }}>Back</Text>\n </Link>\n <View\n style={{\n fontSize: 16,\n fontWeight: 500,\n }}\n >\n {account.name}\n </View>\n {/*\n TODO: connect to an add transaction modal\n Only left here but hidden for flex centering of the account name.\n */}\n <Link to=\"transaction/new\" style={{ visibility: 'hidden' }}>\n <Button\n type=\"bare\"\n style={{ justifyContent: 'center', width: LEFT_RIGHT_FLEX_WIDTH }}\n >\n <Add width={20} height={20} />\n </Button>\n </Link>\n </View>\n <Label title=\"BALANCE\" style={{ marginTop: 10 }} />\n <CellValue\n binding={balance}\n type=\"financial\"\n debug={true}\n style={{\n fontSize: 18,\n fontWeight: '500',\n }}\n getStyle={value => ({\n color: value < 0 ? colors.r4 : colors.p5,\n })}\n />\n <TransactionSearchInput\n accountName={account.name}\n onSearch={onSearch}\n />\n </View>\n <TransactionList\n transactions={allTransactions}\n categories={categories}\n accounts={accounts}\n payees={payees}\n showCategory={!account.offbudget}\n isNew={isNewTransaction}\n // refreshControl={refreshControl}\n onLoadMore={onLoadMore}\n onSelect={onSelectTransaction}\n />\n </View>\n );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams, useNavigate } from 'react-router-dom';\n\nimport debounce from 'debounce';\nimport memoizeOne from 'memoize-one';\nimport { bindActionCreators } from 'redux';\n\nimport * as actions from 'loot-core/src/client/actions';\nimport {\n SchedulesProvider,\n useCachedSchedules,\n} from 'loot-core/src/client/data-hooks/schedules';\nimport * as queries from 'loot-core/src/client/queries';\nimport { pagedQuery } from 'loot-core/src/client/query-helpers';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport {\n getSplit,\n isPreviewId,\n ungroupTransactions,\n} from 'loot-core/src/shared/transactions';\n\nimport { useActions } from '../../hooks/useActions';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { colors } from '../../style';\nimport SyncRefresh from '../SyncRefresh';\n\nimport AccountDetails from './MobileAccountDetails';\n\nconst getSchedulesTransform = memoizeOne((id, hasSearch) => {\n let filter = queries.getAccountFilter(id, '_account');\n\n // Never show schedules on these pages\n if (hasSearch) {\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});\n\nfunction PreviewTransactions({ accountId, children }) {\n let scheduleData = useCachedSchedules();\n\n if (scheduleData == null) {\n return children(null);\n }\n\n let schedules = scheduleData.schedules.filter(\n s =>\n !s.completed &&\n ['due', 'upcoming', 'missed'].includes(scheduleData.statuses.get(s.id)),\n );\n\n return children(\n 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 );\n}\n\nlet paged;\n\nexport default function Account(props) {\n const accounts = useSelector(state => state.queries.accounts);\n const { syncAndDownload } = useActions();\n\n const navigate = useNavigate();\n const [transactions, setTransactions] = useState([]);\n const [searchText, setSearchText] = useState('');\n const [currentQuery, setCurrentQuery] = useState();\n\n let state = useSelector(state => ({\n payees: state.queries.payees,\n newTransactions: state.queries.newTransactions,\n categories: state.queries.categories.list,\n prefs: state.prefs.local,\n dateFormat: state.prefs.local.dateFormat || 'MM/dd/yyyy',\n }));\n\n let dispatch = useDispatch();\n let actionCreators = useMemo(\n () => bindActionCreators(actions, dispatch),\n [dispatch],\n );\n\n const { id: accountId } = useParams();\n\n const makeRootQuery = () => queries.makeTransactionsQuery(accountId);\n\n const updateQuery = query => {\n if (paged) {\n paged.unsubscribe();\n }\n\n paged = pagedQuery(\n query.options({ splits: 'grouped' }).select('*'),\n data => setTransactions(data),\n { pageCount: 150, mapper: ungroupTransactions },\n );\n };\n\n const fetchTransactions = async () => {\n let query = makeRootQuery();\n setCurrentQuery(query);\n updateQuery(query);\n };\n\n useEffect(() => {\n let unlisten;\n\n async function setUpAccount() {\n unlisten = listen('sync-event', ({ type, tables }) => {\n if (type === 'applied') {\n if (\n tables.includes('transactions') ||\n tables.includes('category_mapping') ||\n tables.includes('payee_mapping')\n ) {\n paged?.run();\n }\n\n if (tables.includes('payees') || tables.includes('payee_mapping')) {\n actionCreators.getPayees();\n }\n }\n });\n\n if (state.categories.length === 0) {\n await actionCreators.getCategories();\n }\n if (accounts.length === 0) {\n await actionCreators.getAccounts();\n }\n\n await actionCreators.initiallyLoadPayees();\n await fetchTransactions();\n\n actionCreators.markAccountRead(accountId);\n }\n\n setUpAccount();\n\n return () => unlisten();\n }, []);\n\n const updateSearchQuery = debounce(() => {\n if (searchText === '' && currentQuery) {\n updateQuery(currentQuery);\n } else if (searchText && currentQuery) {\n updateQuery(\n queries.makeTransactionSearchQuery(\n currentQuery,\n searchText,\n state.dateFormat,\n ),\n );\n }\n }, 150);\n\n useEffect(updateSearchQuery, [searchText, currentQuery, state.dateFormat]);\n\n useSetThemeColor(colors.n11);\n\n if (!accounts || !accounts.length) {\n return null;\n }\n\n const account = accounts.find(acct => acct.id === accountId);\n\n const isNewTransaction = id => {\n return state.newTransactions.includes(id);\n };\n\n const onSearch = async text => {\n paged.unsubscribe();\n setSearchText(text);\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const onSelectTransaction = transaction => {\n if (isPreviewId(transaction.id)) {\n let parts = transaction.id.split('/');\n let scheduleId = parts[1];\n\n let options = ['Post transaction', 'Skip scheduled date', 'Cancel'];\n let cancelButtonIndex = 2;\n\n props.showActionSheetWithOptions(\n {\n options,\n cancelButtonIndex,\n },\n buttonIndex => {\n switch (buttonIndex) {\n case 0:\n // Post\n send('schedule/post-transaction', { id: scheduleId });\n break;\n case 1:\n // Skip\n send('schedule/skip-next-date', { id: scheduleId });\n break;\n default:\n }\n },\n );\n } else {\n let trans = [transaction];\n if (transaction.parent_id || transaction.is_parent) {\n let index = transactions.findIndex(\n t => t.id === (transaction.parent_id || transaction.id),\n );\n trans = getSplit(transactions, index);\n }\n\n navigate('Transaction', {\n transactions: trans,\n });\n }\n };\n\n const onRefresh = async () => {\n await syncAndDownload();\n };\n\n let balance = queries.accountBalance(account);\n let numberFormat = state.prefs.numberFormat || 'comma-dot';\n let hideFraction = state.prefs.hideFraction || false;\n\n return (\n <SyncRefresh onSync={onRefresh}>\n {({ refreshing, onRefresh }) => (\n <SchedulesProvider\n transform={getSchedulesTransform(accountId, searchText !== '')}\n >\n <PreviewTransactions accountId={props.accountId}>\n {prependTransactions =>\n prependTransactions == null ? null : (\n <AccountDetails\n // This key forces the whole table rerender when the number\n // format changes\n {...state}\n {...actionCreators}\n key={numberFormat + hideFraction}\n account={account}\n accounts={accounts}\n categories={state.categories}\n payees={state.payees}\n transactions={transactions}\n prependTransactions={prependTransactions || []}\n balance={balance}\n isNewTransaction={isNewTransaction}\n // refreshControl={\n // <RefreshControl\n // refreshing={refreshing}\n // onRefresh={onRefresh}\n // />\n // }\n onLoadMore={() => {\n paged?.fetchNext();\n }}\n onSearch={onSearch}\n onSelectTransaction={() => {}} // onSelectTransaction}\n />\n )\n }\n </PreviewTransactions>\n </SchedulesProvider>\n )}\n </SyncRefresh>\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 { v4 as uuidv4 } from 'uuid';\n\nimport { last, diffItems, applyChanges } from './util';\n\nexport function isPreviewId(id) {\n return id.indexOf('preview/') !== -1;\n}\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 + uuidv4(),\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\nfunction 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\nfunction 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\nfunction 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: uuidv4() };\n\n let children = transactions.filter(t => t.is_child);\n return [\n parent,\n ...children.map(child => ({\n ...child,\n id: uuidv4(),\n parent_id: parent.id,\n })),\n ];\n}\n"],"names":["SyncRefresh","_ref","onSync","children","syncing","setSyncing","useState","refreshing","onRefresh","async","props","_jsx","xmlns","viewBox","style","color","d","fill","forwardRef","ref","View","marginTop","marginLeft","marginRight","borderRadius","backgroundColor","borderColor","colors","boxShadow","overflow","Label","title","Text","styles","textAlign","fontSize","marginBottom","ListItem","height","borderBottomWidth","flexDirection","alignItems","paddingLeft","paddingRight","zIndex","ToBudget","toBudget","onClick","amount","useSheetValue","_jsxs","Button","type","flexShrink","fontWeight","format","Saved","_ref2","projected","budgetedSaved","reportBudget","totalSaved","saved","isNegative","BudgetCell","memo","name","binding","editing","textStyle","categoryId","month","onBudgetAction","sheetValue","AmountInput","value","integerToAmount","ROW_HEIGHT","transform","opacity","position","top","focused","onChange","onBlur","category","amountToInteger","justifyContent","display","BudgetCategory","PureComponent","constructor","super","editMode","blank","this","render","index","budgeted","rolloverBudget","id","balance","content","borderTopWidth","flex","width","CellValue","getStyle","TotalsRow","group","onAddCategory","padding","Add","IncomeCategory","budget","nameTextStyle","amountTextStyle","BudgetGroup","gestures","onEditCategory","onReorderCategory","Card","categories","map","undefined","onEdit","onReorder","IncomeBudgetGroup","Component","BudgetGroups","arguments","getGroups","memoizeOne","groups","incomeGroup","find","is_income","expenseGroups","filter","categoryGroups","editingId","onReorderGroup","overflowY","paddingBottom","BudgetTable","state","editingCategory","setState","monthBounds","onPrevMonth","onNextMonth","onShowBudgetDetails","onOpenActionSheet","currentMonth","monthUtils","NamespaceContext","BudgetHeader","onDone","onEditMode","formatter","parseFloat","_Fragment","_ref5","prevEnabled","start","nextEnabled","end","buttonStyle","left","ArrowThinLeft","bottom","right","ArrowThinRight","SyncButton","Budget","_this","prewarmMonth","length","budgetType","method","values","send","spreadsheet","prewarmCache","initialized","pushModal","applyBudgetAction","bounds","groupId","navigation","navigate","onAdd","createCategory","addCategory","cat_group","targetId","inGroup","aroundCategory","catId","cat","idx","findIndex","moveCategory","moveCategoryGroup","sync","updated","error","options","Boolean","showActionSheetWithOptions","cancelButtonIndex","summary","result","getCategories","grouped","loadCategories","unlisten","listen","tables","includes","cleanup","componentWillUnmount","prefs","numberFormat","hideFraction","_ref3","flag","AnimatedLoading","BudgetWrapper","useSelector","queries","list","local","actions","useActions","useSpreadsheet","useSetThemeColor","TextOneLine","textOverflow","whiteSpace","AccountHeader","textTransform","AccountCard","account","getBalanceQuery","onSelect","onMouseDown","margin","bankId","EmptyMessage","alignSelf","alert","AccountList","isNewTransaction","newTransactions","accounts","updatedAccounts","getOnBudgetBalance","getOffBudgetBalance","onAddAccount","onSelectAccount","budgetedAccounts","offbudget","offbudgetAccounts","accountContent","Page","acct","Accounts","getAccounts","transactions","useNavigate","useEffect","closed","onSelectTransaction","transaction","zIndices","SECTION_HEADING","getPayeesById","payees","groupById","getAccountsById","isPreviewId","indexOf","Status","status","fontStyle","titleFirst","Transaction","showCategory","added","payee","payeeId","cleared","is_parent","notes","schedule","getScheduledAmount","categoryName","items","item","lookupName","transferAcct","transfer_acct","prettyDescription","getDescriptionPretty","prettyCategory","isPreview","ArrowsSynchronize","CheckCircle1","integerToCurrency","TransactionList","makeData","sections","forEach","date","lastSection","data","lastData","isLast","push","is_child","scrollProps","onLoadMore","ListHeaderComponent","ListBox","label","loadMore","selectionMode","Section","Item","section","textValue","isNew","useListState","listBoxRef","useRef","listBoxProps","labelProps","useListBox","loadMoreTransactions","Math","abs","current","scrollHeight","clientHeight","scrollTop","addEventListener","_listBoxRef$current","removeEventListener","collection","listStyle","ListBoxSection","key","itemProps","headingProps","groupProps","useListBoxSection","heading","rendered","css","borderBottom","borderTop","paddingTop","childNodes","node","nodes","Option","_ref4","optionProps","isSelected","useOption","isFocusVisible","focusProps","useFocusRing","mergeProps","background","outline","TransactionSearchInput","accountName","onSearch","text","setText","InputWithContent","leftContent","SearchAlternate","onUpdate","placeholder","border","LEFT_RIGHT_FLEX_WIDTH","AccountDetails","prependTransactions","allTransactions","useMemo","concat","Link","to","textDecoration","CheveronLeft","visibility","debug","getSchedulesTransform","hasSearch","q","$and","orderBy","next_date","PreviewTransactions","accountId","scheduleData","useCachedSchedules","schedules","s","completed","statuses","get","_payee","_account","_amount","paged","Account","syncAndDownload","setTransactions","searchText","setSearchText","currentQuery","setCurrentQuery","dateFormat","dispatch","useDispatch","actionCreators","bindActionCreators","useParams","updateQuery","query","unsubscribe","pagedQuery","splits","select","pageCount","mapper","ungroupTransactions","fetchTransactions","_paged","run","getPayees","initiallyLoadPayees","markAccountRead","setUpAccount","updateSearchQuery","debounce","SchedulesProvider","_createElement","_paged2","fetchNext","updateCategory","c","moveCat","reduce","cats","moveGroup","g","deleteCategory","addGroup","updateGroup","deleteGroup","num","n","SplitTransactionError","total","parent","version","difference","makeChild","prefix","uuidv4","starting_balance_flag","parent_id","recalculateSplit","trans","subtransactions","acc","t","getSplit","parentIndex","split","curr","i","groupTransaction","slice","ungroupTransaction","applyTransactionDiff","groupedTrans","diff","applyChanges","replaceTransactions","func","transactionsCopy","Error","findParentIndex","console","log","deleted","newSplit","_deleted","splice","diffItems","newTransaction","newTrans","addSplitTransaction","prevSub","last","sort_order","updateTransaction","sub","child","deleteTransaction","splitTransaction","realizeTempTransactions"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_actual_app_web=self.webpackChunk_actual_app_web||[]).push([[992],{91836:function(e,t,n){n.d(t,{Z:function(){return s}});n(83017);var l=n(83679),a=n(28993);function s(e){let{width:t,onClose:n,children:s}=e;return(0,a.jsx)(l.u,{position:"bottom-right",width:t,style:{padding:0},onClose:n,children:s})}},98030:function(e,t,n){n.d(t,{M:function(){return R},L:function(){return T}});var l=n(83017),a=n(71274),s=n(27876),o=n(3189),i=n(48664),r=n(45249),d=n(26018),c=n(97156),u=n(24917),h=n(80837),f=n(69585),p=n(28091),x=n(28993);var g=e=>(0,x.jsx)("svg",{...e,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",style:{color:"inherit",...e.style},children:(0,x.jsx)("path",{fill:"currentColor",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"})}),m=n(53819),y=n(13743),j=n(18999),Z=n(61947),v=n(99884),b=n(10666),w=n(91743),C=n(10945),k=n(83679),M=n(99446),O=n(58130);let W=["date","account","payee","notes","category","amount","cleared","saved"].map((e=>[e,(0,h.gL)(e)]));function S(e){let{field:t,options:n,value:l}=e;if("date"===t){if(7===l.length)return"month";if(4===l.length)return"year"}else if("amount"===t){if(n&&n.inflow)return"amount-inflow";if(n&&n.outflow)return"amount-outflow"}return t}function D(e,t){switch(e){case"amount":switch(t){case"amount-inflow":return{inflow:!0};case"amount-outflow":return{outflow:!0};default:return null}case"date":switch(t){case"month":return{month:!0};case"year":return{year:!0};default:return null}default:return null}}function $(e){let{op:t,selected:n,style:l,onClick:a}=e;return(0,x.jsx)(y.Z,{type:"bare",style:[{backgroundColor:m.O9.pK,marginBottom:5},l,n&&{color:"white","&,:hover,:active":{backgroundColor:m.O9.b4}}],onClick:a,children:(0,h.w8)(t)})}function A(e,t){switch(t.type){case"set-op":{let n=h.Z9.get(e.field),l=e.value;return"id"!==n&&"string"!==n||"contains"!==t.op&&"is"!==t.op&&"doesNotContain"!==t.op&&"isNot"!==t.op||(l=null),{...e,op:t.op,value:l}}case"set-value":{let{value:n}=(0,h.l1)(t.value,{type:h.Z9.get(e.field)});return{...e,value:n}}default:throw new Error(`Unhandled action type: ${t.type}`)}}function F(e){let{field:t,initialSubfield:n=t,op:a,value:o,dispatch:i,onApply:r}=e,[d,c]=(0,l.useState)(n),u=(0,l.useRef)(),p=(0,l.useRef)(null);(0,l.useEffect)((()=>{p.current!==a&&u.current&&u.current.focus(),p.current=a}),[a]);let g=h.Z9.get(t),j=h.wZ[g].ops.filter((e=>"isbetween"!==e));return"month"!==d&&"year"!==d||(j=["is"]),(0,x.jsx)(k.u,{position:"bottom-left",style:{padding:15},width:275,onClose:()=>i({type:"close"}),children:(0,x.jsxs)(s.MT,{children:[(0,x.jsx)(w.Z,{style:{marginBottom:10},children:"amount"===t||"date"===t?(0,x.jsx)(Z.Z,{options:"amount"===t?[["amount","Amount"],["amount-inflow","Amount (inflow)"],["amount-outflow","Amount (outflow)"]]:"date"===t?[["date","Date"],["month","Month"],["year","Year"]]:null,value:d,onChange:e=>{c(e),"month"!==e&&"year"!==e||i({type:"set-op",op:"is"})},style:{borderWidth:1}}):(0,f.VL)((0,h.gL)(t))}),(0,x.jsx)(w.Z,{style:{color:m.O9.n4,marginBottom:10},children:"saved"===t&&"Existing filters will be cleared"}),(0,x.jsx)(v.Z,{direction:"row",align:"flex-start",spacing:1,style:{flexWrap:"wrap"},children:"boolean"===g?[(0,x.jsx)($,{op:"true",selected:!0===o,onClick:()=>{i({type:"set-op",op:"is"}),i({type:"set-value",value:!0})}},"true"),(0,x.jsx)($,{op:"false",selected:!1===o,onClick:()=>{i({type:"set-op",op:"is"}),i({type:"set-value",value:!1})}},"false")]:[(0,x.jsx)(v.Z,{direction:"row",align:"flex-start",spacing:1,style:{flexWrap:"wrap"},children:j.slice(0,3).map((e=>(0,x.jsx)($,{op:e,selected:e===a,onClick:()=>i({type:"set-op",op:e})},e)))}),(0,x.jsx)(v.Z,{direction:"row",align:"flex-start",spacing:1,style:{flexWrap:"wrap"},children:j.slice(3,j.length).map((e=>(0,x.jsx)(w.Z,{children:(0,x.jsx)($,{op:e,selected:e===a,onClick:()=>i({type:"set-op",op:e})},e)})))})]}),(0,x.jsxs)("form",{action:"#",children:["boolean"!==g&&(0,x.jsx)(M.Z,{inputRef:u,field:t,subfield:d,type:"id"!==g||"contains"!==a&&"doesNotContain"!==a?g:"string",value:o,multi:"oneOf"===a||"notOneOf"===a,style:{marginTop:10},onChange:e=>i({type:"set-value",value:e})}),(0,x.jsxs)(v.Z,{direction:"row",justify:"flex-end",align:"center",style:{marginTop:15},children:[(0,x.jsx)(w.Z,{style:{flex:1}}),(0,x.jsx)(y.Z,{type:"primary",onClick:e=>{e.preventDefault(),r({field:t,op:a,value:o,options:D(t,d)})},children:"Apply"})]})]})]})})}function T(e){let{onApply:t}=e,n=(0,d.m)(),{dateFormat:s}=(0,a.v9)((e=>({dateFormat:e.prefs.local.dateFormat||"MM/dd/yyyy"}))),[p,m]=(0,l.useReducer)(((e,t)=>{switch(t.type){case"select-field":return{...e,fieldsOpen:!0,condOpen:!1};case"configure":{let{field:n}=(0,h.Z)(t.field),l=h.Z9.get(n),a=h.wZ[l].ops;return{...e,fieldsOpen:!1,condOpen:!0,field:t.field,op:a[0],value:"boolean"===l||null}}case"close":return{fieldsOpen:!1,condOpen:!1,value:null};default:return A(e,t)}}),{fieldsOpen:!1,condOpen:!1,field:null,value:null});return(0,x.jsxs)(w.Z,{children:[(0,x.jsxs)(y.Z,{type:"bare",onClick:()=>m({type:"select-field"}),children:[(0,x.jsx)(g,{style:{width:16,height:16,marginRight:5}})," ","Filter"]}),p.fieldsOpen&&(0,x.jsx)(k.u,{position:"bottom-left",style:{padding:0},onClose:()=>m({type:"close"}),children:(0,x.jsx)(j.Z,{onMenuSelect:e=>{m({type:"configure",field:e})},items:W.map((e=>{let[t,n]=e;return{name:t,text:(0,f.VL)(n)}}))})}),p.condOpen&&(0,x.jsx)(F,{field:p.field,op:p.op,value:p.value,dispatch:m,onApply:async function(e){if("date"===(e=(0,h.Z2)({...e,type:h.Z9.get(e.field)})).type&&e.options)if(e.options.month){let t=(0,o.Z)(e.value,(0,u.LT)(s),new Date);if(!(0,i.Z)(t))return void alert("Invalid date format");e.value=(0,r.Z)(t,"yyyy-MM")}else if(e.options.year){let t=(0,o.Z)(e.value,"yyyy",new Date);if(!(0,i.Z)(t))return void alert("Invalid date format");e.value=(0,r.Z)(t,"yyyy")}let{error:l}="saved"!==e.field&&await(0,c.lW)("rule-validate",{conditions:[e],actions:[]}),a=n.find((t=>e.value===t.id));if(l&&l.conditionErrors.length>0){let t=(0,f.VL)((0,h.gL)(e.field));alert(t+": "+(0,h.zQ)(l.conditionErrors[0]))}else t(a||e),m({type:"close"})}})]})}function L(e){let{field:t,op:n,value:a,options:s,onSave:o,onClose:i}=e,[r,d]=(0,l.useReducer)(((e,t)=>"close"===t.type?(i(),e):A(e,t)),{field:t,op:n,value:a,options:s});return(0,x.jsx)(F,{field:r.field,initialSubfield:S({field:t,options:s,value:a}),op:r.op,value:r.value,options:r.options,dispatch:d,onApply:e=>{o(e),i()}})}function P(e){let{field:t,customName:n,op:a,value:s,options:o,stage:i,style:r,onChange:d,onDelete:c}=e,[u,f]=(0,l.useState)(!1),g=S({field:t,value:s});return(0,x.jsxs)(w.Z,{style:[{backgroundColor:m.O9.n9,borderRadius:4,flexDirection:"row",alignItems:"center",marginRight:10,marginTop:10},r],children:[(0,x.jsx)(y.Z,{type:"bare",disabled:null!=n,onClick:()=>f(!0),style:{marginRight:-7},children:(0,x.jsx)("div",{style:{paddingBlock:1,paddingLeft:5,paddingRight:2},children:n?(0,x.jsx)(b.Z,{style:{color:m.O9.p4},children:n}):(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(b.Z,{style:{color:m.O9.p4},children:(0,h.gL)(g,o)})," ",(0,x.jsx)(b.Z,{style:{color:m.O9.n3},children:(0,h.w8)(a,null)})," ",(0,x.jsx)(C.B,{value:s,field:g,inline:!0,valueIsRaw:"contains"===a||"doesNotContain"===a})]})})}),(0,x.jsx)(y.Z,{type:"bare",onClick:c,children:(0,x.jsx)(p.Z,{style:{width:8,height:8,margin:5,marginLeft:3}})}),u&&(0,x.jsx)(L,{field:t,customName:n,op:a,value:s,options:o,stage:i,onSave:d,onClose:()=>f(!1)})]})}function R(e){let{filters:t,editingFilter:n,onUpdate:l,onDelete:a,conditionsOp:s,onCondOpChange:o}=e;return(0,x.jsxs)(w.Z,{style:{flexDirection:"row",alignItems:"flex-start",flexWrap:"wrap"},children:[(0,x.jsx)(O.a,{conditionsOp:s,onCondOpChange:o,filters:t}),t.map(((e,t)=>(0,x.jsx)(P,{customName:e.customName,field:e.field,op:e.op,value:e.value,options:e.options,editing:n===e,onChange:t=>l(e,t),onDelete:()=>a(e)},t)))]})}},58130:function(e,t,n){n.d(t,{O:function(){return Z},a:function(){return j}});var l=n(83017),a=n(97156),s=n(89220),o=n(53819),i=n(13743),r=n(18999),d=n(91836),c=n(99884),u=n(10666),h=n(91743),f=n(36717),p=n(97117),x=n(99446),g=n(98030),m=n(28993);function y(e){let t,n,{filters:p,conditionsOp:g,filterId:y,onClearFilters:j,onReloadSavedFilter:Z,filtersList:v}=e,[b,w]=(0,l.useState)(!1),[C,k]=(0,l.useState)(!1),[M,O]=(0,l.useState)(!1),[W,S]=(0,l.useState)(null),[D,$]=(0,l.useState)(null),A=(0,l.useRef)(),F=y.name,T=y.id;(0,l.useEffect)((()=>{A.current&&A.current.focus()}),[R]);const L=async e=>{switch($(e),e){case"rename-filter":S(null),k(!1),O(!1),w(!0);break;case"delete-filter":O(!1),await(0,a.lW)("filter-delete",T),j();break;case"update-filter":S(null),k(!1),O(!1),n={conditions:p,conditionsOp:g,id:y.id,name:y.name,status:"saved"},t=await(0,a.OK)("filter-update",{state:n,filters:[...v]}),t.error?(S(t.error.message),w(!0)):Z(n,"update");break;case"save-filter":S(null),k(!0),O(!1),w(!0);break;case"reload-filter":O(!1),n={status:"saved"},Z(n,"reload");break;case"clear-filter":O(!1),j()}};function P(e){let{onClose:t,filterId:n}=e;return(0,m.jsx)(d.Z,{width:200,onClose:t,children:(0,m.jsx)(r.Z,{onMenuSelect:e=>{L(e)},items:[...n.id?[...null!==n.id&&"saved"===n.status?[{name:"rename-filter",text:"Rename"},{name:"delete-filter",text:"Delete"},r.Z.line,{name:"save-filter",text:"Save new filter",disabled:!0},{name:"clear-filter",text:"Clear all conditions"}]:[{name:"rename-filter",text:"Rename"},{name:"update-filter",text:"Update condtions"},{name:"reload-filter",text:"Revert changes"},{name:"delete-filter",text:"Delete"},r.Z.line,{name:"save-filter",text:"Save new filter"},{name:"clear-filter",text:"Clear all conditions"}]]:[{name:"save-filter",text:"Save new filter"},{name:"clear-filter",text:"Clear all conditions"}]]})})}function R(e){let{onClose:l}=e;return(0,m.jsxs)(d.Z,{width:325,onClose:l,children:["update-filter"!==D&&(0,m.jsx)("form",{children:(0,m.jsxs)(c.Z,{direction:"row",justify:"flex-end",align:"center",style:{padding:10},children:[(0,m.jsxs)(f.Wi,{style:{flex:1},children:[(0,m.jsx)(f.lX,{title:"Filter Name",htmlFor:"name-field",style:{userSelect:"none"}}),(0,m.jsx)(x.Z,{inputRef:A,id:"name-field",field:"string",type:"string",value:F,onChange:e=>F=e})]}),(0,m.jsx)(i.Z,{type:"primary",style:{marginTop:18},onClick:e=>{e.preventDefault(),async function(){C?(n={conditions:p,conditionsOp:g,name:F,status:"saved"},t=await(0,a.OK)("filter-create",{state:n,filters:[...v]}),n={...n,id:t.data}):(n={conditions:y.conditions,conditionsOp:y.conditionsOp,id:y.id,name:F},t=await(0,a.OK)("filter-update",{state:n,filters:[...v]})),t.error?S(t.error.message):(w(!1),Z(n))}()},children:C?"Add":"Update"})]})}),W&&(0,m.jsx)(c.Z,{direction:"row",align:"center",style:{padding:10},children:(0,m.jsx)(u.Z,{style:{color:o.O9.r4},children:W})})]})}return(0,m.jsxs)(h.Z,{children:[p.length>0&&(0,m.jsxs)(i.Z,{type:"bare",style:{marginTop:10},onClick:()=>{O(!0)},children:[(0,m.jsxs)(u.Z,{style:{maxWidth:150,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",flexShrink:0},children:[y.id?y.name:"Unsaved filter","\xa0"]}),y.id&&"saved"!==y.status&&(0,m.jsx)(u.Z,{children:"(modified)\xa0"}),(0,m.jsx)(s.Z,{width:8,height:8,style:{marginRight:5}})]}),M&&(0,m.jsx)(P,{onClose:()=>O(!1),filterId:y}),b&&(0,m.jsx)(R,{onClose:()=>w(!1)})]})}function j(e){let{conditionsOp:t,onCondOpChange:n,filters:l}=e;return l.length>1&&(0,m.jsxs)(u.Z,{style:{color:o.O9.n4,marginTop:11,marginRight:5},children:[(0,m.jsx)(p.Wy,{style:{display:"inline-flex"},fields:[["and","all"],["or","any"]],value:t,onChange:(e,t)=>n(t,l)}),"of:"]})}function Z(e){let{filters:t,conditionsOp:n,onUpdateFilter:l,onDeleteFilter:a,onClearFilters:s,onReloadSavedFilter:o,filterId:i,filtersList:r,onCondOpChange:d}=e;return(0,m.jsx)(h.Z,{children:(0,m.jsxs)(c.Z,{spacing:2,direction:"row",justify:"flex-start",align:"flex-start",children:[(0,m.jsx)(g.M,{filters:t,conditionsOp:n,onCondOpChange:d,onUpdate:l,onDelete:a}),(0,m.jsx)(h.Z,{style:{flex:1}}),(0,m.jsx)(y,{filters:t,conditionsOp:n,filterId:i,onClearFilters:s,onReloadSavedFilter:o,filtersList:r})]})})}},48063:function(e,t,n){n.r(t),n.d(t,{ReportRouter:function(){return he}});var l=n(83017),a=n(79274),s=n(19076),o=n(81785),i=n(97156),r=n(24917),d=n(69585);function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const[t,n]=(0,l.useState)(e),[a,s]=(0,l.useState)("and"),[o,i]=(0,l.useState)(null),r=(0,l.useCallback)((e=>{e.conditions?(n([...e.conditions]),s(e.conditionsOp),i(e.id)):(n((t=>[...t,e])),i(null))}),[n]),d=(0,l.useCallback)(((e,t)=>{n((n=>n.map((n=>n===e?t:n)))),i(null)}),[n]),c=(0,l.useCallback)((e=>{n((t=>t.filter((t=>t!==e)))),i(null)}),[n]),u=(0,l.useCallback)((e=>{s(e)}),[s]);return(0,l.useMemo)((()=>({filters:t,saved:o,conditionsOp:a,onApply:r,onUpdate:d,onDelete:c,onCondOpChange:u})),[t,o,r,d,c,u,a])}var u=n(53819),h=n(78738),f=n(82054),p=n(803),x=n(10666),g=n(91743),m=n(78867),y=n(28993);var j=function(e){let{amount:t}=e;return(0,y.jsxs)(f.Z,{style:[u.W2.smallText,{color:t<0?u.O9.r5:u.O9.g5}],children:[t>=0?"+":"",(0,d.zA)(t)]})},Z=n(45249),v=n(99121);async function b(e,t){t(await Promise.all(e.map((e=>(0,v.Vn)(e).then((e=>{let{data:t}=e;return t}))))))}function w(e,t,n){const l={};return e.forEach((e=>{l[n?n(e[t]):e[t]]=e})),l}function C(e,t,n){const l={};return e.forEach((e=>{let a=l[e.date]&&l[e.date][e.xfer]?l[e.date][e.xfer]:0,s={[e[n]]:e.amount+a};l[e[t]]={...l[e[t]],...s}})),l}function k(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4?arguments[4]:void 0;return async(s,c)=>{let{filters:u}=await(0,i.lW)("make-filters-from-conditions",{conditions:l.filter((e=>!e.customName))});const f="or"===a?"$or":"$and";function p(l){let a=(0,v.ZP)("transactions").filter({[f]:[...u]}).filter({$and:[{date:{$transform:"$month",$gte:e}},{date:{$transform:"$month",$lte:t}}],"account.offbudget":!1});return n?a.groupBy([{$month:"$date"},"payee.transfer_acct"]).select([{date:{$month:"$date"}},{isTransfer:"payee.transfer_acct"},{amount:{$sum:"$amount"}}]):a.groupBy(["date","payee.transfer_acct"]).select(["date",{isTransfer:"payee.transfer_acct"},{amount:{$sum:"$amount"}}])}return b([(0,v.ZP)("transactions").filter({[f]:u,date:{$transform:"$month",$lt:e},"account.offbudget":!1}).calculate({$sum:"$amount"}),p().filter({amount:{$gt:0}}),p().filter({amount:{$lt:0}})],(l=>{c(function(e,t,n,l){let[a,s,i]=e,c=s.map((e=>({...e,isTransfer:null!==e.isTransfer}))),u=i.map((e=>({...e,isTransfer:null!==e.isTransfer})));const f=l?r.Do(r.jw(t),r.jw(n)):r.Gn(t,n),p=C(c,"date","isTransfer"),x=C(u,"date","isTransfer");let g=a,m=0,j=0,v=0;const b=f.reduce(((e,t)=>{let n=0,a=0,s=0,i=0;p[t]&&(n=p[t].false?p[t].false:0,s=p[t].true?p[t].true:0),x[t]&&(a=x[t].false?x[t].false:0,i=x[t].true?x[t].true:0),m+=a,j+=n,g+=n+a+s+i,v+=s+i;const r=o.Z(t),c=(0,y.jsxs)("div",{children:[(0,y.jsx)("div",{style:{marginBottom:10},children:(0,y.jsx)("strong",{children:Z.Z(r,l?"MMMM yyyy":"MMMM d, yyyy")})}),(0,y.jsxs)("div",{style:{lineHeight:1.5},children:[(0,y.jsx)(h.Z,{left:"Income:",right:(0,d.zA)(n)}),(0,y.jsx)(h.Z,{left:"Expenses:",right:(0,d.zA)(a)}),(0,y.jsx)(h.Z,{left:"Change:",right:(0,y.jsx)("strong",{children:(0,d.zA)(n+a)})}),s+i!==0&&(0,y.jsx)(h.Z,{left:"Transfers:",right:(0,d.zA)(s+i)}),(0,y.jsx)(h.Z,{left:"Balance:",right:(0,d.zA)(g)})]})]});return e.income.push({x:r,y:(0,d.Bf)(n)}),e.expenses.push({x:r,y:(0,d.Bf)(a)}),e.balances.push({x:r,y:(0,d.Bf)(g),premadeLabel:c,amount:g}),e}),{expenses:[],income:[],balances:[]}),{balances:w}=b;return{graphData:b,balance:w[w.length-1].amount,totalExpenses:m,totalIncome:j,totalTransfers:v,totalChange:w[w.length-1].amount-w[0].amount}}(l,e,t,n))}))}}var M=n(814),O=n(3472),W=n(18322),S=n(88704),D=n(11959),$=n(45591);const A={fontFamily:"Inter var, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif",fontSize:13,letterSpacing:"normal",fill:u.O9.n1,stroke:"transparent"},F={axis:{fill:"transparent",stroke:"none"},grid:{fill:"none",stroke:"none",pointerEvents:"none"},ticks:{fill:"transparent",size:1,stroke:"none"},axisLabel:A,tickLabels:A};var T={colors:{blueFadeStart:"rgba(229, 245, 255, 1)",blueFadeEnd:"rgba(229, 245, 255, 0)",redFadeStart:"rgba(255, 243, 242, 1)",redFadeEnd:"rgba(255, 243, 242, 0)",red:u.O9.r7,blue:u.O9.b6},area:{style:{labels:A,data:{stroke:u.O9.b6,strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round"}}},axis:{style:F},dependentAxis:{style:{...F,grid:{...F.grid,stroke:"rgba(0,0,0,.2)",strokeDasharray:"1,1"},tickLabels:{...A,padding:5}}},independentAxis:{style:{...F,axis:{...F.axis,stroke:"rgba(0,0,0,.2)"},tickLabels:{...A,padding:10}}},bar:{style:{labels:A,data:{fill:u.O9.b6,stroke:"none"}}},line:{style:{labels:A,data:{fill:"none",stroke:u.O9.b6,strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round"}}},voronoi:{style:{labels:A}},chart:{padding:{top:20,left:65,right:20,bottom:50}}},L=n(22644);function P(e){let{style:t,children:n}=e;const a=(0,l.useRef)(null);return(0,y.jsxs)(g.Z,{style:[{height:300,position:"relative",flexShrink:0},t],children:[(0,y.jsx)("div",{ref:a}),(0,y.jsx)(L.Z,{children:e=>{let{width:t,height:l}=e;return(0,y.jsx)("div",{style:{width:t,height:l},children:n(t,l,a.current)})}})]})}var R=n(46214),E=n(86634),B=n(82596);class I extends l.Component{render(){let{active:e,x:t,y:n,scale:l,datum:a,portalHost:s,offsetX:o=0,offsetY:i,position:r,light:d,forceActive:c,style:h}=this.props;const f=t-l.x.range()[0];return r||(r=a.labelPosition?a.labelPosition:f<150?"right":"left"),s&&(e||c)?(n=i?i(n):n,R.createPortal((0,y.jsx)("div",{...(0,E.iv)({position:"absolute",top:0,left:o,transform:"right"===r?`translate(calc(${t}px + 15px), calc(${n}px ${d?"":"- 50%"}))`:`translate(calc(${t}px - 100% - 15px), calc(${n}px ${d?"":"- 50%"}))`,zIndex:1e3,pointerEvents:"none",borderRadius:2,boxShadow:d?"none":"0 1px 6px rgba(0, 0, 0, .20)",backgroundColor:d?"transparent":u.O9.n1,color:d?"inherit":"white",padding:10},!d&&(0,E.bb)({position:"absolute",display:"inline-block",borderTop:"7px solid transparent",borderBottom:"7px solid transparent",["right"===r?"borderRight":"borderLeft"]:"7px solid "+u.O9.n1,["right"===r?"left":"right"]:-6,top:"calc(50% - 7px)",content:'" "'}),h),children:a.premadeLabel}),s)):null}}I.defaultEvents=B.Z.defaultEvents;var U=I;var z=function(e){let{graphData:t,isConcise:n}=e;return(0,y.jsx)(P,{children:(e,l,a)=>t&&(0,y.jsxs)(M.k,{scale:{x:"time",y:"linear"},theme:T,domainPadding:10,width:e,height:l,containerComponent:(0,y.jsx)(O.Z,{voronoiDimension:"x"}),children:[(0,y.jsxs)(W.G,{children:[(0,y.jsx)(S.Z,{data:t.expenses,style:{data:{fill:T.colors.red}}}),(0,y.jsx)(S.Z,{data:t.income})]}),(0,y.jsx)(D.j,{data:t.balances,labelComponent:(0,y.jsx)(U,{portalHost:a}),labels:e=>e.premadeLabel,style:{data:{stroke:u.O9.n5}}}),(0,y.jsx)($.E,{tickFormat:e=>Z.Z(e,n?"MMM ''yy":"MMM d"),tickValues:t.balances.map((e=>e.x)),tickCount:Math.min(5,t.balances.length),offsetY:50}),(0,y.jsx)($.E,{dependentAxis:!0,crossAxis:!1})]})})},N=n(62177),K=n(13743),_=n(61039),H=n(61947),Y=n(98030);function V(e,t,n){const l=r.dK();return n>l&&(n=l),t<e&&(t=e),[t,n]}function G(e){const t=r.dK();return[r.W9(t,e),t]}var X=function(e){let{title:t,start:n,end:l,show1Month:a,allMonths:s,onChangeDates:o,filters:i,conditionsOp:d,onApply:c,onUpdateFilter:h,onDeleteFilter:f,onCondOpChange:p}=e;return(0,y.jsxs)(g.Z,{style:{padding:10,paddingTop:0,flexShrink:0},children:[(0,y.jsxs)(_.Z,{type:"bare",to:"/reports",style:{marginBottom:"15",alignSelf:"flex-start"},children:[(0,y.jsx)(N.Z,{width:10,height:10,style:{marginRight:5}})," Back"]}),(0,y.jsx)(g.Z,{style:u.W2.veryLargeText,children:t}),(0,y.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",marginTop:15,gap:15},children:[(0,y.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",gap:5},children:[(0,y.jsx)(H.Z,{style:{backgroundColor:"white"},onChange:e=>o(...function(e,t,n){const l=e[e.length-1].name;return n<t&&(n=r.zI(t,6)),V(l,t,n)}(s,e,l)),value:n,defaultLabel:r.WU(n,"MMMM, yyyy"),options:s.map((e=>{let{name:t,pretty:n}=e;return[t,n]}))}),(0,y.jsx)(g.Z,{children:"to"}),(0,y.jsx)(H.Z,{style:{backgroundColor:"white"},onChange:e=>o(...function(e,t,n){const l=e[e.length-1].name;return t>n&&(t=r.W9(n,6)),V(l,t,n)}(s,n,e)),value:l,options:s.map((e=>{let{name:t,pretty:n}=e;return[t,n]}))})]}),(0,y.jsx)(Y.L,{onApply:c}),a&&(0,y.jsx)(K.Z,{type:"bare",onClick:()=>o(...G(1)),children:"1 month"}),(0,y.jsx)(K.Z,{type:"bare",onClick:()=>o(...G(2)),children:"3 months"}),(0,y.jsx)(K.Z,{type:"bare",onClick:()=>o(...G(5)),children:"6 months"}),(0,y.jsx)(K.Z,{type:"bare",onClick:()=>o(...G(11)),children:"1 Year"}),(0,y.jsx)(K.Z,{type:"bare",onClick:()=>o(...function(e){return[e[e.length-1].name,r.dK()]}(s)),children:"All Time"})]}),i.length>0&&(0,y.jsx)(g.Z,{style:{marginTop:5},spacing:2,direction:"row",justify:"flex-start",align:"flex-start",children:(0,y.jsx)(Y.M,{filters:i,onUpdate:h,onDelete:f,conditionsOp:d,onCondOpChange:p})})]})},q=n(62914);var Q=function(e,t){const n=(0,q.M)(),[a,s]=(0,l.useState)(null);return(0,l.useEffect)((()=>{let e;return t(n,(e=>s(e))).then((t=>{e=t})),()=>{var t;null===(t=e)||void 0===t||t()}}),[t]),a};var J=function(){const{filters:e,conditionsOp:t,onApply:n,onDelete:a,onUpdate:Z,onCondOpChange:v}=c(),[b,w]=(0,l.useState)(null),[C,M]=(0,l.useState)(r.W9(r.dK(),30)),[O,W]=(0,l.useState)(r.PR()),[S,D]=(0,l.useState)((()=>s.Z(o.Z(O),o.Z(C))>93)),$=(0,l.useMemo)((()=>k(C,O,S,e,t)),[C,O,S,e,t]),A=Q("cash_flow",$);if((0,l.useEffect)((()=>{!async function(){const e=await(0,i.lW)("get-earliest-transaction"),t=e?r.DT(o.Z(e.date)):r.dK(),n=r.Do(t,r.dK()).map((e=>({name:e,pretty:r.WU(e,"MMMM, yyyy")}))).reverse();w(n)}()}),[]),!b||!A)return null;const{graphData:F,totalExpenses:T,totalIncome:L,totalTransfers:P}=A;return(0,y.jsxs)(g.Z,{style:[u.W2.page,{minWidth:650,overflow:"hidden"}],children:[(0,y.jsx)(X,{title:"Cash Flow",allMonths:b,start:r.jw(C),end:r.jw(O),show1Month:!0,onChangeDates:function(e,t){const n=s.Z(o.Z(t),o.Z(e))>93;let l=t+"-31";l>r.PR()&&(l=r.PR()),M(e+"-01"),W(l),D(n)},onApply:n,filters:e,onUpdateFilter:Z,onDeleteFilter:a,conditionsOp:t,onCondOpChange:v}),(0,y.jsxs)(g.Z,{style:{backgroundColor:"white",padding:30,paddingTop:0,overflow:"auto"},children:[(0,y.jsxs)(g.Z,{style:{paddingTop:20,paddingRight:20,flexShrink:0,alignItems:"flex-end",color:u.O9.n3},children:[(0,y.jsx)(h.Z,{style:{marginBottom:5,minWidth:160},left:(0,y.jsx)(f.Z,{children:"Income:"}),right:(0,y.jsx)(x.Z,{style:{fontWeight:600},children:(0,y.jsx)(m.ZP,{children:(0,d.zA)(L)})})}),(0,y.jsx)(h.Z,{style:{marginBottom:5,minWidth:160},left:(0,y.jsx)(f.Z,{children:"Expenses:"}),right:(0,y.jsx)(x.Z,{style:{fontWeight:600},children:(0,y.jsx)(m.ZP,{children:(0,d.zA)(T)})})}),(0,y.jsx)(h.Z,{style:{marginBottom:5,minWidth:160},left:(0,y.jsx)(f.Z,{children:"Transfers:"}),right:(0,y.jsx)(x.Z,{style:{fontWeight:600},children:(0,y.jsx)(m.ZP,{children:(0,d.zA)(P)})})}),(0,y.jsx)(x.Z,{style:{fontWeight:600},children:(0,y.jsx)(m.ZP,{children:(0,y.jsx)(j,{amount:L+T+P})})})]}),(0,y.jsx)(z,{start:C,end:O,graphData:F,isConcise:S}),(0,y.jsxs)(g.Z,{style:{marginTop:30},children:[(0,y.jsx)(p.Z,{children:(0,y.jsx)("strong",{children:"How is cash flow calculated?"})}),(0,y.jsx)(p.Z,{children:"Cash flow shows the balance of your budgeted accounts over time, and the amount of expenses/income each day or month. Your budgeted accounts are considered to be \u201ccash on hand,\u201d so this gives you a picture of how available money fluctuates."})]})]})]})},ee=n(71274);function te(e,t,n){let l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4?arguments[4]:void 0;return async(s,c)=>{if(0===n.length)return null;let{filters:u}=await(0,i.lW)("make-filters-from-conditions",{conditions:l.filter((e=>!e.customName))});const f="or"===a?"$or":"$and";c(function(e,t,n){const l=r.Do(t,n),a=e.map((e=>{let t=e.starting;return l.map((n=>(e.balances[n]&&(t+=e.balances[n].amount),t)))}));let s=!1,i=0,c=0;return{graphData:{data:l.reduce(((e,t,n)=>{let l=0,r=0,u=0;const f=0===e.length?null:e[e.length-1];a.forEach((e=>{const t=e[n];t<0?l+=-t:r+=t,u+=t})),u<0&&(s=!0);const p=o.Z(t+"-01"),x=f?u-(0,d.l9)(f.y):0,g=(0,y.jsxs)("div",{children:[(0,y.jsx)("div",{style:{marginBottom:10},children:(0,y.jsx)("strong",{children:Z.Z(p,"MMMM yyyy")})}),(0,y.jsxs)("div",{style:{lineHeight:1.5},children:[(0,y.jsx)(h.Z,{left:"Assets:",right:(0,d.zA)(r)}),(0,y.jsx)(h.Z,{left:"Debt:",right:`-${(0,d.zA)(l)}`}),(0,y.jsx)(h.Z,{left:"Net worth:",right:(0,y.jsx)("strong",{children:(0,d.zA)(u)})}),(0,y.jsx)(h.Z,{left:"Change:",right:(0,d.zA)(x)})]})]});return 0===e.length&&(i=u),c=u,e.push({x:p,y:(0,d.Bf)(u),premadeLabel:g}),e}),[]),hasNegative:s,start:t,end:n},netWorth:c,totalChange:c-i}}(await Promise.all(n.map((async n=>{let[l,a]=await Promise.all([(0,v.Vn)((0,v.ZP)("transactions").filter({[f]:u,account:n.id,date:{$lt:e+"-01"}}).calculate({$sum:"$amount"})).then((e=>{let{data:t}=e;return t})),(0,v.Vn)((0,v.ZP)("transactions").filter({[f]:[...u]}).filter({account:n.id,$and:[{date:{$gte:e+"-01"}},{date:{$lte:t+"-31"}}]}).groupBy({$month:"$date"}).select([{date:{$month:"$date"}},{amount:{$sum:"$amount"}}])).then((e=>{let{data:t}=e;return t}))]);return{id:n.id,balances:w(a,"date"),starting:l}}))),e,t))}}var ne=n(98424);function le(e){let{start:t,end:n,scale:l,range:a}=e;const s=l.y(0),i=l.x(o.Z(t+"-01")),r=l.x(o.Z(n+"-01"));return i<0||r<0?null:(0,y.jsx)("svg",{children:(0,y.jsxs)("defs",{children:[(0,y.jsx)("clipPath",{id:"positive",children:(0,y.jsx)("rect",{x:i,y:a.y[1],width:r-i,height:s-a.y[1]+1,fill:"#ffffff"})}),(0,y.jsx)("clipPath",{id:"negative",children:(0,y.jsx)("rect",{x:i,y:s+1,width:r-i,height:Math.max(a.y[0]-s-1,0),fill:"#ffffff"})}),(0,y.jsxs)("linearGradient",{id:"positive-gradient",gradientUnits:"userSpaceOnUse",x1:0,y1:a.y[1],x2:0,y2:s,children:[(0,y.jsx)("stop",{offset:"0%",stopColor:T.colors.blueFadeStart}),(0,y.jsx)("stop",{offset:"100%",stopColor:T.colors.blueFadeEnd})]}),(0,y.jsxs)("linearGradient",{id:"negative-gradient",gradientUnits:"userSpaceOnUse",x1:0,y1:s,x2:0,y2:a.y[0],children:[(0,y.jsx)("stop",{offset:"0%",stopColor:T.colors.redFadeEnd}),(0,y.jsx)("stop",{offset:"100%",stopColor:T.colors.redFadeStart})]})]})})}var ae=function(e){let{style:t,graphData:n,compact:a}=e;const s=a?W.G:M.k;return(0,y.jsx)(P,{style:[t,a&&{height:"auto"}],children:(e,t,o)=>n&&(0,y.jsxs)(s,{scale:{x:"time",y:"linear"},theme:T,domainPadding:{x:0,y:10},width:e,height:t,containerComponent:(0,y.jsx)(O.Z,{voronoiDimension:"x"}),padding:a&&{top:0,bottom:0,left:0,right:0},children:[(0,y.jsx)(le,{start:n.start,end:n.end}),(0,l.createElement)(1===n.data.length?S.Z:ne.b,{data:n.data,labelComponent:(0,y.jsx)(U,{portalHost:o}),labels:e=>e.premadeLabel,style:{data:1===n.data.length?{width:50}:{clipPath:"url(#positive)",fill:"url(#positive-gradient)"}}}),n.data.length>1&&(0,y.jsx)(ne.b,{data:n.data,style:{data:{clipPath:"url(#negative)",fill:"url(#negative-gradient)",stroke:T.colors.red,strokeLinejoin:"round"}}}),(0,y.jsx)(ne.b,{data:n.data,style:{data:{fill:"none",stroke:"none"}}}),!a&&(0,y.jsx)($.E,{style:{ticks:{stroke:"red"}},tickFormat:e=>Z.Z(e,"MMM ''yy"),tickValues:n.data.map((e=>e.x)),tickCount:Math.min(5,n.data.length),offsetY:50}),!a&&(0,y.jsx)($.E,{dependentAxis:!0,crossAxis:!n.hasNegative})]})})};function se(){let e=(0,ee.v9)((e=>e.queries.accounts));const{filters:t,saved:n,conditionsOp:a,onApply:s,onDelete:h,onUpdate:f,onCondOpChange:x}=c(),[Z,v]=(0,l.useState)(null),[b,w]=(0,l.useState)(r.W9(r.dK(),5)),[C,k]=(0,l.useState)(r.dK()),M=(0,l.useMemo)((()=>te(b,C,e,t,a)),[b,C,e,t,a]),O=Q("net_worth",M);return(0,l.useEffect)((()=>{!async function(){const e=await(0,i.lW)("get-earliest-transaction"),t=r.dK();let n=e?r.DT(o.Z(e.date.slice(0,7))):t;const l=r.W9(r.dK(),12);n>l&&(n=l);const a=r.Do(n,r.dK()).map((e=>({name:e,pretty:r.WU(e,"MMMM, yyyy")}))).reverse();v(a)}()}),[]),Z&&O?(0,y.jsxs)(g.Z,{style:[u.W2.page,{minWidth:650,overflow:"hidden"}],children:[(0,y.jsx)(X,{title:"Net Worth",allMonths:Z,start:b,end:C,onChangeDates:function(e,t){w(e),k(t)},filters:t,saved:n,onApply:s,onUpdateFilter:f,onDeleteFilter:h,conditionsOp:a,onCondOpChange:x}),(0,y.jsxs)(g.Z,{style:{backgroundColor:"white",padding:30,paddingTop:0,overflow:"auto"},children:[(0,y.jsxs)(g.Z,{style:{textAlign:"right",paddingTop:20,paddingRight:20,flexShrink:0},children:[(0,y.jsx)(g.Z,{style:[u.W2.largeText,{fontWeight:400,marginBottom:5}],children:(0,y.jsx)(m.ZP,{blurIntensity:5,children:(0,d.zA)(O.netWorth)})}),(0,y.jsx)(m.ZP,{children:(0,y.jsx)(j,{amount:O.totalChange})})]}),(0,y.jsx)(ae,{start:b,end:C,graphData:O.graphData}),(0,y.jsxs)(g.Z,{style:{marginTop:30},children:[(0,y.jsx)(p.Z,{children:(0,y.jsx)("strong",{children:"How is net worth calculated?"})}),(0,y.jsx)(p.Z,{children:"Net worth shows the balance of all accounts over time, including all of your investments. Your \u201cnet worth\u201d is considered to be the amount you\u2019d have if you sold all your assets and paid off as much debt as possible. If you hover over the graph, you can also see the amount of assets and debt individually."})]})]})]}):null}var oe=n(51045);var ie=function(e){let t,{start:n,end:l}=e;return n=o.Z(n),l=o.Z(l),t=n.getYear()!==l.getYear()?(0,y.jsxs)("div",{children:[Z.Z(n,"MMM yyyy")," - ",Z.Z(l,"MMM yyyy")]}):n.getMonth()!==l.getMonth()?(0,y.jsxs)("div",{children:[Z.Z(n,"MMM")," - ",Z.Z(l,"MMM yyyy")]}):Z.Z(l,"MMMM yyyy"),(0,y.jsx)(f.Z,{style:{color:u.O9.n6},children:t})};function re(e){let{flex:t,to:n,style:l,children:a}=e;const s={flex:t,margin:15},o=(0,y.jsx)(g.Z,{style:[{backgroundColor:"white",borderRadius:2,height:200,boxShadow:"0 2px 6px rgba(0, 0, 0, .15)",transition:"box-shadow .25s",":hover":n&&{boxShadow:"0 4px 6px rgba(0, 0, 0, .15)"}},n?null:s,l],children:a});return n?(0,y.jsx)(oe.Z,{to:n,style:[{textDecoration:"none",flex:t},s],children:o}):o}function de(e){let{accounts:t}=e;const n=r.dK(),a=r.W9(n,5),[s,o]=(0,l.useState)(!1),i=(0,l.useCallback)((()=>o(!0))),c=(0,l.useCallback)((()=>o(!1))),h=(0,l.useMemo)((()=>te(a,n,t)),[a,n,t]),p=Q("net_worth",h);return p?(0,y.jsx)(re,{flex:2,to:"/reports/net-worth",children:(0,y.jsxs)(g.Z,{style:{flex:1},onPointerEnter:i,onPointerLeave:c,children:[(0,y.jsxs)(g.Z,{style:{flexDirection:"row",padding:20},children:[(0,y.jsxs)(g.Z,{style:{flex:1},children:[(0,y.jsx)(f.Z,{style:[u.W2.mediumText,{fontWeight:500,marginBottom:5}],role:"heading",children:"Net Worth"}),(0,y.jsx)(ie,{start:a,end:n})]}),(0,y.jsxs)(g.Z,{style:{textAlign:"right"},children:[(0,y.jsx)(f.Z,{style:[u.W2.mediumText,{fontWeight:500,marginBottom:5}],children:(0,y.jsx)(m.ZP,{activationFilters:[!s],children:(0,d.zA)(p.netWorth)})}),(0,y.jsx)(m.ZP,{activationFilters:[!s],children:(0,y.jsx)(j,{amount:p.totalChange,style:{color:u.O9.n6,fontWeight:300}})})]})]}),(0,y.jsx)(ae,{start:a,end:n,graphData:p.graphData,compact:!0,style:{height:"auto",flex:1}})]})}):null}function ce(){const e=r.PR(),t=r.dK()+"-01",n=(0,l.useMemo)((()=>function(e,t){return async(n,l)=>{function a(){return(0,v.ZP)("transactions").filter({$and:[{date:{$gte:e}},{date:{$lte:t}}],"account.offbudget":!1,$or:[{"payee.transfer_acct.offbudget":!0,"payee.transfer_acct":null}]}).calculate({$sum:"$amount"})}return b([a().filter({amount:{$gt:0}}),a().filter({amount:{$lt:0}})],(e=>{l({graphData:{income:e[0],expense:e[1]}})}))}}(t,e)),[t,e]),a=Q("cash_flow_simple",n),[s,o]=(0,l.useState)(!1),i=(0,l.useCallback)((()=>o(!0))),c=(0,l.useCallback)((()=>o(!1)));if(!a)return null;const{graphData:h}=a,p=-(h.expense||0),x=h.income||0;return(0,y.jsx)(re,{flex:1,to:"/reports/cash-flow",children:(0,y.jsxs)(g.Z,{style:{flex:1},onPointerEnter:i,onPointerLeave:c,children:[(0,y.jsxs)(g.Z,{style:{flexDirection:"row",padding:20},children:[(0,y.jsxs)(g.Z,{style:{flex:1},children:[(0,y.jsx)(f.Z,{style:[u.W2.mediumText,{fontWeight:500,marginBottom:5}],role:"heading",children:"Cash Flow"}),(0,y.jsx)(ie,{start:t,end:e})]}),(0,y.jsx)(g.Z,{style:{textAlign:"right"},children:(0,y.jsx)(m.ZP,{activationFilters:[!s],children:(0,y.jsx)(j,{amount:x-p,style:{color:u.O9.n6,fontWeight:300}})})})]}),(0,y.jsx)(P,{style:{height:"auto",flex:1},children:(e,t,n)=>(0,y.jsxs)(W.G,{colorScale:[T.colors.blue,T.colors.red],width:100,height:t,theme:T,domain:{x:[0,100],y:[0,Math.max(x,p,100)]},containerComponent:(0,y.jsx)(O.Z,{voronoiDimension:"x"}),labelComponent:(0,y.jsx)(U,{portalHost:n,offsetX:(e-100)/2,offsetY:e=>e+40>t?t-40:e,light:!0,forceActive:!0,style:{padding:0}}),padding:{top:0,bottom:0,left:0,right:0},children:[(0,y.jsx)(S.Z,{barWidth:13,data:[{x:30,y:Math.max(x,5),premadeLabel:(0,y.jsxs)(g.Z,{style:{textAlign:"right"},children:["Income",(0,y.jsx)(g.Z,{children:(0,y.jsx)(m.ZP,{activationFilters:[!s],children:(0,d.zA)(x)})})]}),labelPosition:"left"}],labels:e=>e.premadeLabel}),(0,y.jsx)(S.Z,{barWidth:13,data:[{x:60,y:Math.max(p,5),premadeLabel:(0,y.jsxs)(g.Z,{children:["Expenses",(0,y.jsx)(g.Z,{children:(0,y.jsx)(m.ZP,{activationFilters:[!s],children:(0,d.zA)(p)})})]}),labelPosition:"right",fill:T.colors.red}],labels:e=>e.premadeLabel})]})})]})})}function ue(){let e=(0,ee.v9)((e=>e.queries.accounts));return(0,y.jsxs)(g.Z,{style:[u.W2.page,{paddingLeft:40,paddingRight:40,minWidth:700}],children:[(0,y.jsxs)(g.Z,{style:{flexDirection:"row",flex:"0 0 auto"},children:[(0,y.jsx)(de,{accounts:e}),(0,y.jsx)(ce,{})]}),(0,y.jsx)(g.Z,{style:{flex:"0 0 auto",flexDirection:"row"},children:(0,y.jsxs)(re,{style:[{color:"#a0a0a0",justifyContent:"center",alignItems:"center",width:200},u.W2.mediumText],children:["More reports",(0,y.jsx)("br",{})," coming soon!"]})})]})}function he(){return(0,y.jsxs)(a.Z5,{children:[(0,y.jsx)(a.AW,{path:"/",element:(0,y.jsx)(ue,{})}),(0,y.jsx)(a.AW,{path:"/net-worth",element:(0,y.jsx)(se,{})}),(0,y.jsx)(a.AW,{path:"/cash-flow",element:(0,y.jsx)(J,{})})]})}}}]);
2
- //# sourceMappingURL=reports.689f3940.chunk.js.map