@actual-app/web 23.9.0 → 23.10.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 (55) hide show
  1. package/README.md +7 -2
  2. package/build/apple-touch-icon.png +0 -0
  3. package/build/asset-manifest.json +25 -21
  4. package/build/index.html +1 -1
  5. package/build/kcab/kcab.worker.b835d2cdcf8004c363da.js +250 -0
  6. package/build/kcab/kcab.worker.b835d2cdcf8004c363da.js.map +1 -0
  7. package/build/kcab/xfo.xfo.kcab.worker.2ee5d7175d50b7896f28.js +1 -0
  8. package/build/static/css/main.476f35a5.css +359 -0
  9. package/build/static/css/main.476f35a5.css.map +1 -0
  10. package/build/static/js/231.370f17f8.chunk.js +2 -0
  11. package/build/static/js/231.370f17f8.chunk.js.map +1 -0
  12. package/build/static/js/389.c8f94185.chunk.js +2 -0
  13. package/build/static/js/389.c8f94185.chunk.js.map +1 -0
  14. package/build/static/js/473.02c273e8.chunk.js +2 -0
  15. package/build/static/js/473.02c273e8.chunk.js.map +1 -0
  16. package/build/static/js/678.bf349f5d.chunk.js +2 -0
  17. package/build/static/js/678.bf349f5d.chunk.js.map +1 -0
  18. package/build/static/js/713.1731d555.chunk.js +15 -0
  19. package/build/static/js/713.1731d555.chunk.js.map +1 -0
  20. package/build/static/js/main.7e6eedd0.js +188 -0
  21. package/build/static/js/main.7e6eedd0.js.map +1 -0
  22. package/build/static/js/narrow-components.11cf3591.chunk.js +2 -0
  23. package/build/static/js/narrow-components.11cf3591.chunk.js.map +1 -0
  24. package/build/static/js/reports.39b7254a.chunk.js +2 -0
  25. package/build/static/js/reports.39b7254a.chunk.js.map +1 -0
  26. package/build/static/js/resize-observer-polyfill.98a18736.chunk.js +2 -0
  27. package/build/static/js/resize-observer-polyfill.98a18736.chunk.js.map +1 -0
  28. package/build/static/js/wide-components.fd8595f4.chunk.js +2 -0
  29. package/build/static/js/wide-components.fd8595f4.chunk.js.map +1 -0
  30. package/build/static/media/browser-server.20abc230cfc504c53fa0.js +1 -0
  31. package/package.json +16 -12
  32. package/build/kcab/kcab.worker.903b11c4b36a7822451f.js +0 -3
  33. package/build/kcab/kcab.worker.903b11c4b36a7822451f.js.LICENSE.txt +0 -24
  34. package/build/kcab/kcab.worker.903b11c4b36a7822451f.js.map +0 -1
  35. package/build/kcab/xfo.xfo.kcab.worker.e800a4a41b9557f2726d.js +0 -1
  36. package/build/static/css/main.90cc2688.css +0 -7
  37. package/build/static/css/main.90cc2688.css.map +0 -1
  38. package/build/static/js/171.491e33e7.chunk.js +0 -2
  39. package/build/static/js/171.491e33e7.chunk.js.map +0 -1
  40. package/build/static/js/383.d7919241.chunk.js +0 -2
  41. package/build/static/js/383.d7919241.chunk.js.map +0 -1
  42. package/build/static/js/969.b56f4e53.chunk.js +0 -2
  43. package/build/static/js/969.b56f4e53.chunk.js.map +0 -1
  44. package/build/static/js/main.041e259e.js +0 -3
  45. package/build/static/js/main.041e259e.js.LICENSE.txt +0 -178
  46. package/build/static/js/main.041e259e.js.map +0 -1
  47. package/build/static/js/narrow-components.b48d7cb2.chunk.js +0 -2
  48. package/build/static/js/narrow-components.b48d7cb2.chunk.js.map +0 -1
  49. package/build/static/js/reports.2402a148.chunk.js +0 -2
  50. package/build/static/js/reports.2402a148.chunk.js.map +0 -1
  51. package/build/static/js/resize-observer-polyfill.68c3249b.chunk.js +0 -2
  52. package/build/static/js/resize-observer-polyfill.68c3249b.chunk.js.map +0 -1
  53. package/build/static/js/wide-components.2c2e09e4.chunk.js +0 -2
  54. package/build/static/js/wide-components.2c2e09e4.chunk.js.map +0 -1
  55. package/build/static/media/browser-server.14ed34b8682d7b10163f.js +0 -1
@@ -0,0 +1,2 @@
1
+ (self["webpackChunk_actual_app_web"]=self["webpackChunk_actual_app_web"]||[]).push([[447],{82478:function(e){function t(e,t,n){var r,o,i,s,l;if(null==t)t=100;function a(){var d=Date.now()-s;if(d<t&&d>=0){r=setTimeout(a,t-d)}else{r=null;if(!n){l=e.apply(i,o);i=o=null}}};var d=function(){i=this;o=arguments;s=Date.now();var d=n&&!r;if(!r)r=setTimeout(a,t);if(d){l=e.apply(i,o);i=o=null}return l};d.clear=function(){if(r){clearTimeout(r);r=null}};d.flush=function(){if(r){l=e.apply(i,o);i=o=null;clearTimeout(r);r=null}};return d};t.debounce=t;e.exports=t},10646:function(e,t,n){"use strict";n.d(t,{Z:function(){return l}});var r=n(43188);var o=n(66204);var i=n(59379);var s=n(56816);function l({to:e,style:t,activeStyle:n,...o}){const l=(0,i.s0)();const a=(0,i.bS)({path:e});return(0,r.jsx)(s.Z,{style:{...t,...a?n:{}},activeStyle:n,...o,onClick:t=>{o.onClick?.(t);l(e)}})}},25930:function(e,t,n){"use strict";n.r(t);n.d(t,{Account:function(){return eG},Accounts:function(){return ew},Budget:function(){return ee}});var r=n(43188);var o=n(66204);var i=n(37496);var s=n(55833);var l=n(84094);var a=n(25258);var d=n(73416);var c=n(1447);var u=n(9579);var p=n(76926);var h=n(45931);var f=n(45492);var g=n(24307);function m({onSync:e,children:t}){let[n,r]=(0,o.useState)(false);async function i(){r(true);await e();r(false)}return t({refreshing:n,onRefresh:i})}var x=n(99024);var y=n(43044);var v=n(46055);var b=n(89362);var w=n(68587);const j=e=>(0,r.jsx)("svg",{...e,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",style:{color:"inherit",...e.style},children:(0,r.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"})});var S=j;var C=n(1071);var T=n(76074);var Z=n(56816);const B=(0,o.forwardRef)(({children:e,...t},n)=>{return(0,r.jsx)(g.Z,{...t,ref:n,style:{marginTop:15,marginLeft:5,marginRight:5,borderRadius:6,backgroundColor:f.rS.cardBackground,borderColor:f.rS.cardBorder,boxShadow:"0 1px 2px #9594A8",...t.style},children:(0,r.jsx)(g.Z,{style:{borderRadius:6,overflow:"hidden"},children:e})})});var E=B;var A=n(77644);function _({title:e,style:t}){return(0,r.jsx)(A.Z,{style:{...f.W2.text,color:f.rS.tableRowHeaderText,textAlign:"right",fontSize:12,marginBottom:2,...t},children:e})}var k=n(11800);var W=n(52582);var M=n(57201);var I=n(5291);var R=n(57651);var D=n(75970);var L=n(57023);const N=50;const P=({children:e,style:t,...n})=>{return(0,r.jsx)(g.Z,{style:{height:N,borderBottomWidth:1,borderColor:f.rS.tableBorder,flexDirection:"row",alignItems:"center",paddingLeft:10,paddingRight:10,zIndex:1,...t},...n,children:e})};function G({toBudget:e,onClick:t}){let n=(0,R.Z)(e);let o=(0,I.Z)();return(0,r.jsxs)(Z.Z,{type:"bare",style:{flexDirection:"column",alignItems:"flex-start"},onClick:t,children:[(0,r.jsx)(_,{title:n<0?"OVERBUDGETED":"TO BUDGET",style:{color:f.rS.formInputText,flexShrink:0}}),(0,r.jsx)(A.Z,{style:{...f.W2.smallText,fontWeight:"500",color:n<0?f.rS.errorText:f.rS.formInputText},children:o(n,"financial")})]})}function F({projected:e}){let t=(0,R.Z)(v.u8.totalBudgetedSaved)||0;let n=(0,R.Z)(v.u8.totalSaved)||0;let o=(0,I.Z)();let i=e?t:n;let s=i<0;return(0,r.jsxs)(g.Z,{style:{flexDirection:"column",alignItems:"flex-start",flexBasis:"80px"},children:[e?(0,r.jsx)(_,{title:"PROJECTED SAVINGS",style:{color:f.rS.formInputText}}):(0,r.jsx)(_,{title:s?"OVERSPENT":"SAVED",style:{color:f.rS.formInputText}}),(0,r.jsx)(A.Z,{style:{...f.W2.smallText,fontWeight:"500",color:e?f.rS.alt2WarningText:s?f.rS.alt2ErrorText:f.rS.formInputText},children:o(i,"financial")})]})}const z=(0,o.memo)(function e(e){const{name:t,binding:n,editing:o,style:i,textStyle:s,categoryId:l,month:a,onBudgetAction:d}=e;let c=(0,R.Z)(n);let u=(0,I.Z)();return(0,r.jsxs)(g.Z,{style:i,children:[(0,r.jsx)(L._,{value:(0,b.Bf)(c||0),style:{height:N-4,transform:"translateX(6px)",...!o&&{opacity:0,position:"absolute",top:0}},focused:o,textStyle:{...f.W2.smallText,...s},onChange:()=>{},onBlur:e=>{d(a,"budget-amount",{category:l,amount:(0,b.l9)(e)})}}),(0,r.jsx)(g.Z,{style:{justifyContent:"center",height:N-4,...o&&{display:"none"}},children:(0,r.jsx)(A.Z,{style:{...f.W2.smallText,...s},"data-testid":t,children:u(c||0,"financial")})})]})});function O({group:e,pending:t,style:n}){return _jsxs(Card,{style:{marginTop:7,marginBottom:7,opacity:t?1:.4},children:[_jsx(U,{group:e,blank:true}),e.categories.map((e,t)=>_jsx(H,{category:e,blank:true,index:t},e.id))]})}function K({name:e,pending:t,style:n}){return _jsx(ListItem,{style:{flex:1,borderColor:"transparent",borderRadius:4},children:_jsx(Text,{style:styles.smallText,children:e})})}class H 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:i,onBudgetAction:s,show3Cols:l,showBudgetedCol:a}=this.props;let d=v.aK.catBudgeted(e.id);let c=v.aK.catBalance(e.id);let u=v.aK.catSumAmount(e.id);let p=!e.hidden&&(0,r.jsxs)(P,{style:{backgroundColor:t?f.rS.altTableTextEditing:"transparent",borderBottomWidth:0,borderTopWidth:n>0?1:0,...o},"data-testid":"row",children:[(0,r.jsx)(g.Z,{style:{flex:1},children:(0,r.jsx)(A.Z,{style:f.W2.smallText,"data-testid":"category-name",children:e.name})}),(0,r.jsxs)(g.Z,{style:{alignItems:"center",flexDirection:"row",opacity:this.opacity},children:[l||a?(0,r.jsx)(z,{name:"budgeted",binding:d,editing:t,style:{width:90},textStyle:{...f.W2.smallText,textAlign:"right"},categoryId:e.id,month:i,onBudgetAction:s}):null,l||!a?(0,r.jsx)(W.Z,{name:"spent",binding:u,style:{...f.W2.smallText,width:90,textAlign:"right"},type:"financial"}):null,(0,r.jsx)(W.Z,{name:"balance",binding:c,style:{...f.W2.smallText,width:90,textAlign:"right"},getStyle:e=>e<0&&{color:f.rS.errorText},type:"financial"})]})]});return(0,r.jsx)("div",{children:p})}}class U 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,show3Cols:o,showBudgetedCol:i}=this.props;let s=(0,r.jsxs)(P,{style:{flexDirection:"row",alignItems:"center",backgroundColor:f.rS.tableHeaderBackground},"data-testid":"totals",children:[(0,r.jsx)(g.Z,{style:{flex:1},children:(0,r.jsx)(A.Z,{style:{...f.W2.smallText,fontWeight:"500"},"data-testid":"name",children:e.name})}),(0,r.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",opacity:this.opacity},children:[o||i?(0,r.jsx)(W.Z,{binding:v.aK.groupBudgeted(e.id),style:{...f.W2.smallText,width:90,fontWeight:"500",textAlign:"right"},type:"financial"}):null,o||!i?(0,r.jsx)(W.Z,{binding:v.aK.groupSumAmount(e.id),style:{...f.W2.smallText,width:90,fontWeight:"500",textAlign:"right"},type:"financial"}):null,(0,r.jsx)(W.Z,{binding:v.aK.groupBalance(e.id),style:{...f.W2.smallText,width:90,fontWeight:"500",textAlign:"right"},type:"financial"})]}),t&&(0,r.jsx)(g.Z,{children:(0,r.jsx)(Z.Z,{onClick:()=>n(e.id),style:{padding:10},children:(0,r.jsx)(w.Z,{width:15,height:15})})})]});if(!t){return s}return s}}class Y extends o.PureComponent{render(){const{name:e,budget:t,hidden:n,balance:o,style:i,nameTextStyle:s,amountTextStyle:l}=this.props;if(n){return null}return(0,r.jsxs)(P,{style:{flexDirection:"row",alignItems:"center",padding:10,backgroundColor:"transparent",...i},children:[(0,r.jsx)(g.Z,{style:{flex:1},children:(0,r.jsx)(A.Z,{style:{...f.W2.smallText,...s},"data-testid":"name",children:e})}),t&&(0,r.jsx)(W.Z,{binding:t,style:{...f.W2.smallText,width:90,textAlign:"right",...l},type:"financial"}),(0,r.jsx)(W.Z,{binding:o,style:{...f.W2.smallText,width:90,textAlign:"right",...l},type:"financial"})]})}}class q extends o.PureComponent{render(){const{group:e,editMode:t,month:n,onEditCategory:o,onReorderCategory:i,onAddCategory:s,onBudgetAction:l,showBudgetedCol:a,show3Cols:d}=this.props;function c(e){if(!t){return e}return e}if(!e.hidden){return c((0,r.jsxs)(E,{style:{marginTop:7,marginBottom:7},children:[(0,r.jsx)(U,{group:e,showBudgetedCol:a,budgeted:v.aK.groupBudgeted(e.id),balance:v.aK.groupBalance(e.id),show3Cols:d,editMode:t,onAddCategory:s,onReorderCategory:i}),e.categories.map((e,s)=>{return(0,r.jsx)(H,{show3Cols:d,index:s,category:e,showBudgetedCol:a,editing:undefined,editMode:t,month:n,onEdit:o,onReorder:i,onBudgetAction:l},e.id)})]}))}else{return null}}}class V extends o.Component{render(){const{type:e,group:t}=this.props;return(0,r.jsxs)(g.Z,{children:[(0,r.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center",justifyContent:"flex-end",marginTop:50,marginBottom:5,marginRight:14},children:[e==="report"&&(0,r.jsx)(_,{title:"BUDGETED",style:{width:90}}),(0,r.jsx)(_,{title:"RECEIVED",style:{width:90}})]}),(0,r.jsxs)(E,{style:{marginTop:0},children:[(0,r.jsx)(Y,{name:t.name,budget:e==="report"?v.u8.groupBudgeted(t.id):null,balance:e==="report"?v.u8.groupSumAmount(t.id):v.aK.groupSumAmount(t.id),nameTextStyle:{fontWeight:"500"},amountTextStyle:{fontWeight:"500"},style:{backgroundColor:f.rS.altTableBackground}}),t.categories.map((t,n)=>{return(0,r.jsx)(Y,{type:e,name:t.name,hidden:t.hidden,budget:e==="report"?v.u8.catBudgeted(t.id):null,balance:e==="report"?v.u8.catSumAmount(t.id):v.aK.catSumAmount(t.id),index:n},t.id)})]})]})}}class $ extends o.Component{getGroups=(0,x.Z)(e=>{return{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:i,onEditCategory:s,onAddCategory:l,onReorderCategory:a,onReorderGroup:d,onBudgetAction:c,showBudgetedCol:u,show3Cols:p}=this.props;const{incomeGroup:h,expenseGroups:f}=this.getGroups(t);return(0,r.jsxs)(g.Z,{"data-testid":"budget-groups",style:{flex:"1 0 auto",overflowY:"auto",paddingBottom:15},children:[f.map(e=>{return(0,r.jsx)(q,{group:e,editingId:n,showBudgetedCol:u,editMode:undefined,gestures:o,month:i,onEditCategory:s,onAddCategory:l,onReorderCategory:a,onReorderGroup:d,onBudgetAction:c,show3Cols:p},e.id)}),h&&(0,r.jsx)(V,{type:e,group:h})]})}}function Q(e){const[t,n]=(0,o.useState)(null);function s(e){n(e)}const{width:l}=(0,T.F)();const a=l>=360;const{type:c,categoryGroups:u,month:p,monthBounds:h,editMode:m,onPrevMonth:x,onNextMonth:b,onAddCategory:w,onEditMode:j,onReorderCategory:S,onReorderGroup:C,onShowBudgetDetails:B,onOpenActionSheet:E,onBudgetAction:A}=e;let k=d.dK();let R=(0,I.Z)();const D=(0,i.v9)(e=>{return e.prefs.local&&e.prefs.local.toggleMobileDisplayPref||true});let[L,N]=(0,o.useState)(!D&&!document.cookie.match(/mobileShowBudgetedColPref=true/));let P=(0,i.I0)();function z(){N(!L);if(!L){P((0,y.savePrefs)({mobileShowBudgetedColPref:true}))}}let O={padding:0,backgroundColor:"transparent",borderRadius:"unset"};return(0,r.jsx)(M.Z.Provider,{value:d.cv(p,c),children:(0,r.jsxs)(g.Z,{style:{flex:1,overflowY:"hidden"},"data-testid":"budget-table",children:[(0,r.jsx)(X,{show3Cols:a,currentMonth:p,toggleDisplay:z,showBudgetedCol:L,monthBounds:h,editMode:m,onDone:()=>j(false),onOpenActionSheet:E,onPrevMonth:x,onNextMonth:b}),(0,r.jsxs)(g.Z,{style:{flexDirection:"row",flex:"0 0 auto",padding:10,paddingRight:14,backgroundColor:"white",borderBottomWidth:1,borderColor:f.rS.tableBorder},children:[c==="report"?(0,r.jsx)(F,{projected:p>=k}):(0,r.jsx)(G,{toBudget:v.aK.toBudget,onClick:B}),(0,r.jsx)(g.Z,{style:{flex:1}}),(0,r.jsxs)(Z.Z,{type:"bare",disabled:a,onClick:z,style:{...O,padding:"0 8px",margin:"0 -8px",background:L&&!a?`linear-gradient(-45deg, ${f.rS.formInputBackgroundSelection} 8px, transparent 0)`:!a?`linear-gradient(45deg, ${f.rS.formInputBackgroundSelection} 8px, transparent 0)`:null},children:[a||L?(0,r.jsxs)(g.Z,{style:{width:90,justifyContent:"center"},children:[(0,r.jsx)(_,{title:"BUDGETED",style:{color:f.rS.buttonNormalText}}),(0,r.jsx)(W.Z,{binding:v.u8.totalBudgetedExpense,type:"financial",style:{...f.W2.smallText,color:f.rS.buttonNormalText,textAlign:"right",fontWeight:"500"},formatter:e=>{return R(-parseFloat(e||"0"),"financial")}})]}):null,a||!L?(0,r.jsxs)(g.Z,{style:{width:90,justifyContent:"center"},children:[(0,r.jsx)(_,{title:"SPENT",style:{color:f.rS.formInputText}}),(0,r.jsx)(W.Z,{binding:v.aK.totalSpent,type:"financial",style:{...f.W2.smallText,color:f.rS.formInputText,textAlign:"right",fontWeight:"500"}})]}):null]}),(0,r.jsxs)(g.Z,{style:{width:90,justifyContent:"center"},children:[(0,r.jsx)(_,{title:"BALANCE",style:{color:f.rS.formInputText}}),(0,r.jsx)(W.Z,{binding:v.aK.totalBalance,type:"financial",style:{...f.W2.smallText,color:f.rS.formInputText,textAlign:"right",fontWeight:"500"}})]})]}),(0,r.jsx)(g.Z,{style:{overflowY:"auto"},children:!m?(0,r.jsx)(g.Z,{children:(0,r.jsx)($,{type:c,categoryGroups:u,editingId:t,editMode:m,showBudgetedCol:L,show3Cols:a,month:p,onEditCategory:s,onAddCategory:w,onReorderCategory:S,onReorderGroup:C,onBudgetAction:A})}):(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(g.Z,{children:(0,r.jsx)($,{categoryGroups:u,showBudgetedCol:L,show3Cols:a,editingId:t,editMode:m,onEditCategory:()=>{},onAddCategory:w,onReorderCategory:S,onReorderGroup:C})})})})]})})}function X({currentMonth:e,monthBounds:t,editMode:n,onDone:o,onPrevMonth:i,onNextMonth:s,toggleDisplay:l,showBudgetedCol:a,show3Cols:c}){let u=(0,k.o1)();let p=e>t.start;let h=e<d.W9(t.end,1);let m={paddingLeft:15,paddingRight:15,backgroundColor:"transparent"};return(0,r.jsxs)(g.Z,{style:{alignItems:"center",flexDirection:"row",flexShrink:0,height:50,justifyContent:"center",backgroundColor:f.rS.buttonPrimaryBackground},children:[!n&&(0,r.jsx)(Z.Z,{type:"bare",onClick:p&&i,style:{...m,left:0,opacity:p?1:.6,padding:"5px 30px 5px 0"},children:(0,r.jsx)(S,{style:{color:f.rS.formInputTextReadOnlySelection},width:"15",height:"15"})}),(0,r.jsx)(A.Z,{style:{...f.W2.mediumText,marginTop:12,marginBottom:12,color:f.rS.formInputTextSelected,textAlign:"center"},children:d.WU(e,"MMMM ''yy")}),n?(0,r.jsx)(Z.Z,{type:"bare",onClick:o,style:{...m,position:"absolute",top:0,bottom:0,right:0},textStyle:{color:f.rS.formInputTextReadOnlySelection,fontSize:15,fontWeight:"500"},children:"Done"}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(Z.Z,{type:"bare",onClick:h&&s,style:{...m,opacity:h?1:.6},children:(0,r.jsx)(C.Z,{style:{color:f.rS.formInputTextReadOnlySelection},width:"15",height:"15"})}),u&&(0,r.jsx)(D.rD,{isMobile:true,style:{color:"white",position:"absolute",top:0,bottom:0,right:0,backgroundColor:"transparent",paddingLeft:12,paddingRight:12}})]})]})};class J extends o.Component{constructor(e){super(e);this.summary=0;const t=d.dK();this.state={bounds:{start:t,end:t},currentMonth:t,initialized:false,editMode:false,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,l.lW)("get-budget-bounds");this.setState({bounds:{start:e,end:t}});this.prewarmMonth(this.state.currentMonth);let n=(0,l.oL)("sync-event",({type:e,tables:t})=>{if(e==="success"&&(t.includes("categories")||t.includes("category_mapping")||t.includes("category_groups"))){this.loadCategories()}});this.cleanup=()=>{n()}}componentWillUnmount(){}prewarmMonth=async(e,t=null)=>{t=t||this.props.budgetType;let n=t==="report"?"report-budget-month":"rollover-budget-month";let r=await (0,l.lW)(n,{month:e});for(let e of r){this.props.spreadsheet.prewarmCache(e.name,e)}if(!this.state.initialized){this.setState({initialized:true})}};onShowBudgetDetails=()=>{this.props.pushModal("budget-summary",{month:this.state.currentMonth})};onBudgetAction=e=>{const{currentMonth:t}=this.state;this.props.applyBudgetAction(t,e,this.state.bounds)};onAddCategory=e=>{this.props.navigation.navigate("AddCategoryModal",{groupId:e,onAdd:async t=>{let n=await this.props.createCategory(t,e);let{categoryGroups:r}=this.state;this.setState({categoryGroups:(0,a.i8)(r,{name:t,cat_group:e,is_income:0,id:n})})}})};onReorderCategory=(e,{inGroup:t,aroundCategory:n})=>{let{categoryGroups:r}=this.state;let o,i;if(t){o=t}else if(n){let{id:e,position:t}=n;let s=r.find(t=>t.categories.find(t=>t.id===e));if(t==="bottom"){let{categories:t}=s;let n=t.findIndex(t=>t.id===e);e=n<t.length-1?t[n+1].id:null}o=s.id;i=e}this.props.moveCategory(e,o,i);this.setState({categoryGroups:(0,a.Wr)(r,e,o,i)})};onReorderGroup=(e,t,n)=>{let{categoryGroups:r}=this.state;if(n==="bottom"){let e=r.findIndex(e=>e.id===t);t=e<r.length-1?r[e+1].id:null}this.props.moveCategoryGroup(e,t);this.setState({categoryGroups:(0,a.eq)(r,e,t)})};sync=async()=>{const{updated:e,error:t}=await this.props.sync();if(t){return"error"}else if(e){return"updated"}return null};onPrevMonth=async()=>{let e=d.W9(this.state.currentMonth,1);await this.prewarmMonth(e);this.setState({currentMonth:e})};onNextMonth=async()=>{let e=d.zI(this.state.currentMonth,1);await this.prewarmMonth(e);this.setState({currentMonth:e})};onOpenActionSheet=()=>{let{budgetType:e}=this.props;let t=["Edit Categories","Copy last month’s budget","Set budgets to zero","Set budgets to 3 month average",e==="report"&&"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:true});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:if(e==="report"){this.onBudgetAction("set-all-future")}break;default:}})};render(){const{currentMonth:e,bounds:t,editMode:n,initialized:o}=this.state;const{categories:i,categoryGroups:s,prefs:l,budgetType:a,navigation:d,applyBudgetAction:c}=this.props;let u=l.numberFormat||"comma-dot";let p=l.hideFraction||false;if(!s||!o){return(0,r.jsx)(g.Z,{style:{flex:1,backgroundColor:f.rS.pageBackgroundLineTop,alignItems:"center",justifyContent:"center",marginBottom:25},children:(0,r.jsx)(h.Z,{width:25,height:25})})}return(0,r.jsx)(m,{onSync:this.sync,children:({refreshing:o,onRefresh:l})=>(0,r.jsx)(Q,{categories:i,categoryGroups:s,type:a,month:e,monthBounds:t,editMode:n,navigation:d,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:c},u+p)})}}function ee(){let{list:e,grouped:t}=(0,u.Z)();let n=(0,i.v9)(e=>e.prefs.local.budgetType||"rollover");let o=(0,i.v9)(e=>e.prefs.local);let l=(0,c.o)();let a=(0,s.M)();(0,p.j)(f.rS.mobileBudgetViewTheme);return(0,r.jsx)(J,{categoryGroups:t,categories:e,budgetType:n,prefs:o,...l,spreadsheet:a})}var et=n(59379);var en=n(42308);var er=n(13308);var eo;(function(e){e[e["UP"]=-1]="UP";e[e["DOWN"]=1]="DOWN"})(eo||(eo={}));function ei(e){var t=getComputedStyle(e).overflowY;if(e===document.scrollingElement&&t==="visible"){return true}if(t!=="scroll"&&t!=="auto"){return false}return true}function es(e,t){if(!ei(e)){return false}if(t===eo.DOWN){var n=e.scrollTop+e.clientHeight;return n<e.scrollHeight}if(t===eo.UP){return e.scrollTop>0}throw new Error("unsupported direction")}function el(e,t){if(es(e,t)){return true}if(e.parentElement==null){return false}return el(e.parentElement,t)}function ea(e,t){if(t===void 0)t={};var n=t.insertAt;if(!e||typeof document==="undefined"){return}var r=document.head||document.getElementsByTagName("head")[0];var o=document.createElement("style");o.type="text/css";if(n==="top"){if(r.firstChild){r.insertBefore(o,r.firstChild)}else{r.appendChild(o)}}else{r.appendChild(o)}if(o.styleSheet){o.styleSheet.cssText=e}else{o.appendChild(document.createTextNode(e))}}var ed=".lds-ellipsis {\n display: inline-block;\n position: relative;\n width: 64px;\n height: 64px; }\n\n.lds-ellipsis div {\n position: absolute;\n top: 27px;\n width: 11px;\n height: 11px;\n border-radius: 50%;\n background: #363636;\n animation-timing-function: cubic-bezier(0, 1, 1, 0); }\n\n.lds-ellipsis div:nth-child(1) {\n left: 6px;\n animation: lds-ellipsis1 0.6s infinite; }\n\n.lds-ellipsis div:nth-child(2) {\n left: 6px;\n animation: lds-ellipsis2 0.6s infinite; }\n\n.lds-ellipsis div:nth-child(3) {\n left: 26px;\n animation: lds-ellipsis2 0.6s infinite; }\n\n.lds-ellipsis div:nth-child(4) {\n left: 45px;\n animation: lds-ellipsis3 0.6s infinite; }\n\n@keyframes lds-ellipsis1 {\n 0% {\n transform: scale(0); }\n 100% {\n transform: scale(1); } }\n\n@keyframes lds-ellipsis3 {\n 0% {\n transform: scale(1); }\n 100% {\n transform: scale(0); } }\n\n@keyframes lds-ellipsis2 {\n 0% {\n transform: translate(0, 0); }\n 100% {\n transform: translate(19px, 0); } }\n";ea(ed);var ec=function(){return o.createElement("div",{className:"lds-ellipsis"},o.createElement("div",null),o.createElement("div",null),o.createElement("div",null),o.createElement("div",null))};var eu=function(){return o.createElement("div",null,o.createElement("p",null,"↧\xa0\xa0pull to refresh\xa0\xa0↧"))};var ep=".ptr,\n.ptr__children {\n height: 100%;\n width: 100%;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n position: relative; }\n\n.ptr.ptr--fetch-more-treshold-breached .ptr__fetch-more {\n display: block; }\n\n.ptr__fetch-more {\n display: none; }\n\n/**\n * Pull down transition \n */\n.ptr__children,\n.ptr__pull-down {\n transition: transform 0.2s cubic-bezier(0, 0, 0.31, 1); }\n\n.ptr__pull-down {\n position: absolute;\n overflow: hidden;\n left: 0;\n right: 0;\n top: 0;\n visibility: hidden; }\n .ptr__pull-down > div {\n display: none; }\n\n.ptr--dragging {\n /**\n * Hide PullMore content is treshold breached\n */\n /**\n * Otherwize, display content\n */ }\n .ptr--dragging.ptr--pull-down-treshold-breached .ptr__pull-down--pull-more {\n display: none; }\n .ptr--dragging .ptr__pull-down--pull-more {\n display: block; }\n\n.ptr--pull-down-treshold-breached {\n /**\n * Force opacity to 1 is pull down trashold breached\n */\n /**\n * And display loader\n */ }\n .ptr--pull-down-treshold-breached .ptr__pull-down {\n opacity: 1 !important; }\n .ptr--pull-down-treshold-breached .ptr__pull-down--loading {\n display: block; }\n\n.ptr__loader {\n margin: 0 auto;\n text-align: center; }\n";ea(ep);var eh=function(e){var t=e.isPullable,n=t===void 0?true:t,r=e.canFetchMore,i=r===void 0?false:r,s=e.onRefresh,l=e.onFetchMore,a=e.refreshingContent,d=a===void 0?o.createElement(ec,null):a,c=e.pullingContent,u=c===void 0?o.createElement(eu,null):c,p=e.children,h=e.pullDownThreshold,f=h===void 0?67:h,g=e.fetchMoreThreshold,m=g===void 0?100:g,x=e.maxPullDownDistance,y=x===void 0?95:x,v=e.resistance,b=v===void 0?1:v,w=e.backgroundColor,j=e.className,S=j===void 0?"":j;var C=(0,o.useRef)(null);var T=(0,o.useRef)(null);var Z=(0,o.useRef)(null);var B=(0,o.useRef)(null);var E=false;var A=false;var _=false;var k=0;var W=0;(0,o.useEffect)(function(){if(!n||!T||!T.current)return;var e=T.current;e.addEventListener("touchstart",R,{passive:true});e.addEventListener("mousedown",R);e.addEventListener("touchmove",D,{passive:false});e.addEventListener("mousemove",D);window.addEventListener("scroll",L);e.addEventListener("touchend",N);e.addEventListener("mouseup",N);document.body.addEventListener("mouseleave",N);return function(){e.removeEventListener("touchstart",R);e.removeEventListener("mousedown",R);e.removeEventListener("touchmove",D);e.removeEventListener("mousemove",D);window.removeEventListener("scroll",L);e.removeEventListener("touchend",N);e.removeEventListener("mouseup",N);document.body.removeEventListener("mouseleave",N)}},[p,n,s,f,y,i,m]);(0,o.useEffect)(function(){var e;if(!((e=C)===null||e===void 0?void 0:e.current))return;var t=C.current.classList.contains("ptr--fetch-more-treshold-breached");if(t)return;if(i&&M()<m&&l){C.current.classList.add("ptr--fetch-more-treshold-breached");A=true;l().then(I).catch(I)}},[i,p]);var M=function(){if(!T||!T.current)return-1;var e=window.scrollY;var t=T.current.scrollHeight;return t-e-window.innerHeight};var I=function(){requestAnimationFrame(function(){if(T.current){T.current.style.overflowX="hidden";T.current.style.overflowY="auto";T.current.style.transform="unset"}if(Z.current){Z.current.style.opacity="0"}if(C.current){C.current.classList.remove("ptr--pull-down-treshold-breached");C.current.classList.remove("ptr--dragging");C.current.classList.remove("ptr--fetch-more-treshold-breached")}if(E)E=false;if(A)A=false})};var R=function(e){_=false;if(e instanceof MouseEvent){k=e.pageY}if(window.TouchEvent&&e instanceof TouchEvent){k=e.touches[0].pageY}W=k;if(e.type==="touchstart"&&el(e.target,eo.UP)){return}if(T.current.getBoundingClientRect().top<0){return}_=true};var D=function(e){if(!_){return}if(window.TouchEvent&&e instanceof TouchEvent){W=e.touches[0].pageY}else{W=e.pageY}C.current.classList.add("ptr--dragging");if(W<k){_=false;return}if(e.cancelable){e.preventDefault()}var t=Math.min((W-k)/b,y);if(t>=f){_=true;E=true;C.current.classList.remove("ptr--dragging");C.current.classList.add("ptr--pull-down-treshold-breached")}if(t>=y){return}Z.current.style.opacity=(t/65).toString();T.current.style.overflow="visible";T.current.style.transform="translate(0px, "+t+"px)";Z.current.style.visibility="visible"};var L=function(e){if(A)return;if(i&&M()<m&&l){A=true;C.current.classList.add("ptr--fetch-more-treshold-breached");l().then(I).catch(I)}};var N=function(){_=false;k=0;W=0;if(!E){if(Z.current)Z.current.style.visibility="hidden";I();return}if(T.current){T.current.style.overflow="visible";T.current.style.transform="translate(0px, "+f+"px)"}s().then(I).catch(I)};return o.createElement("div",{className:"ptr "+S,style:{backgroundColor:w},ref:C},o.createElement("div",{className:"ptr__pull-down",ref:Z},o.createElement("div",{className:"ptr__loader ptr__pull-down--loading"},d),o.createElement("div",{className:"ptr__pull-down--pull-more"},u)),o.createElement("div",{className:"ptr__children",ref:T},p,o.createElement("div",{className:"ptr__fetch-more",ref:B},o.createElement("div",{className:"ptr__loader ptr__fetch-more--loading"},d))))};var ef=eh;var eg=n(99818);function em(e){return(0,r.jsx)("div",{style:{overflow:"auto"},children:(0,r.jsx)(ef,{pullDownThreshold:80,resistance:2,className:String((0,eg.iv)({"& .ptr__pull-down":{textAlign:"center"},"& .ptr__children":{overflow:"hidden auto"}})),...e})})};function ex({name:e,amount:t,style:n={}}){return(0,r.jsxs)(g.Z,{style:{flex:"1 0 auto",flexDirection:"row",marginTop:10,color:f.rS.altpageTextSubdued,...n},children:[(0,r.jsx)(g.Z,{style:{flex:1},children:(0,r.jsx)(A.Z,{style:{...f.W2.text,textTransform:"uppercase",fontSize:13},"data-testid":"name",children:e})}),(0,r.jsx)(W.Z,{binding:t,style:{...f.W2.text,fontSize:13},type:"financial"})]})}function ey({account:e,updated:t,getBalanceQuery:n,onSelect:o}){return(0,r.jsx)(g.Z,{style:{flex:"1 0 auto",flexDirection:"row",backgroundColor:f.rS.tableBackground,boxShadow:`0 1px 1px ${f.rS.mobileAccountShadow}`,borderRadius:6,marginTop:10},"data-testid":"account",children:(0,r.jsxs)(Z.Z,{onMouseDown:()=>o(e.id),style:{flexDirection:"row",flex:1,alignItems:"center",borderRadius:6,"&:active":{opacity:.1}},children:[(0,r.jsx)(g.Z,{style:{flex:"1 auto",margin:"10px 0"},children:(0,r.jsxs)(g.Z,{style:{flexDirection:"row",alignItems:"center"},children:[(0,r.jsx)(en.Z,{style:{...f.W2.text,fontSize:17,fontWeight:600,color:t?f.rS.mobileAccountText:f.rS.pillText,paddingRight:30},"data-testid":"account-name",children:e.name}),e.bankId&&(0,r.jsx)(g.Z,{style:{backgroundColor:f.rS.noticeText,marginLeft:"-23px",width:8,height:8,borderRadius:8}})]})}),(0,r.jsx)(W.Z,{binding:n(e),type:"financial",style:{fontSize:16,color:"inherit"},getStyle:e=>e<0&&{color:"inherit"},"data-testid":"account-balance"})]})})}function ev({onAdd:e}){return(0,r.jsxs)(g.Z,{style:{flex:1,padding:30},children:[(0,r.jsx)(A.Z,{style:f.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,r.jsx)(Z.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,r.jsx)(A.Z,{style:{marginTop:20,color:f.rS.altpageTextSubdued},children:"In the future, you can add accounts using the add button in the header."})]})}function eb({accounts:e,updatedAccounts:t,getBalanceQuery:n,getOnBudgetBalance:o,getOffBudgetBalance:i,onAddAccount:s,onSelectAccount:l}){const{syncAndDownload:a}=(0,c.o)();const d=e.filter(e=>e.offbudget===0);const u=e.filter(e=>e.offbudget===1);if(e.length===0){return(0,r.jsx)(ev,{onAdd:s})}return(0,r.jsx)(g.Z,{style:{flex:1},children:(0,r.jsx)(er.T,{title:"Accounts",children:(0,r.jsxs)(em,{onRefresh:a,children:[(0,r.jsx)(ex,{name:"For Budget",amount:o()}),d.map(e=>(0,r.jsx)(ey,{account:e,updated:t.includes(e.id),getBalanceQuery:n,onSelect:l},e.id)),(0,r.jsx)(ex,{name:"Off budget",amount:i(),style:{marginTop:30}}),u.map(e=>(0,r.jsx)(ey,{account:e,updated:t.includes(e.id),getBalanceQuery:n,onSelect:l},e.id))]})})})}function ew(){let e=(0,i.v9)(e=>e.queries.accounts);let t=(0,i.v9)(e=>e.queries.newTransactions);let n=(0,i.v9)(e=>e.queries.updatedAccounts);let s=(0,i.v9)(e=>e.prefs.local.numberFormat||"comma-dot");let l=(0,i.v9)(e=>e.prefs.local.hideFraction||false);const{list:a}=(0,u.Z)();let{getAccounts:d}=(0,c.o)();const h=(0,o.useState)({});const m=(0,et.s0)();(0,o.useEffect)(()=>{(async()=>d())()},[]);const x=e=>{m(`/accounts/${e}`)};const y=e=>{m(`/transaction/${e}`)};(0,p.j)(f.rS.mobileAccountsViewTheme);return(0,r.jsx)(g.Z,{style:{flex:1},children:(0,r.jsx)(eb,{accounts:e.filter(e=>!e.closed),categories:a,transactions:h||[],updatedAccounts:n,newTransactions:t,getBalanceQuery:v.cW,getOnBudgetBalance:v.SZ,getOffBudgetBalance:v.An,onAddAccount:()=>{},onSelectAccount:x,onSelectTransaction:y},s+l)})}var ej=n(82478);var eS=n.n(ej);var eC=n(65485);var eT=n(62829);var eZ=n(10959);var eB=n(76804);var eE=n(45485);var eA=n(74436);var e_=n(30);var ek=n(10646);var eW=n(46405);var eM=n(83172);function eI({accountName:e,onSearch:t}){const[n,i]=(0,o.useState)("");return(0,r.jsx)(g.Z,{style:{flexDirection:"row",alignItems:"center",backgroundColor:f.rS.tableHeaderBackground,margin:"11px auto 4px",borderRadius:4,padding:10,width:"100%"},children:(0,r.jsx)(eW.Z,{leftContent:(0,r.jsx)(e_.Z,{style:{width:13,height:13,flexShrink:0,color:n?f.rS.formInputTextHighlight:"inherit",margin:5,marginRight:0}}),value:n,onUpdate:e=>{i(e);t(e)},placeholder:`Search ${e}`,style:{backgroundColor:f.rS.formInputBackground,border:`1px solid ${f.rS.formInputBorder}`,fontSize:15,flex:1,height:32,marginLeft:4,padding:8}})})}const eR=70;function eD({account:e,prependTransactions:t,transactions:n,accounts:i,categories:s,payees:l,balance:a,isNewTransaction:d,onLoadMore:u,onSearch:p,onSelectTransaction:h,pushModal:m}){let x=(0,o.useMemo)(()=>{return t.concat(n)},[t,n]);const{syncAndDownload:y}=(0,c.o)();const v=async()=>{await y(e.id)};return(0,r.jsxs)(g.Z,{style:{flex:1,backgroundColor:f.rS.tableHeaderBackground,overflowY:"hidden",width:"100%"},children:[(0,r.jsxs)(g.Z,{style:{alignItems:"center",flexShrink:0,overflowY:"hidden",paddingTop:10,top:0,width:"100%"},children:[(0,r.jsxs)(g.Z,{style:{alignItems:"center",flexDirection:"row",justifyContent:"space-between",width:"100%"},children:[(0,r.jsxs)(eE.rU,{to:-1,style:{color:f.rS.formLabelText,alignItems:"center",display:"flex",textDecoration:"none",width:eR},children:[(0,r.jsx)(eA.Z,{style:{width:32,height:32}}),(0,r.jsx)(A.Z,{style:{...f.W2.text,fontWeight:500},children:"Back"})]}),(0,r.jsx)(g.Z,{style:{fontSize:16,fontWeight:500},role:"heading",children:e.name}),(0,r.jsx)(ek.Z,{to:"transactions/new",type:"bare","aria-label":"Add Transaction",style:{justifyContent:"center",width:eR},hoveredStyle:{background:"transparent"},activeStyle:{background:"transparent"},children:(0,r.jsx)(w.Z,{width:20,height:20})})]}),(0,r.jsx)(_,{title:"BALANCE",style:{marginTop:10}}),(0,r.jsx)(W.Z,{binding:a,type:"financial",debug:true,style:{fontSize:18,fontWeight:"500"},getStyle:e=>({color:e<0?f.rS.errorText:f.rS.pillTextHighlighted}),"data-testid":"account-balance"}),(0,r.jsx)(eI,{accountName:e.name,onSearch:p})]}),(0,r.jsx)(em,{onRefresh:v,children:(0,r.jsx)(eM.z4,{transactions:x,categories:s,accounts:i,payees:l,showCategory:!e.offbudget,isNew:d,onLoadMore:u,onSelect:h,pushModal:m})})]})};const eL=(0,x.Z)((e,t)=>{let n=v.PK(e,"_account");if(t){n={id:null}}return e=>{e=e.filter({$and:[n,{"_account.closed":false}]});return e.orderBy({next_date:"desc"})}});function eN({accountId:e,children:t}){let n=(0,eT.oF)();if(n==null){return t(null)}let r=n.schedules.filter(e=>!e.completed&&["due","upcoming","missed"].includes(n.statuses.get(e.id)));return t(r.map(e=>({id:"preview/"+e.id,payee:e._payee,account:e._account,amount:e._amount,date:e.next_date,notes:n.statuses.get(e.id),schedule:e.id})))}let eP;function eG(e){const t=(0,i.v9)(e=>e.queries.accounts);const n=(0,et.s0)();const[s,a]=(0,o.useState)([]);const[d,c]=(0,o.useState)("");const[h,g]=(0,o.useState)();let m=(0,i.v9)(e=>({payees:e.queries.payees,newTransactions:e.queries.newTransactions,prefs:e.prefs.local,dateFormat:e.prefs.local.dateFormat||"MM/dd/yyyy"}));let x=(0,i.I0)();let b=(0,o.useMemo)(()=>(0,eC.DE)(y,x),[x]);const{id:w}=(0,et.UO)();const j=()=>v.yf(w);const S=e=>{if(eP){eP.unsubscribe()}eP=(0,eZ.Fr)(e.options({splits:"grouped"}).select("*"),e=>a(e),{pageCount:150,mapper:eB.Xt})};const C=async()=>{let e=j();g(e);S(e)};(0,o.useEffect)(()=>{let e;async function n(){e=(0,l.oL)("sync-event",({type:e,tables:t})=>{if(e==="applied"){if(t.includes("transactions")||t.includes("category_mapping")||t.includes("payee_mapping")){eP?.run()}if(t.includes("payees")||t.includes("payee_mapping")){b.getPayees()}}});if(t.length===0){await b.getAccounts()}await b.initiallyLoadPayees();await C();b.markAccountRead(w)}n();return()=>e()},[]);const T=(0,u.Z)();const Z=eS()(()=>{if(d===""&&h){S(h)}else if(d&&h){S(v.jS(h,d,m.dateFormat))}},150);(0,o.useEffect)(Z,[d,h,m.dateFormat]);(0,p.j)(f.rS.mobileAccountViewTheme);if(!t||!t.length){return null}const B=t.find(e=>e.id===w);const E=e=>{return m.newTransactions.includes(e)};const A=async e=>{eP.unsubscribe();c(e)};const _=e=>{if(!(0,eB.J4)(e.id)){n(`transactions/${e.id}`)}};let k=v.cW(B);let W=m.prefs.numberFormat||"comma-dot";let M=m.prefs.hideFraction||false;return(0,r.jsx)(eT.up,{transform:eL(w,d!==""),children:(0,r.jsx)(eN,{accountId:e.accountId,children:e=>e==null?null:(0,o.createElement)(eD,{...m,...b,key:W+M,account:B,accounts:t,categories:T.list,payees:m.payees,transactions:s,prependTransactions:e||[],balance:k,isNewTransaction:E,onLoadMore:()=>{eP?.fetchNext()},onSearch:A,onSelectTransaction:_})})})};},25258:function(e,t,n){"use strict";n.d(t,{Rp:function(){return a},Wr:function(){return i},eq:function(){return s},i8:function(){return r},iE:function(){return c},mD:function(){return d},uu:function(){return l},yr:function(){return o}});function r(e,t){return e.map(e=>{if(e.id===t.cat_group){e.categories=[t,...e.categories]}return{...e}})}function o(e,t){return e.map(e=>{if(e.id===t.cat_group){e.categories=e.categories.map(e=>{if(e.id===t.id){return{...e,...t}}return e})}return e})}function i(e,t,n,r){if(t===r){return e}let o=e.reduce((e,n)=>{return e||n.categories.find(e=>e.id===t)},null);o={...o,cat_group:n};return e.map(e=>{if(e.id===n){e.categories=e.categories.reduce((e,n)=>{if(n.id===r){e.push(o);e.push(n)}else if(n.id!==t){e.push(n)}return e},[]);if(!r){e.categories.push(o)}}else{e.categories=e.categories.filter(e=>e.id!==t)}return{...e}})}function s(e,t,n){if(t===n){return e}let r=e.find(e=>e.id===t);e=e.reduce((e,o)=>{if(o.id===n){e.push(r);e.push(o)}else if(o.id!==t){e.push(o)}return e},[]);if(!n){e.push(r)}return e}function l(e,t){return e.map(e=>{e.categories=e.categories.filter(e=>e.id!==t);return e})}function a(e,t){return[...e,t]}function d(e,t){return e.map(e=>{if(e.id===t.id){return{...e,...t}}return e})}function c(e,t){return e.filter(e=>e.id!==t)}}}]);
2
+ //# sourceMappingURL=narrow-components.11cf3591.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/narrow-components.11cf3591.chunk.js","mappings":"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","sources":["../../../node_modules/debounce/index.js","components/common/ButtonLink.tsx","components/SyncRefresh.tsx","icons/v1/ArrowThinLeft.js","components/common/Card.tsx","components/common/Label.tsx","components/budget/MobileTable.tsx","components/budget/MobileBudgetTable.js","components/budget/MobileBudget.js","../../../node_modules/react-simple-pull-to-refresh/build/index.esm.js","components/responsive/PullToRefresh.tsx","components/accounts/MobileAccounts.js","components/accounts/MobileAccountDetails.js","components/accounts/MobileAccount.js","../../loot-core/src/shared/categories.ts"],"sourcesContent":["/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n var timeout, args, context, timestamp, result;\n if (null == wait) wait = 100;\n\n function later() {\n var last = Date.now() - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n context = args = null;\n }\n }\n };\n\n var debounced = function(){\n context = this;\n args = arguments;\n timestamp = Date.now();\n var callNow = immediate && !timeout;\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n context = args = null;\n }\n\n return result;\n };\n\n debounced.clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n \n debounced.flush = function() {\n if (timeout) {\n result = func.apply(context, args);\n context = args = null;\n \n clearTimeout(timeout);\n timeout = null;\n }\n };\n\n return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\n","import React, { type ComponentProps } from 'react';\nimport { useMatch, useNavigate } from 'react-router-dom';\n\nimport { type CSSProperties } from '../../style';\n\nimport Button from './Button';\n\ntype ButtonLinkProps = ComponentProps<typeof Button> & {\n to: string;\n activeStyle?: CSSProperties;\n};\nexport default function ButtonLink({\n to,\n style,\n activeStyle,\n ...props\n}: ButtonLinkProps) {\n const navigate = useNavigate();\n const match = useMatch({ path: to });\n return (\n <Button\n style={{\n ...style,\n ...(match ? activeStyle : {}),\n }}\n activeStyle={activeStyle}\n {...props}\n onClick={e => {\n props.onClick?.(e);\n navigate(to);\n }}\n />\n );\n}\n","import { type ReactNode, useState } from 'react';\n\ntype ChildrenProps = {\n refreshing: boolean;\n onRefresh: () => Promise<void>;\n};\ntype SyncRefreshProps = {\n onSync: () => Promise<void>;\n children: (props: ChildrenProps) => ReactNode;\n};\nexport default function SyncRefresh({ onSync, children }: SyncRefreshProps) {\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 { theme } 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 marginTop: 15,\n marginLeft: 5,\n marginRight: 5,\n borderRadius: 6,\n backgroundColor: theme.cardBackground,\n borderColor: theme.cardBorder,\n boxShadow: '0 1px 2px #9594A8',\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, theme, 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 color: theme.tableRowHeaderText,\n textAlign: 'right',\n fontSize: 12,\n marginBottom: 2,\n ...style,\n }}\n >\n {title}\n </Text>\n );\n}\n","import React, { type ComponentProps, type ReactNode } from 'react';\n\nimport { type CSSProperties, theme } from '../../style';\nimport View from '../common/View';\n\nexport const ROW_HEIGHT = 50;\n\ntype ListItemProps = ComponentProps<typeof View> & {\n children?: ReactNode;\n style: CSSProperties;\n};\n\nexport const ListItem = ({ children, style, ...props }: ListItemProps) => {\n return (\n <View\n style={{\n height: ROW_HEIGHT,\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n flexDirection: 'row',\n alignItems: 'center',\n paddingLeft: 10,\n paddingRight: 10,\n zIndex: 1,\n ...style,\n }}\n {...props}\n >\n {children}\n </View>\n );\n};\n","import React, { Component, memo, PureComponent, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\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 { savePrefs } from 'loot-core/src/client/actions';\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 { useResponsive } from '../../ResponsiveProvider';\nimport { theme, 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 { useServerURL } from '../ServerContext';\nimport CellValue from '../spreadsheet/CellValue';\nimport NamespaceContext from '../spreadsheet/NamespaceContext';\nimport useFormat from '../spreadsheet/useFormat';\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 let format = useFormat();\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: theme.formInputText, flexShrink: 0 }}\n />\n <Text\n style={{\n ...styles.smallText,\n fontWeight: '500',\n color: amount < 0 ? theme.errorText : theme.formInputText,\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 format = useFormat();\n let saved = projected ? budgetedSaved : totalSaved;\n let isNegative = saved < 0;\n\n return (\n <View\n style={{\n flexDirection: 'column',\n alignItems: 'flex-start',\n flexBasis: '80px',\n }}\n >\n {projected ? (\n <Label\n title=\"PROJECTED SAVINGS\"\n style={{ color: theme.formInputText }}\n />\n ) : (\n <Label\n title={isNegative ? 'OVERSPENT' : 'SAVED'}\n style={{ color: theme.formInputText }}\n />\n )}\n\n <Text\n style={{\n ...styles.smallText,\n fontWeight: '500',\n color: projected\n ? theme.alt2WarningText\n : isNegative\n ? theme.alt2ErrorText\n : theme.formInputText,\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 let format = useFormat();\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\n key={cat.id}\n category={cat}\n blank={true}\n index={index}\n />\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 = editMode || blank ? 0 : 1;\n }\n\n render() {\n let {\n category,\n editing,\n index,\n style,\n month,\n onBudgetAction,\n show3Cols,\n showBudgetedCol,\n } = this.props;\n let budgeted = rolloverBudget.catBudgeted(category.id);\n let balance = rolloverBudget.catBalance(category.id);\n let spent = rolloverBudget.catSumAmount(category.id);\n\n let content = !category.hidden && (\n <ListItem\n style={{\n backgroundColor: editing ? theme.altTableTextEditing : 'transparent',\n borderBottomWidth: 0,\n borderTopWidth: index > 0 ? 1 : 0,\n ...style,\n }}\n data-testid=\"row\"\n >\n <View style={{ flex: 1 }}>\n <Text style={styles.smallText} data-testid=\"category-name\">\n {category.name}\n </Text>\n </View>\n <View\n style={{\n alignItems: 'center',\n flexDirection: 'row',\n opacity: this.opacity,\n }}\n >\n {show3Cols || showBudgetedCol ? (\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 ) : null}\n {show3Cols || !showBudgetedCol ? (\n <CellValue\n name=\"spent\"\n binding={spent}\n style={{\n ...styles.smallText,\n width: 90,\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n ) : null}\n <CellValue\n name=\"balance\"\n binding={balance}\n style={{\n ...styles.smallText,\n width: 90,\n textAlign: 'right',\n }}\n getStyle={value => value < 0 && { color: theme.errorText }}\n type=\"financial\"\n />\n </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, show3Cols, showBudgetedCol } =\n this.props;\n let content = (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: theme.tableHeaderBackground,\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 {show3Cols || showBudgetedCol ? (\n <CellValue\n binding={rolloverBudget.groupBudgeted(group.id)}\n style={{\n ...styles.smallText,\n width: 90,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n ) : null}\n {show3Cols || !showBudgetedCol ? (\n <CellValue\n binding={rolloverBudget.groupSumAmount(group.id)}\n style={{\n ...styles.smallText,\n width: 90,\n fontWeight: '500',\n textAlign: 'right',\n }}\n type=\"financial\"\n />\n ) : null}\n <CellValue\n binding={rolloverBudget.groupBalance(group.id)}\n style={{\n ...styles.smallText,\n width: 90,\n fontWeight: '500',\n 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}\nclass IncomeCategory extends PureComponent {\n render() {\n const {\n name,\n budget,\n hidden,\n balance,\n style,\n nameTextStyle,\n amountTextStyle,\n } = this.props;\n if (hidden) {\n return null;\n }\n return (\n <ListItem\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: 10,\n backgroundColor: 'transparent',\n ...style,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{ ...styles.smallText, ...nameTextStyle }}\n data-testid=\"name\"\n >\n {name}\n </Text>\n </View>\n {budget && (\n <CellValue\n binding={budget}\n style={{\n ...styles.smallText,\n width: 90,\n textAlign: 'right',\n ...amountTextStyle,\n }}\n type=\"financial\"\n />\n )}\n <CellValue\n binding={balance}\n style={{\n ...styles.smallText,\n width: 90,\n 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: colorsm.tableBackground,\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 showBudgetedCol,\n show3Cols,\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 if (!group.hidden) {\n return editable(\n <Card\n style={{\n marginTop: 7,\n marginBottom: 7,\n }}\n >\n <TotalsRow\n group={group}\n showBudgetedCol={showBudgetedCol}\n budgeted={rolloverBudget.groupBudgeted(group.id)}\n balance={rolloverBudget.groupBalance(group.id)}\n show3Cols={show3Cols}\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 show3Cols={show3Cols}\n key={category.id}\n index={index}\n category={category}\n showBudgetedCol={showBudgetedCol}\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 } else {\n return null;\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={group.name}\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={{\n backgroundColor: theme.altTableBackground,\n }}\n />\n\n {group.categories.map((category, index) => {\n return (\n <IncomeCategory\n key={category.id}\n type={type}\n name={category.name}\n hidden={category.hidden}\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 showBudgetedCol,\n show3Cols,\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 showBudgetedCol={showBudgetedCol}\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 show3Cols={show3Cols}\n />\n );\n })}\n\n {incomeGroup && <IncomeBudgetGroup type={type} group={incomeGroup} />}\n </View>\n );\n }\n}\n\nexport function BudgetTable(props) {\n const [editingCategory, setEditingCategory] = useState(null);\n function onEditCategory(id) {\n setEditingCategory(id);\n }\n const { width } = useResponsive();\n const show3Cols = width >= 360;\n const {\n type,\n categoryGroups,\n month,\n monthBounds,\n editMode,\n // refreshControl,\n onPrevMonth,\n onNextMonth,\n onAddCategory,\n onEditMode,\n onReorderCategory,\n onReorderGroup,\n onShowBudgetDetails,\n onOpenActionSheet,\n onBudgetAction,\n } = props;\n\n // let editMode = false; // neuter editMode -- sorry, not rewriting drag-n-drop right now\n let currentMonth = monthUtils.currentMonth();\n let format = useFormat();\n\n const mobileShowBudgetedColPref = useSelector(state => {\n return (\n (state.prefs.local && state.prefs.local.toggleMobileDisplayPref) || true\n );\n });\n\n let [showBudgetedCol, setShowBudgetedCol] = useState(\n !mobileShowBudgetedColPref &&\n !document.cookie.match(/mobileShowBudgetedColPref=true/),\n );\n\n let dispatch = useDispatch();\n\n function toggleDisplay() {\n setShowBudgetedCol(!showBudgetedCol);\n if (!showBudgetedCol) {\n // remember the pref indefinitely\n dispatch(savePrefs({ mobileShowBudgetedColPref: true }));\n }\n }\n let buttonStyle = {\n padding: 0,\n backgroundColor: 'transparent',\n borderRadius: 'unset',\n };\n\n return (\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month, type)}>\n <View style={{ flex: 1, overflowY: 'hidden' }} data-testid=\"budget-table\">\n <BudgetHeader\n show3Cols={show3Cols}\n currentMonth={month}\n toggleDisplay={toggleDisplay}\n showBudgetedCol={showBudgetedCol}\n monthBounds={monthBounds}\n editMode={editMode}\n onDone={() => onEditMode(false)}\n onOpenActionSheet={onOpenActionSheet}\n onPrevMonth={onPrevMonth}\n onNextMonth={onNextMonth}\n />\n <View\n style={{\n flexDirection: 'row',\n flex: '0 0 auto',\n padding: 10,\n paddingRight: 14,\n backgroundColor: 'white',\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\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 <Button\n type=\"bare\"\n disabled={show3Cols}\n onClick={toggleDisplay}\n style={{\n ...buttonStyle,\n padding: '0 8px',\n margin: '0 -8px',\n background:\n showBudgetedCol && !show3Cols\n ? `linear-gradient(-45deg, ${theme.formInputBackgroundSelection} 8px, transparent 0)`\n : !show3Cols\n ? `linear-gradient(45deg, ${theme.formInputBackgroundSelection} 8px, transparent 0)`\n : null,\n // 45deg to flip it to the lower left corner\n }}\n >\n {show3Cols || showBudgetedCol ? (\n <View style={{ width: 90, justifyContent: 'center' }}>\n <Label\n title=\"BUDGETED\"\n style={{ color: theme.buttonNormalText }}\n />\n <CellValue\n binding={reportBudget.totalBudgetedExpense}\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.buttonNormalText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n formatter={value => {\n return format(-parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n ) : null}\n {show3Cols || !showBudgetedCol ? (\n <View\n style={{\n width: 90,\n justifyContent: 'center',\n }}\n >\n <Label title=\"SPENT\" style={{ color: theme.formInputText }} />\n <CellValue\n binding={rolloverBudget.totalSpent}\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.formInputText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n />\n </View>\n ) : null}\n </Button>\n <View\n style={{\n width: 90,\n justifyContent: 'center',\n }}\n >\n <Label title=\"BALANCE\" style={{ color: theme.formInputText }} />\n <CellValue\n binding={rolloverBudget.totalBalance}\n type=\"financial\"\n style={{\n ...styles.smallText,\n color: theme.formInputText,\n textAlign: 'right',\n fontWeight: '500',\n }}\n />\n </View>\n </View>\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 showBudgetedCol={showBudgetedCol}\n show3Cols={show3Cols}\n // gestures={gestures}\n month={month}\n onEditCategory={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 showBudgetedCol={showBudgetedCol}\n show3Cols={show3Cols}\n editingId={editingCategory}\n editMode={editMode}\n // gestures={gestures}\n onEditCategory={() => {}} //onEditCategory}\n onAddCategory={onAddCategory}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n />\n </View>\n\n {/* <DragDropHighlight /> */}\n </>\n // )}\n // </DragDrop>\n )}\n </View>\n </View>\n </NamespaceContext.Provider>\n );\n}\n\nfunction BudgetHeader({\n currentMonth,\n monthBounds,\n editMode,\n onDone,\n onPrevMonth,\n onNextMonth,\n toggleDisplay,\n showBudgetedCol,\n show3Cols,\n}) {\n let serverURL = useServerURL();\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: theme.buttonPrimaryBackground,\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 left: 0,\n opacity: prevEnabled ? 1 : 0.6,\n padding: '5px 30px 5px 0',\n }}\n >\n <ArrowThinLeft\n style={{ color: theme.formInputTextReadOnlySelection }}\n width=\"15\"\n height=\"15\"\n />\n </Button>\n )}\n <Text\n style={{\n ...styles.mediumText,\n marginTop: 12,\n marginBottom: 12,\n color: theme.formInputTextSelected,\n textAlign: 'center',\n // zIndex: -1\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',\n top: 0,\n bottom: 0,\n right: 0,\n }}\n textStyle={{\n color: theme.formInputTextReadOnlySelection,\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: theme.formInputTextReadOnlySelection }}\n width=\"15\"\n height=\"15\"\n />\n </Button>\n {serverURL && (\n <SyncButton\n isMobile\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 )}\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 useCategories from '../../hooks/useCategories';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport AnimatedLoading from '../../icons/AnimatedLoading';\nimport { theme } 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: theme.pageBackgroundLineTop,\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 { list: categories, grouped: categoryGroups } = useCategories();\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 useSetThemeColor(theme.mobileBudgetViewTheme);\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 React, { useRef, useEffect } from 'react';\n\nvar DIRECTION;\r\n(function (DIRECTION) {\r\n DIRECTION[DIRECTION[\"UP\"] = -1] = \"UP\";\r\n DIRECTION[DIRECTION[\"DOWN\"] = 1] = \"DOWN\";\r\n})(DIRECTION || (DIRECTION = {}));\n\nfunction isOverflowScrollable(element) {\r\n var overflowType = getComputedStyle(element).overflowY;\r\n if (element === document.scrollingElement && overflowType === 'visible') {\r\n return true;\r\n }\r\n if (overflowType !== 'scroll' && overflowType !== 'auto') {\r\n return false;\r\n }\r\n return true;\r\n}\r\nfunction isScrollable(element, direction) {\r\n if (!isOverflowScrollable(element)) {\r\n return false;\r\n }\r\n if (direction === DIRECTION.DOWN) {\r\n var bottomScroll = element.scrollTop + element.clientHeight;\r\n return bottomScroll < element.scrollHeight;\r\n }\r\n if (direction === DIRECTION.UP) {\r\n return element.scrollTop > 0;\r\n }\r\n throw new Error('unsupported direction');\r\n}\r\n/**\r\n * Returns whether a given element or any of its ancestors (up to rootElement) is scrollable in a given direction.\r\n */\r\nfunction isTreeScrollable(element, direction) {\r\n if (isScrollable(element, direction)) {\r\n return true;\r\n }\r\n if (element.parentElement == null) {\r\n return false;\r\n }\r\n return isTreeScrollable(element.parentElement, direction);\r\n}\n\nfunction styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar css = \".lds-ellipsis {\\n display: inline-block;\\n position: relative;\\n width: 64px;\\n height: 64px; }\\n\\n.lds-ellipsis div {\\n position: absolute;\\n top: 27px;\\n width: 11px;\\n height: 11px;\\n border-radius: 50%;\\n background: #363636;\\n animation-timing-function: cubic-bezier(0, 1, 1, 0); }\\n\\n.lds-ellipsis div:nth-child(1) {\\n left: 6px;\\n animation: lds-ellipsis1 0.6s infinite; }\\n\\n.lds-ellipsis div:nth-child(2) {\\n left: 6px;\\n animation: lds-ellipsis2 0.6s infinite; }\\n\\n.lds-ellipsis div:nth-child(3) {\\n left: 26px;\\n animation: lds-ellipsis2 0.6s infinite; }\\n\\n.lds-ellipsis div:nth-child(4) {\\n left: 45px;\\n animation: lds-ellipsis3 0.6s infinite; }\\n\\n@keyframes lds-ellipsis1 {\\n 0% {\\n transform: scale(0); }\\n 100% {\\n transform: scale(1); } }\\n\\n@keyframes lds-ellipsis3 {\\n 0% {\\n transform: scale(1); }\\n 100% {\\n transform: scale(0); } }\\n\\n@keyframes lds-ellipsis2 {\\n 0% {\\n transform: translate(0, 0); }\\n 100% {\\n transform: translate(19px, 0); } }\\n\";\nstyleInject(css);\n\n// Source: https://loading.io/css/\r\nvar RefreshingContent = function () {\r\n return (React.createElement(\"div\", { className: \"lds-ellipsis\" },\r\n React.createElement(\"div\", null),\r\n React.createElement(\"div\", null),\r\n React.createElement(\"div\", null),\r\n React.createElement(\"div\", null)));\r\n};\n\nvar PullingContent = function () {\r\n return (React.createElement(\"div\", null,\r\n React.createElement(\"p\", null, \"\\u21A7\\u00A0\\u00A0pull to refresh\\u00A0\\u00A0\\u21A7\")));\r\n};\n\nvar css$1 = \".ptr,\\n.ptr__children {\\n height: 100%;\\n width: 100%;\\n overflow: hidden;\\n -webkit-overflow-scrolling: touch;\\n position: relative; }\\n\\n.ptr.ptr--fetch-more-treshold-breached .ptr__fetch-more {\\n display: block; }\\n\\n.ptr__fetch-more {\\n display: none; }\\n\\n/**\\n * Pull down transition \\n */\\n.ptr__children,\\n.ptr__pull-down {\\n transition: transform 0.2s cubic-bezier(0, 0, 0.31, 1); }\\n\\n.ptr__pull-down {\\n position: absolute;\\n overflow: hidden;\\n left: 0;\\n right: 0;\\n top: 0;\\n visibility: hidden; }\\n .ptr__pull-down > div {\\n display: none; }\\n\\n.ptr--dragging {\\n /**\\n * Hide PullMore content is treshold breached\\n */\\n /**\\n * Otherwize, display content\\n */ }\\n .ptr--dragging.ptr--pull-down-treshold-breached .ptr__pull-down--pull-more {\\n display: none; }\\n .ptr--dragging .ptr__pull-down--pull-more {\\n display: block; }\\n\\n.ptr--pull-down-treshold-breached {\\n /**\\n * Force opacity to 1 is pull down trashold breached\\n */\\n /**\\n * And display loader\\n */ }\\n .ptr--pull-down-treshold-breached .ptr__pull-down {\\n opacity: 1 !important; }\\n .ptr--pull-down-treshold-breached .ptr__pull-down--loading {\\n display: block; }\\n\\n.ptr__loader {\\n margin: 0 auto;\\n text-align: center; }\\n\";\nstyleInject(css$1);\n\nvar PullToRefresh = function (_a) {\r\n var _b = _a.isPullable, isPullable = _b === void 0 ? true : _b, _c = _a.canFetchMore, canFetchMore = _c === void 0 ? false : _c, onRefresh = _a.onRefresh, onFetchMore = _a.onFetchMore, _d = _a.refreshingContent, refreshingContent = _d === void 0 ? React.createElement(RefreshingContent, null) : _d, _e = _a.pullingContent, pullingContent = _e === void 0 ? React.createElement(PullingContent, null) : _e, children = _a.children, _f = _a.pullDownThreshold, pullDownThreshold = _f === void 0 ? 67 : _f, _g = _a.fetchMoreThreshold, fetchMoreThreshold = _g === void 0 ? 100 : _g, _h = _a.maxPullDownDistance, maxPullDownDistance = _h === void 0 ? 95 : _h, // max distance to scroll to trigger refresh\r\n _j = _a.resistance, // max distance to scroll to trigger refresh\r\n resistance = _j === void 0 ? 1 : _j, backgroundColor = _a.backgroundColor, _k = _a.className, className = _k === void 0 ? '' : _k;\r\n var containerRef = useRef(null);\r\n var childrenRef = useRef(null);\r\n var pullDownRef = useRef(null);\r\n var fetchMoreRef = useRef(null);\r\n var pullToRefreshThresholdBreached = false;\r\n var fetchMoreTresholdBreached = false; // if true, fetchMore loader is displayed\r\n var isDragging = false;\r\n var startY = 0;\r\n var currentY = 0;\r\n useEffect(function () {\r\n if (!isPullable || !childrenRef || !childrenRef.current)\r\n return;\r\n var childrenEl = childrenRef.current;\r\n childrenEl.addEventListener('touchstart', onTouchStart, { passive: true });\r\n childrenEl.addEventListener('mousedown', onTouchStart);\r\n childrenEl.addEventListener('touchmove', onTouchMove, { passive: false });\r\n childrenEl.addEventListener('mousemove', onTouchMove);\r\n window.addEventListener('scroll', onScroll);\r\n childrenEl.addEventListener('touchend', onEnd);\r\n childrenEl.addEventListener('mouseup', onEnd);\r\n document.body.addEventListener('mouseleave', onEnd);\r\n return function () {\r\n childrenEl.removeEventListener('touchstart', onTouchStart);\r\n childrenEl.removeEventListener('mousedown', onTouchStart);\r\n childrenEl.removeEventListener('touchmove', onTouchMove);\r\n childrenEl.removeEventListener('mousemove', onTouchMove);\r\n window.removeEventListener('scroll', onScroll);\r\n childrenEl.removeEventListener('touchend', onEnd);\r\n childrenEl.removeEventListener('mouseup', onEnd);\r\n document.body.removeEventListener('mouseleave', onEnd);\r\n };\r\n }, [\r\n children,\r\n isPullable,\r\n onRefresh,\r\n pullDownThreshold,\r\n maxPullDownDistance,\r\n canFetchMore,\r\n fetchMoreThreshold,\r\n ]);\r\n /**\r\n * Check onMount / canFetchMore becomes true\r\n * if fetchMoreThreshold is already breached\r\n */\r\n useEffect(function () {\r\n var _a;\r\n /**\r\n * Check if it is already in fetching more state\r\n */\r\n if (!((_a = containerRef) === null || _a === void 0 ? void 0 : _a.current))\r\n return;\r\n var isAlreadyFetchingMore = containerRef.current.classList.contains('ptr--fetch-more-treshold-breached');\r\n if (isAlreadyFetchingMore)\r\n return;\r\n /**\r\n * Proceed\r\n */\r\n if (canFetchMore && getScrollToBottomValue() < fetchMoreThreshold && onFetchMore) {\r\n containerRef.current.classList.add('ptr--fetch-more-treshold-breached');\r\n fetchMoreTresholdBreached = true;\r\n onFetchMore().then(initContainer).catch(initContainer);\r\n }\r\n }, [canFetchMore, children]);\r\n /**\r\n * Returns distance to bottom of the container\r\n */\r\n var getScrollToBottomValue = function () {\r\n if (!childrenRef || !childrenRef.current)\r\n return -1;\r\n var scrollTop = window.scrollY; // is the pixels hidden in top due to the scroll. With no scroll its value is 0.\r\n var scrollHeight = childrenRef.current.scrollHeight; // is the pixels of the whole container\r\n return scrollHeight - scrollTop - window.innerHeight;\r\n };\r\n var initContainer = function () {\r\n requestAnimationFrame(function () {\r\n /**\r\n * Reset Styles\r\n */\r\n if (childrenRef.current) {\r\n childrenRef.current.style.overflowX = 'hidden';\r\n childrenRef.current.style.overflowY = 'auto';\r\n childrenRef.current.style.transform = \"unset\";\r\n }\r\n if (pullDownRef.current) {\r\n pullDownRef.current.style.opacity = '0';\r\n }\r\n if (containerRef.current) {\r\n containerRef.current.classList.remove('ptr--pull-down-treshold-breached');\r\n containerRef.current.classList.remove('ptr--dragging');\r\n containerRef.current.classList.remove('ptr--fetch-more-treshold-breached');\r\n }\r\n if (pullToRefreshThresholdBreached)\r\n pullToRefreshThresholdBreached = false;\r\n if (fetchMoreTresholdBreached)\r\n fetchMoreTresholdBreached = false;\r\n });\r\n };\r\n var onTouchStart = function (e) {\r\n isDragging = false;\r\n if (e instanceof MouseEvent) {\r\n startY = e.pageY;\r\n }\r\n if (window.TouchEvent && e instanceof TouchEvent) {\r\n startY = e.touches[0].pageY;\r\n }\r\n currentY = startY;\r\n // Check if element can be scrolled\r\n if (e.type === 'touchstart' && isTreeScrollable(e.target, DIRECTION.UP)) {\r\n return;\r\n }\r\n // Top non visible so cancel\r\n if (childrenRef.current.getBoundingClientRect().top < 0) {\r\n return;\r\n }\r\n isDragging = true;\r\n };\r\n var onTouchMove = function (e) {\r\n if (!isDragging) {\r\n return;\r\n }\r\n if (window.TouchEvent && e instanceof TouchEvent) {\r\n currentY = e.touches[0].pageY;\r\n }\r\n else {\r\n currentY = e.pageY;\r\n }\r\n containerRef.current.classList.add('ptr--dragging');\r\n if (currentY < startY) {\r\n isDragging = false;\r\n return;\r\n }\r\n if (e.cancelable) {\r\n e.preventDefault();\r\n }\r\n var yDistanceMoved = Math.min((currentY - startY) / resistance, maxPullDownDistance);\r\n // Limit to trigger refresh has been breached\r\n if (yDistanceMoved >= pullDownThreshold) {\r\n isDragging = true;\r\n pullToRefreshThresholdBreached = true;\r\n containerRef.current.classList.remove('ptr--dragging');\r\n containerRef.current.classList.add('ptr--pull-down-treshold-breached');\r\n }\r\n // maxPullDownDistance breached, stop the animation\r\n if (yDistanceMoved >= maxPullDownDistance) {\r\n return;\r\n }\r\n pullDownRef.current.style.opacity = ((yDistanceMoved) / 65).toString();\r\n childrenRef.current.style.overflow = 'visible';\r\n childrenRef.current.style.transform = \"translate(0px, \" + yDistanceMoved + \"px)\";\r\n pullDownRef.current.style.visibility = 'visible';\r\n };\r\n var onScroll = function (e) {\r\n /**\r\n * Check if component has already called onFetchMore\r\n */\r\n if (fetchMoreTresholdBreached)\r\n return;\r\n /**\r\n * Check if user breached fetchMoreThreshold\r\n */\r\n if (canFetchMore && getScrollToBottomValue() < fetchMoreThreshold && onFetchMore) {\r\n fetchMoreTresholdBreached = true;\r\n containerRef.current.classList.add('ptr--fetch-more-treshold-breached');\r\n onFetchMore().then(initContainer).catch(initContainer);\r\n }\r\n };\r\n var onEnd = function () {\r\n isDragging = false;\r\n startY = 0;\r\n currentY = 0;\r\n // Container has not been dragged enough, put it back to it's initial state\r\n if (!pullToRefreshThresholdBreached) {\r\n if (pullDownRef.current)\r\n pullDownRef.current.style.visibility = 'hidden';\r\n initContainer();\r\n return;\r\n }\r\n if (childrenRef.current) {\r\n childrenRef.current.style.overflow = 'visible';\r\n childrenRef.current.style.transform = \"translate(0px, \" + pullDownThreshold + \"px)\";\r\n }\r\n onRefresh().then(initContainer).catch(initContainer);\r\n };\r\n return (React.createElement(\"div\", { className: \"ptr \" + className, style: { backgroundColor: backgroundColor }, ref: containerRef },\r\n React.createElement(\"div\", { className: \"ptr__pull-down\", ref: pullDownRef },\r\n React.createElement(\"div\", { className: \"ptr__loader ptr__pull-down--loading\" }, refreshingContent),\r\n React.createElement(\"div\", { className: \"ptr__pull-down--pull-more\" }, pullingContent)),\r\n React.createElement(\"div\", { className: \"ptr__children\", ref: childrenRef },\r\n children,\r\n React.createElement(\"div\", { className: \"ptr__fetch-more\", ref: fetchMoreRef },\r\n React.createElement(\"div\", { className: \"ptr__loader ptr__fetch-more--loading\" }, refreshingContent)))));\r\n};\n\nexport default PullToRefresh;\n","import React, { type ComponentProps } from 'react';\nimport BasePullToRefresh from 'react-simple-pull-to-refresh';\n\nimport { css } from 'glamor';\n\ntype PullToRefreshProps = ComponentProps<typeof BasePullToRefresh>;\n\nexport default function PullToRefresh(props: PullToRefreshProps) {\n return (\n <div style={{ overflow: 'auto' }}>\n <BasePullToRefresh\n pullDownThreshold={80}\n resistance={2}\n className={String(\n css({\n '& .ptr__pull-down': {\n textAlign: 'center',\n },\n '& .ptr__children': {\n overflow: 'hidden auto',\n },\n }),\n )}\n {...props}\n />\n </div>\n );\n}\n","import React, { 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 useCategories from '../../hooks/useCategories';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { theme, 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 PullToRefresh from '../responsive/PullToRefresh';\nimport CellValue from '../spreadsheet/CellValue';\n\nfunction AccountHeader({ name, amount, style = {} }) {\n return (\n <View\n style={{\n flex: '1 0 auto',\n flexDirection: 'row',\n marginTop: 10,\n color: theme.altpageTextSubdued,\n ...style,\n }}\n >\n <View style={{ flex: 1 }}>\n <Text\n style={{\n ...styles.text,\n textTransform: 'uppercase',\n fontSize: 13,\n }}\n data-testid=\"name\"\n >\n {name}\n </Text>\n </View>\n <CellValue\n binding={amount}\n style={{ ...styles.text, 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: theme.tableBackground,\n boxShadow: `0 1px 1px ${theme.mobileAccountShadow}`,\n borderRadius: 6,\n marginTop: 10,\n }}\n data-testid=\"account\"\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 fontSize: 17,\n fontWeight: 600,\n color: updated ? theme.mobileAccountText : theme.pillText,\n paddingRight: 30,\n }}\n data-testid=\"account-name\"\n >\n {account.name}\n </TextOneLine>\n {account.bankId && (\n <View\n style={{\n backgroundColor: theme.noticeText,\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: 'inherit' }}\n getStyle={value => value < 0 && { color: 'inherit' }}\n data-testid=\"account-balance\"\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: theme.altpageTextSubdued }}>\n In the future, you can add accounts using the add button in the header.\n </Text>\n </View>\n );\n}\n\nfunction AccountList({\n accounts,\n updatedAccounts,\n getBalanceQuery,\n getOnBudgetBalance,\n getOffBudgetBalance,\n onAddAccount,\n onSelectAccount,\n}) {\n const { syncAndDownload } = useActions();\n\n const budgetedAccounts = accounts.filter(account => account.offbudget === 0);\n const offbudgetAccounts = accounts.filter(account => account.offbudget === 1);\n\n // If there are no accounts, show a helpful message\n if (accounts.length === 0) {\n return <EmptyMessage onAdd={onAddAccount} />;\n }\n\n return (\n <View style={{ flex: 1 }}>\n <Page title=\"Accounts\">\n <PullToRefresh onRefresh={syncAndDownload}>\n <AccountHeader name=\"For Budget\" amount={getOnBudgetBalance()} />\n {budgetedAccounts.map(acct => (\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\n name=\"Off budget\"\n amount={getOffBudgetBalance()}\n style={{ marginTop: 30 }}\n />\n {offbudgetAccounts.map(acct => (\n <AccountCard\n account={acct}\n key={acct.id}\n updated={updatedAccounts.includes(acct.id)}\n getBalanceQuery={getBalanceQuery}\n onSelect={onSelectAccount}\n />\n ))}\n </PullToRefresh>\n </Page>\n </View>\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 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 const { list: categories } = useCategories();\n let { getAccounts } = useActions();\n\n const transactions = useState({});\n const navigate = useNavigate();\n\n useEffect(() => {\n (async () => getAccounts())();\n }, []);\n\n const onSelectAccount = id => {\n navigate(`/accounts/${id}`);\n };\n\n const onSelectTransaction = transaction => {\n navigate(`/transaction/${transaction}`);\n };\n\n useSetThemeColor(theme.mobileAccountsViewTheme);\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 />\n </View>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { useActions } from '../../hooks/useActions';\nimport Add from '../../icons/v1/Add';\nimport CheveronLeft from '../../icons/v1/CheveronLeft';\nimport SearchAlternate from '../../icons/v2/SearchAlternate';\nimport { theme, styles } from '../../style';\nimport ButtonLink from '../common/ButtonLink';\nimport InputWithContent from '../common/InputWithContent';\nimport Label from '../common/Label';\nimport Text from '../common/Text';\nimport View from '../common/View';\nimport PullToRefresh from '../responsive/PullToRefresh';\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: theme.tableHeaderBackground,\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 ? theme.formInputTextHighlight : '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: theme.formInputBackground,\n border: `1px solid ${theme.formInputBorder}`,\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 pushModal,\n}) {\n let allTransactions = useMemo(() => {\n return prependTransactions.concat(transactions);\n }, [prependTransactions, transactions]);\n\n const { syncAndDownload } = useActions();\n const onRefresh = async () => {\n await syncAndDownload(account.id);\n };\n\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: theme.tableHeaderBackground,\n overflowY: 'hidden',\n width: '100%',\n }}\n >\n <View\n style={{\n alignItems: 'center',\n flexShrink: 0,\n overflowY: 'hidden',\n paddingTop: 10,\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={-1}\n style={{\n color: theme.formLabelText,\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 role=\"heading\"\n >\n {account.name}\n </View>\n\n <ButtonLink\n to=\"transactions/new\"\n type=\"bare\"\n aria-label=\"Add Transaction\"\n style={{ justifyContent: 'center', width: LEFT_RIGHT_FLEX_WIDTH }}\n hoveredStyle={{ background: 'transparent' }}\n activeStyle={{ background: 'transparent' }}\n >\n <Add width={20} height={20} />\n </ButtonLink>\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 ? theme.errorText : theme.pillTextHighlighted,\n })}\n data-testid=\"account-balance\"\n />\n <TransactionSearchInput\n accountName={account.name}\n onSearch={onSearch}\n />\n </View>\n\n <PullToRefresh onRefresh={onRefresh}>\n <TransactionList\n transactions={allTransactions}\n categories={categories}\n accounts={accounts}\n payees={payees}\n showCategory={!account.offbudget}\n isNew={isNewTransaction}\n onLoadMore={onLoadMore}\n onSelect={onSelectTransaction}\n pushModal={pushModal}\n />\n </PullToRefresh>\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 { listen } from 'loot-core/src/platform/client/fetch';\nimport {\n isPreviewId,\n ungroupTransactions,\n} from 'loot-core/src/shared/transactions';\n\nimport useCategories from '../../hooks/useCategories';\nimport { useSetThemeColor } from '../../hooks/useSetThemeColor';\nimport { theme } from '../../style';\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\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 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 (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 // Load categories if necessary.\n const categories = useCategories();\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(theme.mobileAccountViewTheme);\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 const onSelectTransaction = transaction => {\n // details of how the native app used to handle preview transactions here can be found at commit 05e58279\n if (!isPreviewId(transaction.id)) {\n navigate(`transactions/${transaction.id}`);\n }\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 <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={categories.list}\n payees={state.payees}\n transactions={transactions}\n prependTransactions={prependTransactions || []}\n balance={balance}\n isNewTransaction={isNewTransaction}\n onLoadMore={() => {\n paged?.fetchNext();\n }}\n onSearch={onSearch}\n onSelectTransaction={onSelectTransaction}\n />\n )\n }\n </PreviewTransactions>\n </SchedulesProvider>\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"],"names":["debounce","func","wait","immediate","timeout","args","context","timestamp","result","later","last","Date","now","setTimeout","apply","debounced","arguments","callNow","clear","clearTimeout","flush","module","exports","ButtonLink","to","style","activeStyle","props","navigate","useNavigate","match","useMatch","path","Button","onClick","e","SyncRefresh","onSync","children","syncing","setSyncing","useState","onSync_","refreshing","onRefresh","SvgArrowThinLeft","svg","xmlns","viewBox","color","d","fill","Card","forwardRef","ref","View","marginTop","marginLeft","marginRight","borderRadius","backgroundColor","theme","cardBackground","borderColor","cardBorder","boxShadow","overflow","Label","title","Text","styles","text","tableRowHeaderText","textAlign","fontSize","marginBottom","ROW_HEIGHT","ListItem","height","borderBottomWidth","tableBorder","flexDirection","alignItems","paddingLeft","paddingRight","zIndex","ToBudget","toBudget","amount","useSheetValue","format","useFormat","type","formInputText","flexShrink","smallText","fontWeight","errorText","Saved","projected","budgetedSaved","reportBudget","totalBudgetedSaved","totalSaved","saved","isNegative","flexBasis","alt2WarningText","alt2ErrorText","BudgetCell","memo","name","binding","editing","textStyle","categoryId","month","onBudgetAction","sheetValue","AmountInput","value","integerToAmount","transform","opacity","position","top","focused","onChange","onBlur","category","amountToInteger","justifyContent","display","data-testid","BudgetGroupPreview","group","pending","TotalsRow","blank","categories","map","cat","index","BudgetCategory","id","BudgetCategoryPreview","flex","PureComponent","constructor","editMode","render","show3Cols","showBudgetedCol","budgeted","rolloverBudget","catBudgeted","balance","catBalance","spent","catSumAmount","content","hidden","altTableTextEditing","borderTopWidth","width","CellValue","getStyle","div","onAddCategory","tableHeaderBackground","groupBudgeted","groupSumAmount","groupBalance","padding","Add","IncomeCategory","budget","nameTextStyle","amountTextStyle","BudgetGroup","onEditCategory","onReorderCategory","editable","undefined","onEdit","onReorder","IncomeBudgetGroup","Component","altTableBackground","BudgetGroups","getGroups","memoizeOne","groups","incomeGroup","find","is_income","expenseGroups","filter","categoryGroups","editingId","gestures","onReorderGroup","overflowY","paddingBottom","BudgetTable","editingCategory","setEditingCategory","useResponsive","monthBounds","onPrevMonth","onNextMonth","onEditMode","onShowBudgetDetails","onOpenActionSheet","currentMonth","monthUtils","mobileShowBudgetedColPref","useSelector","state","prefs","local","toggleMobileDisplayPref","setShowBudgetedCol","document","cookie","dispatch","useDispatch","toggleDisplay","savePrefs","buttonStyle","NamespaceContext","Provider","BudgetHeader","onDone","disabled","margin","background","formInputBackgroundSelection","buttonNormalText","totalBudgetedExpense","formatter","parseFloat","totalSpent","totalBalance","serverURL","useServerURL","prevEnabled","start","nextEnabled","end","buttonPrimaryBackground","left","ArrowThinLeft","formInputTextReadOnlySelection","mediumText","formInputTextSelected","bottom","right","ArrowThinRight","SyncButton","isMobile","Budget","summary","bounds","initialized","loadCategories","getCategories","setState","grouped","componentDidMount","send","prewarmMonth","unlisten","listen","tables","includes","cleanup","componentWillUnmount","budgetType","method","values","spreadsheet","prewarmCache","pushModal","applyBudgetAction","groupId","navigation","onAdd","createCategory","addCategory","cat_group","inGroup","aroundCategory","targetId","catId","idx","findIndex","length","moveCategory","moveCategoryGroup","sync","updated","error","options","Boolean","showActionSheetWithOptions","cancelButtonIndex","numberFormat","hideFraction","pageBackgroundLineTop","AnimatedLoading","flag","BudgetWrapper","list","useCategories","actions","useActions","useSpreadsheet","useSetThemeColor","mobileBudgetViewTheme","DIRECTION","isOverflowScrollable","element","overflowType","getComputedStyle","scrollingElement","isScrollable","direction","DOWN","bottomScroll","scrollTop","clientHeight","scrollHeight","UP","Error","isTreeScrollable","parentElement","styleInject","css","insertAt","head","getElementsByTagName","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","RefreshingContent","className","PullingContent","css$1","PullToRefresh","_a","_b","isPullable","_c","canFetchMore","onFetchMore","_d","refreshingContent","_e","pullingContent","_f","pullDownThreshold","_g","fetchMoreThreshold","_h","maxPullDownDistance","_j","resistance","_k","containerRef","useRef","childrenRef","pullDownRef","fetchMoreRef","pullToRefreshThresholdBreached","fetchMoreTresholdBreached","isDragging","startY","currentY","useEffect","current","childrenEl","addEventListener","onTouchStart","passive","onTouchMove","window","onScroll","onEnd","body","removeEventListener","isAlreadyFetchingMore","classList","contains","getScrollToBottomValue","add","then","initContainer","catch","scrollY","innerHeight","requestAnimationFrame","overflowX","remove","MouseEvent","pageY","TouchEvent","touches","target","getBoundingClientRect","cancelable","preventDefault","yDistanceMoved","Math","min","toString","visibility","BasePullToRefresh","String","AccountHeader","altpageTextSubdued","textTransform","AccountCard","account","getBalanceQuery","onSelect","tableBackground","mobileAccountShadow","onMouseDown","TextOneLine","mobileAccountText","pillText","bankId","noticeText","EmptyMessage","alignSelf","alert","AccountList","accounts","updatedAccounts","getOnBudgetBalance","getOffBudgetBalance","onAddAccount","onSelectAccount","syncAndDownload","budgetedAccounts","offbudget","offbudgetAccounts","Page","acct","Accounts","queries","newTransactions","getAccounts","transactions","onSelectTransaction","transaction","mobileAccountsViewTheme","closed","TransactionSearchInput","accountName","onSearch","setText","InputWithContent","leftContent","SearchAlternate","formInputTextHighlight","onUpdate","placeholder","formInputBackground","border","formInputBorder","LEFT_RIGHT_FLEX_WIDTH","AccountDetails","prependTransactions","payees","isNewTransaction","onLoadMore","allTransactions","useMemo","concat","paddingTop","Link","formLabelText","textDecoration","CheveronLeft","role","aria-label","hoveredStyle","debug","pillTextHighlighted","TransactionList","showCategory","isNew","getSchedulesTransform","hasSearch","q","$and","orderBy","next_date","PreviewTransactions","accountId","scheduleData","useCachedSchedules","schedules","s","completed","statuses","get","schedule","payee","_payee","_account","_amount","date","notes","paged","Account","setTransactions","searchText","setSearchText","currentQuery","setCurrentQuery","dateFormat","actionCreators","bindActionCreators","useParams","makeRootQuery","updateQuery","query","unsubscribe","pagedQuery","splits","select","data","pageCount","mapper","ungroupTransactions","fetchTransactions","setUpAccount","run","getPayees","initiallyLoadPayees","markAccountRead","updateSearchQuery","mobileAccountViewTheme","isPreviewId","SchedulesProvider","key","fetchNext","updateCategory","c","moveCat","reduce","cats","push","moveGroup","g","deleteCategory","addGroup","updateGroup","deleteGroup"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self["webpackChunk_actual_app_web"]=self["webpackChunk_actual_app_web"]||[]).push([[992],{10646:function(e,t,n){n.d(t,{Z:function(){return i}});var s=n(43188);var r=n(66204);var a=n(59379);var o=n(56816);function i({to:e,style:t,activeStyle:n,...r}){const i=(0,a.s0)();const l=(0,a.bS)({path:e});return(0,s.jsx)(o.Z,{style:{...t,...l?n:{}},activeStyle:n,...r,onClick:t=>{r.onClick?.(t);i(e)}})}},29696:function(e,t,n){n.r(t);n.d(t,{ReportRouter:function(){return eO}});var s=n(43188);var r=n(66204);var a=n(59379);var o=n(56605);var i=n(41071);var l=n(84094);var c=n(73416);var d=n(89362);function h(e=[]){const[t,n]=(0,r.useState)(e);const[s,a]=(0,r.useState)("and");const[o,i]=(0,r.useState)(null);const l=(0,r.useCallback)(e=>{if(e.conditions){n([...e.conditions]);a(e.conditionsOp);i(e.id)}else{n(t=>[...t,e]);i(null)}},[n]);const c=(0,r.useCallback)((e,t)=>{n(n=>n.map(n=>n===e?t:n));i(null)},[n]);const d=(0,r.useCallback)(e=>{n(t=>t.filter(t=>t!==e));i(null)},[n]);const h=(0,r.useCallback)(e=>{a(e)},[a]);return(0,r.useMemo)(()=>({filters:t,saved:o,conditionsOp:s,onApply:l,onUpdate:c,onDelete:d,onCondOpChange:h}),[t,o,l,c,d,h,s])}var u=n(45492);var x=n(30715);var f=n(24924);var g=n(42994);var p=n(77644);var m=n(24307);var y=n(16853);function j({amount:e}){return(0,s.jsxs)(f.Z,{style:{...u.W2.smallText,color:e<0?u.rS.errorText:u.rS.noticeText},children:[e>=0?"+":"",(0,d.zA)(e)]})}var v=j;var Z=n(79982);var b=n(10959);function w(e){return e.slice(0,7)}async function k(e,t){let n=await Promise.all(e.map(e=>{return(0,b.Vn)(e).then(({data:e})=>e)}));t(n)}function M(e,t,n){const s={};e.forEach(e=>{s[n?n(e[t]):e[t]]=e});return s}function S(e,t,n){const s={};e.forEach(e=>{let r=s[e.date]?s[e.date][e.isTransfer]?s[e.date][e.isTransfer]:0:0;let a={[e[n]]:e.amount+r};s[e[t]]={...s[e[t]],...a}});return s};function C(e,t){return async(n,s)=>{function r(){return(0,b.ZP)("transactions").filter({$and:[{date:{$gte:e}},{date:{$lte:t}}],"account.offbudget":false,$or:[{"payee.transfer_acct.offbudget":true,"payee.transfer_acct":null}]}).calculate({$sum:"$amount"})}return k([r().filter({amount:{$gt:0}}),r().filter({amount:{$lt:0}})],e=>{s({graphData:{income:e[0],expense:e[1]}})})}}function W(e,t,n,s=[],r){return async(a,o)=>{let{filters:i}=await (0,l.lW)("make-filters-from-conditions",{conditions:s.filter(e=>!e.customName)});const c=r==="or"?"$or":"$and";function d(s){let r=(0,b.ZP)("transactions").filter({[c]:[...i]}).filter({$and:[{date:{$transform:"$month",$gte:e}},{date:{$transform:"$month",$lte:t}}],"account.offbudget":false});if(n){return r.groupBy([{$month:"$date"},"payee.transfer_acct"]).select([{date:{$month:"$date"}},{isTransfer:"payee.transfer_acct"},{amount:{$sum:"$amount"}}])}return r.groupBy(["date","payee.transfer_acct"]).select(["date",{isTransfer:"payee.transfer_acct"},{amount:{$sum:"$amount"}}])}return k([(0,b.ZP)("transactions").filter({[c]:i,date:{$transform:"$month",$lt:e},"account.offbudget":false}).calculate({$sum:"$amount"}),d("amount > 0").filter({amount:{$gt:0}}),d("amount < 0").filter({amount:{$lt:0}})],s=>{o($(s,e,t,n))})}}function $(e,t,n,r){let[a,o,l]=e;let h=o.map(e=>{return{...e,isTransfer:e.isTransfer!==null}});let u=l.map(e=>{return{...e,isTransfer:e.isTransfer!==null}});const f=r?c.Do(c.jw(t),c.jw(n)):c.Gn(t,n);const g=S(h,"date","isTransfer");const p=S(u,"date","isTransfer");let m=a;let y=0;let j=0;let v=0;const b=f.reduce((e,t)=>{let n=0;let a=0;let o=0;let l=0;if(g[t]){n=!g[t].false?0:g[t].false;o=!g[t].true?0:g[t].true}if(p[t]){a=!p[t].false?0:p[t].false;l=!p[t].true?0:p[t].true}y+=a;j+=n;m+=n+a+o+l;v+=o+l;const c=i.Z(t);const h=(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{marginBottom:10},children:(0,s.jsx)("strong",{children:Z.Z(c,r?"MMMM yyyy":"MMMM d, yyyy")})}),(0,s.jsxs)("div",{style:{lineHeight:1.5},children:[(0,s.jsx)(x.Z,{left:"Income:",right:(0,d.zA)(n)}),(0,s.jsx)(x.Z,{left:"Expenses:",right:(0,d.zA)(a)}),(0,s.jsx)(x.Z,{left:"Change:",right:(0,s.jsx)("strong",{children:(0,d.zA)(n+a)})}),o+l!==0&&(0,s.jsx)(x.Z,{left:"Transfers:",right:(0,d.zA)(o+l)}),(0,s.jsx)(x.Z,{left:"Balance:",right:(0,d.zA)(m)})]})]});e.income.push({x:c,y:(0,d.Bf)(n)});e.expenses.push({x:c,y:(0,d.Bf)(a)});e.balances.push({x:c,y:(0,d.Bf)(m),premadeLabel:h,amount:m});return e},{expenses:[],income:[],balances:[]});const{balances:w}=b;return{graphData:b,balance:w[w.length-1].amount,totalExpenses:y,totalIncome:j,totalTransfers:v,totalChange:w[w.length-1].amount-w[0].amount}}var A=n(34827);var D=n(18826);var P=n(68812);var T=n(160);var B=n(77464);var F=n(54494);let L={blueFadeStart:"rgba(229, 245, 255, 1)",blueFadeEnd:"rgba(229, 245, 255, 0)",redFadeStart:"rgba(255, 243, 242, 1)",redFadeEnd:"rgba(255, 243, 242, 0)"};const E="Inter var, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif";const _="normal";const z=13;const K={fontFamily:E,fontSize:z,letterSpacing:_,fill:u.rS.reportsLabel,stroke:"transparent"};const R={axis:{fill:"transparent",stroke:"none"},grid:{fill:"none",stroke:"none",pointerEvents:"none"},ticks:{fill:"transparent",size:1,stroke:"none"},axisLabel:K,tickLabels:K};const I={colors:{...L,red:u.rS.reportsRed,blue:u.rS.reportsBlue},area:{style:{labels:K,data:{stroke:u.rS.reportsBlue,strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round"}}},axis:{style:R},dependentAxis:{style:{...R,grid:{...R.grid,stroke:"rgba(0,0,0,.2)",strokeDasharray:"1,1"},tickLabels:{...K,padding:5}}},independentAxis:{style:{...R,axis:{...R.axis,stroke:"rgba(0,0,0,.2)"},tickLabels:{...K,padding:10}}},bar:{style:{labels:K,data:{fill:u.rS.reportsBlue,stroke:"none"}}},line:{style:{labels:K,data:{fill:"none",stroke:u.rS.reportsBlue,strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round"}}},voronoi:{style:{labels:K}},chart:{padding:{top:20,left:65,right:20,bottom:50}}};var U=n(38638);function G({style:e,children:t}){const n=(0,r.useRef)(null);return(0,s.jsxs)(m.Z,{style:{height:300,position:"relative",flexShrink:0,...e},children:[(0,s.jsx)("div",{ref:n}),(0,s.jsx)(U.Z,{children:({width:e,height:r})=>(0,s.jsx)("div",{style:{width:e,height:r},children:t(e,r,n.current)})})]})}var N=n(42457);var H=n(99818);var O=n(90407);class V extends r.Component{static defaultEvents=O.Z.defaultEvents;render(){let{active:e,x:t,y:n,scale:r,datum:a,portalHost:o,offsetX:i=0,offsetY:l,position:c,light:d,forceActive:h,style:x}=this.props;const f=r.x.range();const g=t-f[0];if(!c){if(a.labelPosition){c=a.labelPosition}else{c=g<150?"right":"left"}}if(!o||!e&&!h){return null}n=l?l(n):n;return N.createPortal((0,s.jsx)("div",{className:`${(0,H.iv)({position:"absolute",top:0,left:i,transform:c==="right"?`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.rS.alt2MenuBackground,color:d?"inherit":u.rS.alt2MenuItemText,padding:10},!d&&(0,H.bb)({position:"absolute",display:"inline-block",borderTop:"7px solid transparent",borderBottom:"7px solid transparent",[c==="right"?"borderRight":"borderLeft"]:"7px solid "+u.rS.alt2MenuBackground,[c==="right"?"left":"right"]:-6,top:"calc(50% - 7px)",content:'" "'}),x)}`,children:a.premadeLabel}),o)}}var Y=V;function q({graphData:e,isConcise:t}){return(0,s.jsx)(G,{children:(n,r,a)=>e&&(0,s.jsxs)(A.k,{scale:{x:"time",y:"linear"},theme:I,domainPadding:10,width:n,height:r,containerComponent:(0,s.jsx)(D.Z,{voronoiDimension:"x"}),children:[(0,s.jsxs)(P.G,{children:[(0,s.jsx)(T.Z,{data:e.expenses}),(0,s.jsx)(T.Z,{data:e.income})]}),(0,s.jsx)(B.j,{data:e.balances,labelComponent:(0,s.jsx)(Y,{portalHost:a}),labels:e=>e.premadeLabel,style:{data:{stroke:u.rS.altpageTextSubdued}}}),(0,s.jsx)(F.E,{tickFormat:e=>Z.Z(e,t?"MMM ''yy":"MMM d"),tickValues:e.balances.map(e=>e.x),tickCount:Math.min(5,e.balances.length),offsetY:50}),(0,s.jsx)(F.E,{dependentAxis:true,crossAxis:false})]})})}var X=q;var J=n(62503);var Q=n(56816);var ee=n(10646);var et=n(78628);var en=n(993);function es(e,t,n){const s=e[e.length-1].name;if(n<t){n=c.zI(t,6)}return ea(s,t,n)}function er(e,t,n){const s=e[e.length-1].name;if(t>n){t=c.W9(n,6)}return ea(s,t,n)}function ea(e,t,n){const s=c.dK();if(n>s){n=s}if(t<e){t=e}return[t,n]}function eo(e){const t=c.dK();const n=c.W9(t,e);return[n,t]}function ei(e){const t=e[e.length-1].name;const n=c.dK();return[t,n]}function el({title:e,start:t,end:n,show1Month:r,allMonths:a,onChangeDates:o,filters:i,conditionsOp:l,onApply:d,onUpdateFilter:h,onDeleteFilter:x,onCondOpChange:f,headerPrefixItems:g}){return(0,s.jsxs)(m.Z,{style:{padding:10,paddingTop:0,flexShrink:0},children:[(0,s.jsxs)(ee.Z,{type:"bare",to:"/reports",style:{marginBottom:"15",alignSelf:"flex-start"},children:[(0,s.jsx)(J.Z,{width:10,height:10,style:{marginRight:5}})," Back"]}),(0,s.jsx)(m.Z,{style:u.W2.veryLargeText,children:e}),(0,s.jsxs)(m.Z,{style:{flexDirection:"row",alignItems:"center",marginTop:15,gap:15},children:[g,(0,s.jsxs)(m.Z,{style:{flexDirection:"row",alignItems:"center",gap:5},children:[(0,s.jsx)(et.Z,{onChange:e=>o(...es(a,e,n)),value:t,defaultLabel:c.WU(t,"MMMM, yyyy"),options:a.map(({name:e,pretty:t})=>[e,t])}),(0,s.jsx)(m.Z,{children:"to"}),(0,s.jsx)(et.Z,{onChange:e=>o(...er(a,t,e)),value:n,options:a.map(({name:e,pretty:t})=>[e,t])})]}),i&&(0,s.jsx)(en.L,{onApply:d}),r&&(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(1)),children:"1 month"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(2)),children:"3 months"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(5)),children:"6 months"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...eo(11)),children:"1 Year"}),(0,s.jsx)(Q.Z,{type:"bare",onClick:()=>o(...ei(a)),children:"All Time"})]}),i&&i.length>0&&(0,s.jsx)(m.Z,{style:{marginTop:5},spacing:2,direction:"row",justify:"flex-start",align:"flex-start",children:(0,s.jsx)(en.M,{filters:i,onUpdate:h,onDelete:x,conditionsOp:l,onCondOpChange:f})})]})}var ec=el;var ed=n(55833);function eh(e,t){const n=(0,ed.M)();const[s,a]=(0,r.useState)(null);(0,r.useEffect)(()=>{let e;t(n,e=>a(e)).then(t=>{e=t});return()=>{e?.()}},[t]);return s}var eu=eh;function ex(){const{filters:e,conditionsOp:t,onApply:n,onDelete:a,onUpdate:j,onCondOpChange:Z}=h();const[b,w]=(0,r.useState)(null);const[k,M]=(0,r.useState)(c.W9(c.dK(),5));const[S,C]=(0,r.useState)(c.PR());const[$,A]=(0,r.useState)(()=>{const e=o.Z(i.Z(S),i.Z(k));return e>31*3});const D=(0,r.useMemo)(()=>W(k,S,$,e,t),[k,S,$,e,t]);const P=eu("cash_flow",D);(0,r.useEffect)(()=>{async function e(){const e=await (0,l.lW)("get-earliest-transaction");const t=e?c.DT(i.Z(e.date)):c.dK();const n=c.Do(t,c.dK()).map(e=>({name:e,pretty:c.WU(e,"MMMM, yyyy")})).reverse();w(n)}e()},[]);function T(e,t){const n=o.Z(i.Z(t),i.Z(e));const s=n>31*3;let r=t+"-31";if(r>c.PR()){r=c.PR()}M(e+"-01");C(r);A(s)}if(!b||!P){return null}const{graphData:B,totalExpenses:F,totalIncome:L,totalTransfers:E}=P;return(0,s.jsxs)(m.Z,{style:{...u.W2.page,minWidth:650,overflow:"hidden"},children:[(0,s.jsx)(ec,{title:"Cash Flow",allMonths:b,start:c.jw(k),end:c.jw(S),show1Month:true,onChangeDates:T,onApply:n,filters:e,onUpdateFilter:j,onDeleteFilter:a,conditionsOp:t,onCondOpChange:Z}),(0,s.jsxs)(m.Z,{style:{backgroundColor:u.rS.tableBackground,padding:30,paddingTop:0,overflow:"auto"},children:[(0,s.jsxs)(m.Z,{style:{paddingTop:20,paddingRight:20,flexShrink:0,alignItems:"flex-end",color:u.rS.pageText},children:[(0,s.jsx)(x.Z,{style:{marginBottom:5,minWidth:160},left:(0,s.jsx)(f.Z,{children:"Income:"}),right:(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,d.zA)(L)})})}),(0,s.jsx)(x.Z,{style:{marginBottom:5,minWidth:160},left:(0,s.jsx)(f.Z,{children:"Expenses:"}),right:(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,d.zA)(F)})})}),(0,s.jsx)(x.Z,{style:{marginBottom:5,minWidth:160},left:(0,s.jsx)(f.Z,{children:"Transfers:"}),right:(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,d.zA)(E)})})}),(0,s.jsx)(p.Z,{style:{fontWeight:600},children:(0,s.jsx)(y.ZP,{children:(0,s.jsx)(v,{amount:L+F+E})})})]}),(0,s.jsx)(X,{start:k,end:S,graphData:B,isConcise:$}),(0,s.jsxs)(m.Z,{style:{marginTop:30},children:[(0,s.jsx)(g.Z,{children:(0,s.jsx)("strong",{children:"How is cash flow calculated?"})}),(0,s.jsx)(g.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 “cash on hand,” so this gives you a picture of how available money fluctuates."})]})]})]})}var ef=ex;var eg=n(9579);var ep=n(35915);var em=n(70044);var ey=n(10730);function ej({categoryGroups:e,selectedCategories:t,setSelectedCategories:n}){const[a,o]=(0,r.useState)(false);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{children:(0,s.jsx)(Q.Z,{onClick:()=>o(e=>!e),children:a?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(ep.Z,{width:20,height:20}),"Show unchecked"]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(em.Z,{width:20,height:20}),"Hide unchecked"]})})}),(0,s.jsx)("ul",{style:{listStyle:"none",marginLeft:0,paddingLeft:0,paddingRight:10,height:320,flexGrow:1,overflowY:"scroll"},children:e&&e.map(e=>{const o=e.categories.every(e=>t.some(t=>t.id===e.id));const i=e.categories.every(e=>!t.some(t=>t.id===e.id));return(0,s.jsxs)(r.Fragment,{children:[(0,s.jsxs)("li",{style:{display:i&&a?"none":"flex",marginBottom:8,flexDirection:"row"},children:[(0,s.jsx)(ey.XZ,{id:`form_${e.id}`,checked:o,onChange:s=>{const r=t.filter(t=>!e.categories.some(e=>e.id===t.id));if(o){n(r)}else{n(r.concat(e.categories))}}}),(0,s.jsx)("label",{htmlFor:`form_${e.id}`,style:{userSelect:"none",fontWeight:"bold"},children:e.name})]}),(0,s.jsx)("li",{children:(0,s.jsx)("ul",{style:{listStyle:"none",marginLeft:0,marginBottom:10,paddingLeft:10},children:e.categories.map((e,r)=>{const o=t.some(t=>t.id===e.id);return(0,s.jsxs)("li",{style:{display:!o&&a?"none":"flex",flexDirection:"row",marginBottom:4},children:[(0,s.jsx)(ey.XZ,{id:`form_${e.id}`,checked:o,onChange:s=>{if(o){n(t.filter(t=>t.id!==e.id))}else{n([...t,e])}}}),(0,s.jsx)("label",{htmlFor:`form_${e.id}`,style:{userSelect:"none"},children:e.name})]},e.id)})})})]},e.id)})})]})}var ev=n(46055);function eZ(e,t,n,s){return async(r,a)=>{if(e===null||t===null||s.length===0){return}let o;if(n===-1){const e=await (0,b.Vn)((0,b.ZP)("transactions").filter({$or:s.map(e=>({category:e.id}))}).orderBy({date:"asc"}).limit(1).select("date"));if(e.data.length===0){return}o=c.Do(c.DT(e.data[0].date),t)}else{o=c.Do(c.W9(e,n),t)}const i=async(e,t)=>Promise.all([r.get(e,ev.aK.catBudgeted(t.id)).then(e=>e.value??0),r.get(e,ev.aK.catSumAmount(t.id)).then(e=>e.value??0),r.get(e,ev.aK.catBalance(t.id)).then(e=>e.value??0)]).then(([e,t,n])=>({budgeted:e,sumAmount:t,balance:n}));const l=async e=>o.reduce(async(t,n)=>({...await t,[n]:await i(c.cv(n),e)}),Promise.resolve({}));const d=await s.reduce(async(s,r)=>({...await s,[r.id]:await l(r).then(s=>eb(e,t,r,n,s))}),Promise.resolve({}));a({categories:s,tickValues:d[s[0].id].map(e=>e.x),data:d})}}function eb(e,t,n,r,a){const o=c.Do(e,t);const[l,h]=o.reduce(([e,t],o)=>{const l=a[o];const h=i.Z(`${o}-01`);const u=r===-1?t:r;const f=[];for(let e=0;e<u;e++){f.push(a[c.W9(o,e)].sumAmount)}const g=f.reduce((e,t)=>e+t)/f.length;const p=(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{marginBottom:10},children:(0,s.jsx)("strong",{children:n.name})}),(0,s.jsxs)("div",{style:{lineHeight:1.5},children:[r!==0&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(x.Z,{left:"Average:",right:(0,d.zA)(Math.round(g))}),(0,s.jsx)("hr",{})]}),(0,s.jsx)(x.Z,{left:"Budgeted:",right:(0,d.zA)(l.budgeted)}),(0,s.jsx)(x.Z,{left:"Spent:",right:(0,d.zA)(l.sumAmount)}),(0,s.jsx)(x.Z,{left:"Balance:",right:(0,d.zA)(l.balance)})]})]});return[[...e,{x:h,y:(0,d.Bf)(Math.round(g)),premadeLabel:p,average:g,budgeted:l.budgeted,total:l.sumAmount}],t+1]},[[],1]);return l}var ew=n(94818);function ek({start:e,end:t,scale:n,range:r}){const a=n.y(0);const o=n.x(i.Z(e+"-01"));const l=n.x(i.Z(t+"-01"));if(o<0||l<0||o===undefined||l===undefined){return null}return(0,s.jsx)("svg",{children:(0,s.jsxs)("defs",{children:[(0,s.jsx)("clipPath",{id:"positive",children:(0,s.jsx)("rect",{x:o,y:r.y[1],width:l-o,height:a-r.y[1]+1,fill:"#ffffff"})}),(0,s.jsx)("clipPath",{id:"negative",children:(0,s.jsx)("rect",{x:o,y:a+1,width:l-o,height:Math.max(r.y[0]-a-1,0),fill:"#ffffff"})}),(0,s.jsxs)("linearGradient",{id:"positive-gradient",gradientUnits:"userSpaceOnUse",x1:0,y1:r.y[1],x2:0,y2:a,children:[(0,s.jsx)("stop",{offset:"0%",stopColor:I.colors.blueFadeStart}),(0,s.jsx)("stop",{offset:"100%",stopColor:I.colors.blueFadeEnd})]}),(0,s.jsxs)("linearGradient",{id:"negative-gradient",gradientUnits:"userSpaceOnUse",x1:0,y1:a,x2:0,y2:r.y[0],children:[(0,s.jsx)("stop",{offset:"0%",stopColor:I.colors.redFadeEnd}),(0,s.jsx)("stop",{offset:"100%",stopColor:I.colors.redFadeStart})]})]})})};function eM({style:e,start:t,end:n,graphData:r,compact:a}){if(!r||!r.data){return}return(0,s.jsx)(G,{style:{...e,...a&&{height:"auto",flex:1}},children:(e,o,i)=>(0,s.jsxs)(A.k,{scale:{x:"time",y:"linear"},theme:I,width:e,height:o,children:[(0,s.jsx)(ek,{start:t,end:n}),(0,s.jsx)(ew.N,{colorScale:"qualitative",domainPadding:{x:a?5:15},children:r.categories.map(e=>(0,s.jsx)(T.Z,{data:r.data[e.id],labelComponent:!a?(0,s.jsx)(Y,{portalHost:i}):undefined,labels:e=>e.premadeLabel},e.id))}),!a&&(0,s.jsx)(F.E,{style:{ticks:{stroke:"red"}},tickFormat:e=>Z.Z(e,"MMM ''yy"),tickValues:r.tickValues,tickCount:Math.max(1,Math.min(e>760?12:5,r.tickValues.length)),offsetY:50,orientation:"bottom"}),(0,s.jsx)(F.E,{dependentAxis:true,crossAxis:false,invertAxis:true,tickCount:a?2:o/70})]})})}var eS=eM;function eC(){const e=(0,eg.Z)();const[t,n]=(0,r.useState)(null);const[a,o]=(0,r.useState)(null);const[d,h]=(0,r.useState)(c.W9(c.dK(),5));const[x,f]=(0,r.useState)(c.dK());const[g,p]=(0,r.useState)(1);(0,r.useEffect)(()=>{if(t===null&&e.list.length!==0){n(e.list)}},[e,t]);const y=(0,r.useMemo)(()=>{return eZ(d,x,g,(e.list||[]).filter(e=>!e.is_income&&!e.hidden&&t&&t.some(t=>t.id===e.id)))},[d,x,g,e,t]);const j=eu("category_spending",y);(0,r.useEffect)(()=>{async function e(){const e=await (0,l.lW)("get-earliest-transaction");const t=c.dK();let n=e?c.DT(i.Z(w(e.date))):t;const s=c.W9(c.dK(),12);if(n>s){n=s}const r=c.Do(n,c.dK()).map(e=>({name:e,pretty:c.WU(e,"MMMM, yyyy")})).reverse();o(r)}e()},[]);function v(e,t){h(e);f(t)}if(!a||!j){return null}const Z=[{value:1,description:"No averaging"},{value:3,description:"3 months"},{value:6,description:"6 months"},{value:12,description:"12 months"},{value:-1,description:"All time"}];const b=Z.length-1;const k=(0,s.jsxs)(m.Z,{style:{flexDirection:"row",alignItems:"center",gap:5},children:[(0,s.jsx)(m.Z,{children:"Average: "}),(0,s.jsx)(et.Z,{style:{backgroundColor:"white"},onChange:p,value:g,options:Z.map(e=>[e.value,e.description]),line:b})]});return(0,s.jsxs)(m.Z,{style:{...u.W2.page,overflow:"hidden"},children:[(0,s.jsx)(ec,{title:"Category Spending",allMonths:a,start:d,end:x,onChangeDates:v,headerPrefixItems:k}),(0,s.jsxs)(m.Z,{style:{display:"flex",flexDirection:"row",padding:15,gap:15,flexGrow:1},children:[(0,s.jsx)(m.Z,{style:{width:200},children:(0,s.jsx)(ej,{categoryGroups:e.grouped.filter(e=>!e.is_income),selectedCategories:t,setSelectedCategories:n})}),(0,s.jsx)(m.Z,{style:{flexGrow:1,backgroundColor:"white",padding:30,overflow:"auto",transition:"flex-grow .3s linear"},children:(0,s.jsx)(eS,{style:{flexGrow:1},start:d,end:x,graphData:j})})]})]})}var eW=eC;var e$=n(37496);function eA(e,t,n,s=[],r){return async(a,o)=>{if(n.length===0){return null}let{filters:i}=await (0,l.lW)("make-filters-from-conditions",{conditions:s.filter(e=>!e.customName)});const c=r==="or"?"$or":"$and";const d=await Promise.all(n.map(async n=>{let[s,r]=await Promise.all([(0,b.Vn)((0,b.ZP)("transactions").filter({[c]:i,account:n.id,date:{$lt:e+"-01"}}).calculate({$sum:"$amount"})).then(({data:e})=>e),(0,b.Vn)((0,b.ZP)("transactions").filter({[c]:[...i]}).filter({account:n.id,$and:[{date:{$gte:e+"-01"}},{date:{$lte:t+"-31"}}]}).groupBy({$month:"$date"}).select([{date:{$month:"$date"}},{amount:{$sum:"$amount"}}])).then(({data:e})=>e)]);return{id:n.id,balances:M(r,"date"),starting:s}}));o(eD(d,e,t))}}function eD(e,t,n){const r=c.Do(t,n);const a=e.map(e=>{let t=e.starting;return r.map(n=>{if(e.balances[n]){t+=e.balances[n].amount}return t})});let o=false;let l=0;let h=0;let u=null;let f=null;const g=r.reduce((e,t,n)=>{let r=0;let c=0;let g=0;const p=e.length===0?null:e[e.length-1];a.forEach(e=>{const t=e[n];if(t<0){r+=-t}else{c+=t}g+=t});if(g<0){o=true}const m=i.Z(t+"-01");const y=p?g-(0,d.l9)(p.y):0;const j=(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{style:{marginBottom:10},children:(0,s.jsx)("strong",{children:Z.Z(m,"MMMM yyyy")})}),(0,s.jsxs)("div",{style:{lineHeight:1.5},children:[(0,s.jsx)(x.Z,{left:"Assets:",right:(0,d.zA)(c)}),(0,s.jsx)(x.Z,{left:"Debt:",right:`-${(0,d.zA)(r)}`}),(0,s.jsx)(x.Z,{left:"Net worth:",right:(0,s.jsx)("strong",{children:(0,d.zA)(g)})}),(0,s.jsx)(x.Z,{left:"Change:",right:(0,d.zA)(y)})]})]});if(e.length===0){l=g}h=g;e.push({x:m,y:(0,d.Bf)(g),premadeLabel:j});e.forEach(e=>{if(e.y<u||u===null){u=e.y}if(e.y>f||f===null){f=e.y}});return e},[]);return{graphData:{data:g,hasNegative:o,start:t,end:n},netWorth:h,totalChange:h-l,lowestNetWorth:u,highestNetWorth:f}}var eP=n(65556);function eT({style:e,graphData:t,compact:n,domain:a}){const o=n?P.G:A.k;return(0,s.jsx)(G,{style:{...e,...n&&{height:"auto"}},children:(e,i,l)=>t&&(0,s.jsxs)(o,{scale:{x:"time",y:"linear"},theme:I,domainPadding:{x:0,y:10},domain:a,width:e,height:i,containerComponent:(0,s.jsx)(D.Z,{voronoiDimension:"x"}),padding:n&&{top:0,bottom:0,left:0,right:0},children:[(0,s.jsx)(ek,{start:t.start,end:t.end}),(0,r.createElement)(t.data.length===1?T.Z:eP.b,{data:t.data,labelComponent:(0,s.jsx)(Y,{portalHost:l}),labels:e=>e.premadeLabel,style:{data:t.data.length===1?{width:50}:{clipPath:"url(#positive)",fill:"url(#positive-gradient)"}}}),t.data.length>1&&(0,s.jsx)(eP.b,{data:t.data,style:{data:{clipPath:"url(#negative)",fill:"url(#negative-gradient)",stroke:I.colors.red,strokeLinejoin:"round"}}}),(0,s.jsx)(eP.b,{data:t.data,style:{data:{fill:"none",stroke:"none"}}}),!n&&(0,s.jsx)(F.E,{style:{ticks:{stroke:I.colors.red}},tickFormat:e=>Z.Z(e,"MMM ''yy"),tickValues:t.data.map(e=>e.x),tickCount:Math.min(e/220,t.data.length),offsetY:50}),!n&&(0,s.jsx)(F.E,{dependentAxis:true,tickCount:Math.round(i/70),crossAxis:!t.hasNegative})]})})}var eB=eT;function eF(){let e=(0,e$.v9)(e=>e.queries.accounts);const{filters:t,saved:n,conditionsOp:a,onApply:o,onDelete:x,onUpdate:f,onCondOpChange:p}=h();const[j,Z]=(0,r.useState)(null);const[b,k]=(0,r.useState)(c.W9(c.dK(),5));const[M,S]=(0,r.useState)(c.dK());const C=(0,r.useMemo)(()=>eA(b,M,e,t,a),[b,M,e,t,a]);const W=eu("net_worth",C);(0,r.useEffect)(()=>{async function e(){const e=await (0,l.lW)("get-earliest-transaction");const t=c.dK();let n=e?c.DT(i.Z(w(e.date))):t;const s=c.W9(c.dK(),12);if(n>s){n=s}const r=c.Do(n,c.dK()).map(e=>({name:e,pretty:c.WU(e,"MMMM, yyyy")})).reverse();Z(r)}e()},[]);function $(e,t){k(e);S(t)}if(!j||!W){return null}return(0,s.jsxs)(m.Z,{style:{...u.W2.page,minWidth:650,overflow:"hidden"},children:[(0,s.jsx)(ec,{title:"Net Worth",allMonths:j,start:b,end:M,onChangeDates:$,filters:t,saved:n,onApply:o,onUpdateFilter:f,onDeleteFilter:x,conditionsOp:a,onCondOpChange:p}),(0,s.jsxs)(m.Z,{style:{backgroundColor:u.rS.tableBackground,padding:30,paddingTop:0,overflow:"auto",flexGrow:1},children:[(0,s.jsxs)(m.Z,{style:{textAlign:"right",paddingTop:20,paddingRight:20,flexShrink:0},children:[(0,s.jsx)(m.Z,{style:{...u.W2.largeText,fontWeight:400,marginBottom:5},children:(0,s.jsx)(y.ZP,{blurIntensity:5,children:(0,d.zA)(W.netWorth)})}),(0,s.jsx)(y.ZP,{children:(0,s.jsx)(v,{amount:W.totalChange})})]}),(0,s.jsx)(eB,{style:{flexGrow:1},start:b,end:M,graphData:W.graphData,domain:{y:[W.lowestNetWorth*.99,W.highestNetWorth*1.01]}}),(0,s.jsxs)(m.Z,{style:{marginTop:30},children:[(0,s.jsx)(g.Z,{children:(0,s.jsx)("strong",{children:"How is net worth calculated?"})}),(0,s.jsx)(g.Z,{children:"Net worth shows the balance of all accounts over time, including all of your investments. Your “net worth” is considered to be the amount you’d 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."})]})]})]})}var eL=n(58068);var eE=n(45931);var e_=n(99147);function ez({start:e,end:t}){e=i.Z(e);t=i.Z(t);let n;if(e.getYear()!==t.getYear()){n=(0,s.jsxs)("div",{children:[Z.Z(e,"MMM yyyy")," - ",Z.Z(t,"MMM yyyy")]})}else if(e.getMonth()!==t.getMonth()){n=(0,s.jsxs)("div",{children:[Z.Z(e,"MMM")," - ",Z.Z(t,"MMM yyyy")]})}else{n=Z.Z(t,"MMMM yyyy")}return(0,s.jsx)(f.Z,{style:{color:u.rS.pageTextSubdued},children:n})}var eK=ez;function eR({flex:e,to:t,style:n,children:r}){const a={flex:e,margin:15};const o=(0,s.jsx)(m.Z,{style:{backgroundColor:u.rS.tableBackground,borderRadius:2,height:200,boxShadow:"0 2px 6px rgba(0, 0, 0, .15)",transition:"box-shadow .25s",":hover":t&&{boxShadow:"0 4px 6px rgba(0, 0, 0, .15)"},...t?null:a,...n},children:r});if(t){return(0,s.jsx)(e_.Z,{to:t,style:{textDecoration:"none",flex:e,...a},children:o})}return o}function eI(){return(0,s.jsx)(m.Z,{style:{height:"100%",alignItems:"center",justifyContent:"center"},children:(0,s.jsx)(eE.Z,{style:{width:25,height:25}})})}function eU({accounts:e}){const t=c.dK();const n=c.W9(t,5);const[a,o]=(0,r.useState)(false);const i=(0,r.useCallback)(()=>o(true));const l=(0,r.useCallback)(()=>o(false));const h=(0,r.useMemo)(()=>eA(n,t,e),[n,t,e]);const x=eu("net_worth",h);return(0,s.jsx)(eR,{flex:2,to:"/reports/net-worth",children:(0,s.jsxs)(m.Z,{style:{flex:1},onPointerEnter:i,onPointerLeave:l,children:[(0,s.jsxs)(m.Z,{style:{flexDirection:"row",padding:20},children:[(0,s.jsxs)(m.Z,{style:{flex:1},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},role:"heading",children:"Net Worth"}),(0,s.jsx)(eK,{start:n,end:t})]}),x&&(0,s.jsxs)(m.Z,{style:{textAlign:"right"},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},children:(0,s.jsx)(y.ZP,{activationFilters:[!a],children:(0,d.zA)(x.netWorth)})}),(0,s.jsx)(y.ZP,{activationFilters:[!a],children:(0,s.jsx)(v,{amount:x.totalChange,style:{color:u.rS.altTableText,fontWeight:300}})})]})]}),x?(0,s.jsx)(eB,{start:n,end:t,graphData:x.graphData,compact:true,style:{height:"auto",flex:1}}):(0,s.jsx)(eI,{})]})})}function eG(){const e=c.PR();const t=c.dK()+"-01";const n=(0,r.useMemo)(()=>C(t,e),[t,e]);const a=eu("cash_flow_simple",n);const[o,i]=(0,r.useState)(false);const l=(0,r.useCallback)(()=>i(true));const h=(0,r.useCallback)(()=>i(false));const{graphData:x}=a||{};const g=-(x?.expense||0);const p=x?.income||0;return(0,s.jsx)(eR,{flex:1,to:"/reports/cash-flow",children:(0,s.jsxs)(m.Z,{style:{flex:1},onPointerEnter:l,onPointerLeave:h,children:[(0,s.jsxs)(m.Z,{style:{flexDirection:"row",padding:20},children:[(0,s.jsxs)(m.Z,{style:{flex:1},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},role:"heading",children:"Cash Flow"}),(0,s.jsx)(eK,{start:t,end:e})]}),a&&(0,s.jsx)(m.Z,{style:{textAlign:"right"},children:(0,s.jsx)(y.ZP,{activationFilters:[!o],children:(0,s.jsx)(v,{amount:p-g,style:{color:u.rS.altTableText,fontWeight:300}})})})]}),a?(0,s.jsx)(G,{style:{height:"auto",flex:1},children:(e,t,n)=>(0,s.jsxs)(P.G,{colorScale:[I.colors.blue,I.colors.red],width:100,height:t,theme:I,domain:{x:[0,100],y:[0,Math.max(p,g,100)]},containerComponent:(0,s.jsx)(D.Z,{voronoiDimension:"x"}),labelComponent:(0,s.jsx)(Y,{portalHost:n,offsetX:(e-100)/2,offsetY:e=>e+40>t?t-40:e,light:true,forceActive:true,style:{padding:0}}),padding:{top:0,bottom:0,left:0,right:0},children:[(0,s.jsx)(T.Z,{barWidth:13,data:[{x:30,y:Math.max(p,5),premadeLabel:(0,s.jsxs)(m.Z,{style:{textAlign:"right"},children:["Income",(0,s.jsx)(m.Z,{children:(0,s.jsx)(y.ZP,{activationFilters:[!o],children:(0,d.zA)(p)})})]}),labelPosition:"left"}],labels:e=>e.premadeLabel}),(0,s.jsx)(T.Z,{barWidth:13,data:[{x:60,y:Math.max(g,5),premadeLabel:(0,s.jsxs)(m.Z,{children:["Expenses",(0,s.jsx)(m.Z,{children:(0,s.jsx)(y.ZP,{activationFilters:[!o],children:(0,d.zA)(g)})})]}),labelPosition:"right"}],labels:e=>e.premadeLabel})]})}):(0,s.jsx)(eI,{})]})})}function eN(){const{list:e=[]}=(0,eg.Z)();const t=c.PR();const n=c.W9(t,3);const a=(0,r.useMemo)(()=>{return eZ(n,t,3,e.filter(e=>!e.is_income&&!e.hidden))},[n,t,e]);const o=eu("category_spending",a);return(0,s.jsxs)(eR,{flex:1,to:"/reports/category-spending",children:[(0,s.jsx)(m.Z,{children:(0,s.jsx)(m.Z,{style:{flexDirection:"row",padding:"20px 20px 0"},children:(0,s.jsxs)(m.Z,{style:{flex:1},children:[(0,s.jsx)(f.Z,{style:{...u.W2.mediumText,fontWeight:500,marginBottom:5},role:"heading",children:"Spending"}),(0,s.jsx)(eK,{start:n,end:t})]})})}),o?(0,s.jsx)(eS,{start:n,end:t,graphData:o,compact:true}):(0,s.jsx)(eI,{})]})}function eH(){let e=(0,eL.Z)("categorySpendingReport");let t=(0,e$.v9)(e=>e.queries.accounts);return(0,s.jsxs)(m.Z,{style:{...u.W2.page,...{paddingLeft:40,paddingRight:40,minWidth:700}},children:[(0,s.jsxs)(m.Z,{style:{flexDirection:"row",flex:"0 0 auto"},children:[(0,s.jsx)(eU,{accounts:t}),(0,s.jsx)(eG,{})]}),e&&(0,s.jsxs)(m.Z,{style:{flex:"0 0 auto",flexDirection:"row"},children:[(0,s.jsx)(eN,{}),(0,s.jsx)("div",{style:{flex:1}}),(0,s.jsx)("div",{style:{flex:1}})]})]})};function eO(){return(0,s.jsxs)(a.Z5,{children:[(0,s.jsx)(a.AW,{path:"/",element:(0,s.jsx)(eH,{})}),(0,s.jsx)(a.AW,{path:"/net-worth",element:(0,s.jsx)(eF,{})}),(0,s.jsx)(a.AW,{path:"/cash-flow",element:(0,s.jsx)(ef,{})}),(0,s.jsx)(a.AW,{path:"/category-spending",element:(0,s.jsx)(eW,{})})]})}}}]);
2
+ //# sourceMappingURL=reports.39b7254a.chunk.js.map